首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Android Camera HAL3 Preview 數據流深度解析

     編輯:關於C++

前言

基於 Surface BufferQueue 架構,分析 Camera2Client 與 Camera3Device 在 Preview 模式下如何管理視頻幀緩存。

核心流程

1. convertMetadataListToRequestListLocked

將 mPreviewRequest(含 OutputStream 索引)轉為 CaptureRequest,準備下發 HAL3。

2. configureStreamsLocked

對所有 Input/Output Stream 執行 startConfiguration/finishConfiguration。

  • Camera3OutputStream::startConfiguration:查詢 Consumer (Surface) 的 GRALLOC_USAGE 位(如 HW_CAMERA_WRITE、HW_TEXTURE),決定 Buffer 分配屬性。
  • HAL3 configure_streams:提交 camera3_stream_configuration(含每個 stream 的 camera3_stream_t:寬高、格式、最大 Buffer 數、用途)。高通平台每 stream 對應一個 Channel。
  • Camera3Stream::finishConfiguration:
    • configureQueueLocked:連接 ANativeWindow API,設置用途、縮放模式、尺寸、格式、Transform、Buffer 數(mTotalBufferCount = consumerMinUndequeued + halMaxBuffers,通常 8 個)。
    • registerBuffersLocked:dequeueBuffer 取出所有 Buffer,填充 camera3_stream_buffer_set,調用 HAL3 register_stream_buffers 綁定,隨後 cancelBuffer 歸還標記為 ERROR 狀態,完成註冊。

3. Buffer Dequeue(Request 下發)

RequestThread::threadLoop 中為每個 OutputStream getBuffer 獲取一個 camera3_stream_buffer_t,打包進 camera3_capture_request.output_buffers 下發 HAL3。getBuffer 內部等待可用 Buffer(受 max_buffers 限制),調用 getBufferLocked 從 Consumer dequeueBuffer 取得,更新狀態為 OK。

4. Buffer Queue(結果返回)

HAL3 通過 camera3_callback_ops.process_capture_result 返回結果。Camera3Device::returnOutputBuffers 遍歷結果 Buffer,調用對應 Stream returnBuffer → returnBufferLocked。首次註冊時 Buffer 狀態為 ERROR 執行 cancelBuffer;正常幀狀態 OK 設置 timestamp 執行 queueBuffer 送顯示。

5. Consumer 消費

Preview 由 SurfaceFlinger 消費;CallbackProcessor 監聽 onFrameAvailable,喚醒線程 processNewCallback,最終 dataCallback(CAMERA_MSG_PREVIEW_FRAME, ...) 回調上層 APP。

總結

Preview 數據流本質是 Buffer 的 dequeue → HAL3 填充 → queue → Consumer 顯示 循環。configureStreams 階段完成 Buffer 屬性協商與註冊,RequestThread 驅動每幀 Buffer 流轉。HAL3 實現最複雜,Framework 層主要管理隊列與狀態機。

Camera3 Request/Result 流程圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved