android camera接口介绍

1. Camera

Android的camera硬件抽象层(HAL)将更高层次的android.hardware中的camera框架层API与底层的camera驱动和camera硬件模块连接了起来。Camera子系统包括camera流水线上各个组件的实现,而camera HAL提供了这些组件的使用接口。

注:camera HAL起着承上启下的作用。在camera HAL层实现中,芯片厂商一般将camera HAL层的实现分为两层:interface层和OEM层。OEM层为下层,它用于屏蔽不同的camera硬件。不同的camera硬件必须支持OEM层提供的对外接口。Interface层为上层,它调用OEM层的对外接口来实现camera HAL所定义的接口。对于Interface层,它并不知道底层camera硬件到底是哪一个版本。同时,interface层完成了屏蔽camera HAL版本的作用。对于OEM层,它也不知道上层是哪一个camera HAL版本,及android版本。两层分离架构,可以很容易地实现不同芯片支持同一个android版本和同一款芯片支持不同android版本(前提条件是该款芯片能够支持这些android版本的各个需求)。

2. Architecture

下面的图片和列表描述camera HAL层的各个组件:


Figure 1. Camera architecture

Application framework

应用框架层是app代码,它调用android.hardware.Camera API与底层的camera硬件进行交互。在android.hardware.Camera API内部,调用相应的JNI类来访问native层的代码,与camera硬件进行交互。

JNI

JNI代码位于frameworks/base/core/jni/android_hardware_Camera.cpp中,它与android.hardware.Camera有一定的关系。JNI代码调用native层代码获得底层camera硬件的访问入口,通过该入口,可以获取到framework层用于创建android.hardware.Camera对象的相关数据。

注:JNI =java native interface,该层使用C++语言实现。有些app软件通过直接调用JNI层对外的接口来访问底层camera硬件,这样使用效率会高一些,但实现复杂度相对也高一些。

Native framework

Native framework层的定义位于frameworks/av/camera/Camera.cpp该层提供了与android.hardware.Camera类对等的一个实现。这个类通过调用IPC binder代理来获取camera service的访问接口。

Binder IPC proxies

IPC binder代理可以现实进程间通信。在frameworks/av/camera目录下有三个camera binder类的定义。ICameraServicecameraservice的接口,ICamera是被打开的camera设备的接口,ICameraClientcamera设备返回给application framework层的接口。

Camera service

Camera service层的定义位于frameworks/av/services/camera/libcameraservice/CameraService.cpp中。它是与camera HAL交互的实际代码。

HAL

硬件抽象层定义了可供cameraservice层调用的标准接口,该接口必须被你的camera硬件功能正确地实现。

Kernel driver

Camera驱动与真实的camera硬件和所实现的camera HAL层进行交互。Camera硬件和驱动必须能够提供YV12NV21格式的图像数据,以支持camera图像数据在显示屏上的预览和视频录制。

注:YV12YUV420P,三个plane,即YVU三个plane依次存储,如:YYYYYYYY VV UUNV21YUV420SP,两plane,即YVU作为两个plane存储,且VU交织,即一个V,一个U,依次存储,如:YYYYYYYY VUVU。具体见:

http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html


3. Implementing the HAL

Camera HAL层位于camera驱动和更高层次的android framework之间,它定义了你必须实现的接口,该接口方便app能够正确地操作camera硬件。CameraHAL层的接口被定义在头文件hardware/libhardware/include/hardware/camera.hhardware/libhardware/include/hardware/camera_common.h中。

camera_common.h定义了一个重要的结构体camera_module,这个结构体定义了一个标准结构,可以获取camera基本信息,比如ID和所有camera所共有的属性,比如是否是前置或者后置camera。

camera.h包含的code基本上与android.hardware.Camera一致。这个头文件中声明了一个结构体camera_device,它包含了结构体camera_device_ops,该结构体中有指向实现camera HAL接口的函数的函数指针。关于开发者可以设置的camera参数的各中类型,可以参考文件frameworks/av/include/camera/CameraParameters.h。在camera HAL层,使用int (*set_parameters)(struct camera_device *, const char *parms)来设置这些参数。

一个camera HAL层实现的实例,可以参考hardware/ti/omap4xxx/camera下面的关于Galaxy Nexus HAL的实现。


4. Configuring the Shared Library

你需要建立android编译环境,正确地将camera HAL层的实现打包到一个共享库中,然后拷贝到Android.mk中所建立的适当的路径下:

1> 创建目录device/<company_name>/<device_name>/camera,获取你的库所对应的代码文件。

2创建文件Android.mk,编译共享库。确保Makefile文件中包含下面这几行:

LOCAL_MODULE := camera.<device_name>
LOCAL_MODULE_RELATIVE_PATH := hw

注意,你的库必须命名为camera.<device_name> (.so是自动附加的),以便android能正确地加载这个库。例如,去文件hardware/ti/omap4xxx/Android.mk,看看GalaxyNexus camera的Makefile文件。

3通过从目录frameworks/native/data/etc下拷贝必要功能XML文件,在你的设备的Makefile文件中明确指出你的设备有哪些功能。例如,明确指出你的设备有闪光灯,而且能自动聚焦,那就需要在你的设备所对应的<device>/<company_name>/<device_name>/device.mk Makefile文件中增加下面几行:

PRODUCT_COPY_FILES := \ ...
 
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \    

一个设备的Makefile文件的例子,可以参考device/samsung/tuna/device.mk.

4在device/<company_name>/<device_name>/media_profiles.xml和device/<company_name>/<device_name>/media_codecs.xml两个XML文件中,声明你的camera设备支持的多媒体编解码器,格式和分辨率。为了获取更多相关信息,可以参考ExposingCodecs and Profiles to the Framework

注:这个信息很重要,上层app如果要使用相关功能,需要先查询底层硬件支持哪些编解码器及其性能,然后选择与自己需求最匹配的特性,设置给底层硬件。如果该信息设置错误,底层硬件将无法工作,或者出现工作异常。

5将下面的信息加入你的device/<company_name>/<device_name>/device.mk Makefile文件,将拷贝media_profiles.xmlmedia_codecs.xml到相应的位置。

# media config xml file
PRODUCT_COPY_FILES +=\
    <device>/<company_name>/<device_name>/media_profiles.xml:system/etc/media_profiles.xml

# media codec config xml file
PRODUCT_COPY_FILES +=\
    <device>/<company_name>/<device_name>/media_codecs.xml:system/etc/media_codecs.xml

6通过在你的设备device/<company_name>/<device_name>/device.mk Makefile中的PRODUCT_PACKAGES变量里添加app名称,声明你想将哪些cameraapp添加到你的设备的系统image中:

PRODUCT_PACKAGES :=\
Gallery2 \
...

 

Website:

https://source.android.com/devices/camera/index.html




  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
r18_ap6330的步骤.txt 2017/2/9 10:47 开始整理 原始SDK默认配置为rtl8723bs,现在要修改为:AP6330。 硬件平台:全志R18。 开发板:DP-18 SDK:Android6.0.1/Linux3.10.65(v2.1版本,发布日期20161008) WIFI测试需要支持5.8G的AP来测试。BT用普通的Android手机发送图片即可。 1、请严重注意全志R18的架构选择:ARCH=arm64 rootroot@cm-System-Product-Name:/home/wwt/dp18_ap6330/lichee/linux-3.10$ rootroot@cm-System-Product-Name:/home/wwt/dp18_ap6330/lichee/linux-3.10$ make ARCH=arm64 menuconfig rootroot@cm-System-Product-Name:/home/wwt/dp18_ap6330/lichee/linux-3.10$ WIFI部分可以关闭realtek: Device Drivers ---> [*] Network device support ---> [*] Wireless LAN ---> Realtek 8723B SDIO or SPI WiFi Realtek 8723BS_VQ0 WiFi Realtek 8189F SDIO WiFi Realtek 8723C SDIO or SPI WiFi 可以配置内核打印级别为18(默认为17?) General setup ---> (18) Kernel log buffer size (16 => 64KB, 17 => 128KB) 2、 Z:\home\wwt\dp18_ap6330\android\device\softwinner\tulip-d1\BoardConfig.mk 关闭这里: # BOARD_WIFI_VENDOR := realtek 打开这里: BOARD_WIFI_VENDOR := broadcom 蓝牙的修改: ##BOARD_HAVE_BLUETOOTH_BCM := true BOARD_HAVE_BLUETOOTH_NAME := rtl8723bs_vq0 BOARD_HAVE_BLUETOOTH_RTK_COEX := true BOARD_HAVE_BLUETOOTH_RTK := true BLUETOOTH_HCI_USE_RTK_H5 := true 修改为: BOARD_HAVE_BLUETOOTH_BCM := true BOARD_HAVE_BLUETOOTH_NAME := ap6330 #BOARD_HAVE_BLUETOOTH_NAME := rtl8723bs_vq0 #BOARD_HAVE_BLUETOOTH_RTK_COEX := true #BOARD_HAVE_BLUETOOTH_RTK := true #BLUETOOTH_HCI_USE_RTK_H5 := true 3、 Z:\home\wwt\dp18_ap6330\android\device\softwinner\tulip-d1\init.sun50iw1p1.rc 蓝牙部分: #bluesleep insmod /system/vendor/modules/rtl_btlpm.ko 修改为: #bluesleep #insmod /system/vendor/modules/rtl_btlpm.ko #network insmod /system/vendor/modules/bcmdhd.ko insmod /system/vendor/modules/bcm_btlpm.ko WIFI部分: 关闭这里: # 1. realtek & eagle wifi service # 1.1 realtek & eagle wifi sta service service wpa_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ -I/system/etc/wifi/wpa_supplicant_overlay.conf \ -O/data/misc/wifi/sockets \ -e

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值