ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2010年9月24日 星期五

ffmpeg 的 ffplay 筆記

mpegts.c 的 mpegts_read_header( ) 負責
mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1); mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
handle_packet( ) 處理 pid, start,

utils.c : av_find_stream_info( )
av_read_frame_internal( )


Data Structure:

AVPacket 好像是基本,裡面最重要的應該就是 *data 和 size。其他都是一些 timestamp 資料。
AVPacketList 就加一個 指向下一個 AVPacket 的 pointer (如其名, linking list)。

PacketQueue 裡面就是一個 AVPacketList,並且有一堆 queue operation,對這個 queue 裡的 AVPacketList 作 put, get, init, end 等動作。

FFPlay 有一個超大 structure : VideoState,裡面有 video, audio 和 subtitle 的 PacketQueue.

這個 VideoState structure 只有在 ffplay.c 里使用到,ffplay.c 里宣告幾個 VideoState 的變數,然後很多 function 都用 VideoState 作
argument... Q_Q

Thread
stream_open -- decode_thread -- refresh_thread
                 |
                component_open -- video_thread, subtitle_thread


decode_thread ( ) 負責讀取 source file/stream,demux 出 audio, video, subtitle 方別放到 audio, video, subtitle 的 packetqueue。

video_thread, subtitle_thread 定時從 對應的 packetqueue 取出 packet 作 decoding 和 rendering.
Audio Stream 用 callback function 實做,因為 audio stream 播放完後會 call callback function,所以從 callbackfunction 讀取 audio 的 packetqueue 資料 decode 就可以。 不必像 video, subtitle 一樣要自己"對齊"時間。


MpegTSContext是 mpegts.c 自己使用的 structure,類似 task context 一樣,定義了一堆state variable。
包含一個
MpegTSFilter *pids[NB_PID_MAX];
MpegTSFilter 是:
struct MpegTSFilter { int pid; int last_cc; /* last cc code (-1 if first packet) */ enum MpegTSFilterType type; union { MpegTSPESFilter pes_filter; MpegTSSectionFilter section_filter; } u; }; 其中 union 裡的兩個 member 是 callbackfunction (跟一堆東西)。 大概就是 parse 到哪一個 pid 就那個 pid 的callback function
比較通用的 structure:


AVInputFormat : 用在 decoding, 是所有 decoder 的 parent class. 定義了 function pointer for read header, packet... etc,所有 decoder 都要實做這些 function,並且宣告一個自己的 AVInputFormat Variable。
AVOutputFormat 也一樣。

沒有留言:

標籤

網誌存檔