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 也一樣。
沒有留言:
張貼留言