1.描述
AVInputFormat 是類(lèi)似COM 接口的數(shù)據(jù)結(jié)構(gòu)冯事,表示輸入文件容器格式,著重于功能函數(shù)血公,一種文件容器格式對(duì)應(yīng)一個(gè)AVInputFormat 結(jié)構(gòu)昵仅,在程序運(yùn)行時(shí)有多個(gè)實(shí)例,位于avoformat.h文件中累魔。
2.結(jié)構(gòu)體定義
typedef struct AVInputFormat {
/**
* A comma separated list of short names for the format. New names
* may be appended with a minor bump.
*/
const char *name;
/**
* Descriptive name for the format, meant to be more human-readable
* than name. You should use the NULL_IF_CONFIG_SMALL() macro
* to define it.
*/
const char *long_name;
/**
* Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
* AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
* AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
*/
int flags;
/**
* If extensions are defined, then no probe is done. You should
* usually not use extension format guessing because it is not
* reliable enough
*/
const char *extensions;
const struct AVCodecTag * const *codec_tag;
const AVClass *priv_class; ///< AVClass for the private context
/**
* Comma-separated list of mime types.
* It is used check for matching mime types while probing.
* @see av_probe_input_format2
*/
const char *mime_type;
/*****************************************************************
* No fields below this line are part of the public API. They
* may not be used outside of libavformat and can be changed and
* removed at will.
* New public fields should be added right above.
*****************************************************************
*/
struct AVInputFormat *next;
/**
* Raw demuxers store their codec ID here.
*/
int raw_codec_id;
/**
* Size of private data so that it can be allocated in the wrapper.
*/
int priv_data_size;
/**
* Tell if a given file has a chance of being parsed as this format.
* The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes
* big so you do not have to check for that unless you need more.
*/
int (*read_probe)(AVProbeData *);
/**
* Read the format header and initialize the AVFormatContext
* structure. Return 0 if OK. 'avformat_new_stream' should be
* called to create new streams.
*/
int (*read_header)(struct AVFormatContext *);
/**
* Used by format which open further nested input.
*/
int (*read_header2)(struct AVFormatContext *, AVDictionary **options);
/**
* Read one packet and put it in 'pkt'. pts and flags are also
* set. 'avformat_new_stream' can be called only if the flag
* AVFMTCTX_NOHEADER is used and only in the calling thread (not in a
* background thread).
* @return 0 on success, < 0 on error.
* When returning an error, pkt must not have been allocated
* or must be freed before returning
*/
int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
/**
* Close the stream. The AVFormatContext and AVStreams are not
* freed by this function
*/
int (*read_close)(struct AVFormatContext *);
/**
* Seek to a given timestamp relative to the frames in
* stream component stream_index.
* @param stream_index Must not be -1.
* @param flags Selects which direction should be preferred if no exact
* match is available.
* @return >= 0 on success (but not necessarily the new offset)
*/
int (*read_seek)(struct AVFormatContext *,
int stream_index, int64_t timestamp, int flags);
/**
* Get the next timestamp in stream[stream_index].time_base units.
* @return the timestamp or AV_NOPTS_VALUE if an error occurred
*/
int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
int64_t *pos, int64_t pos_limit);
/**
* Start/resume playing - only meaningful if using a network-based format
* (RTSP).
*/
int (*read_play)(struct AVFormatContext *);
/**
* Pause playing - only meaningful if using a network-based format
* (RTSP).
*/
int (*read_pause)(struct AVFormatContext *);
/**
* Seek to timestamp ts.
* Seeking will be done so that the point from which all active streams
* can be presented successfully will be closest to ts and within min/max_ts.
* Active streams are all streams that have AVStream.discard < AVDISCARD_ALL.
*/
int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
/**
* Returns device list with it properties.
* @see avdevice_list_devices() for more details.
*/
int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);
/**
* Initialize device capabilities submodule.
* @see avdevice_capabilities_create() for more details.
*/
int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
/**
* Free device capabilities submodule.
* @see avdevice_capabilities_free() for more details.
*/
int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
} AVInputFormat;
3.常見(jiàn)變量及其作用
const char *name;//格式名列表.也可以分配一個(gè)新名字摔笤。
const char *long_name;//格式的描述性名稱(chēng),意味著比名稱(chēng)更易于閱讀垦写。
int flags;
//可用的flag有: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
const char *extensions;//文件擴(kuò)展名
const AVClass *priv_class; //一個(gè)模擬類(lèi)型列表.用來(lái)在probe的時(shí)候check匹配的類(lèi)型籍茧。
struct AVInputFormat *next;//用于把所有支持的輸入文件容器格式連接成鏈表,便于遍歷查找梯澜。
int priv_data_size;//標(biāo)示具體的文件容器格式對(duì)應(yīng)的Context 的大小。
int (*read_probe)(AVProbeData *);//判斷一個(gè)給定的文件是否有可能被解析為這種格式渴析。 給定的buf足夠大晚伙,所以你沒(méi)有必要去檢查它,除非你需要更多 俭茧。
int (*read_header)(struct AVFormatContext *);//讀取format頭并初始化AVFormatContext結(jié)構(gòu)體咆疗,如果成功,返回0母债。創(chuàng)建新的流需要調(diào)用avformat_new_stream午磁。
int (*read_header2)(struct AVFormatContext *, AVDictionary **options);//新加的函數(shù)指針,用于打開(kāi)進(jìn)一步嵌套輸入的格式毡们。
int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);//讀取一個(gè)數(shù)據(jù)包并將其放在“pkt”中迅皇。 pts和flag也被設(shè)置。
int (*read_close)(struct AVFormatContext *);//關(guān)閉流衙熔。 AVFormatContext和Streams不會(huì)被此函數(shù)釋放登颓。
int (*read_seek)(struct AVFormatContext *, int stream_index, int64_t timestamp, int flags);
int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, int64_t *pos, int64_t pos_limit);//獲取stream [stream_index] .time_base單位中的下一個(gè)時(shí)間戳。
int (*read_play)(struct AVFormatContext *);//開(kāi)始/繼續(xù)播放 - 僅當(dāng)使用基于網(wǎng)絡(luò)的(RTSP)格式時(shí)才有意義红氯。
int (*read_pause)(struct AVFormatContext *);//暫停播放 - 僅當(dāng)使用基于網(wǎng)絡(luò)的(RTSP)格式時(shí)才有意義框咙。
int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);//尋求時(shí)間戳ts咕痛。
int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);返回設(shè)備列表及其屬性。
int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);//初始化設(shè)備能力子模塊喇嘱。
int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);//釋放設(shè)備能力子模塊茉贡。