FFmpeg init_input函数剖析

函数调用逻辑
avformat_open_input
       init_input
            av_probe_input_buffer2

函数原型

static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)

函数说明
主要是调用av_probe_input_buffer2函数探测码流格式。AVFormatContext结构体flags变量,在经过avformat_alloc_context创建AVFormatContext结构体对象指针之后,flags值是0x200000(AVFMT_FLAG_AUTO_BSF),含义是等待包数据然后确定码流的文件格式,或者是添加一个字节流的过滤器(Wait for packet data before writing a header, and add bitstream filters as requested by the muxer)
AVFMT_FLAG_DISCARD_CORRUPT  0x0100 ///< Discard frames marked corrupted
AVInputFormat结构体flags变量,在经过av_find_input_format("h264"),返回之后flags的值是0x0100(AVFMT_FLAG_DISCARD_CORRUPT)(Discard frames marked corrupted)

函数代码
static int init_input(AVFormatContext *s, const char *filename,
                      AVDictionary **options)
{
    int ret;
    AVProbeData pd = { filename, NULL, 0 };
    int score = AVPROBE_SCORE_RETRY;

if (s->pb) {
//当前的flags是0x200000
        s->flags |= AVFMT_FLAG_CUSTOM_IO;
//iformat指定h264码流格式之后,不为NULL
        if (!s->iformat)
            return av_probe_input_buffer2(s->pb, &s->iformat, filename,
                                         s, 0, s->format_probesize);
//s->iformat->flags & AVFMT_NOFILE值为真,但是并没有在日志文件中打印出来Custom AVIOContext makes no sense
        else if (s->iformat->flags & AVFMT_NOFILE)
            av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
                                      "will be ignored with AVFMT_NOFILE format.\n");
        return 0;
    }

if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
        (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
        return score;

if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
        return ret;

if (s->iformat)
        return 0;
    return av_probe_input_buffer2(s->pb, &s->iformat, filename,
                                 s, 0, s->format_probesize);
}

原文地址:http://blog.51cto.com/fengyuzaitu/2055123

时间: 2025-02-01 19:57:53

FFmpeg init_input函数剖析的相关文章

FFmpeg avio_alloc_context函数剖析

函数原型AVIOContext *avio_alloc_context(                  unsigned char *buffer,                  int buffer_size,                  int write_flag,                  void *opaque,                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_siz

FFmpeg av_probe_input_buffer函数剖析以及优化

函数调用关系av_probe_input_buffer调用av_probe_input_buffer2进行整一个码流格式的分析过程.其中调用avio_read进行码流数据的读取,将缓存数据保存在AVProbeData定义的buf里面,然后调用av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)函数去猜测码流格式,其中包裹最终的调用函数av_probe_input_format3. 优化方向如果知道AVInpu

FFmpeg mov_read_ftyp函数剖析

函数说明 读取文件格式,最小版本以及兼容格式,然后存储到metadata,metadata作为AVFormatContext成员变量,可以通过t = av_dict_get(pAVFormatContext->metadata, "major_brand", NULL, AV_DICT_IGNORE_SUFFIX);查看文件格式 /* read major brand, minor version and compatible brands and store them as m

FFmpeg ff_h264_parse_sprop_parameter_sets函数剖析

SDP中SPS内容        sprop-parameter-sets=Z0IAKpY1QPAET8s3AQEBQAABwgAAV+QB,aM48gA== 该函数主要是读取Z0IAKpY1QPAET8s3AQEBQAABwgAAV+QB的内容到data_ptr,一共32个字节还没有读取SPS的每一个字段,然后赋值给SPS相应的字段int ff_h264_parse_sprop_parameter_sets(AVFormatContext *s,                        

FFmpeg avcodec_parameters_to_context函数剖析

函数说明    将AVCodecParameters结构体中码流参数拷贝到AVCodecContext结构体中,并且重新拷贝一份extradata内容,涉及到的视频的关键参数有format, width, height, codec_type等,这些参数在优化avformat_find_stream_info函数的时候,手动指定该参数通过InitDecoder函数解码统一指定H264,分辨率是1920*1080 int avcodec_parameters_to_context(AVCodecC

自执行匿名函数剖析

引入 在很多js代码中我们常常会看见这样一种写法: (function( window, undefined ) { // code })(window); 这种写法我们称之为自执行匿名函数(self-executing anonymous function). 正如它的名字一样,它是自己执行自己的,前一个括号是一个匿名函数,后一个括号代表立即执行. 函数和函数表达式的区别 语法 function keqing(){ //函数 alert('Hi~'); } var keqing = funct

ffmpeg.c函数结构简单分析(画图)

前一阵子研究转码的时候看了FFmpeg的源代码.由于ffmpeg.c的代码相对比较长,而且其中有相当一部分是AVFilter有关的代码(这一部分一直不太熟),因此之前学习FFmpeg的时候一直也没有好好看一下其源代码.最近正好看了看AVFilter的知识,顺便就看了下FFmpeg的源代码,在这里画图理一下它的结构.目前好多地方还没有弄明白,等到以后慢慢完善了. 先说明一下自己画的结构图的规则:图中仅画出了比较重要的函数之间的调用关系.粉红色的函数是FFmpeg编解码类库(libavcodec,l

power(乘幂)函数剖析

近来学习STL,看到power函数的实现感觉挺有趣,记录一下. 1. 一般情况下,我自己要实现乘幂函数会这样实现: int power(int x,size_t n) { int result = 1; while (n--) result *= x; return result; } 这样即使实现,这里的时间复杂度和n有关,时间复杂度为0(n). 2. 看了stl源码实现是这样: // Returns __x ** __n, where __n >= 0. _Note that "mul

STM32的GPIO使用的函数剖析

转载http://blog.csdn.net/wuwuhuizheyisheng/article/details/8239599 STM32的GPIO总结 作者:JCY 该文是自己学习了一段STM32后所写,是对STM32使用固件库编程最简单的一段程序,是对固件库函数的一部分进行解析.如有错误之处请指正,不胜感激. 一. GPIO_Init函数解析 1 1.参数GPIO_TypeDef 1 2.参数GPIO_InitStruct 2 3.函数代码详解 4 4.备注 6 一.GPIO_Init函数