(轉)Android多媒體支撐庫OpenCore視頻硬件加速

http://blog.csdn.net/ccskyer/article/details/6035033

=============================================================

今天在看opencore的代碼時,在函數PlayerDriver::handleSetVideoSurface中有以下內容:

// attempt to load device-specific video MIO
    if (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 one
    if (mio == NULL) {
        LOGW("Using generic video MIO");
        mio = new AndroidSurfaceOutput();
    }

也就是說在創建generic video MIO之前先要嘗試加載針對特定硬件的MIO庫,上網找了下,有以下解析:

==============================================================

原文地址:http://www.cnmsdn.com/html/201010/1287036493ID8204.html

Android2.2之前版本的視頻音頻的播放默認支撐庫爲OpenCore。OpenCore功能非常強大,可以支持多種媒體格式,並支持擴展。當然本文將要簡單介紹一下怎樣對OpenCore進行視頻硬件加速,以提高其視頻運行效率。

OpenCore的作用簡單的說就是對媒體(音頻視頻)數據進行解碼,並輸出到終端設備。音頻數據解碼和輸出比較簡單,本文重點介紹視頻數據的解碼和輸出。爲了使OpenCore的視頻播放支持Android系統,谷歌定義了兩套視頻輸出方案,一種是由硬件廠商實現硬件加速的視頻輸出,硬件視頻輸出裏面可以調用硬件Overlay模塊對輸出的視頻數據進行硬件混疊,這樣輸出效率會非常的高;另外一種爲谷歌定義的軟視頻輸出,該軟視頻輸出定義爲 AndroidSurfaceOutput類,這種方案中系統會調用SurfaceFilnger對輸出視頻數據進行混疊,該混疊爲軟件混疊,執行效率比較低。請看文件PlayerDriver.cpp中handleSetVideoSurface方法的代碼:

// attempt to load device-specific video MIO

if (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 one

if (mio == NULL) {

LOGW("Using generic video MIO");

mio = new AndroidSurfaceOutput();

}

可以看出如果mLibHandle不爲空,則調用硬件庫中的MIO(多媒體IO)工廠方法產生MIO(多媒體 IO)。如果mLibHandle爲空,則用通用視頻MIO(AndroidSurfaceOutput類)。如果你仔細研究 AndroidSurfaceOutput類你會發現,其底層調用的SurfaceFlinger來進行視頻數據混疊,然後輸出的,這部分有興趣的朋友可以去查看代碼。

那麼mLibHandle那裏初始化的呢?在文件PlayerDriver.cpp中PlayerDriver類的構造函數中有如下代碼:

// 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 library

mLibHandle = ::dlopen(MIO_LIBRARY_NAME, RTLD_NOW);

if (mLibHandle != NULL) {

LOGV("OpenCore hardware module loaded");

} else {

LOGV("OpenCore hardware module not found");

}

}

我們可以看出mLibHandle爲庫MIO_LIBRARY_NAME的句柄。請參考下面的代碼:

// library and function name to retrieve device-specific MIOs

static const char* MIO_LIBRARY_NAME = "libopencorehw.so";

static const char* VIDEO_MIO_FACTORY_NAME = "createVideoMio";

現在我們可以非常清楚的看到如果系統中有libopencorehw.so庫,則OpenCore將會調用該庫中的 createVideoMio函數來創建MIO。由此我們可以知道對OpenCore的視頻輸出硬件加速,其實就是定義libopencorehw.so 庫。

那麼libopencorehw.so定義在那裏呢?因爲libopencorehw.so這個庫是和硬件相關的,不同的硬件會有不同的實現,所以這個庫可以理解成硬件適配層(HAL)的一部分。請參考《怎樣實現Android系統的HAL(硬件適配層)》。由於硬件的千變萬化,這裏就不給實現的例子了。這樣的例子非常多,大部分基於ARM芯片,你可以“依葫蘆畫瓢”,定製成自己平臺的庫。

本文簡單介紹了一下OpenCore視頻輸出的硬件加速的原理。搞清楚視頻輸出硬件加速的原理,對一些進行Android移植到新硬件平臺的朋友會有幫助。如有紕漏之處,請各位朋友指正。


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