typedef struct AVCodec
{
// 标示Codec的名字,比如,"h264" "h263"等。
const char *name;
// 标示Codec的类型,有video,audio等类型。
enum CodecType type;
// 标示Codec的ID,有CODEC_ID_H264等。
enum CodecID id;
// 标示具体的Codec对应的Context的size,如:H264Context。
int priv_data_size;
// 以下标示Codec对外提供的操作,每一种解码器都会实现这些操作。
int(*init)(AVCodecContext*);
int(*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
int(*close)(AVCodecContext*);
int(*decode)(AVCodecContext *, void *outdata, int *outdata_size, uint8_t *buf, int buf_size);
struct AVCodec *next;
}AVCodec;
H264的主要结构的初始化如下:
AVCodec ff_h264_decoder = {
"h264",
AVMEDIA_TYPE_VIDEO,
CODEC_ID_H264,
sizeof(H264Context),
ff_h264_decode_init,
NULL,
ff_h264_decode_end,
decode_frame
}
说明:
AVCodec 是类似 COM接口的数据结构,表示音视频编解码器,着重于功能函数,一种媒体类型对应一个AVCodec结构,在程序运行时有多个实例。next变量用于把所有支持的编解码器连接成链表,便于遍历查找;id确定了 唯 一编 解 码器 ; priv_data_size表示具 体 的Codec对应的Context结构大 小 ,比 如MsrleContext 或TSContext,这些具体的结够定义散落于各个.c文件中,为避免太多的if else 类语句判断类型再计算大小,这里 就直接指明大小,因为这是一个编译时静态确定的字段,所以放在AVCodec而不是AVCodecContex t中。