日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Camera架构分析

發布時間:2025/3/15 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Camera架构分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源代碼版本:allwinner 4.0.4

frameworks代碼:

frameworks/base/core/java/Android/hardware/Camera.java

JNI層代碼:

frameworks/base/core/jni/android_hardware_Camera.cpp

client端代碼:

frameworks/base/libs/camera/

server端代碼:

frameworks/base/services/camera/libcameraservice/

HAL層代碼:

device/softwinner/common/hardware/camera/

camera配置文件:

system/etc/ camera.cfg


先從應用程序open camera分析,其調用流程如下圖:


? ? ? ? 圖中,JNI的Camera::connect函數通過跨進程調用,服務端CameraService會創建Client實體BnCamera, 并且經過binder轉換,返回給JNI connet函數一個BpCamera代理,有了這個代理,就可以遠程調用CameraService內嵌類client的方法,如startPreview,autoFocus等等;

? ? ? ? 并且,Camera::connect將Camera對象作為參數傳遞給服務端,Camera類繼承自BnCameraClient,所以JNI 端Camera自身也創建了BnCameraClient實體,跨進程后,CameraService獲得其代理BpCameraClient,有了這個代理,服務端就可以回調Camera端的notifyCallback,dataCallback,dataCallbackTimestamp等方法。在這種情景下,可以把CameraService視為客戶端,而Camera則為服務端。


? ? ? ?framework層的調用流程大概就如上所述,HAL層是廠商自己實現的,不同方案代碼結構各有不同,這里分析的是allwinner的源代碼。接著以startPreview為例子,看framework層是如何調用HAL層的。調用流程如下圖所示:



對上述圖中簡要說明幾點:

? ? ? ? 1. framework的幾個callback函數在構造函數初始化時候就已經注冊到了HAL中,以實現HAL層有數據時候回調framework, 最終framework回調app中的注冊函數

? ? ? ? 2.?CameraHardware類在初始化時候開啟了DoCommandThread和DoAutoFocusThread線程,用來監聽上層的命令和動作,前者監聽如設置攝像頭的白光平衡,曝光度,快門模式等;后者用來監聽自動對焦命令。

? ? ? ? 3.?doStartPreview最終會調用V4L2Camera類的startWorkerThread來啟動線程,該線程實現方法在V4L2CameraDevice類的inWorkerThread函數。該函數首先調用ioctl(mCamFd, VIDIOC_DQBUF, buf)獲取圖像數據,并將數據進行格式轉換和大小縮放。最后用OSAL_Queue方法將數據入隊列并發出通知信號。

? ? ? ? 4.??V4L2CameraDevice類的previewThread線程收到信號,調用onNextFrameCB,回調framwork函數將數據返回上層;并調用onNextFramePreview將數據在窗口中進行預覽,這就是打開攝像頭看到的預覽圖像。

? ? ? 其他流程如takePicture,startRecording等和上述差不多,下面給出takePicture的流程圖,其它不再重述。



最后看應用層調用takePicture拍照時候的數據回調過程。

應用層拍照的調用函數是?camera.takePicture(shutterCallback, rawCallback, jpegCallback);

shutterCallback類要實現Camera.ShutterCallback接口;?rawCallback, jpegCallback類要實現Camera.PictureCallback接口,他們的一般形式如下:? ? ?

[cpp]?view plaincopy
  • //返回照片的JPEG格式的數據????????
  • private?JpegCallback?jpegCallback?=?new?PictureCallback(){??????
  • ????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????????
  • ????????Parameters?ps?=?camera.getParameters();??????????????????
  • ????????if(ps.getPictureFormat()?==?PixelFormat.JPEG){????????????????
  • ????????????//存儲拍照獲得的圖片????????????????????
  • ????????????try?{???
  • ????????????????String?path?=?"/sdcard/"+System.currentTimeMillis()+".jpg";??????
  • ????????????????File?file?=?new?File(path);??
  • ????????????????if(!file.exists())??
  • ????????????????????file.createNewFile();??
  • ????????????????FileOutputStream?fos?=?new?FileOutputStream(file);??
  • ????????????????fos.write(data);??
  • ????????????????fos.close();????????
  • ????????????}?catch?(Exception?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}??????????
  • ????????????//將圖片交給Image程序處理?????????????????????????
  • ????????????Uri?uri?=?Uri.fromFile(new?File(path));?????????????????????????
  • ????????????Intent?intent?=?new?Intent();??????????????????????????????
  • ????????????intent.setAction("android.intent.action.VIEW");?????????????????????????????
  • ????????????intent.setDataAndType(uri,?"image/jpeg");?????????????????????????????
  • ????????????startActivity(intent);??????????????????????
  • ????????}?????????????
  • ????}??????
  • };??
  • [cpp]?view plaincopy
  • //快門按下的時候onShutter()被回調??
  • private?ShutterCallback?shutterCallback?=?new?ShutterCallback(){??
  • ????public?void?onShutter()?{??
  • ????????if(tone?==?null)??
  • ????????????//發出提示用戶的聲音??
  • ????????????tone?=?new?ToneGenerator(AudioManager.STREAM_MUSIC,?ToneGenerator.MAX_VOLUME);??
  • ????????tone.startTone(ToneGenerator.TONE_PROP_BEEP2);??
  • ????}??
  • };??

  • rawCallback則為返回未壓縮的數據,一般用不上。

    其framework層的回調過程如下圖:


    前面已經分析,hal層取得數據后回調了cameraservice的dataCallback方法和notifyCallback方法;經過binder跨進程,回調Camera端的對應方法。

    ? ? ? ? 1. 在JNI中,包含了一個內部類JNICameraContext,其繼承自CameraListener并實現了其notify,postData和postDataTimestamp方法。在camera初始化的時候android_hardware_Camera_native_setup方法中就已經為mListener賦值了一個JNICameraContext對象。Camera類就是通過listener->postData,listener->notify等方法調用JNICameraContext類的實現方法;JNICameraContext用env->SetByteArrayRegion(obj, 0, size, data)創建空間保存壓縮過的JPEG格式圖片,再通過CallStaticVoidMethod回調framework中Camera.java中的方法。

    ? ? ? ? 2. 在Camera.java中通過EventHandler類的handleMessage來處理JNI回調的方法,swith根據參數的不同,回調APP中相應的方法,而這些方法正是是APP當初在takePicture時候傳進來的。

    ? ? ? ? 通過上述流程就實現了數據從HAL層到APP層的回調過程。


    原文地址:http://blog.csdn.net/lushengchu_luis/article/details/11033095

    總結

    以上是生活随笔為你收集整理的Android Camera架构分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。