2011-10-10 0:07:18
一. 调用av_register_all函数注册所有的格式和编码解码器.
1.1 先调用avcodec_register_all函数注册所有的编码解码器.
1. 下面列出与H264相关的注册:
// 注册硬件加速器
REGISTER_HWACCEL (H264_DXVA2, h264_dxva2);
REGISTER_HWACCEL (H264_VAAPI, h264_vaapi);
// 注册解码器
REGISTER_DECODER (H264, h264);
REGISTER_DECODER (H264_VDPAU, h264_vdpau);
// 注册编码器
REGISTER_ENCODER (LIBX264, libx264);
// 注册分析器
REGISTER_PARSER (H264, h264);
// 注册位流分离器
REGISTER_BSF (H264_MP4TOANNEXB, h264_mp4toannexb);
2. 下面列出注册宏:
#define REGISTER_HWACCEL(X,x) { \
extern AVHWAccel x##_hwaccel; \
if(CONFIG_##X##_HWACCEL) av_register_hwaccel(&x##_hwaccel); }
#define REGISTER_ENCODER(X,x) { \
extern AVCodec x##_encoder; \
if(CONFIG_##X##_ENCODER) avcodec_register(&x##_encoder); }
#define REGISTER_DECODER(X,x) { \
extern AVCodec x##_decoder; \
if(CONFIG_##X##_DECODER) avcodec_register(&x##_decoder); }
#define REGISTER_ENCDEC(X,x) REGISTER_ENCODER(X,x); REGISTER_DECODER(X,x)
#define REGISTER_PARSER(X,x) { \
extern AVCodecParser x##_parser; \
if(CONFIG_##X##_PARSER) av_register_codec_parser(&x##_parser); }
#define REGISTER_BSF(X,x) { \
extern AVBitStreamFilter x##_bsf; \
if(CONFIG_##X##_BSF) av_register_bitstream_filter(&x##_bsf); }
3. 分析一下注册函数, 以avcodec_register函数为例:
注册codec
void avcodec_register(AVCodec *codec)
{
AVCodec **p;
avcodec_init();
p = &first_avcodec;
while (*p != NULL) p = &(*p)->next;
*p = codec;
codec->next = NULL;
}
放到一个单链表中
可以看到avcodec_register函数把输入的AVCodec连成一个链表, 其它注册函数与之类似, 就不多言了.
一. 调用av_register_all函数注册所有的格式和编码解码器.
1.1 先调用avcodec_register_all函数注册所有的编码解码器.
1. 下面列出与H264相关的注册:
// 注册硬件加速器
REGISTER_HWACCEL (H264_DXVA2, h264_dxva2);
REGISTER_HWACCEL (H264_VAAPI, h264_vaapi);
// 注册解码器
REGISTER_DECODER (H264, h264);
REGISTER_DECODER (H264_VDPAU, h264_vdpau);
// 注册编码器
REGISTER_ENCODER (LIBX264, libx264);
// 注册分析器
REGISTER_PARSER (H264, h264);
// 注册位流分离器
REGISTER_BSF (H264_MP4TOANNEXB, h264_mp4toannexb);
2. 下面列出注册宏:
#define REGISTER_HWACCEL(X,x) { \
extern AVHWAccel x##_hwaccel; \
if(CONFIG_##X##_HWACCEL) av_register_hwaccel(&x##_hwaccel); }
#define REGISTER_ENCODER(X,x) { \
extern AVCodec x##_encoder; \
if(CONFIG_##X##_ENCODER) avcodec_register(&x##_encoder); }
#define REGISTER_DECODER(X,x) { \
extern AVCodec x##_decoder; \
if(CONFIG_##X##_DECODER) avcodec_register(&x##_decoder); }
#define REGISTER_ENCDEC(X,x) REGISTER_ENCODER(X,x); REGISTER_DECODER(X,x)
#define REGISTER_PARSER(X,x) { \
extern AVCodecParser x##_parser; \
if(CONFIG_##X##_PARSER) av_register_codec_parser(&x##_parser); }
#define REGISTER_BSF(X,x) { \
extern AVBitStreamFilter x##_bsf; \
if(CONFIG_##X##_BSF) av_register_bitstream_filter(&x##_bsf); }
3. 分析一下注册函数, 以avcodec_register函数为例:
注册codec
void avcodec_register(AVCodec *codec)
{
AVCodec **p;
avcodec_init();
p = &first_avcodec;
while (*p != NULL) p = &(*p)->next;
*p = codec;
codec->next = NULL;
}
放到一个单链表中
可以看到avcodec_register函数把输入的AVCodec连成一个链表, 其它注册函数与之类似, 就不多言了.