您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 手机开发培训 08_Android的Video 输入输出系统
Android的Video输入输出系统Android的Video输入输出系统第一部分Video输入输出系统的综述第二部分Overlay系统第三部分Overlay的硬件抽象层第四部分Camera系统与上层接口第五部分Camera的硬件抽象层第一部分Video输入输出系统的综述在Android系统中,视频的输入、输出具有特定的架构。视频输入输出的两个部分是:视频输入:Camera系统既作为视频输入的接口,也作为照相机应用的下层实现。视频输出:Overlay系统一般作为视频输出的单独层次,在硬件支持中实现。第一部分Video输入输出系统的综述Android的Overlay系统结构OverlayHAL实现VideoOutputDriverOverlayHardwareInterface内核空间C框架OverlayAPIlibui.soOverlaySurfaceFlinger第一部分Video输入输出系统的综述Overlay相关的代码路径:Overlay框架部分的头文件和源文件:frameworks/base/include/ui/frameworks/base/libs/ui/主要为类是IOverlay和Overlay,源代码被编译成库libui.so。与Overlay相关的SurfaceFlinger:framework/base/libs/surfaceflinger/主要的类是LayerBuffer。Overlay的硬件抽象层的接口:hardware/libhardware/include/hardware/overlay.hAndroid的Camera系统结构CameraHAL实现CameraServiceCameraDriverCameraHardwareInterface内核空间C框架CameraAPICameraJNIJavaCameraClass(android.hardware.camera)libui.soCameraJava框架IPC第一部分Video输入输出系统的综述第一部分Video输入输出系统的综述Camera相关的代码路径:Camera框架部分的头文件和源文件:frameworks/base/include/ui/frameworks/base/libs/ui/这部分的内容被编译成库libui.so。Camera服务部分:frameworks/base/camera/libcameraservice/这部分内容被编译成库libcameraservice.so。第一部分Video输入输出系统的综述Camera的JAVA本地调用部分(JNI):frameworks/base/core/jni/android_hardware_Camera.cppCamera的JAVA类:frameworks/base/core/java/android/hardware/Camera.javaCamera的硬件抽象层的定义:frameworks/base/include/ui/目录之中的CameraHardwareInterface.h第二部分Overlay系统在Android中,Overlay系统提供overlay接口,这个接口的含义是叠加在主的显示层上的另外一个显示层,这个叠加的显示层通常作为视频的输出或者照相机取景器的预览界面来使用。Overlay通过ISurface接口来使用,这个Overlay的使用与ISurface中的registerBuffers,postBuffer,unregisterBuffers几个接口是并立的,使用Overlay接口将和SurfaceFlinger中的显示等功能无关。第二部分Overlay系统标题标题第二部分Overlay系统ISurface接口的定义:classISurface:publicIInterface{public:DECLARE_META_INTERFACE(Surface);/*......*/virtualstatus_tregisterBuffers(constBufferHeap&buffers)=0;virtualvoidpostBuffer(ssize_toffset)=0;//one-wayvirtualvoidunregisterBuffers()=0;virtualspOverlayRefcreateOverlay(uint32_tw,uint32_th,int32_tformat)=0;};Overlay接口虽然通过SurfaceFlinger的LayerBuffer来实现,但是Overlay是一个独立接口和SurfaceFlinger的其他部分没有依赖关系。第二部分Overlay系统在文件Overlay.h中,定义了两个类OverlayRef和Overlay。classOverlay:publicvirtualRefBase{public:Overlay(constspOverlayRef&overlayRef);voiddestroy();status_tdequeueBuffer(overlay_buffer_t*buffer);status_tqueueBuffer(overlay_buffer_tbuffer);void*getBufferAddress(overlay_buffer_tbuffer);/*......*/};类Overlay中的几个接口用于视频数据的输出,可以用队列,也可以直接使用地址。第二部分Overlay系统不使用Overlay和使用Overlay的对比:ISurfacePreviewDataSurfaceFlinger/2DGraphicsFramebufferDriverVideoOutputDataOverlayHALVideoOutputDataISurfaceSurfaceFlinger/2DGraphicsFramebufferDriverOverlayV4l2outputGetOverlayFbdriverVideoOutDevicePreviewData第二部分Overlay系统Overlay与其他系统不同,它没有主动被Android系统所使用,因此如果移植了Overlay系统的硬件抽象层。还需要增加使用Overlay的部分。Overlay的使用场景主要有两个:视频播放器的输出(PVPlayer)Preview的输出(CameraHal)第三部分Overlay的硬件抽象层Overlay的硬件抽象层的接口在以下头文件中定义:hardware/libhardware/include/hardware/overlay.h在这个头文件中,主要定义了两个类:overlay_control_device_t和overlay_data_device_t,它们分别继承了hw_device_tcommon,通过这两个类实现Overlay的硬件抽象层。实现一个Overlay的硬件抽象层使用的是Android硬件模块的标准方法,通过类overlay_module_t来完成。第三部分Overlay的硬件抽象层openhw_module_tcommon{.method}OVERLAY_HARDWARE_CONTROLOVERLAY_HARDWARE_DATAgetcreateOverlaydestroyOverlaysetPositiongetPositionsetParameterhw_device_tinitializedequeueBufferqueueBuffergetBufferAddresshw_device_twhformatw_strideh_stridereserved[3]getHandleRefreserved_procs[7]overlay_module_toverlay_control_device_toverlay_data_device_toverlay_tintnumFds;intfds[4];intnumInts;intdata[0];overlay_handle_t第三部分Overlay的硬件抽象层Overlay硬件抽象层的一个实现示例在以下中实现:hardware/libhardware/modules/overlay/overlay.cppstaticstructhw_module_methods_toverlay_module_methods={open:overlay_device_open};conststructoverlay_module_tHAL_MODULE_INFO_SYM={common:{tag:HARDWARE_MODULE_TAG,version_major:1,version_minor:0,id:OVERLAY_HARDWARE_MODULE_ID,name:SampleOverlaymodule,author:TheAndroidOpenSourceProject,methods:&overlay_module_methods,}};第三部分Overlay的硬件抽象层Overlay的使用过程:overlay_control_open→overlay_module_t(hw_module_tcommon)::open→overlay_control_device_t(hw_device_tcommon)→overlay_module_t(hw_module_tcommon)::open→overlay_data_device_t(hw_device_tcommon)overlay_control_device_t::createOverlay→overlay_t::getHandleRef→overlay_handle_toverlay_data_device_t::initialize(overlay_handle_t)overlay_data_device_t::dequeueBufferoverlay_data_device_t::queueBufferoverlay_data_device_t::getBufferAddressOverlay硬件抽象层需要基于一个视频显示的驱动来实现。Overlay的硬件抽象层通常基于两个驱动:framerbuffer驱动程序VideoforLinux2中的视频输出驱动。基于framerbuffer驱动程序的实现,通常实现获得内存地址的接口即可。基于v4l2的实现可以提供流方式的接口,获得更好的性能,其中又分成使用内核内存和使用用户空间内存两种方式。第三部分Overlay的硬件抽象层第四部分Camera系统与上层接口4.1Camera框架和CameraService4.2Camera的JNI和JAVA4.1Camera框架和CameraService在Android系统中,Android的Camera包含取景器(viewfinder)、视频数据获取(Recording)和拍摄照片的功能。Camera部分的主要头的框架部分包含在ui库的中,而Camera中间层的实现是CameraService,CameraService通过调用下层的Camera硬件抽象层来实现功能。4.1Camera框架和CameraServiceCamera主要的头文件有以下几个:ICameraClient.hCamera.hICamera.hICameraService.hICameraService.h、ICameraClient.h和ICamera.h三个类定义了Camera的接口和架构,ICameraService.cpp和Camera.cpp两个文件用于Camera架构的实现,Camera的具体功能在下层调用硬件相关的接口来实现。Camera.h是Camera系统对上层的接口。4.1Camera框架和CameraServiceICameraClientBnCameraClientCame
本文标题:手机开发培训 08_Android的Video 输入输出系统
链接地址:https://www.777doc.com/doc-7211259 .html