研究VLC筆記1

現在,此博客尚未寫完,請讀者謹慎閱讀。


研究VLC-Android版本0.9.5,從vlc-android開始讀代碼:
1、LibVlC.java中有playMRL函數,感覺它是開始播放一個視頻,此函數是調用一個本地jni函數:Java_org_videolan_libvlc_LibVLC_playMRL,在libvlcjni.c中。


2、在Java_org_videolan_libvlc_LibVLC_playMRL中調用libvlc_media_player_play,這個函數是在VLC工程的lib\media_player.c文件中


3、在lib\media_player.c文件的libvlc_media_player_play中,會調用VLC的src\input\input.c文件的input_Create函數,它啓動一個線程去讀文件或流。裏面就一句話,執行函數:Create();


4、在Create()中是如何運行到解複用函數OpenDemux的,搞的不是很明白,大概是這樣:在input.c中有MainLoop線程主循環,它的裏面調用了MainLoopDemux,就在這個MainLoopDemux函數定義處,作者註釋這個函數的用途:Main loop: Fill buffers from access, and demux。不出意外的話就是這裏了,果然裏面有一個來自src\input\demux.h的demux_Demux函數,這個函數近似於只有一句話return p_demux->pf_demux( p_demux );這句話什麼意思,請看下面的5、6、7三點就明白了。


5、在VLC\modules\demux\avformat中有個OpenDemux函數,裏面有我們熟悉的ffmpeg庫的avformat_open_input和av_find_input_format,在此之前還調用了avcommon.h文件中的vlc_init_avformat(),它初始化了ffmpeg環境:av_register_all(),但這裏有個疑問,我在公司的電腦上看到av_register_all()之後接着avformat_network_init(),但我在家裏剛下載的VLC源碼裏又沒有avformat_network_init,奇怪,難道是在編譯的時候寫進去的?


6、在VLC\modules\demux\avformat\demux.c文件中有個Demux函數,它裏面有av_read_frame(),想必Demux真的就是解複用函數了。


7、那麼上述的OpenDemux和Demux有什麼關係呢?原來在OpenDemux中有個p_demux結構,通過這句話p_demux->pf_demux = Demux;把函數指針賦給了此結構。OpenDemux是在modules\demux\avformat\avformat.h中聲明,在demux.c中定義的,在avformat.c的vlc_module_begin()和vlc_module_end()中,在這麼一句set_callbacks( OpenDemux, CloseDemux ),估計這裏就把OpenDemux綁定到某個回調過程了。


8、在Demux函數中有一句話很耐人尋味,就是在p_stream->codec->codec_type == AVMEDIA_TYPE_VIDEO時,專門判斷格式是否是FLV,註釋中寫的是Add here notoriously bugged file formats/samples regarding PTS,什麼意思?百度一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章