【音视频】ffplay源码解析-PacketQueue队列

2023-09-17 15:14:31

包队列架构位置

在这里插入图片描述


对应结构体源码

MyAVPacketList
typedef struct MyAVPacketList {
    AVPacket		pkt;    //解封装后的数据
    struct MyAVPacketList	*next;  //下一个节点
    int			serial;     //播放序列
} MyAVPacketList;
PacketQueue
typedef struct PacketQueue {
    MyAVPacketList	*first_pkt, *last_pkt;  // 队首,队尾指针
    int		nb_packets;   // 包数量,也就是队列元素数量
    int		size;         // 队列所有元素的数据大小总和
    int64_t		duration; // 队列所有元素的数据播放持续时间
    int		abort_request; // 用户退出请求标志
    int		serial;         // 播放序列号,和MyAVPacketList的serial作用相同,但改变的时序稍微有点不同
    SDL_mutex	*mutex;     // 用于维持PacketQueue的多线程安全(SDL_mutex可以按pthread_mutex_t理解)
    SDL_cond	*cond;      // 用于读、写线程相互通知(SDL_cond可以按pthread_cond_t理解)
} PacketQueue;

内存管理

  • 内部是一个链表队列MyAVPacketList,存放数据包
    • 链表队列适用于不确定缓存区具体大小的情形
  • 完全由PacketQueue维护管理
    • 放节点 put时malloc
    • 取节点 get时free
  • 锁机制——线程安全
    • put前后,加锁解锁
    • get前后,加锁解锁
  • 写端位于解复用线程,读端位于解码线程

serial字段

  • 为了区分seek前后的连续帧

  • 做法:seek之后,后一段的put节点serial+1

  • 场景

    用户拖动进度条,seek操作,之前缓存的帧不能播放了,要播放seek操作之后新缓存的帧,
    为了区别2段帧,加入serial字段
    

队列大小设置

PacketQueue 是一种链表式的队列

  • 内存充足情况下:可以不限制将数据包放入队列中,不需要考虑队列的大小。
  • 控制队列大小:如果我们需要控制队列的大小,我们可以使用以下三个变量来限制队列节点的数量:
    • size:控制队列中数据包的总大小。
    • duration:控制队列中数据包的总播放时间。
    • nb_packets:控制队列中数据包的数量。

更多推荐

【双系统】忘记Ubuntu登录密码,应该重装系统还是换新电脑?

电脑装的双系统,但是好几个月都用的是服务器,并没有用本地电脑的另一个系统(Ubuntu20.04)。开机不小心选到了Ubuntu,结果却忘记了登录密码。文章目录一、修改登录密码二、删除/解锁秘钥环三、Linux系统的root用户密码问题一、修改登录密码通过以下步骤来重置密码:重启你的电脑。在GRUB加载页面时,按下Sh

.Net IDE智能提示汉化(.Net6、AspNetCore)

先上现成的.net6汉化文件,可以手动下载后参照如何为.NET安装本地化的IntelliSense文件进行安装。或者使用后文的工具进行自动安装。无对照英文在前中文在前汉化内容来自官方在线文档,某些内容可能存在明显的机翻痕迹。上一些效果图:.Net6之前的版本汉化.net6之前的版本,微软官方提供了本地化包,可以在Dow

MQTT Qt 客户端开发记录

1.MQTT介绍MQTT是一种常用的物联网协议。MQTT(MessageQueuingTelemetryTransport)是一种轻量级的发布/订阅通信协议,用于在物联网(IoT)和机器对机器(M2M)通信中传输消息。MQTT协议被设计用于在低带宽和不稳定网络环境下工作,以及在设备和服务器之间实现可靠的通信。MQTT协

什么是媒体邀约?邀请媒体的流程

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。媒体邀约,简单来说,是企业或组织为了某个特定的事件、活动或新闻,主动邀请媒体进行报道或参与。这个过程旨在确保媒体的出席并进一步传播相关信息,从而达到更广泛的受众。邀请媒体的流程大致可以分为以下几个步骤:媒体媒体宣传的目的:明确为何需要邀请媒体,是为了推广新产品、发布

1_图神经网络GNN基础知识学习

文章目录安装PyTorchGeometric安装工具包在KarateClub数据集上使用图卷积网络(GCN)进行节点分类两个画图函数GraphNeuralNetworks数据集:Zachary'skarateclubnetwork.PyTorchGeometric数据集介绍edge_index使用networkx可视化

Bash脚本学习 - 条件句、数组、for循环,函数

1.条件测试[和]是一个用于执行条件测试的命令。它们必须用空格分隔开,并且在[后面和]前面必须有空格。-eq是一个比较运算符,表示等于(equal)。它用于比较两个值是否相等。2.条件句在ifelseifelse.sh文件中,#!/bin/bashif[${1,,}=herbert];thenecho"Oh,you'r

利用gpt进行GMV变化数据分析

prompt:现在已知男性GMV从800降至600,女性GMV从1200至1300,请计算男女GMV变动对整体GMV变动的贡献度output:在这个问题中,我们要计算男性和女性的GMV(总销售额)变动对整体GMV变动的贡献度。首先,计算男性和女性的GMV变动量:男性GMV变动量:600-800=-200600−800=

排序算法-----快速排序(递归)

目录前言快速排序步骤原理大致思路流程动态图代码实现算法分析空间复杂度时间复杂度稳定性前言今天我们开始学习排序算法中的快速排序算法,既然叫快速排序,那肯定是体现在快这方面,相较于前面所学习过的排序算法,快速排序是比这些算法的速度要快的,将来很多时候我们都会用到快速排序来去做排序的,下面就一起来学习吧!快速排序快速排序(Q

第 363 场 LeetCode 周赛题解

A计算K置位下标对应元素的和模拟classSolution{public:intpop_cnt(intx){//求x的二进制表示中的1的位数intres=0;for(;x;x>>=1)if(x&1)res++;returnres;}intsumIndicesWithKSetBits(vector<int>&nums,i

Git概述

目录一、什么是Git二、什么是版本控制系统三、Git和SVN对比SVN集中式SVN优缺点Git分布式Git优缺点四、Git工作流程四个工作区域工作流程五、Git下载与安装一、什么是Git很多人都知道,林纳斯·托瓦兹在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Git是

漏刻有时数据可视化Echarts组件开发(28):异形柱图、pictorialBar和dataZoom组件的使用

构建容器vardom=document.getElementById('container');varmyChart=echarts.init(dom,null,{renderer:'canvas',useDirtyRect:false});模拟数据vardataList=[{name:'班级一',value:120,

热文推荐