Android Codec 集成和 video Overlay 收藏
Codec 集成和video overlay是現(xiàn)在FSL對android 多媒體修改的所有東西,codec library以.so的形式放在prebuilt目錄下,沒有源文件 。而video overlay的實(shí)現(xiàn)主要是使用了FSL的ipu底層庫,將視頻數(shù)據(jù) 直接發(fā)送到硬件,由硬件進(jìn)行merge。
A、Codec 集成
1、codec 集成方法
首先聲明一下俺說的codec集成是指將codec集成到opencore 框架中,網(wǎng)上看有人直接放個庫然后通過jni調(diào)用,這種的方式有點(diǎn)扯蛋,得自己實(shí)現(xiàn)控制,同步,輸出等一堆東西,完全是殺雞取卵,我們就不討論了。要把一個裸的codec放在opencore框架內(nèi)有三種方式:
a、實(shí)現(xiàn)一個openmax component 注冊在android已存在的omx core上,或者提供自己的omx core
b、實(shí)現(xiàn)一個封裝了codec的PVMF 標(biāo)準(zhǔn)的 mio(media input/output)
c、 實(shí)現(xiàn)一個封裝codec的PVMF的Node
三種方式都涉及到opencore一堆BT的術(shù)語,首先我們得來消化下這幾個術(shù)語,不然很難有個直觀的了解。因?yàn)閛pencore實(shí)在龐大得超出我的能力之外,所以俺只是從整體結(jié)構(gòu)上看了下骨架,我是這么理解的:opencore實(shí)際包含兩部分:一部分就是command管道,一個就是數(shù)據(jù)管道;command就是我們的player/author engine, 而數(shù)據(jù)的流動就是在pvmf 中進(jìn)行。PVMF下面掛載的的基本組件就是Node,就是實(shí)現(xiàn)一個具體功能的單元,比如說file parse, codec, sink等等。前面提到的MIO實(shí)際上也是一個特殊的Node,它的功能就是media input/output 。
engline接受上層的command,控制PVMF下的Node進(jìn)行工作,而Pvplayer/author是基于engline實(shí)現(xiàn)的一個提供給android使用的SDK,這就是Opencore的工作原理 了。
剛才 在這里只說第一種方式,就是omx封裝的方式,F(xiàn)SL也是采用的這種方式的提供的 HW codec library,并且提供了自己的omx core。換句話就是說FSL實(shí)現(xiàn)了整個/external/opencore/codecs_v2這個目錄的內(nèi)容,雖然這個悶騷的公司只是提供了幾個.so 。我們要想實(shí)現(xiàn)一個完整的omx封裝的codec移植得準(zhǔn)備下面的知識 :
/external/opencore/doc/openmax_call_sequences.pdf
/external/opencore/doc/omx_core_integration_guide.pdf
http://omxil.sourceforge.net/docs/modules.html 除了這些spec和guide之外,現(xiàn)成的例子就是android已經(jīng)封裝好的omx core了,也就codecs_v2/omx里面的內(nèi)容。如果有裸codec,封裝成omx從技術(shù) 講應(yīng)該是不難的,基本過程就是先封裝成omx,然后再封裝成pv_omx,不過opemax IL層的spec很復(fù)雜,要做的工作可能比較多。
編譯好的omx library 我們可以按照FSL的方式放在prebuilt目錄下面,并提供相應(yīng)的配置文件,比如fslomx.cfg,在這里說一下我們封裝好的library是如何被調(diào)用的。所有編譯好的library最后都會被放在/system/lib目錄,android會在/etc讀取所有的.cfg文件,然后根據(jù) UUID來判斷是否為omx封裝好的library,如果UUID匹配的話它就會到lib目錄中載入相應(yīng)的library。這里涉及到一個重要的文件 /opencore/external/codecs_v2/omx/omx_mastercore/src /pv_omxmastercore.cpp。由這個文件來負(fù)責(zé)當(dāng)存在多個omx core的時候的處理。
omxmastercore.cpp管理一個優(yōu)先權(quán)的問題,比如說當(dāng)存在多個omx core,而且每個omx core都具有一個mp3 decode component 時我們應(yīng)該使用哪一個component進(jìn)行解碼?omxmastercore對這個選擇的處理過程是這樣的:
a、根據(jù).cfg的文件名的字母排列順序載入.cfg文件,也就是說fslomx.cfg會比pvomx.cfg先載入
b、根據(jù)UUID一個一個判斷是否為omx封裝的library,如果是的話就載入相應(yīng)的library,并對omx core下所有的component進(jìn)行注冊
[換句話說就是配置文件名字母靠前的會被先載入,相應(yīng)component注冊也會被注冊在前面]
c、omxmastercore根據(jù)應(yīng)用 程序要求的role(比如mp3)及其要求的配置去注冊的component中尋找滿足要求的component,一旦找到就選定進(jìn)行解碼
因此如果你想使用自己的codec來進(jìn)行解碼,必須使你的配置文件名排在前面,或者如果不需要其他的omx core的話干脆刪除它的配置文件。我曾經(jīng)做過一個實(shí)驗(yàn),去掉fsl的codec , 51播視頻就會直接卡死,如果去掉android自帶的codec視頻和音頻都無法播放,因?yàn)閒sl現(xiàn)在只提供了視頻的硬解碼,當(dāng)應(yīng)用程序找不到音頻的解碼的時候就會直接報錯。從側(cè)面來說fsl的 video codec還是很牛B的,它調(diào)用了/external/fsl_imx_lib/vpu中的接口。
因此總的來說實(shí)現(xiàn)codec的移植應(yīng)該是不難的,將來還可以使用偷懶的方法,也就是說只實(shí)現(xiàn)相應(yīng)的component,把它注冊到android已有的 omx core中,這個注冊是在/external/opencore/codecs_v2/omx/omx_common/src /pv_omxregistry.cpp中實(shí)現(xiàn)的。
除了omx封裝外其他兩種方式我沒仔細(xì)看過,Node方式PV還沒提供文檔,而mio集成方式在doc里面有它的開發(fā)文檔。
B、Video Overlay
Android原來是video playback的輸出是使用的Isurface接口,也就是說它是用surfaceflinger來實(shí)現(xiàn)window的合并的,SW merge必然導(dǎo)致播放的效率低下,而且資源消耗很高。FSL在這里實(shí)現(xiàn)了硬件overlay的方式來播放視頻,就是使用ipu進(jìn)行硬件的merge,說穿了就是把vpu解碼后的數(shù)據(jù)直接送到ipu的overlay buffer。
這里涉及到兩個底層的lib,一個就是libipu.so,還一個是libvpu.so,vpu負(fù)責(zé)解碼,而ipu負(fù)責(zé)顯示。在這里要改變的主要是兩個地方,首先要獲得vpu解碼后的數(shù)據(jù),這里主要涉及到下面目錄中的文件:
/external/opencore/nodes/pvomxbasedecnode/src/pvmf_omx_basedec_node.h
/external/opencore/nodes/pvomxbasedecnode/include/pvmf_omx_basedec_node.cpp
/external/opencore/nodes/pvomxvideodecnode/src/pvmf_omx_
然后就是將數(shù)據(jù)送到overlay buffer,這部分修改的內(nèi)容實(shí)際上就是實(shí)現(xiàn)了ipu 的一個sequence,這個sequence的內(nèi)容可以參照:
/external/fsl_imx_lib/ipu/mxc_ipu_hl_lib.h
具體的修改內(nèi)容在下面幾個文件:
/android/android_surface_output.cpp
/android/android_surface_outpur.h