ffplayソースコード解析():AVPacketとAVFrame関係でPacketQueue

ffplay元アドレス:http://ffmpeg.org/doxygen/trunk/ffplay_8c_source.html

2つのキューはPacketQueue、FrameQueue、分析や説明のためのAVPacketとAVFrameキューにLETの関係がありffplayます。

A、AVPacket AVFrame構造と意味

AVPacket

圧縮されたデータを格納するために、圧縮されたデータは、オーディオ、圧縮映像データと字幕データ圧縮を含みます。これは、圧縮されたデータを格納する多重分離操作で通常であり、復号器への入力として渡されます。またはエンコーダからの出力は、マルチプレクサに渡されます。ビデオデータ圧縮のために、AVPacketは、典型的にはビデオフレームを含みます。圧縮されたオーディオデータの場合、圧縮されたオーディオは、いくつかのフレームを含むことができます。

AVFrame

デコードされた音声や映像データの場合は保存されています。AVFrameはav_frame_freeを通して放出av_frame_alloc、によって割り当てられなければなりません。

両者の関係

av_read_frame得られた圧縮されたデータは、一般に、3つの圧縮パケット(ビデオ、オーディオ、及びサブタイトル)、AVPacketで表されるがあり、AVPacketをパケット。

その後AVPacketへのコールavcodec_send_packetとavcodec_receive_frameはAVFrameをデコードします。

注:当初からFFmpegの3.xでは、avcodec_decode_video2はavcodec_send_packetとavcodec_receive_frameに置き換えられ、放棄されました。

二、ffplayキューの関係

3 ffplay PacketQueueがありますが、各ビデオパケットキューは、パケット、オーディオパケットおよび字幕キューのキューです。

したがって、3種類のFrameQueue、ビデオ・フレーム・キュー、オーディオおよび字幕フレームキューフレーム・キューがあります。

初期化は、それぞれ、ワークキューstream_open関数で実行される、初期化動作がpacket_queue_initのframe_queue_initによって行われます。手動初期化PacketQueue AVPacket割り当て構造なしで、なおが、直接復号プロセスAVPacketに使用。FrameQueueではav_frame_alloc AVFrame構造によって手動で割り当てられます。

read_thread機能、av_read_frame関数を介してリードデータパケットに、次にAVPacket packet_queue_putコールはPacketQueueに加えます。

video_thread関数では、データはget_video_frame機能、FrameQueueに添加し、次いでコールqueue_pictureのAVFrameによるリードフレームです。

そして、2つのキューは、それをリンクする方法ですか?あなたはread_thread機能を解析することによって知ることができます。

まず、必要な逆多重化および復号化するデータ構造を作成します。その後、3つのデータは、各オープンstream_component_open機能を通じてストリーミング。最後に、データパケットは、別々av_read_frameによって対応PacketQueueに加え逆多重化されます。stream_component_open機能において、ワークを復号するためのffplayは、具体的キューはdecoder_init関数によってPacketQueueを指定するPacketQueue入力を参照している、デコーダ、デコーダ構造は、キューの部材を有するデータ構造をセットアップ作業を復号化するための主な原因です。この作品は、stream_component_open中で行われます。指定した後PacketQueue復号機能はPacketQueue AVFrame構造からget_video_frame、そして最後queue_pictureのFrameQueue機能により得られた復号されたフレームに加えました。

おすすめ

転載: www.cnblogs.com/renhui/p/12217958.html