博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FFmpeg h264_probe函数剖析
阅读量:7144 次
发布时间:2019-06-29

本文共 2792 字,大约阅读时间需要 9 分钟。

函数调用

avformat_open_input
s->iformat->read_header(s)

函数说明

/**

  • Read the format header and initialize the AVFormatContext
  • structure. Return 0 if OK. 'avformat_new_stream' should be
  • called to create new streams.
    /
    int (
    read_header)(struct AVFormatContext *);

从read_header函数调用,去探测h264的码流格式,流程是怎么样的有待研究

代码说明
static int h264_probe(AVProbeData *p)
{
uint32_t code = -1;
int sps = 0, pps = 0, idr = 0, res = 0, sli = 0;
int i, ret;
int pps_ids[MAX_PPS_COUNT+1] = {0};
int sps_ids[MAX_SPS_COUNT+1] = {0};
unsigned pps_id, sps_id;
GetBitContext gb;

for (i = 0; i + 2 < 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[] = {             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] == -1 && !ref_idc)            return 0;        if (ref_zero[type] == 2) {            if (!(code == 0x100 && !p->buf[i + 1] && !p->buf[i + 2]))                res++;        }        ret = init_get_bits8(&gb, p->buf + i + 1, p->buf_size - i - 1);        if (ret < 0)            return 0;        switch (type) {        case 1:        case 5:            get_ue_golomb_long(&gb);            if (get_ue_golomb_long(&gb) > 9U)                return 0;            pps_id = get_ue_golomb_long(&gb);            if (pps_id > MAX_PPS_COUNT)                return 0;            if (!pps_ids[pps_id])                break;            if (type == 1)                sli++;            else                idr++;            break;        case 7:            skip_bits(&gb, 14);            if (get_bits(&gb, 2))                return 0;            skip_bits(&gb, 8);            sps_id = get_ue_golomb_long(&gb);            if (sps_id > MAX_SPS_COUNT)                return 0;            sps_ids[sps_id] = 1;            sps++;            break;        case 8:            pps_id = get_ue_golomb_long(&gb);            if (pps_id > MAX_PPS_COUNT)                return 0;            sps_id = get_ue_golomb_long(&gb);            if (sps_id > MAX_SPS_COUNT)                return 0;            if (!sps_ids[sps_id])                break;            pps_ids[pps_id] = 1;            pps++;            break;        }    }}ff_tlog(NULL, "sps:%d pps:%d idr:%d sli:%d res:%d\n", sps, pps, idr, sli, res);if (sps && pps && (idr || sli > 3) && res < (sps + pps + idr))    return AVPROBE_SCORE_EXTENSION + 1;  // 1 more than .mpgreturn 0;

}

参考

     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/2043501,如需转载请自行联系原作者

你可能感兴趣的文章
[译] 如何在无损的情况下让图片变的更小
查看>>
Android 开发实用小技巧
查看>>
聊聊sentinel的SentinelWebAutoConfiguration
查看>>
JB的Python之旅-爬取phizhub网站
查看>>
仿制支付宝刮刮卡
查看>>
Xcode9 自动上传Fir
查看>>
JavaScript异步流程控制的前世今生
查看>>
通过static关键词来实现late static binding(静态调用绑定)
查看>>
Android小知识-OkHttp的两种请求方式
查看>>
使用Node.js开发REST APIs的10个最佳实践(翻译)
查看>>
目前传销和诈骗的虚拟货币有哪些?
查看>>
RxJava2源码分析(一):基本流程分析
查看>>
iOS两种颜色的线性渐变 --DDGBannerScrollView
查看>>
实战PHP数据结构基础之栈
查看>>
大数据与云计算的关系,Hadoop、Nosql如何参与其中?
查看>>
HTML5拖放的详解以及实例分享
查看>>
阿里巴巴前端工程师一面二面三面终面面经总结
查看>>
Python正则表达式初识(七)
查看>>
Cocos Creator踩坑日记(一)
查看>>
webpack之代码拆分
查看>>