Android'scamera模块代码分析内容目录Android'scamera模块代码分析..................................................................................................11Android'scamera模块概述..........................................................................................................22camera模块调试方式..................................................................................................................23camera对视频处理流程..............................................................................................................24代码分析......................................................................................................................................41Android'scamera模块概述Camera模块是android系统中用于处理视频输入的模块。Android将camera定义为一个framework,这样客户可以使用camera'sframework支持不同的硬件,只需客户实现camera的framework。本文主要介绍cameraframework和如何实现cameraframework。2camera模块调试方式•生成avd.androidcreateavd-t1-nmyavd//生成avd,-t制定typeid,-n指定生成avd的名字mksdcard-lsdcard512M/sdcard.img//生成虚拟的sdcard,512m指定大小,sdcard.img指定sdcard的名字。•启动android模拟器(包括虚拟的sdcard)emulator-sdcard/sdcard.img•通过adblogcat获取启动log.•分析启动log是否正常,是否正常启动了sdcard.•使用模拟器进行拍照,并查看log.以上是基于android提供的虚拟机来实现的模拟。在没有硬件的环境里面,可以通过这个环境进行配置和测试。3camera对视频处理流程简单的流程控制。简单的数据流程:4代码初步描述下图为camera调用流程,为android提供的camera框架。以上的框架已经由android实现,在移植新的硬件的时候,我们无需修改以上对应的code.需要实现的code为CameraHardwareInterface这一层。1.CameraHardwareInterface链接cameraserver和vedio4linux(也可能是其他的驱动),通过实现CameraHardwareInterface可以屏蔽不同的driver对之前实现的code的冲击,这样无论使用何种驱动程序,camerahal几乎不需要进行任何的修改。CameraHardwareInterface接口定义于文件frameworks/base/include/ui/CameraHardwareInterface.h中。ClassCameraHardwareInterface:publicvirtualRefBase{virtualstatus_tstartRecording(...)=0;virtualboidstopRecording()=0;virtualstatus_tautoFocus(...)=0;virtualstatus_ttakePicture(....)=0;…};类中定义了拍照录像等api,当需要支援新的硬件时就需要继承于类ClassCameraHardwareInterface,支援拍照录像等功能。换句话讲每一个CameraHardwareInterface实例对应一个硬件。(不知道这样说对不对)2.CameraService是Camera框架的中间层,用于链接CameraHardwareInterface和Client.定义于文件frameworks/base/camera/libcameraservice/CameraService.hclassCameraService:publicBnCameraService{classClient;};类BnCameraService中提供了一些api,但是这些api(拍照录像等)并不被其他程序使用,而只在本地使用。而classClient是个很重要的类,它在内部真实的处理由camerahal返回的数据和notify信息。其中之前的3个callback函数和camerahal都会以成员变量的形式存在于classClient.总结当需要支援一个camera的时候,需要实现2个类:ClassCameraHardwareInterface:用于实现一个新硬件CameraService:用于实现CameraService::Client中的3个callback函数。与camera相关的还有surface和opencoresurface需要基于framebuffer实现,也就是实现surface的框架。Opencore是一个opensourceproject,提供player,author,encoder,decodercodec...andorid针对opencore做了封装,简单的应用可以使用android封装好的api进行录像播放等功能。5分析核心代码classCameraHardwareInterface是camera框架最核心的部分,当需要支援新硬件的时候需要实现新的class并且public继承CameraHardwareInterface。classCameraHardwareInterface定义于./frameworks/base/include/ui/CameraHardwareInterface.hclassCameraHardwareInterface:publicvirtualRefBase类CameraHardwareInterface虚拟继承于RefBase防止二意性。RefBase是引用计数基础类。几乎每个class都会继承自RefBase。CameraHardwareInterface中定义了若干函数,下面逐个介绍virtual~CameraHardwareInterface(){}virtualdestructor子类在释放资源时可以正确调用子类和父类destructorvirtualspIMemoryHeapgetPreviewHeap()const=0;purevitualfunction,返回由newMemoryHeapBase(size)分配的用于保存previewmediadata,previewbuf内部实现为ping-pangbuf。virtualspIMemoryHeapgetRawHeap()const=0;purevitualfunction,返回由newMemoryHeapBase(size)分配的用于保存camera拍照时返回的rowdata。virtualvoidsetCallbacks(notify_callbacknotify_cb,data_callbackdata_cb,data_callback_timestampdata_cb_timestamp,void*user)=0;purevitualfunction,设置3个callback,(3个callback一般由CameraService::Client中实现)。下面是3个callback函数的原型:typedefvoid(*notify_callback)(int32_tmsgType,int32_text1,int32_text2,void*user);typedefvoid(*data_callback)(int32_tmsgType,constspIMemory&dataPtr,void*user);typedefvoid(*data_callback_timestamp)(nsecs_ttimestamp,int32_tmsgType,constspIMemory&dataPtr,void*user);notify_callback用于处理一些通知的消息,如按了快门等。data_callback用来返回通过camera得到的rawdata.data_callback_timestamp用来返回通过camera得到的rawdata并且携带时间戳。virtualvoidenableMsgType(int32_tmsgType)=0;purevitualfunction,用于指定msgtype对应的callback(上面那3个callback)是否可以调用,如当nableMsgType(CAMERA_MSG_PREVIEW_FRAME)则可以调用data_callback。Android支援的msgtype:enum{CAMERA_MSG_ERROR=0x001,CAMERA_MSG_SHUTTER=0x002,CAMERA_MSG_FOCUS=0x004,CAMERA_MSG_ZOOM=0x008,CAMERA_MSG_PREVIEW_FRAME=0x010,CAMERA_MSG_VIDEO_FRAME=0x020,CAMERA_MSG_POSTVIEW_FRAME=0x040,CAMERA_MSG_RAW_IMAGE=0x080,CAMERA_MSG_COMPRESSED_IMAGE=0x100,CAMERA_MSG_ALL_MSGS=0x1FF};virtualvoiddisableMsgType(int32_tmsgType)=0purevitualfunction,与enableMsgType相反。virtualboolmsgTypeEnabled(int32_tmsgType)=0purevitualfunction,用于判断一个或者多个msgtype是否有效,内部使用&操作。virtualstatus_tstartPreview()=0;purevitualfunction,设置程序运行在preview模式,主要需要配置preview的参数,vedio数据格式,图像的宽,高,帧率等,设置拍照出图的宽高和图片格式。Preview应该以一个线程的方式调用,在程序内部不断的loop获取rawdata并把rawdata发送给surface用于preview,之后支援录像,需要把rawdata发送给mediaauthor。virtualbooluseOverlay(){returnfalse;}virtualfunction,默认不使用overlay来显示preview,如果使用overlay来显示preview则在子类中重新实现。virtualstatus_tsetOverlay(constspOverlay&overlay){returnBAD_VALUE;}virtualfunction,默认不使用overlay来显示preview,如果需要overlay来显示preview则在子类中重新实现。virtualvoidstopPreview()=0;purevitualfunction,停止preview。如果preview使用线程实现则退出thread.方式为调