包队列架构位置

对应结构体源码
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:控制队列中数据包的数量。