ffmpeg重要結構體之AVIOContext

ffmpeg重要結構體之AVFrame

ffmpeg重要結構體之AVFormatContext

ffmpeg重要結構體之AVCodecContext

ffmpeg重要結構體之AVCodec

ffmpeg重要結構體之AVIOContext

ffmpeg重要結構體之AVStream

ffmpeg重要結構體之AVPacket



AVIOContext是有關輸入輸出數據的結構體,其定義位於文件libavformat\avio.h中。

在結構體AVFormatCtx中有AVIOContext類型的成員。

定義代碼如下:

typedef struct AVIOContext {
    /**
     * A class for private options.
     *
     * If this AVIOContext is created by avio_open2(), av_class is set and
     * passes the options down to protocols.
     *
     * If this AVIOContext is manually allocated, then av_class may be set by
     * the caller.
     *
     * warning -- this field can be NULL, be sure to not pass this AVIOContext
     * to any av_opt_* functions in that case.
     */
    const AVClass *av_class;
    unsigned char *buffer;  /**< Start of the buffer. */
    int buffer_size;        /**< Maximum buffer size */
    unsigned char *buf_ptr; /**< Current position in the buffer */
    unsigned char *buf_end; /**< End of the data, may be less than
                                 buffer+buffer_size if the read function returned
                                 less data than requested, e.g. for streams where
                                 no more data has been received yet. */
    void *opaque;           /**< A private pointer, passed to the read/write/seek/...
                                 functions. */
    int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
    int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
    int64_t (*seek)(void *opaque, int64_t offset, int whence);
    int64_t pos;            /**< position in the file of the current buffer */
    int must_flush;         /**< true if the next seek should flush */
    int eof_reached;        /**< true if eof reached */
    int write_flag;         /**< true if open for writing */
    int max_packet_size;
    unsigned long checksum;
    unsigned char *checksum_ptr;
    unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
    int error;              /**< contains the error code or 0 if no error happened */
    /**
     * Pause or resume playback for network streaming protocols - e.g. MMS.
     */
    int (*read_pause)(void *opaque, int pause);
    /**
     * Seek to a given timestamp in stream with the specified stream_index.
     * Needed for some network streaming protocols which don't support seeking
     * to byte position.
     */
    int64_t (*read_seek)(void *opaque, int stream_index,
                         int64_t timestamp, int flags);
    /**
     * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
     */
    int seekable;

    /**
     * max filesize, used to limit allocations
     * This field is internal to libavformat and access from outside is not allowed.
     */
    int64_t maxsize;

    /**
     * avio_read and avio_write should if possible be satisfied directly
     * instead of going through a buffer, and avio_seek will always
     * call the underlying seek function directly.
     */
    int direct;

    /**
     * Bytes read statistic
     * This field is internal to libavformat and access from outside is not allowed.
     */
    int64_t bytes_read;

    /**
     * seek statistic
     * This field is internal to libavformat and access from outside is not allowed.
     */
    int seek_count;

    /**
     * writeout statistic
     * This field is internal to libavformat and access from outside is not allowed.
     */
    int writeout_count;

    /**
     * Original buffer size
     * used internally after probing and ensure seekback to reset the buffer size
     * This field is internal to libavformat and access from outside is not allowed.
     */
    int orig_buffer_size;

    /**
     * Threshold to favor readahead over seek.
     * This is current internal only, do not use from outside.
     */
    int short_seek_threshold;
} AVIOContext;


解碼某mpeg-4碼流(raw format),AVFormat中的AVIOContext *pb的值如圖:

其中和視頻解碼相關的重要結構體包括:

unsigned char *buffer:指向數據開始的位置。一般就是指向文件的開頭。如上圖中的buffer,其前幾個數據爲00 00 01 b0,正是此mpeg-4文件的開頭。

int buffer_size:buffer的最大值,一般爲0x8000即32768.

unsigned char *buf_ptr:當前在buffer中的位置

unsigned char *buf_end:buffer結尾的位置。

int (*read_packet)(void *opaque, uint8_t *buf, int buf_size):讀一個packet。

int (*write_packet)(void *opaque, uint8_t *buf, int buf_size):寫一個packet。

int64_t (*seek)(void *opaque, int64_t offset, int whence):seek到某一位置。

int (*read_pause)(void *opaque, int pause):對於網絡流媒體,暫停(pause)或者恢復(resume)。

int64_t (*read_seek)(void *opaque, int stream_index, int64_t timestamp, int flags):seek到某個時間戳。

int seekable:當前的流是否可以seek。

發佈了32 篇原創文章 · 獲贊 9 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章