// attempt to load device-specific video MIOif (mLibHandle != NULL) {VideoMioFactory f = (VideoMioFactory) ::dlsym(mLibHandle, VIDEO_MIO_FACTORY_NAME);if (f != NULL) {mio = f();}}// if no device-specific MIO was created, use the generic oneif (mio == NULL) {LOGW("Using generic video MIO");mio = new AndroidSurfaceOutput();}
可以看出如果mLibHandle不為空,則調(diào)用硬件庫(kù)中的MIO(多媒體IO)工廠方法產(chǎn)生MIO(多媒體IO)。如果mLibHandle為空,則用通用視頻MIO(AndroidSurfaceOutput類)。如果你仔細(xì)研究AndroidSurfaceOutput類你會(huì)發(fā)現(xiàn),其底層調(diào)用的SurfaceFlinger來(lái)進(jìn)行視頻數(shù)據(jù)混疊,然后輸出的,這部分有興趣的朋友可以去查看代碼。
那么mLibHandle那里初始化的呢?在文件PlayerDriver.cpp中PlayerDriver類的構(gòu)造函數(shù)中有如下代碼:
// running in emulation?mLibHandle = NULL;char value[PROPERTY_VALUE_MAX];if (property_get("ro.kernel.qemu", value, 0)) {mEmulation = true;LOGV("Emulation mode - using software codecs");} else {// attempt to open h/w specific librarymLibHandle = ::dlopen(MIO_LIBRARY_NAME, RTLD_NOW);if (mLibHandle != NULL) {LOGV("OpenCore hardware module loaded");} else {LOGV("OpenCore hardware module not found");}}
我們可以看出mLibHandle為庫(kù)MIO_LIBRARY_NAME的句柄。請(qǐng)參考下面的代碼:
// library and function name to retrieve device-specific MIOsstatic const char* MIO_LIBRARY_NAME = "libopencorehw.so";static const char* VIDEO_MIO_FACTORY_NAME = "createVideoMio";
現(xiàn)在我們可以非常清楚的看到如果系統(tǒng)中有l(wèi)ibopencorehw.so庫(kù),則OpenCore將會(huì)調(diào)用該庫(kù)中的createVideoMio函數(shù)來(lái)創(chuàng)建MIO。由此我們可以知道對(duì)OpenCore的視頻輸出硬件加速,其實(shí)就是定義libopencorehw.so庫(kù)。
那么libopencorehw.so定義在那里呢?因?yàn)閘ibopencorehw.so這個(gè)庫(kù)是和硬件相關(guān)的,不同的硬件會(huì)有不同的實(shí)現(xiàn),所以這個(gè)庫(kù)可以理解成硬件適配層(HAL)的一部分。請(qǐng)參考《怎樣實(shí)現(xiàn)Android系統(tǒng)的HAL(硬件適配層)》。由于硬件的千變?nèi)f化,這里就不給實(shí)現(xiàn)的例子了。這樣的例子非常多,大部分基于ARM芯片,你可以“依葫蘆畫瓢”,定制成自己平臺(tái)的庫(kù)。
本文簡(jiǎn)單介紹了一下OpenCore視頻輸出的硬件加速的原理。搞清楚視頻輸出硬件加速的原理,對(duì)一些進(jìn)行Android移植到新硬件平臺(tái)的朋友會(huì)有幫助。如有紕漏之處,請(qǐng)各位朋友指正。
聯(lián)系客服