最近在研究ffplay,以下是本人今天在研究FrameQueue的时候整理的笔记,如有错误还请有心人指出来~
//这个队列是一个循环队列,windex是指其中的首元素,rindex是指其中的尾部元素.
typedef struct FrameQueue {
                 Frame queue[FRAME_QUEUE_SIZE ];
                 int rindex;//表示循环队列的结尾处
                 int windex;//表示循环队列的开始处
                 int size;
                 int max_size;
                 int keep_last;
                 int rindex_shown;//一开始为0,之后一直为1
                 SDL_mutex *mutex;
                 SDL_cond *cond;
                 PacketQueue *pktq;
} FrameQueue;
//表示FrameQueue的初始化主要是针对内存的处理,针对视频来说,keep_last为1
static int frame_queue_init(FrameQueue *f, PacketQueue *pktq, int max_size, int keep_last)

{
int i;
memset(f, 0, sizeof(FrameQueue));
if (!(f->mutex = SDL_CreateMutex()))
return AVERROR(ENOMEM);
if (!(f->cond = SDL_CreateCond()))
return AVERROR(ENOMEM);
f->pktq = pktq;
f->max_size = FFMIN(max_size, FRAME_QUEUE_SIZE);
f->keep_last = !!keep_last;
for (i = 0; i < f->max_size; i++)
if (!(f->queue[i].frame = av_frame_alloc()))
return AVERROR(ENOMEM);
return 0;

}

//表示从循环队列帧里面取出当前需要显示的一帧视频
static Frame *frame_queue_peek(FrameQueue * f)
{
                 return &f ->queue[(f->rindex
+ f->rindex_shown) % f ->max_size];
}
//表示从循环队列帧里面取出当前需要显示的下哦i一帧视频
static Frame *frame_queue_peek_next( FrameQueue * f )
{
                 return &f ->queue[( f->rindex
+ f ->rindex_shown + 1) % f ->max_size];
}

//返回要填充的frame_queue中的Frame。
static Frame *frame_queue_peek_writable( FrameQueue * f )
{
                 /* wait until
we have space to put a new frame */
                SDL_LockMutex( f ->mutex);
                 while (f ->size
>= f->max_size &&
                       ! f ->pktq->abort_request)
{
                                SDL_CondWait( f ->cond, f ->mutex);
                }
                SDL_UnlockMutex( f ->mutex);

                 if (f ->pktq->abort_request)
                                 return NULL ;

                 return &f ->queue[ f->windex];
}
//放帧到队列中(frame_queue_peek_writable)之后的参数操作,windex++
static void frame_queue_push( FrameQueue * f )
{
                 if (++f ->windex
== f->max_size)
                                 f ->windex
= 0;
                SDL_LockMutex( f ->mutex);
                 f ->size++;
                SDL_CondSignal( f ->cond);
                SDL_UnlockMutex( f ->mutex);
}
//从帧队列中取出帧之后的参数操作,当rindex_show为0的时候使其变为1,否则--rindex
static void frame_queue_next( FrameQueue * f )
{
                 if (f ->keep_last
&& ! f->rindex_shown) {
                                 f ->rindex_shown
= 1;
                                 return ;
                }
                frame_queue_unref_item(& f ->queue[f ->rindex]);
                 if (++f ->rindex
== f->max_size)
                                 f ->rindex
= 0;
                SDL_LockMutex( f ->mutex);
                 f ->size--;
                SDL_CondSignal( f ->cond);
                SDL_UnlockMutex( f ->mutex);
}
其中size-rindex_shown为现在队列中的帧数目

【C/C++开发】ffplay中的FrameQueue的自我理解的更多相关文章

  1. iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  2. Idea开发环境中搭建Maven并且使用Maven打包部署程序

    1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME的环境变量,然后将该变量添加到Path中 备注:必须要有JAVA_HOM ...

  3. Wabpack系列:在webpack+vue开发环境中使用echarts导致编译文件过大怎么办?

    现象,在一个webpack+vue的开发环境中,npm install echarts --save了echarts,然后在vue文件中直接使用 import echarts from 'echart ...

  4. 开发环境中biztalk项目设置注意事项(转)

      适用版本:biztalk 2006 适用环境:开发测试环境 在开发过程中,在开发环境中,一定会是一个对项目不断的修改.编译.部署.测试,查看测试结果,发现有问题,然后回到开发环境再修改.编译.部署 ...

  5. git 一般的开发流程中的代码管理

    一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...

  6. iOS 自定义控件开发(中)

    <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...

  7. 将linux用在开发环境中

    我是如何将linux用在开发环境中的 1.为什么不直接安装Linux在主机 一直想深入学习一下linux的使用,于是将家里的笔记本装了linux系统,但是要将自己的系统打造一个适合开发的环境确实是一件 ...

  8. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  9. ASP.NET Web Froms开发模式中实现程序集的延迟加载

    延迟加载是一个很大的诱惑,可以达到一些比较好的效果,比如: 1.在实体框架中,由于关联数据的数量和使用时机是不确定的,通过延迟加载,仅在使用的时候去执行关联数据的查询操作,减少无谓的数据查询操作,可以 ...

随机推荐

  1. [Dart] final vs const

    void main() { ; print(a); ; print(b); final c = 'Hello'; // c = 'Hello again'; // Uncomment to throw ...

  2. 学到了林海峰,武沛齐讲的Day22-完 os sys json pickle shelve XML re

    __ file__    =====   文件路径 os.path.dirname( 路径 )=======到上一层目录 os sys

  3. Linux 内核参数说明

    转载自: https://www.cnblogs.com/tolimit/p/5065761.html 因个人能力有限,不能保证所有描述都正确,还请大家集思广益,有错误的地方欢迎大家留言指正,同时也欢 ...

  4. Postgresql 物理备份冷备份 与 热备份

    一.冷备份 将数据库停下来,然后把数据库的PGDATA目录拷贝下来就可以了. PostgreSQL把与数据库实例有关的配置文件和数据文件都放在PGDATA目录下,所以做冷备份很简单. 二.热备份 热备 ...

  5. Python2.7学习

    网上很多代码都不适用于python3版本,所以还是转回版本2来学习了 install 安装模块特别简单 E:\01_SOFT\Python27\python  -m easy_install sunb ...

  6. 【原创】go语言学习(六)函数详解2

    目录 变量作用域和可见性 匿名函数 闭包 课后练习 变量作用域和可见性 1.全局变量量,在程序整个生命周期有效. var a int = 10 2.局部变量量,分为两种: 1)函数内定义, 2)语句句 ...

  7. IDEA2018全局搜索中搜索jar包/lib

    搜索jar包 配置find in path ctrl+shift+f 点击 ...处 把lib添加进来 点击OK保存 之后在IDEA中 , 双击shift , 调出全局搜索框就可以搜索到 jar包里的 ...

  8. BIOS 中断大全

    BIOS中断: 1.显示服务(Video Service--INT 10H) 00H -设置显示器模式0CH -写图形象素  01H -设置光标形状0DH -读图形象素  02H -设置光标位置0EH ...

  9. 10月清北学堂培训 Day 1

    今天是杨溢鑫老师的讲授~ T1 1 题意: n * m 的地图,有 4 种不同的地形(包括空地),6 种不同的指令,求从起点及初始的状态开始根据指令行动的结果. 2 思路:(虽然分了数据范围但是实际上 ...

  10. 如何在一个function里面设置一个全局的变量?

    答:解决方法是在function的开始插入一个global声明: def f() global x