ffplay源码分析__解码函数decoder_decode_frame

 前言

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()。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值