編輯:關於android開發
1. 建立連接
前面的Camera sub system的基礎知識這裡不在贅述,調用流程:
CameraService->connect
> 判斷cameraId是否為有效cameraId,裡面的mNumberOfCameras是從HAL裡得到的,在CameraService創建時讀取HAL的靜態結構數據CameraInfo,通常也是實現在對應的CameraHardware裡。
>判斷mClient是否已經建立
如果有mClient,看看其是否正在使用,沒有使用的話,將mClient銷毀
>如果mClient存在並且正在使用,則退出
>打開CameraHardware
調用的是HAL_openCameraHardware(cameraId),它是HAL必須要實現的一個open函數,代碼在對應的CameraHardware.cpp裡實現。
它其實只調用了CameraHardware的createInstance使用了單例模式。
>創建新的Client,加入到管理數組mClient裡
HAL CameraHardware.cpp的實現
> 聲明CameraInfo,如果是兩個攝像頭的話,就創建兩個元素的結構體
static CameraInfo sCameraInfo[] = {
{ CAMERA_FACING_BACK, 0 /* orientation */ }
{ CAMERA_FACING_FRONT, 0 /* orientation */ }
};
> 聲明HAL_getNumberOfCameras()
其實就是給上層的接口函數,讓上層得到攝像頭的個數
returen sizeof(sCameraInfo)/sizeof(sCameraInfo[0]);
> 聲明HAL_getCameraInfo(int cameraId, struct CameraInfo * cameraInfo)
其實就是給上層的接口函數,讓上層得到指定攝像頭的信息
> 聲明HAL_openCameraHardware(int cameraId)
給上層的接口函數,打開指定的攝像頭,創建HAL實例,就來供上層使用, 打開Camera驅動,設置其CameraParameters
2. Preview
> 上層最終調用到CameraService::Client::startPreview()
> 調用到CameraService::Client::startCameraMode(int)
>> 判斷是否有權訪問Camera主要是check pid和Hardware
>> 在該函數裡根據int的值,決定是preview還是Recording
>> 如果是Preview調用CameraService::Client::startPreviewMode()
>>> 判斷是否hardware正在使用?如果正在使用,退出
>>> 判斷使用Overlay還是Surface
>>> 使用Overlay調用HAL的startPreview() mHardware->startPreview() (mHardware是在第1步中的HAL_openCameraHardware(int cameraId)中得到)
>>> 如果使用Surface,設置hardware使用flag, 調用startPreview
>>> 創建V4L2Camera實例mCamera,這是一個底層的驅動操作封裝類,用來和V4L2直接進行操作
>>> 設置MemoryHeapBase和MemoryBase,方便遠程remote client能夠訪問到Camera frame data
>>> 啟動preview thread
>>>調用CameraService::Client::registerPreviewBuffers(),注冊PreviewBuffers用來將preview數據送到Surface裡
>>> 創建一個ISurface::BufferHeap類型實例,初始化preview數據的信息,寬,高,顯示數據格式,和preview數據位置
>>>ISurface::BufferHeap buffers(w, h, w, h, HAL_PIXEL_FORMAT_RGB_565, mOrientation, 0, mHardware->getPreviewHeap());
>>> 調用mSurface->registerBuffers(buffers),將上述數據信息注冊到Surface裡,用於顯示
PS:之前寫的代碼,一起顯示白屏,沒有采集的圖像,最後發現是上述HAL_PIXEL_FORMAT_RGB_565忘記改了,浪費半天時間。
++++++ 同時運行的preview thread
>>1 調用mCamera->GrabRawFrame()從USB攝像頭獲取一幀原始數據rawFrameData(YUYV格式)
>>2 將rawFrameData轉換為rgb565格式方便顯示
>>3 調用Callback函數mDataCb,將轉換好的數據傳回到CameraService裡
>>4 回到1繼續執行
>> 數據被送回到CameraService裡,回調的是CameraService::Client::dataCallback方法
>> 調用 CameraService::Client::handlePreviewData(IMemory)
>> 調用mSurface->postBuffer()顯示到Surface上
學習Android從0開始之基礎篇(2)-AndroidMainfest.xml文件詳解 AndroidMainfest.xml文件詳解 一、關於AndroidMani
編譯器開發系列--Ocelot語言5.表達式的有效性檢查,--ocelot有效性本篇將對“1=3”“&5”這樣無法求值的不正確的表達式進行檢查。 將檢查如下這些問
Android 手機衛士--導航界面3、4和功能列表界面跳轉邏輯處理,android4和剛剛花了一點時間,將導航界面3、4的布局和相應的跳轉邏輯寫了一下: Setup3
Android系統 應用圖標顯示未讀消息數(BadgeNumber) 桌面app圖標的角標顯示 Android系統 小米,三星,索尼手機發送桌面快鍵提醒數字圖標,在