mp4player 是 mpeg4ip 內附的一個 player
RFC 1889 RTP 被 RFC 3550 淘汰(obsolete)
video 繼承 video_sdl
– 由 player_session 建立之,用以 sync video/audio
– 主要由 player_media 使用,player_session貫穿主軸,在建立video和player_media實體時,都會把自己傳入.
player_media 建立 plugin 時,會把 video_sync(m_video_sync)傳入codec_plugin中.
各個 codec_plugin 為 xxxx_file.cpp
codec_plugin 利用 check_for_video_codec() 傳回之.
plugin實作檔案最後都有一個 macro 定出 structure: mpeg4ip_codec_plugin.
如此一來,codec_plugin_cpp的 check_for_video_codec()/check_for_audio_codec() 即可利用 dlsym() 找到它,並依據此 structure 去叫用 plugin 中的 function.
rtsp_thread()
+-> get_rtp_packet()
+-> callback_for_rtp_packet()
+-> 呼叫設置的 callback
在 rtsp_thread 中,作完 callback 後,會呼叫 periodic(), 這也是藉由 rtsp_thread_set_rtp_callback() 去設置的.
c_rtp_periodic(), 用 rtsp_thread_set_rtp_callback()設進去.
mp4player 中,callback function (CPlayerMedia::rtp_receive_packet(),此 function 會被包在 c_rtp_packet_callback, 再被上面的 rtsp_thread_set_rtp_callback() 設進去)
判斷 interleaved 而決定呼叫 rtp_process_recv_data() 或 rtp_process_ctrol().
periodic function 則呼叫 rtp_byte_stream() 去 recv_task (在 rtp_bytestream.cpp )
上面的那個段落又會呼叫 rtp_update(), rtp_update() 收 packet, 呼叫 callback.
rtp_update()(or callback??) 會執行 timeout_rr(), 而 timeout_rr() 中會執行 rtp_init_extern_net().
指定的 callback: c_recv_callback() => player_media->recv_callback() => stream->recv_callback() 放在 queue 中.
systems.h
– include necessary headers and redefine data types.
sdp.h
– session description protocol
rtsp_private.h
– the major rtsp interface
sdl.h
-> needed, for thread-control (create, mutex…and so on)
rtsp_create_client_for_rtp_tcp()
– create mutex
– create thread, 同時亦建立 unix socket, 之後的 function 會透過此 socket 與 thread 溝通, thread 主體在 rtsp_thread.c (rtsp_thread())中.
圖片及相關檔案: