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(AVCodecContext *codec,
                                  const AVCodecParameters *par)
{
    codec->codec_type = par->codec_type;//AVMEDIA_TYPE_VIDEO
    codec->codec_id   = par->codec_id;//AV_CODEC_ID_H264
    codec->codec_tag  = par->codec_tag;//0

codec->bit_rate              = par->bit_rate;//0
    codec->bits_per_coded_sample = par->bits_per_coded_sample;//0
    codec->bits_per_raw_sample   = par->bits_per_raw_sample;//8
    codec->profile               = par->profile;//66
    codec->level                 = par->level;//42

switch (par->codec_type) {
    case AVMEDIA_TYPE_VIDEO:
        codec->pix_fmt                = par->format;//12
        codec->width                  = par->width;//1920
        codec->height                 = par->height;//1080
        codec->field_order            = par->field_order;//AV_FIELD_PROGRESSIVE
        codec->color_range            = par->color_range;//AVCOL_RANGE_JPEG
        codec->color_primaries        = par->color_primaries;//AVCOL_PRI_BT709
        codec->color_trc              = par->color_trc;//AVCOL_TRC_BT709
        codec->colorspace             = par->color_space;//AVCOL_SPC_BT709
        codec->chroma_sample_location = par->chroma_location;//AVCHROMA_LOC_LEFT
        codec->sample_aspect_ratio    = par->sample_aspect_ratio;//num=0,den=1
        codec->has_b_frames           = par->video_delay;//0
        break;
    case AVMEDIA_TYPE_AUDIO:
        codec->sample_fmt       = par->format;
        codec->channel_layout   = par->channel_layout;
        codec->channels         = par->channels;
        codec->sample_rate      = par->sample_rate;
        codec->block_align      = par->block_align;
        codec->frame_size       = par->frame_size;
        codec->delay            =
        codec->initial_padding  = par->initial_padding;
        codec->trailing_padding = par->trailing_padding;
        codec->seek_preroll     = par->seek_preroll;
        break;
    case AVMEDIA_TYPE_SUBTITLE:
        codec->width  = par->width;
        codec->height = par->height;
        break;
    }

//extradata保存SPS/PPS信息
    if (par->extradata) {
        av_freep(&codec->extradata);
        codec->extradata = av_mallocz(par->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
        if (!codec->extradata)
            return AVERROR(ENOMEM);
        memcpy(codec->extradata, par->extradata, par->extradata_size);
        codec->extradata_size = par->extradata_size;
    }

return 0;
}

说明:
当手动指定编码格式的时候,说明探测码流格式的代码是可以省略的,例如
avformat_open_input
avformat_find_stream_info

avformat_open_input缺省情况下,无法播放图像

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

时间: 2024-11-05 22:39:09

FFmpeg avcodec_parameters_to_context函数剖析的相关文章

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 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_al

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,                        

自执行匿名函数剖析

引入 在很多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函数