vlc-video解碼後的輸出路徑

做播放器類的app開發,有很多的多媒體框架可以選擇,vlc就是其中之一,其他的比如ijkplayer vitamio等,總的來說他們的功能都是一致的,即音視頻文件的解複用,解碼,這些功能被封裝成java sdk,簡化app開發人員的調用。 現在有個疑問,如果是使用android系統提供的 mediaplayer進行播放,最終解碼出來的yuv數據流可以知道mediaplayer內部給到surface 輸出了,那這些第三方的框架自己解碼出來的 yuv數據,怎麼配合輸出到android顯示呢? 也就是說使用了那些android系統提供的接受 yuv數據播放的接口?所以這裏從vlc源碼來分析下,vlc 解碼後的yuv video數據輸出到哪裏去了。同樣 音頻解碼後的輸出,在我之前的一篇博客中有分析:https://blog.csdn.net/u012459903/article/details/103727581
vlc 3.0.6源碼, 從源碼 /input/decoder.c  的函數 DecoderPlayVideo() ,即解碼完後輸出video到 video ouput設備,在vlc_vout.h中有介紹 struct vout_thread_t 結構體,其中包含的 struct vout_thread_sys_t,這個就是所有video輸出模塊應該實現對接的一個結構體,vlc模塊化的結構,  在src/videoout/video_output.c  中:

static vout_thread_t *VoutCreate(vlc_object_t *object,
                                 const vout_configuration_t *cfg)
{
    video_format_t original;
    if (VoutValidateFormat(&original, cfg->fmt))
        return NULL;
    /* Allocate descriptor */
    vout_thread_t *vout = vlc_custom_create(object,
                                            sizeof(*vout) + sizeof(*vout->p),
                                            "video output");
}

創建"video output" 能力的module.
所以下面就按照這個struct vout_thread_sys_t結構體在全工程中查找video out模塊了。也可以通過“video output” 關鍵字來查找。每一個video out模塊都有應該有類似如下:

vlc_module_begin()
 ...
    set_capability("vout display", /*10*/0)
 ...
vlc_module_end()

這樣的模塊描述。
1.0 Aa.c : "vout display" module using aalib
2.0 caca.c: Color ASCII Art "vout display" module using libcaca
3.0 clone.c : Clone video plugin for vlc  只是克隆出來另一份
4.0 decklink.cpp: BlackMagic DeckLink SDI輸出模塊
5.0 direct3d11.c: Windows Direct3D11 video output module
6.0  direct3d9.c: Windows Direct3D9 video output module
7.0 directdraw.c: Windows DirectDraw video output
8.0 modulse/hw/vpdau/display.c : VDPAU is the Video Decode and Presentation API for UNIX. It provides an interface to video decode acceleration and presentation hardware present in modern GPUs   gpu顯卡接口
9.0 modules/video_outpu/android/display.c  android 的video輸出,這就是我要找的,可以看到對應子目錄 /module/video_output/android/:   文件 utils.h :終於使用到了 android的接口。這個部分怎麼使用還得單獨研究研究
10.0 modules/video_output/opengl/display.c  openGL接口,android也支持opengGL
11.0 evas.c  : EFL Evas video output https://www.enlightenment.org/  Enlightenment Foundation Libraries, or EFL, are the set of libraries used to create the Enlightenment Window Manager DR17 (E17) 不知道是什麼時候的產物,好冷門的樣子
12.0 fb.c :framebuffer plugin linux基於framebuffer設備的輸出
13.0 flaschentaschen.c: Flaschen-Taschen video output display for vlc cf. https://github.com/hzeller/flaschen-taschen
不認識,好像樹莓派有關
14.0 glwin32.c: Windows OpenGL provider
15.0 kva.c: KVA video output plugin 
16.0 shm.c Wayland shared memory video output module for VLC media player 共享內存的方式輸出給其他程序使用
17.0 vdummy.c: Dummy video output display method for testing purposes dump輸出調試使用
18.0 vmem.c: memory video driver for vlc
19.0 modules/codec/omxil/vout.c :OpenMAX IL video output  輸出給openmax
20.0 mmal.c: MMAL-based vout plugin for Raspberry Pi
21.0 wingdi.c : Win32 / WinCE GDI video output plugin for vlc
22.0 x11.c X C Bindings video output module for VLC media player
23.0 xvideo.c X C Bindings video output module for VLC media player
24.0 yuv.c : yuv video output 輸出yuv流到文件,或者設備文件
從這些moudle來看,video輸出到android,一個途徑是使用了android的nativewindow, 另一個就是走opengGL

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