Android Camera HAL V3参数传递

最近一直在调试Android 4.4.3的Camera HAL层,对framework层到HAL的参数传递方法一直不明白,导致调试无从下手,今天总算是有点启发,也不知道对不对,但是要写出来给,一是给自己做个笔记,二是可能会对后来的朋友有些启发;

在调试Camera HAL的过程中发现,HAL层调用的许多framework层的很多回调函数,这点要注意,以前我一直以为都是只能framework向下调用HAL层的函数,而HAL层不能调用到framework层的函数,所以导致我在追踪代码的过程中有很多迷糊的地方;后来知道了这些豁然开朗;
              首先第一个很关键的头文件:myandroid/system/media/camera/include/system/camera_metadata_tags.h,这个头文件中有一个很关键的enum类型camera_metadata_tagcamera_metadata_tag 中很很多tag,每个tag后面的注释部分意思是你要定义一个相应类型的enum或int32[ ]类型的数据,并把数据的值注册到系统list中,以后framework和HAL就可以通过tag中的ID匹配相应的参数值;framework层和HAL层通过查找这个tag id找到buffer list中相应的惨值;

typedef enum camera_metadata_tag {
    ANDROID_COLOR_CORRECTION_MODE =                   // enum         | public
            ANDROID_COLOR_CORRECTION_START,
    ANDROID_COLOR_CORRECTION_TRANSFORM,               // rational[]   | public
    ANDROID_COLOR_CORRECTION_GAINS,                   // float[]      | public
    ANDROID_COLOR_CORRECTION_END,

    ANDROID_CONTROL_AE_ANTIBANDING_MODE =             // enum         | public
            ANDROID_CONTROL_START,
    ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,         // int32        | public
    ANDROID_CONTROL_AE_LOCK,                          // enum         | public
    ANDROID_CONTROL_AE_MODE,                          // enum         | public
    ANDROID_CONTROL_AE_REGIONS,                       // int32[]      | public<span style="white-space:pre">	</span>//要定义一个public权限的int32[]数据,并把它注册到系统中;
    ANDROID_CONTROL_AE_TARGET_FPS_RANGE,              // int32[]      | public
    ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,            // enum         | public
    <span style="color:#ff0000;">ANDROID_CONTROL_AF_MODE</span>,                          // enum         | public<span style="white-space:pre">	</span>//自动对焦相关?
    ANDROID_CONTROL_AF_REGIONS,                       // int32[]      | public
    ANDROID_CONTROL_AF_TRIGGER, 
<span style="color:#3333ff;"><strong>ANDROID_CONTROL_AF_AVAILABLE_MODES</strong></span>,               // byte[]       | public<span style="white-space:pre">	</span>//AF控制相关
<span style="color:#ff0000;">ANDROID_FLASH_MODE</span>,                               // enum         | public<span style="white-space:pre">	</span>//闪光灯相关?
//.......................省略部分代码.............................<pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif;">ANDROID_BLACK_LEVEL_LOCK =                        // enum         | public</span>
ANDROID_BLACK_LEVEL_START, ANDROID_BLACK_LEVEL_END, //在枚举空间层次结构中的位置。所有供应商的扩展标签必须定义在标签 >=vendor_section_start 后} camera_metadata_tag_t;

 

上面那些camera_metadata_tag_t中有些enum类型,有些事int32类型,他们具体指什么呢?在myandroid/hardware/imx/mx6/libcamera2/MetadaManager.cpp文件中MetadaManager::createStaticInfo(camera_metadata_t **info, bool sizeRequest)函数中;

status_t MetadaManager::createStaticInfo(camera_metadata_t **info, bool sizeRequest)
{
//.......................................
static const uint8_t <span style="color:#ff0000;">availableAfModes</span>[] = {
			ANDROID_CONTROL_AF_MODE_OFF ,				// new add 
            ANDROID_CONTROL_AF_MODE_AUTO,				// new add
            ANDROID_CONTROL_AF_MODE_MACRO,				// new add 
            //ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,	// new add 
            //ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE	// new add
    };
	//添加对自动对焦模式的支持
    ADD_OR_SIZE(<span style="color:#3333ff;"><strong>ANDROID_CONTROL_AF_AVAILABLE_MODES</strong></span>,
                <span style="color:#ff0000;">availableAfModes</span>, sizeof(<span style="color:#ff0000;">availableAfModes</span>));
//.......................................
}
Camera HAL层是怎么获得Framework层传下来的参数呢?通过调用myandroid/system/media/camera/src/camera_metadata.c文件中的ANDROID_API接口find_camera_metadata_entry();find_camera_metadata_entry()函数的entry参数是输出指针,得到entry值;entry是一个camera_metadata_entry结构体;通过camera_metadata_entry的union指针传递参数值;

typedef struct camera_metadata_entry {
    size_t   index;
    uint32_t tag;
    uint8_t  type;
    size_t   count;
    union {
        uint8_t *u8;			//trigger
        int32_t *i32;			//trigger_id
        float   *f;
        int64_t *i64;			//timestamp
        double  *d;
        camera_metadata_rational_t *r;		//帧率相关
    } data;
} camera_metadata_entry_t;


myandroid/hardware/imx/mx6/libcamera2/MetadaManager.cpp

status_t MetadaManager::getFrameRate(int *value)
{
	
    camera_metadata_entry_t <span style="color:#ff0000;"><strong>streams</strong></span>;
    int res = <span style="color:#3333ff;"><strong>find_camera_metadata_entry</strong></span>(mCurrentRequest,
            ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &<span style="color:#ff0000;"><strong>streams</strong></span>);
    if (res != NO_ERROR) {
        ALOGE("%s: error reading fps range tag", __FUNCTION__);
        return BAD_VALUE;
    }

    int v[2];
    for (uint32_t i = 0; i < streams.count && i < 2; i++) {
        v[i] = <strong><span style="color:#ff0000;">streams</span></strong>.data.i32[i];<span style="white-space:pre">			</span>//得到framework层的值;
    }

    if (v[0] > 15 && v[1] > 15) {
        *value = 30;
    }
    else {
        *value = 15;
    }
    return NO_ERROR;
}
framework层是怎么得到HAL层返回的值呢?

myandroid/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp

void Camera3Device::processCaptureResult(const camera3_capture_result *result) {
//.............................................
// Check that there's a timestamp in the result metadata
<span style="white-space:pre">	</span><strong><span style="color:#ff0000;">CameraMetadata </span></strong><span style="color:#3366ff;"><strong>captureResult</strong></span>;<span style="white-space:pre">		</span>//<span style="color: rgb(255, 0, 0); font-weight: bold; font-family: Arial, Helvetica, sans-serif;">CameraMetadata.find(tag)返回</span><span style="color: rgb(51, 102, 255); font-weight: bold; font-family: Arial, Helvetica, sans-serif;">camera_metadata_entry 就得到了HAL层传上来的参数;</span><span style="color: rgb(255, 0, 0); font-weight: bold; font-family: Arial, Helvetica, sans-serif;">
</span>        <strong><span style="color:#3366ff;">camera_metadata_entry </span></strong>entry =
                <span style="color:#3333ff;"><strong>captureResult</strong></span>.find(<span style="color:#ff0000;">ANDROID_SENSOR_TIMESTAMP</span>);
        if (entry.count == 0) {
            SET_ERR("No timestamp provided by HAL for frame %d!",
                    frameNumber);
            gotResult = false;
        } else if (timestamp != entry.data.i64[0]) {
            SET_ERR("Timestamp mismatch between shutter notify and result"
                    " metadata for frame %d (%lld vs %lld respectively)",
                    frameNumber, timestamp, entry.data.i64[0]);
            gotResult = false;
        }
//.............................................
}
其实myandroid/frameworks/av/include/camera/CameraMetadata.h是framework和HAL参数的中间class;类似个中间变量;以上内容全是个人理解,有错的地方还希望大家指正;一起进步;








  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android相机硬件抽象层(Camera HAL)是Android系统中的一个组件,它提供了一个标准的接口,使应用程序可以与不同类型的相机硬件进行通信。Camera HAL负责管理相机硬件的驱动程序,并将相机数据传递给应用程序。它还提供了一些功能,如自动对焦、曝光控制和图像处理。Camera HALAndroid相机架构中的重要组成部分,它使得开发人员可以轻松地开发出高质量的相机应用程序。 ### 回答2: Android Camera HAL(硬件抽象层)是一种软件层,它实现了操作系统和相机硬件之间的通信。它为相机硬件提供了一种标准的接口,并允许操作系统与硬件之间进行通信,使用户可以在操作系统的界面上控制相机硬件。HAL为开发人员提供了一种开发相机驱动的标准接口,使他们能够使用相同的API在多个设备上编写相机应用程序。 Android Camera HAL提供了一些常见的功能,例如设置相机参数(如曝光时间、焦距、白平衡等)、捕获图像、处理传感器数据和检测触发事件等。HAL将这些功能作为API提供给应用程序,允许应用程序使用这些功能进行自定义图像处理。 除了这些常见的功能,HAL还放宽了操作系统和硬件之间的联系,因为它提供了一个统一的接口。这意味着开发人员可以通过编写HAL来支持新的相机硬件,而不必修改操作系统的源代码。这种可扩展性使得HAL成为一个非常强大的工具,使开发人员能够轻松地集成新硬件和新功能。 总的来说,Android Camera HAL允许开发人员轻松访问和控制相机硬件,并通过使用标准API开发相机应用程序。HAL还促进了相机硬件的可扩展性和可配置性,因为它提供了一个单一的接口,使得不同的设备可以使用相同的API访问底层硬件。 ### 回答3: Android相机HAL(硬件抽象层)是一种旨在提高Android设备相机性能和兼容性的软件组件。HAL是指在底层(硬件、驱动程序、操作系统等)运行的一组软件接口,它们负责把应用程序的请求翻译成与底层硬件通信的命令。 Android相机HAL负责控制相机的硬件功能,例如焦距、曝光、闪光灯、白平衡和图像处理等。HAL相当于一个中间层,使应用程序能够从硬件细节中解放出来,并以一种统一的方式使用不同的摄像头硬件。 不同厂商的相机硬件有很多不同之处,例如像素密度、传感器类型、镜头质量等等。HAL的设计是为了让所有Android设备的应用程序在不同的相机硬件上都能很好地运行。 在HAL中,有两个主要组件:HAL模块和框架层。HAL模块是用于控制硬件的代码库,包括相机驱动程序、图像处理和传感器控制等。框架层按照HAL接口规范与HAL模块通信,并向应用程序提供相机服务。 与传统的相机API不同,Android相机HAL的架构是在原生级别上实现的。这意味着Android设备的各个供应商可以自由地为硬件开发HAL模块,以适应各自的需求。 总之,Android相机HAL的目的是提高相机性能和兼容性。HAL的设计使所有Android设备的应用程序都能使用不同的摄像头硬件,并简化了与底层硬件的通信。这种设计为各个供应商提供了灵活的发展空间,也推动了Android相机的发展和普及。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值