android camera接口介绍
2015-12-25 20:28
288 查看
1.Camera
Android的camera硬件抽象层(HAL)将更高层次的android.hardware中的camera框架层API与底层的camera驱动和camera硬件模块连接了起来。Camera子系统包括camera流水线上各个组件的实现,而camera
HAL提供了这些组件的使用接口。
注:cameraHAL起着承上启下的作用。在cameraHAL层实现中,芯片厂商一般将cameraHAL层的实现分为两层:interface层和OEM层。OEM层为下层,它用于屏蔽不同的camera硬件。不同的camera硬件必须支持OEM层提供的对外接口。Interface层为上层,它调用OEM层的对外接口来实现cameraHAL所定义的接口。对于Interface层,它并不知道底层camera硬件到底是哪一个版本。同时,interface层完成了屏蔽camera
HAL版本的作用。对于OEM层,它也不知道上层是哪一个cameraHAL版本,及android版本。两层分离架构,可以很容易地实现不同芯片支持同一个android版本和同一款芯片支持不同android版本(前提条件是该款芯片能够支持这些android版本的各个需求)。
2.Architecture
下面的图片和列表描述cameraHAL层的各个组件:
Figure1.Cameraarchitecture
Applicationframework
应用框架层是app代码,它调用android.hardware.Camera
API与底层的camera硬件进行交互。在android.hardware.Camera
API内部,调用相应的JNI类来访问native层的代码,与camera硬件进行交互。
JNI
JNI代码位于android.hardware.Camera有一定的关系。JNI代码调用native层代码获得底层camera硬件的访问入口,通过该入口,可以获取到framework层用于创建android.hardware.Camera对象的相关数据。
注:JNI=javanativeinterface,该层使用C++语言实现。有些app软件通过直接调用JNI层对外的接口来访问底层camera硬件,这样使用效率会高一些,但实现复杂度相对也高一些。
Nativeframework
Nativeframework层的定义位于android.hardware.Camera类对等的一个实现。这个类通过调用IPC
binder代理来获取cameraservice的访问接口。
BinderIPCproxies
IPCbinder代理可以现实进程间通信。在
framework层的接口。
Cameraservice
Cameraservice层的定义位于
HAL
硬件抽象层定义了可供cameraservice层调用的标准接口,该接口必须被你的camera硬件功能正确地实现。
Kerneldriver
Camera驱动与真实的camera硬件和所实现的cameraHAL层进行交互。Camera硬件和驱动必须能够提供YV12和NV21格式的图像数据,以支持camera图像数据在显示屏上的预览和视频录制。
注:YV12是YUV420P,三个plane,即Y,V,U三个plane依次存储,如:YYYYYYYY
VVUU;NV21是YUV420SP,两plane,即Y,VU作为两个plane存储,且VU交织,即一个V,一个U,依次存储,如:YYYYYYYY
VUVU。具体见:
/article/5931367.html
3.ImplementingtheHAL
CameraHAL层位于camera驱动和更高层次的androidframework之间,它定义了你必须实现的接口,该接口方便app能够正确地操作camera硬件。CameraHAL层的接口被定义在头文件
android.hardware.Camera一致。这个头文件中声明了一个
HAL接口的函数的函数指针。关于开发者可以设置的camera参数的各中类型,可以参考文件
一个cameraHAL层实现的实例,可以参考
NexusHAL的实现。
4.ConfiguringtheSharedLibrary
你需要建立android编译环境,正确地将cameraHAL层的实现打包到一个共享库中,然后拷贝到
1>创建目录
2>创建文件Android.mk,编译共享库。确保Makefile文件中包含下面这几行:
camera的Makefile文件。
3>通过从目录
Makefile文件中增加下面几行:
一个设备的Makefile文件的例子,可以参考
4>
andProfilestotheFramework。
注:这个信息很重要,上层app如果要使用相关功能,需要先查询底层硬件支持哪些编解码器及其性能,然后选择与自己需求最匹配的特性,设置给底层硬件。如果该信息设置错误,底层硬件将无法工作,或者出现工作异常。
5>
Makefile文件,将拷贝
6>
Website:
https://source.android.com/devices/camera/index.html
Android的camera硬件抽象层(HAL)将更高层次的
HAL提供了这些组件的使用接口。
注:cameraHAL起着承上启下的作用。在cameraHAL层实现中,芯片厂商一般将cameraHAL层的实现分为两层:interface层和OEM层。OEM层为下层,它用于屏蔽不同的camera硬件。不同的camera硬件必须支持OEM层提供的对外接口。Interface层为上层,它调用OEM层的对外接口来实现cameraHAL所定义的接口。对于Interface层,它并不知道底层camera硬件到底是哪一个版本。同时,interface层完成了屏蔽camera
HAL版本的作用。对于OEM层,它也不知道上层是哪一个cameraHAL版本,及android版本。两层分离架构,可以很容易地实现不同芯片支持同一个android版本和同一款芯片支持不同android版本(前提条件是该款芯片能够支持这些android版本的各个需求)。
2.Architecture
下面的图片和列表描述cameraHAL层的各个组件:
Figure1.Cameraarchitecture
Applicationframework
应用框架层是app代码,它调用
API与底层的camera硬件进行交互。在
API内部,调用相应的JNI类来访问native层的代码,与camera硬件进行交互。
JNI
JNI代码位于
frameworks/base/core/jni/android_hardware_Camera.cpp
中,它与
注:JNI=javanativeinterface,该层使用C++语言实现。有些app软件通过直接调用JNI层对外的接口来访问底层camera硬件,这样使用效率会高一些,但实现复杂度相对也高一些。
Nativeframework
Nativeframework层的定义位于
frameworks/av/camera/Camera.cpp
,该层提供了与
binder代理来获取cameraservice的访问接口。
BinderIPCproxies
IPCbinder代理可以现实进程间通信。在
frameworks/av/camera目录下有三个camerabinder类的定义。ICameraService是cameraservice的接口,ICamera是被打开的camera设备的接口,ICameraClient是camera设备返回给application
framework层的接口。
Cameraservice
Cameraservice层的定义位于
frameworks/av/services/camera/libcameraservice/CameraService.cpp中。它是与cameraHAL交互的实际代码。
HAL
硬件抽象层定义了可供cameraservice层调用的标准接口,该接口必须被你的camera硬件功能正确地实现。
Kerneldriver
Camera驱动与真实的camera硬件和所实现的cameraHAL层进行交互。Camera硬件和驱动必须能够提供YV12和NV21格式的图像数据,以支持camera图像数据在显示屏上的预览和视频录制。
注:YV12是YUV420P,三个plane,即Y,V,U三个plane依次存储,如:YYYYYYYY
VVUU;NV21是YUV420SP,两plane,即Y,VU作为两个plane存储,且VU交织,即一个V,一个U,依次存储,如:YYYYYYYY
VUVU。具体见:
3.ImplementingtheHAL
CameraHAL层位于camera驱动和更高层次的androidframework之间,它定义了你必须实现的接口,该接口方便app能够正确地操作camera硬件。CameraHAL层的接口被定义在头文件
hardware/libhardware/include/hardware/camera.h和
hardware/libhardware/include/hardware/camera_common.h中。
camera_common.h定义了一个重要的结构体
camera_module,这个结构体定义了一个标准结构,可以获取camera基本信息,比如ID和所有camera所共有的属性,比如是否是前置或者后置camera。
camera.h
包含的code基本上与
结构体camera_device,它包含了结构体camera_device_ops,该结构体中有指向实现camera
HAL接口的函数的函数指针。关于开发者可以设置的camera参数的各中类型,可以参考文件
frameworks/av/include/camera/CameraParameters.h
。在cameraHAL层,使用int(*set_parameters)(structcamera_device*,constchar*parms)来设置这些参数。
一个cameraHAL层实现的实例,可以参考
hardware/ti/omap4xxx/camera
下面的关于Galaxy
NexusHAL的实现。
4.ConfiguringtheSharedLibrary
你需要建立android编译环境,正确地将cameraHAL层的实现打包到一个共享库中,然后拷贝到
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
andProfilestotheFramework。
注:这个信息很重要,上层app如果要使用相关功能,需要先查询底层硬件支持哪些编解码器及其性能,然后选择与自己需求最匹配的特性,设置给底层硬件。如果该信息设置错误,底层硬件将无法工作,或者出现工作异常。
5>
将下面的信息加入你的device/<company_name>/<device_name>/device.mk
Makefile文件,将拷贝
media_profiles.xml和
media_codecs.xml
到相应的位置。
#mediaconfigxmlfile
PRODUCT_COPY_FILES+=\
<device>/<company_name>/<device_name>/media_profiles.xml:system/etc/media_profiles.xml
#mediacodecconfigxmlfile
PRODUCT_COPY_FILES+=\
<device>/<company_name>/<device_name>/media_codecs.xml:system/etc/media_codecs.xml
6>
通过在你的设备device/<company_name>/<device_name>/device.mkMakefile中的
PRODUCT_PACKAGES
变量里添加app名称,声明你想将哪些cameraapp添加到你的设备的系统image中:
PRODUCT_PACKAGES:=\
Gallery2\
...
Website:
相关文章推荐
- Android书籍推荐
- Android 二维码功能实现
- ubuntu12.04 配置android 编译环境,个人经验小结
- 在android移动设备上登录gmail的时候报password错误解决方法!!!!
- 4000 Android RotateAnimation详解
- android实战之 视觉差侧滑菜单简单版+Activity视觉差动画
- (一) Porting USB 3G MODEM to Android
- adb 命令使用之抓取log并过滤。
- Android黑科技,读取用户短信+修改系统短信数据库
- AndroidManifest中注册application
- Android Studio 2.0 Preview4 transformClassesWithDexFor
- android弹出了单选框和listview实现功能的问题
- android的gralloc分析
- Android dialog 对话框自定义布局
- android studio比较长用的几款插件
- android studio比较长用的几款插件
- android studio比较长用的几款插件
- 我为什么主张反对使用Android Fragment
- Android -- LinearLayout
- Android studio开发NDK