1.描述
AVInputFormat 是类似COM 接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFormat 结构,在程序运行时有多个实例,位于avoformat.h文件中。
2.结构体定义
1 typedef struct AVInputFormat { 2 /** 3 * A comma separated list of short names for the format. New names 4 * may be appended with a minor bump. 5 */ 6 const char *name; 7 8 /** 9 * Descriptive name for the format, meant to be more human-readable 10 * than name. You should use the NULL_IF_CONFIG_SMALL() macro 11 * to define it. 12 */ 13 const char *long_name; 14 15 /** 16 * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, 17 * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, 18 * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. 19 */ 20 int flags; 21 22 /** 23 * If extensions are defined, then no probe is done. You should 24 * usually not use extension format guessing because it is not 25 * reliable enough 26 */ 27 const char *extensions; 28 29 const struct AVCodecTag * const *codec_tag; 30 31 const AVClass *priv_class; ///< AVClass for the private context 32 33 /** 34 * Comma-separated list of mime types. 35 * It is used check for matching mime types while probing. 36 * @see av_probe_input_format2 37 */ 38 const char *mime_type; 39 40 /***************************************************************** 41 * No fields below this line are part of the public API. They 42 * may not be used outside of libavformat and can be changed and 43 * removed at will. 44 * New public fields should be added right above. 45 ***************************************************************** 46 */ 47 struct AVInputFormat *next; 48 49 /** 50 * Raw demuxers store their codec ID here. 51 */ 52 int raw_codec_id; 53 54 /** 55 * Size of private data so that it can be allocated in the wrapper. 56 */ 57 int priv_data_size; 58 59 /** 60 * Tell if a given file has a chance of being parsed as this format. 61 * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes 62 * big so you do not have to check for that unless you need more. 63 */ 64 int (*read_probe)(AVProbeData *); 65 66 /** 67 * Read the format header and initialize the AVFormatContext 68 * structure. Return 0 if OK. 'avformat_new_stream' should be 69 * called to create new streams. 70 */ 71 int (*read_header)(struct AVFormatContext *); 72 73 /** 74 * Used by format which open further nested input. 75 */ 76 int (*read_header2)(struct AVFormatContext *, AVDictionary **options); 77 78 /** 79 * Read one packet and put it in 'pkt'. pts and flags are also 80 * set. 'avformat_new_stream' can be called only if the flag 81 * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a 82 * background thread). 83 * @return 0 on success, < 0 on error. 84 * When returning an error, pkt must not have been allocated 85 * or must be freed before returning 86 */ 87 int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); 88 89 /** 90 * Close the stream. The AVFormatContext and AVStreams are not 91 * freed by this function 92 */ 93 int (*read_close)(struct AVFormatContext *); 94 95 /** 96 * Seek to a given timestamp relative to the frames in 97 * stream component stream_index. 98 * @param stream_index Must not be -1. 99 * @param flags Selects which direction should be preferred if no exact 100 * match is available. 101 * @return >= 0 on success (but not necessarily the new offset) 102 */ 103 int (*read_seek)(struct AVFormatContext *, 104 int stream_index, int64_t timestamp, int flags); 105 106 /** 107 * Get the next timestamp in stream[stream_index].time_base units. 108 * @return the timestamp or AV_NOPTS_VALUE if an error occurred 109 */ 110 int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, 111 int64_t *pos, int64_t pos_limit); 112 113 /** 114 * Start/resume playing - only meaningful if using a network-based format 115 * (RTSP). 116 */ 117 int (*read_play)(struct AVFormatContext *); 118 119 /** 120 * Pause playing - only meaningful if using a network-based format 121 * (RTSP). 122 */ 123 int (*read_pause)(struct AVFormatContext *); 124 125 /** 126 * Seek to timestamp ts. 127 * Seeking will be done so that the point from which all active streams 128 * can be presented successfully will be closest to ts and within min/max_ts. 129 * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. 130 */ 131 int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); 132 133 /** 134 * Returns device list with it properties. 135 * @see avdevice_list_devices() for more details. 136 */ 137 int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); 138 139 /** 140 * Initialize device capabilities submodule. 141 * @see avdevice_capabilities_create() for more details. 142 */ 143 int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); 144 145 /** 146 * Free device capabilities submodule. 147 * @see avdevice_capabilities_free() for more details. 148 */ 149 int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); 150 } AVInputFormat;
3.常见变量及其作用
const char *name;//格式名列表.也可以分配一个新名字。 const char *long_name;//格式的描述性名称,意味着比名称更易于阅读。 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;//文件扩展名 const AVClass *priv_class; //一个模拟类型列表.用来在probe的时候check匹配的类型。 struct AVInputFormat *next;//用于把所有支持的输入文件容器格式连接成链表,便于遍历查找。 int priv_data_size;//标示具体的文件容器格式对应的Context 的大小。 int (*read_probe)(AVProbeData *);//判断一个给定的文件是否有可能被解析为这种格式。 给定的buf足够大,所以你没有必要去检查它,除非你需要更多 。 int (*read_header)(struct AVFormatContext *);//读取format头并初始化AVFormatContext结构体,如果成功,返回0。创建新的流需要调用avformat_new_stream。 int (*read_header2)(struct AVFormatContext *, AVDictionary **options);//新加的函数指针,用于打开进一步嵌套输入的格式。 int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);//读取一个数据包并将其放在“pkt”中。 pts和flag也被设置。 int (*read_close)(struct AVFormatContext *);//关闭流。 AVFormatContext和Streams不会被此函数释放。 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单位中的下一个时间戳。 int (*read_play)(struct AVFormatContext *);//开始/继续播放 - 仅当使用基于网络的(RTSP)格式时才有意义。 int (*read_pause)(struct AVFormatContext *);//暂停播放 - 仅当使用基于网络的(RTSP)格式时才有意义。 int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);//寻求时间戳ts。 int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);返回设备列表及其属性。 int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);//初始化设备能力子模块。 int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);//释放设备能力子模块。
作者:YellowLayne
链接:https://www.jianshu.com/p/8e365f882fab
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 标签:AVFMT,struct,AVFormatContext,int,read,AVInputFormat,stream,结构,FFmpeg From: https://www.cnblogs.com/lizishaoye/p/18235605