前言
decoder_decode_frame函数主要功能是用来解码,在video_thread线程和audio_thread线程中被调用。这个函数有很多判断序列号的地方,序列号主要是跳转时用到的,跳转时PacketQueue的序列号会变,所以先说下序列号。
一、PacketQueue的serial,MyAVPacketList的serial,Decoder的pkt_serial
1、PacketQueue的serial
typedef struct PacketQueue {
AVFifoBuffer *pkt_list; //ffmpeg实现的先进先出的队列
int nb_packets; // 队列中AVPacket数量
int size; //队列占用内存大小
int64_t duration; // 队列所有数据包的持续时间
int abort_request; //是否结束
int serial; //队列序列号
SDL_mutex *mutex; //队列锁
SDL_cond *cond;//队列条件变量
} PacketQueue;
PacketQueue是所有序列号的源头,其他序列号是直接或间接被PacketQueue影响的。跳转时,PacketQueue的序列号会增加,代表一个新的流。
在stream_open()中调用packet_queue_init(),PacketQueue序列号初始化为0。

接下来在read_thread线程-->stream_component_open()-->decoder_start()-->packet_queue_start()中,运行q->serial++,此时PacketQueue的serial为1。

2、MyAVPacketList的serial
typedef struct MyAVPacketList {
AVPacket *pkt;
int serial;
} MyAVPacketList;
由于AVPacket信息中不带序列号,所以用MyAVPacketList结构体封装了一下序列号信息。
MyAVPacketList序列号第一次初始化是在read_thread线程,从文件读取Avpacket数据向PacketQueue队列插入数据时赋值的。调用顺序是:read_thread线程-->packet_queue_put()-->packet_queue_put_private()。
在函数packet_queue_put_private中,MyAVPacketList的序列号第一次赋值为PacketQueue的序列号。(可以把PacketQueue看成容器,每一个MyAVPacketList都是容器的一个元素,容器的序列号决定了每一个元素的序列号)。

3、Decoder的pkt_serial
Decoder的pkt_serial在调用decoder_init时初始化的,初始为-1。调用顺序:read_thread线程-->stream_component_open()-->decoder_init()。

最低0.47元/天 解锁文章
911

被折叠的 条评论
为什么被折叠?



