(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