ffmpeg源代码简单分析 :avcodec_decode_video2()

2023-11-23 04:58

本文主要是介绍ffmpeg源代码简单分析 :avcodec_decode_video2(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

avcodec_decode_video2()的函数实现如下所示:

int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,int *got_picture_ptr,const AVPacket *avpkt)
{AVCodecInternal *avci = avctx->internal;int ret;// copy to ensure we do not change avpktAVPacket tmp = *avpkt;if (!avctx->codec)return AVERROR(EINVAL);if (avctx->codec->type != AVMEDIA_TYPE_VIDEO) {av_log(avctx, AV_LOG_ERROR, "Invalid media type for video\n");return AVERROR(EINVAL);}*got_picture_ptr = 0;if ((avctx->coded_width || avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx))return AVERROR(EINVAL);avcodec_get_frame_defaults(picture);if (!avctx->refcounted_frames)av_frame_unref(&avci->to_free);if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type & FF_THREAD_FRAME)) {int did_split = av_packet_split_side_data(&tmp);apply_param_change(avctx, &tmp);avctx->pkt = &tmp;if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)ret = ff_thread_decode_frame(avctx, picture, got_picture_ptr,&tmp);else {ret = avctx->codec->decode(avctx, picture, got_picture_ptr,&tmp);picture->pkt_dts = avpkt->dts;if(!avctx->has_b_frames){av_frame_set_pkt_pos(picture, avpkt->pos);}//FIXME these should be under if(!avctx->has_b_frames)/* get_buffer is supposed to set frame parameters */if (!(avctx->codec->capabilities & CODEC_CAP_DR1)) {if (!picture->sample_aspect_ratio.num)    picture->sample_aspect_ratio = avctx->sample_aspect_ratio;if (!picture->width)                      picture->width               = avctx->width;if (!picture->height)                     picture->height              = avctx->height;if (picture->format == AV_PIX_FMT_NONE)   picture->format              = avctx->pix_fmt;}}add_metadata_from_side_data(avctx, picture);emms_c(); //needed to avoid an emms_c() call before every return;avctx->pkt = NULL;if (did_split) {av_packet_free_side_data(&tmp);if(ret == tmp.size)ret = avpkt->size;}if (ret < 0 && picture->data[0])av_frame_unref(picture);if (*got_picture_ptr){if (!avctx->refcounted_frames) {avci->to_free = *picture;avci->to_free.extended_data = avci->to_free.data;memset(picture->buf, 0, sizeof(picture->buf));}avctx->frame_number++;av_frame_set_best_effort_timestamp(picture,guess_correct_pts(avctx,picture->pkt_pts,picture->pkt_dts));}} elseret = 0;/* many decoders assign whole AVFrames, thus overwriting extended_data;* make sure it's set correctly */picture->extended_data = picture->data;return ret;
}
该函数的输入和输出参数分别为 const AVPacket *avpkt和 AVFrame *picture,分别表示待解码的码流和解码完成后的音视频信号,函数的核心是 ret = avctx->codec->decode(avctx, picture, got_picture_ptr,  &tmp),调用预定义好的解码器进行解码。

这篇关于ffmpeg源代码简单分析 :avcodec_decode_video2()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415493

相关文章

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四