Camera HAL驗證初步–使用Emulated Camera HAL

來源:互聯網
上載者:User

(code base version: 4.0.4)

一、使用Emulated Camera HAL驗證總體流程

Emulated Camera HAL是android原生代碼中提供的一個類比網路攝影機的實現,它沒有和具體的kernel driver進行通訊,而是通過軟體的方式產生、擷取和傳送幀資料來類比一個網路攝影機,可以用於在沒有實際網路攝影機的情況下調試camera程式,同時它也可以作為實際的Camera HAL層設計實現的一個參考。

代碼所在路徑:

development\tools\emulator\system\camera

編譯最終產生的庫檔案:

out/target/product/xxx/system/lib/hw/camera.goldfish.so

我們可以使用camera.goldfish.so來替換實際需要載入的Camera HAL的庫檔案來驗證HAL層之上的流程是否有問題。

先來看下系統如何載入Camera HAL層的庫檔案(.so):

void CameraService::onFirstRef()

if (hw_get_module(CAMERA_HARDWARE_MODULE_ID,
                (const hw_module_t **)&mModule) < 0) {
        LOGE("Could not load camera HAL module: %s.", CAMERA_HARDWARE_MODULE_ID);
        mNumberOfCameras = 0;
    }

------------>>>

hw_get_module_by_class(id, NULL, module);

------------>>>

    /* Loop through the configuration variants looking for a module */
    for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
        if (i < HAL_VARIANT_KEYS_COUNT) {
            if (property_get(variant_keys[i], prop, NULL) == 0) {
                continue;
            }
            snprintf(path, sizeof(path), "%s/%s.%s.so",
                     HAL_LIBRARY_PATH2, name, prop);
            if (access(path, R_OK) == 0) break;

            snprintf(path, sizeof(path), "%s/%s.%s.so",
                     HAL_LIBRARY_PATH1, name, prop);
            if (access(path, R_OK) == 0) break;
        } else {
            snprintf(path, sizeof(path), "%s/%s.default.so",
                     HAL_LIBRARY_PATH1, name);
            if (access(path, R_OK) == 0) break;
        }
    }

    status = -ENOENT;
    if (i < HAL_VARIANT_KEYS_COUNT+1) {
        /* load the module, if this fails, we're doomed, and we should not try
         * to load a different variant. */
        status = load(class_id, path, module);
    }

查看CAMERA_HARDWARE_MODULE_ID宏定義:

#define CAMERA_HARDWARE_MODULE_ID "camera"

假設property_get(variant_keys[i], prop, NULL)擷取回來的值為”google“(實際平台variant_keys的值可以通過ADB / getprop擷取),則載入的.so檔案為:camera.google.so或者camera.default.so,所以我們可以將camera.goldfish.so定義為camera.google.so並通過adb push進系統目錄(路徑HAL_LIBRARY_PATH1:system/lib/hw),這樣在進入camera應用時就會預設載入camera.goldfish.so庫檔案,camera.goldfish.so類比了一個網路攝影機的實現,正常情況下,可以在螢幕上看到一個黑白格式的漂浮窗生動影像。

二、設計自己的Camera HAL

參考Emulated Camera HAL的實現,我們可以自己設計一個Camera HAL層,保留Emulated Camera HAL大體的流程架構,主要增加和kernel driver的通訊互動部分來控制實際的網路攝影機,並根據平台的硬體特性實現preview, take picture, video recorde等功能。

通常將Camera HAL層的實現放在如下路徑:

device\vendor-x\common\hardware\libcamera\

device\vendor-x\module-type\libcamera\

模組名稱使用上面分析的"camera.google":

LOCAL_MODULE

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.