• <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),我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
            數(shù)據(jù)加載中……

            ffmpeg分析系列之三(輸入輸出格式)

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

            探測(cè)數(shù)據(jù)結(jié)構(gòu):

            /** This structure contains the data a format has to probe a file. */
            typedef struct AVProbeData {
                const char *filename;
                unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */
                int buf_size; /**< Size of buf except extra allocated bytes */
            } AVProbeData;


            h264的探測(cè)函數(shù):

            static int h264_probe(AVProbeData *p)
            {
                uint32_t code= -1;
                int sps=0, pps=0, idr=0, res=0, sli=0;
                int i;

                for(i=0; i<p->buf_size; i++){
                    code = (code<<8) + p->buf[i];
                    if ((code & 0xffffff00) == 0x100) {
                        int ref_idc= (code>>5)&3;
                        int type = code & 0x1F;
                        static const int8_t ref_zero[32]={
                            2, 0, 0, 0, 0,-1, 1,-1,
                           -1, 1, 1, 1, 1,-1, 2, 2,
                            2, 2, 2, 0, 2, 2, 2, 2,
                            2, 2, 2, 2, 2, 2, 2, 2
                        };

                        if(code & 0x80) //forbidden bit

                            return 0;

                        if(ref_zero[type] == 1 && ref_idc)
                            return 0;
                        if(ref_zero[type] ==-&& !ref_idc)
                            return 0;
                        if(ref_zero[type] == 2)
                            res++;

                        switch(type){
                        case 1: sli++; break;
                        case 5: idr++; break;
                        case 7:
                            if(p->buf[i+2]&0x0F)
                                return 0;
                            sps++;
                            break;
                        case 8: pps++; break;
                        }
                    }
                }
                if(sps && pps && (idr||sli>3) && res<(sps+pps+idr))
                    return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg

                return 0;
            }


            視頻讀首部函數(shù):

            static int video_read_header(AVFormatContext *s,
                                         AVFormatParameters *ap)
            {
                AVStream *st;

                st = av_new_stream(s, 0);
                if (!st)
                    return AVERROR(ENOMEM);

                st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
                st->codec->codec_id = s->iformat->value;
                st->need_parsing = AVSTREAM_PARSE_FULL;

                /* for MJPEG, specify frame rate */
                /* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/
                if (ap->time_base.num) {
                    st->codec->time_base= ap->time_base;
                } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
                            st->codec->codec_id == CODEC_ID_MPEG4 ||
                            st->codec->codec_id == CODEC_ID_DIRAC ||
                            st->codec->codec_id == CODEC_ID_DNXHD ||
                            st->codec->codec_id == CODEC_ID_H264) {
                    st->codec->time_base= (AVRational){1,25};
                }
                av_set_pts_info(st, 64, 1, 1200000);

                return 0;
            }


            原始地讀實(shí)際的包函數(shù):

            int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
            {
                int ret, size;

                size = RAW_PACKET_SIZE;

                if (av_new_packet(pkt, size) < 0)
                    return AVERROR(ENOMEM);

                pkt->pos= url_ftell(s->pb);
                pkt->stream_index = 0;
                ret = get_partial_buffer(s->pb, pkt->data, size);
                if (ret < 0) {
                    av_free_packet(pkt);
                    return ret;
                }
                pkt->size = ret;
                return ret;
            }


            原始地寫包函數(shù):

            static int raw_write_packet(struct AVFormatContext *s, AVPacket *pkt)
            {
                put_buffer(s->pb, pkt->data, pkt->size);
                put_flush_packet(s->pb);
                return 0;
            }


            h264混合器:

            AVOutputFormat h264_muxer = {
                "h264",
                NULL_IF_CONFIG_SMALL("raw H.264 video format"),
                NULL,
                "h264",
                0,
                CODEC_ID_NONE,
                CODEC_ID_H264,
                NULL,
                raw_write_packet,
                .flags= AVFMT_NOTIMESTAMPS,
            };



            h264分離器:

            AVInputFormat h264_demuxer = {
                "h264",
                NULL_IF_CONFIG_SMALL("raw H.264 video format"),
                0,
                h264_probe,
                video_read_header,
                ff_raw_read_partial_packet,
                .flags= AVFMT_GENERIC_INDEX,
                .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
                .value = CODEC_ID_H264,
            }


            libavformat/allformats.c文件的av_register_all函數(shù)注冊(cè)了h264分離器和混合器:

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


            void av_register_all(void)
            {
                /* 省略部分代碼 */
                /* protocols */
                REGISTER_MUXDEMUX (H264, h264);
                /* 省略部分代碼 */
            }


            把注冊(cè)格式函數(shù)也貼出來吧:

            /** head of registered input format linked list */
            AVInputFormat *first_iformat = NULL;
            /** head of registered output format linked list */
            AVOutputFormat *first_oformat = NULL;


            void av_register_input_format(AVInputFormat *format)
            {
                AVInputFormat **p;
                p = &first_iformat;
                while (*!= NULL) p = &(*p)->next;
                *= format;
                format->next = NULL;
            }

            void av_register_output_format(AVOutputFormat *format)
            {
                AVOutputFormat **p;
                p = &first_oformat;
                while (*!= NULL) p = &(*p)->next;
                *= format;
                format->next = NULL;
            }

            @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:24 Khan 閱讀(1347) 評(píng)論(0)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺(tái)開發(fā)周邊技術(shù)

            亚洲人成精品久久久久| 97精品国产97久久久久久免费| 久久久免费观成人影院| 色综合久久久久| 尹人香蕉久久99天天拍| 亚洲精品午夜国产va久久| 狠狠色狠狠色综合久久| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久亚洲私人国产精品vA| 久久精品国产亚洲精品2020| 亚洲狠狠综合久久| 热RE99久久精品国产66热| 少妇高潮惨叫久久久久久| 精品久久人人爽天天玩人人妻| 日韩久久久久久中文人妻| 久久这里只精品99re66| 中文字幕无码久久精品青草| 中文成人无码精品久久久不卡 | 91视频国产91久久久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 一级做a爰片久久毛片看看| 色99久久久久高潮综合影院| 色婷婷狠狠久久综合五月| 亚洲国产日韩欧美综合久久| 区久久AAA片69亚洲 | 色综合久久中文色婷婷| 精品久久久久久国产91| 婷婷国产天堂久久综合五月| 国产香蕉久久精品综合网| 久久天堂AV综合合色蜜桃网 | 亚洲色婷婷综合久久| 久久久久AV综合网成人| 久久国产一区二区| 久久一区二区三区99| 亚洲国产精品久久电影欧美| 久久久久亚洲AV无码专区体验| 久久九九青青国产精品| 亚洲а∨天堂久久精品9966| 亚洲国产精品无码成人片久久| 青青草原综合久久大伊人精品| 久久嫩草影院免费看夜色|