hello,各位好,本人是一名嵌入式軟體工程師,目前正使用ffmpeg開發一款嵌入式多媒體播放器,《ffmpeg分析》系列博文是本人在閱讀ffmpeg原始碼時所做的筆記,希望對各位有點幫助。分析過程結合下面的例程:
一. 呼叫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函式為例:
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連成一個連結串列, 其它註冊函式與之類似, 就不多言了.
4. 上面呼叫了avcodec_init函式:
void avcodec_init(void) { static int initialized = 0;
if (initialized != 0) return; initialized = 1;
dsputil_static_init (); }
|
這個函式只會真正執行一次. 5. 上面呼叫了dsputil_static_init函式:
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; }
|
可以看到, 它初始化了一些靜態資料. 1.2 註冊所有的格式和外部庫及協議.
1. 下面列出與H264相關的註冊:
// 註冊分離器和混合器 REGISTER_MUXDEMUX (H264, h264);
// 註冊檔案協議 REGISTER_PROTOCOL (FILE, file);
|
2. 下面列出註冊宏:
#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); }
|
這些註冊函式與avcodec_register函式類似, 就不多言了. |
文章來自http://blog.chinaunix.net/u3/104564/showart_2369191.html |