[オーディオとビデオ] ffplay ソースコード解析 - PacketQueue キュー

パケットキューアーキテクチャの場所

ここに画像の説明を挿入します


対応する構造体のソースコード

MyAVパケットリスト
typedef struct MyAVPacketList {
    
    
    AVPacket		pkt;    //解封装后的数据
    struct MyAVPacketList	*next;  //下一个节点
    int			serial;     //播放序列
} MyAVPacketList;
パケットキュー
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 によって完全に保守および管理されます
    • ノードを置くときのmalloc
    • ノード取得時は無料
  • ロック機構 - スレッドセーフティ
    • 置く前と後、ロックとロック解除
    • 取得、ロック、ロック解除の前後
  • 書き込み側は逆多重化スレッドに位置し、読み取り側はデコード スレッドに位置します。

シリアルフィールド

  • シーク前後の連続フレームを区別するため

  • 方法: シーク後、次のセクションにノード Serial+1 を配置します。

  • シーン

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

キューサイズの設定

PacketQueue はリンク リスト キューです

  • 十分なメモリがある場合: データ パケットを制限なくキューに入れることができ、キューのサイズを考慮する必要はありません。
  • キュー サイズの制御: キューのサイズを制御する必要がある場合は、次の 3 つの変数を使用してキュー ノードの数を制限できます。
    • size: キュー内のパケットの合計サイズを制御します。
    • 継続時間: キュー内のパケットの合計再生時間を制御します。
    • nb_packets: キュー内のパケット数を制御します。

おすすめ

転載: blog.csdn.net/qq_43537701/article/details/132942699