(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