• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

            路漫漫,長(zhǎng)修遠(yuǎn),我們不能沒(méi)有錢
            隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
            數(shù)據(jù)加載中……

            ffmpeg分析系列之一(注冊(cè)該注冊(cè)的)(轉(zhuǎn)載)

             (不知原始出處, 方便請(qǐng)告知, 此處轉(zhuǎn)載于 http://hi.baidu.com/monkeyifox)

            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);

            posted on 2012-12-14 01:18 Khan 閱讀(1264) 評(píng)論(0)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺(tái)開發(fā)周邊技術(shù)

            国产成人精品久久| 精品综合久久久久久98| 久久国产成人亚洲精品影院| 久久精品国产亚洲Aⅴ香蕉| 伊人久久大香线蕉综合网站| 国内精品久久久人妻中文字幕| 狠狠色丁香婷婷综合久久来| 日韩精品久久久久久久电影| 精品国产VA久久久久久久冰| 久久性生大片免费观看性| 亚洲香蕉网久久综合影视 | 93精91精品国产综合久久香蕉| 婷婷国产天堂久久综合五月| 久久综合久久综合久久| 亚洲AV无码久久| 四虎影视久久久免费观看| 久久综合狠狠色综合伊人| 久久99久久99精品免视看动漫| 久久99精品九九九久久婷婷| 久久99国产综合精品免费| 婷婷国产天堂久久综合五月| 国产综合精品久久亚洲| 潮喷大喷水系列无码久久精品| 久久成人国产精品免费软件| 久久免费视频一区| 国产精品青草久久久久福利99| 久久精品国产亚洲AV大全| 久久久久久久久久久精品尤物| 久久综合九色欧美综合狠狠| 7国产欧美日韩综合天堂中文久久久久| 亚洲精品乱码久久久久久中文字幕 | 综合久久一区二区三区 | 久久久久久亚洲精品不卡 | 日韩精品无码久久久久久| 亚洲另类欧美综合久久图片区| 久久99精品免费一区二区| 国产成人久久精品二区三区| 久久最近最新中文字幕大全| 色偷偷888欧美精品久久久| 99国产精品久久久久久久成人热| 久久综合狠狠综合久久|