ffmpeg-AVInputFormat解析

AVInputFormat是ffmpeg的解复用器对象,类似COM接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFormat 结构,在程序运行时有多个实例,位于avoformat.h文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
typedef struct AVInputFormat {
/**
* 格式的短名称
*/
const char *name;

/**
* 格式的长名称
*/
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;

/**
* 扩展定义,通常不使用扩展
*/
const char *extensions;

const struct AVCodecTag * const *codec_tag;

//一个模拟类型列表.用来在probe的时候check匹配的类型
const AVClass *priv_class; ///< AVClass for the private context

/**
* mime类型,如video/avc,在probing(探测)时需要检测
*/
const char *mime_type;

/*
* 用于把所有支持的输入文件容器格式连接成链表,便于遍历查找
*/
struct AVInputFormat *next;

/**
* 原始Demuxer存储的codec_id
*/
int raw_codec_id;

/**
* 标示具体的文件容器格式对应的Context的大小.
*/
int priv_data_size;

/**
* 判断一个给定的文件是否有可能被解析为这种格式
* 给定的buff足够大,所以你没有必要去检查它,除非你需要更多
*/
int (*read_probe)(AVProbeData *);

/**
* 读取format头并初始化AVFormatContext结构体,如果成功,返回0
* 创建新的流需要调用avformat_new_stream
*/
int (*read_header)(struct AVFormatContext *);

/**
* 读取一个packet并存入pkt指针中
*/
int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);

/**
* 关闭流
*/
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);

/**
* 获取stream [stream_index] .time_base单位中的下一个时间戳
*/
int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
int64_t *pos, int64_t pos_limit);

/**
* 开始/继续播放 - 仅当使用基于网络的(RTSP)格式时才有意义
*/
int (*read_play)(struct AVFormatContext *);

/**
* 暂停播放 - 仅当使用基于网络的(RTSP)格式时才有意义.
*/
int (*read_pause)(struct AVFormatContext *);

/**
* 快进/快退到指定时间戳
*/
int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);

/**
* 返回设备列表及其属性
*/
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);
} AVInputFormat;