11.AVCodec 结构体

AVCodec 结构体

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 = {
    .name                  = "h264",
    .long_name             = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
    .type                  = AVMEDIA_TYPE_VIDEO,
    .id                    = AV_CODEC_ID_H264,
    .priv_data_size        = sizeof(H264Context),
    .init                  = h264_decode_init,
    .close                 = h264_decode_end,
    .decode                = h264_decode_frame,
    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING,
    .flush                 = flush_dpb,
    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
    .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context),
    .profiles              = NULL_IF_CONFIG_SMALL(ff_h264_profiles),
    .priv_class            = &h264_class,
};

说明:
AVCodec 是类似 COM 接口的数据结构,表示音视频编解码器,着重于功能函数,
一种媒体类型对应一个 AVCodec 结构,在程序运行时有多个实例。
next 变量用于把所有支持的编解码器连接成链表,便于遍历查找;
id 确定了 唯 一编 解 码器 ;
priv_data_size 表示具 体 的 Codec 对应的 Context 结构大小 ,
比如 MsrleContext 或 TSContext,这些具体的结够定义散落于各个.c 文件中,
为避免太多的 if else 类语句判断类型再计算大小,这里就直接指明大小,
因为这是一个编译时静态确定的字段,所以放在 AVCodec 而不是 AVCodecContext 中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值