青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

路漫漫,長修遠,我們不能沒有錢
隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
數據加載中……

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

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

探測數據結構:

/** 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的探測函數:

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


視頻讀首部函數:

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


原始地讀實際的包函數:

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


原始地寫包函數:

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函數注冊了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);
    /* 省略部分代碼 */
}


把注冊格式函數也貼出來吧:

/** 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://m.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 閱讀(1368) 評論(0)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺開發周邊技術

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲人在线视频| 怡红院精品视频| 午夜视频一区二区| 午夜精品久久久久久久蜜桃app | 久久香蕉国产线看观看网| 欧美一区三区三区高中清蜜桃 | 久久久综合精品| 久久综合图片| 欧美日韩一区在线观看视频| 国产精品人人爽人人做我的可爱| 国产精品一区二区久久| 国产最新精品精品你懂的| 伊人久久av导航| 一本色道久久综合亚洲精品小说| 亚洲免费影视第一页| 久久精品国产v日韩v亚洲 | 羞羞答答国产精品www一本| 久久久久国产一区二区三区| 欧美大片免费观看在线观看网站推荐| 欧美日韩成人在线| 狠狠久久五月精品中文字幕| 亚洲精品中文字幕女同| 欧美在线1区| 亚洲三级免费观看| 欧美伊人久久久久久午夜久久久久 | 老牛影视一区二区三区| 久久精品免视看| 久久久免费av| 极品尤物av久久免费看| 最新日韩精品| 先锋资源久久| 亚洲精品乱码| 久久国产毛片| 国产精品国产自产拍高清av| 亚洲第一天堂av| 久久国产手机看片| 日韩视频在线观看国产| 久久中文字幕导航| 国产一区三区三区| 午夜精品www| 日韩一区二区福利| 欧美精品一区二区三区四区| 精品999在线播放| 性色av一区二区三区| 亚洲精品欧洲| 欧美人妖在线观看| 亚洲肉体裸体xxxx137| 久久婷婷国产综合精品青草 | 在线中文字幕不卡| 欧美精品首页| 99亚洲视频| 亚洲国产视频一区| 欧美成人精品在线观看| 亚洲国产欧美在线人成| 米奇777超碰欧美日韩亚洲| 校园激情久久| 国产一区日韩二区欧美三区| 久久激情五月丁香伊人| 亚洲欧美日韩国产一区| 国产色产综合色产在线视频| 久久精品国产免费看久久精品| 亚洲综合大片69999| 国产女主播在线一区二区| 亚洲综合色婷婷| 亚洲一区二区三区涩| 国产精品美女久久久| 欧美一激情一区二区三区| 亚洲男人天堂2024| 韩国v欧美v日本v亚洲v| 欧美不卡福利| 欧美了一区在线观看| 亚洲一区二区三区精品动漫| 亚洲伊人久久综合| 黄色在线一区| 亚洲黄色免费| 国产精品国产一区二区| 久久精品国产亚洲a| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲三级国产| 亚洲一区国产视频| 国产综合久久久久久鬼色| 你懂的成人av| 欧美日韩视频不卡| 久久精品91久久香蕉加勒比| 久久免费精品视频| 亚洲一区二区高清| 亚洲最新视频在线播放| 亚洲片国产一区一级在线观看| 亚洲一区中文字幕在线观看| 国产手机视频一区二区| 亚洲第一精品在线| 国产精品s色| 欧美暴力喷水在线| 国产精品高清网站| 老巨人导航500精品| 欧美日韩视频在线一区二区观看视频 | 久久成人亚洲| 一区二区日韩伦理片| 性欧美暴力猛交另类hd| 亚洲麻豆国产自偷在线| 性8sex亚洲区入口| 亚洲视频综合| 久色婷婷小香蕉久久| 亚洲调教视频在线观看| 久久久噜噜噜久久狠狠50岁| 亚洲视频 欧洲视频| 久久婷婷人人澡人人喊人人爽| 亚洲欧美清纯在线制服| 免费永久网站黄欧美| 久久精品成人一区二区三区蜜臀| 欧美精品麻豆| 亚洲电影免费观看高清完整版在线 | 亚洲第一综合天堂另类专| 国产日韩av高清| 99精品视频免费全部在线| 亚洲国产精品专区久久| 欧美一区二区三区电影在线观看| 99视频一区二区三区| 久久在线免费视频| 老色批av在线精品| 国产专区综合网| 亚洲欧美日韩一区二区三区在线观看 | 在线看不卡av| 久久福利精品| 久久久久久欧美| 国产精品中文在线| 亚洲一区国产| 性色av一区二区三区| 国产精品久久久久99| 一区二区三区福利| aa级大片欧美三级| 欧美韩国在线| 亚洲看片一区| 亚洲女同精品视频| 国产精品视频免费在线观看| 亚洲在线一区二区三区| 性欧美xxxx大乳国产app| 国产精品久久久久久户外露出 | 欧美电影专区| 1000部国产精品成人观看| 欧美专区在线| 免费看亚洲片| 亚洲人成在线观看一区二区 | 欧美一级黄色录像| 久久成人这里只有精品| 国内精品**久久毛片app| 久久精品卡一| 免费欧美高清视频| 亚洲精品一区二区三区四区高清| 欧美成人一区二区三区| 日韩网站在线| 欧美中文在线观看| 亚洲国产欧美在线| 国产精品都在这里| 久久精品国产免费看久久精品| 欧美成人蜜桃| 亚洲欧美国产不卡| 有码中文亚洲精品| 欧美日韩色综合| 亚洲欧美日韩专区| 欧美电影专区| 午夜精品久久久久久久久久久久 | 在线成人中文字幕| 欧美大片免费久久精品三p | 亚洲高清久久| 亚洲视屏一区| 国产日韩在线播放| 欧美好骚综合网| 午夜视频在线观看一区二区三区| 美女啪啪无遮挡免费久久网站| 日韩手机在线导航| 国产欧美精品久久| 欧美乱妇高清无乱码| 午夜精品久久久久久久99水蜜桃| 亚洲国产成人av| 久久精品在线播放| 亚洲桃花岛网站| 91久久久久久| 国产色综合久久| 欧美三级电影一区| 免费久久99精品国产| 亚洲女人天堂av| 亚洲精品久久久久中文字幕欢迎你 | 国产伦精品一区二区三区| 蜜桃久久av| 欧美一区二区三区久久精品| 亚洲精品日韩在线观看| 快she精品国产999| 欧美伊人久久| 亚洲午夜极品| 日韩亚洲成人av在线| 影音先锋国产精品| 国产真实乱偷精品视频免| 国产精品区一区二区三| 欧美日韩1234| 欧美久久久久久| 欧美精品激情在线观看| 久久久久一区二区三区| 国产日韩欧美一区在线 | 午夜激情综合网|