当前位置: 首页 > news >正文

FFmpeg 基本API avcodec_send_packet函数内部调用流程分析

1、avcodec_send_packet函数定义

avcodec_send_packet 是 FFmpeg 多媒体处理框架中的核心函数,属于其解码 API 的关键组成部分。
其主要功能是解码器输入函数:负责向解码器提交压缩数据包(AVPacket),现代解码 API 核心:取代旧版 avcodec_decode_video2/avcodec_decode_audio4 所属模块:libavcodec 库(编解码器核心库)。

int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
  • attribute_align_arg:编译器属性,确保栈对齐(x86架构重要优化)
  • 返回值:int 类型错误码(0=成功,负值=错误)
  • 参数:
    • avctx:编解码器上下文,包含解码器状态和配置
    • avpkt:输入数据包(可为NULL表示刷新解码器)

2、avcodec_send_packet函数流程分析

2.1 参数验证阶段

  • 检查编解码器是否已打开:!avcodec_is_open(avctx)
  • 检查是否为解码器:!av_codec_is_decoder(avctx->codec)
  • 无效数据包检查:avpkt && !avpkt->size && avpkt->data

2.2 状态检查

  • 如果正在draining(刷新状态):dc->draining_started,直接返回AVERROR_EOF

2.3 数据包处理

  • 当收到有效数据包时(有数据或边数据):
    • 检查内部缓冲区是否为空:!AVPACKET_IS_EMPTY(avci->buffer_pkt)
    • 如果缓冲区非空,返回EAGAIN(要求先处理缓冲帧)
    • 缓冲区为空则复制数据包:av_packet_ref(avci->buffer_pkt, avpkt)
  • 当收到空包(draining信号):
    • 设置dc->draining_started = 1 开始刷新解码器

2.4 解码触发

  • 检查缓冲区帧是否为空:!avci->buffer_frame->buf[0]
  • 检查是否非draining状态:!dc->draining_started
  • 满足条件时调用decode_receive_frame_internal()

2.5 返回结果

  • 成功返回0
  • 错误返回相应错误码
    具体源码分析如下:
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
{// 获取内部结构体指针AVCodecInternal *avci = avctx->internal;DecodeContext     *dc = decode_ctx(avci);int ret;// 1. 基本参数校验if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))return AVERROR(EINVAL);// 2. 检查draining状态if (dc->draining_started)return AVERROR_EOF;// 3. 数据包有效性检查if (avpkt && !avpkt->size && avpkt->data)return AVERROR(EINVAL);// 4. 有效数据包处理if (avpkt && (avpkt->data || avpkt->side_data_elems)) {// 4.1 检查缓冲区是否已满if (!AVPACKET_IS_EMPTY(avci->buffer_pkt))return AVERROR(EAGAIN);// 4.2 复制数据包到内部缓冲区ret = av_packet_ref(avci->buffer_pkt, avpkt);if (ret < 0)return ret;} // 5. 处理draining信号(空包)else {dc->draining_started = 1;}// 6. 触发解码(非draining状态且缓冲区有空位)if (!avci->buffer_frame->buf[0] && !dc->draining_started) {ret = decode_receive_frame_internal(avctx, avci->buffer_frame);// 只处理严重错误(忽略EAGAIN和EOF)if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)return ret;}return 0;
}

3、avcodec_send_packet函数内部调用流程

在这里插入图片描述

http://www.dtcms.com/a/503589.html

相关文章:

  • 手机建站网站常德营销型网站建设
  • Flutter 与原生混合编程
  • DevOps 与 部署入门:加速软件交付与运维的实践指南
  • 优化网站seo中山做百度网站的公司名称
  • 上海袜网站建设电商营业执照
  • 找到K个最接近的元素
  • Java中JDK、JRE、JVM概念
  • MySQL 表操作核心指南:CRUD 与进阶技巧
  • 网站开发个人总结网页设计与网站建设在线考试1
  • 算法笔记 05
  • 游戏科技网站杭州建设工程交易中心网站
  • 网站做推广要备案吗四川seo快速排名
  • 有关房地产开发建设的网站哪些网站可以接点私活做的
  • 有关应广单片机数据类型与ROM空间优化的一点看法
  • 【2026计算机毕业设计】基于Jsp的医疗设备及业务综合巡检系统
  • 个人业务技能提升如何助力:从“做事”到“成事”的跃迁之路
  • 我们需要的中文编程是什么样子的?
  • 那些网站可以接私活做做兼职有哪些网站
  • 绚星智慧科技斩获智享会三项大奖,领跑AI时代学习与发展赛道
  • 零基础入门Java·基础篇 学习大纲
  • XSS 攻击详解:原理、类型与防范策略
  • 青岛网站建设 百度天津基础设施建设
  • 内蒙古住房和建设厅网站wordpress会员修改
  • 网站排名优化教程wordpress themes.php
  • 机器学习18:扩散模型(Diffusion Model)与Stable Diffusion
  • 17-机器学习与大模型开发数学教程-第1章 1-9 凸函数与凸优化基础
  • 空间建设网站企业建站程序推荐
  • 网站建设 点指成名网站开发调查问卷
  • 【经典书籍】C++ Primer 第10到12章精华讲解
  • 前端数据存储localStorage、sessionStorage 与 Cookie