hello,各位好,本人是一名嵌入式軟件工程師,目前正使用ffmpeg開發(fā)一款嵌入式多媒體播放器,《ffmpeg分析》系列博文是本人在閱讀ffmpeg源代碼時(shí)所做的筆記,希望對(duì)各位有點(diǎn)幫助。分析過(guò)程結(jié)合下面的例程: http://dranger.com/ffmpeg/tutorial05.c 一. 調(diào)用av_register_all函數(shù)注冊(cè)所有的格式和編碼解碼器. 1.1 先調(diào)用avcodec_register_all函數(shù)注冊(cè)所有的編碼解碼器. 1. 下面列出與H264相關(guān)的注冊(cè):
// 注冊(cè)硬件加速器
REGISTER_HWACCEL (H264_DXVA2, h264_dxva2);
REGISTER_HWACCEL (H264_VAAPI, h264_vaapi);
// 注冊(cè)解碼器
REGISTER_DECODER (H264, h264);
REGISTER_DECODER (H264_VDPAU, h264_vdpau);
// 注冊(cè)編碼器
REGISTER_ENCODER (LIBX264, libx264);
// 注冊(cè)分析器
REGISTER_PARSER (H264, h264);
// 注冊(cè)位流分離器
REGISTER_BSF (H264_MP4TOANNEXB, h264_mp4toannexb);
2. 下面列出注冊(cè)宏:
#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. 分析一下注冊(cè)函數(shù), 以avcodec_register函數(shù)為例:
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函數(shù)把輸入的AVCodec連成一個(gè)鏈表, 其它注冊(cè)函數(shù)與之類似, 就不多言了.
4. 上面調(diào)用了avcodec_init函數(shù):
void avcodec_init(void)
{
static int initialized = 0;
if (initialized != 0)
return;
initialized = 1;
dsputil_static_init ();
}
這個(gè)函數(shù)只會(huì)真正執(zhí)行一次. 5. 上面調(diào)用了dsputil_static_init函數(shù):
av_cold void dsputil_static_init(void)
{
int i;
for(i=0;i<256;i++) ff_cropTbl[i + MAX_NEG_CROP] = i;
for(i=0;i<MAX_NEG_CROP;i++) {
ff_cropTbl[i] = 0;
ff_cropTbl[i + MAX_NEG_CROP + 256] = 255;
}
for(i=0;i<512;i++) {
ff_squareTbl[i] = (i - 256) * (i - 256);
}
for(i=0; i<64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1;
}
可以看到, 它初始化了一些靜態(tài)數(shù)據(jù). 1.2 注冊(cè)所有的格式和外部庫(kù)及協(xié)議.
1. 下面列出與H264相關(guān)的注冊(cè):
// 注冊(cè)分離器和混合器
REGISTER_MUXDEMUX (H264, h264);
// 注冊(cè)文件協(xié)議
REGISTER_PROTOCOL (FILE, file);
2. 下面列出注冊(cè)宏:
#define REGISTER_MUXER(X,x) { \
extern AVOutputFormat x##_muxer; \
if(CONFIG_##X##_MUXER) av_register_output_format(&x##_muxer); }
#define REGISTER_DEMUXER(X,x) { \
extern AVInputFormat x##_demuxer; \
if(CONFIG_##X##_DEMUXER) av_register_input_format(&x##_demuxer); }
#define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)
#define REGISTER_PROTOCOL(X,x) { \
extern URLProtocol x##_protocol; \
if(CONFIG_##X##_PROTOCOL) av_register_protocol(&x##_protocol); }
這些注冊(cè)函數(shù)與avcodec_register函數(shù)類似, 就不多言了.
@import url(http://www.shnenglu.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);