Android的camera硬件抽象層(HAL)將更高層次的android.hardware.Camera中的camera框架層API與底層的camera驅動和camera硬件模塊連接了起來。Android最新版本介紹了camera棧的一個新的、底層的實現。如果你有一個以前開發的camera HAL模塊,可以驅動android其他版本,那你將發現在camera流水線中發生了非常大的變化。
由於很多設備都依賴於camera HAL層的第一個版本,所以android發佈的新版本仍然會支持它。Android camera service層也支持camera HAL層v1和v3兩個版本,當你想讓camera HAL層的v1版本支持較少的前置camera而v3版本支持更高級的後置版本時,這個是很有用的。V2版本只是v3的一個過渡版本,將不再支持。
我們只有一個camera HAL模塊(有自己的版本號,一般爲1,2或者2.1),它對應於多個擁有自己版本號的camera設備。爲了支持設備的v2或者更新版本,Camera模塊需要提供v2或者更新版本,這類的camera模塊有一個多個camera設備版本混合的版本號。這就是當我們所說的android支持多個camera HAL層的實現。
注:在camera architecture圖中可以看到camera HAL層有四個模塊,分別爲:Camera HAL Device v1,Camera HAL Device v2,Camera HAL Device v3和Camera HAL Module。Camera模塊的版本必須與camera設備的版本匹配。
注意:新的camera HAL層正在開發中,隨時都可能發生變化。這篇文檔在較高層次描述了camera子系統的設計,忽略了很多細節問題。參考Camera versionsupport獲知我們的計劃。
1. Overview
Camera子系統的第一個版本被設計爲高層控制的一個黑盒。粗略地將,舊的子系統分爲三種操作模式:
· 預覽
· 視頻錄製
· 拍照
每種模式差別甚微,且功能重疊。這使得很難實現新的功能,例如burst模式,因爲在兩種模式之間切換時會停止。
注:burst模式指的是快速拍照,在規定的時間內連續不斷地進行拍照。在第一版的camera子系統中,拍一張照片後,會回到預覽模式,然後再拍一張,再回到預覽模式。這種處理,很難滿足burst模式的需求。
Figure 1.Camera components
2. Version 3 enhancements
重新設計android camera API的目的是爲了充分地提高android設備上應用程序控制camera子系統的能力。重組API,使得它更高效和可維護。
新增控制使得在android設備上更容易創建高質量的能穩定地在多個android產品上運行的camera應用程序,同時在使用設備指定的算法的前提下儘可能地使得質量和性能最大化。
第三版的Camera子系統構建了一個單一且統一視圖的操作模式,能用來實現以前的任何模式以及其他模式,比如burst模式。這使得用戶可以更好地控制聚集、曝光及後處理,比如去噪,對比度增強和銳化。另外,這種簡化的視圖使得應用程序開發者更容易使用camera的各種功能。這版API使camera子系統形成一個流水線,按照1:1的比例,將幀數據的多次捕獲轉爲多幀數據的請求。這些請求封裝了捕獲和處理這幀數據的所有配置信息。這些信息包括:分辨率,像素格式,sensor調整,鏡頭和閃光燈控制,3A操作模式,RAW轉YUV處理,統計信息產生,等等。
注:這裏的描述,是第三版與第一版最大的區別。第一版中,操作模式多次運行,比如要五張圖片,則進行五次拍照。而第三版中,先把需求描述清楚,作爲一個個請求,在每個請求中將本次圖像數據情況描述清楚,將請求依次發送到底層。這對底層camera硬件要求很高,因爲這些請求中相鄰兩個請求的圖像數據分辨率,格式等等都有可能不同。需要底層camera硬件在有效的時間範圍內,必須提供上層所需要的圖像數據。
簡單地說,application framework層向camera子系統請求一幀數據,camera子系統返回一幀圖像數據即可。另外,包含例如顏色空間,lens shading等信息的元數據需要被包含在每一個返回的數據單元裏。下面的圖片給出了各個組件更多的細節。你可以將camera第三個版本看作第一個單行處理的流水線。它將每一個拍照請求轉化爲sensor捕獲的一幀圖像,其處理如下:
· 返回一個拍照相關的擁有元數據的對象。
· 一個或者多個圖像數據buffer,每個都有自己的目標surface。
可能的輸出surface被預先配置:
· 每一個surface是固定分辨率的多個圖像buffer的目標。
· 只有很少數量的surface可以被配置爲立即輸出。
一個請求包含了所有拍照的配置,輸出surface的列表被添加到圖像buffer中(所有被配置的單元的輸出)。一個請求可能只發送一次,也有可能會被多次發送。拍照優先於被重複發送的請求。
Figure 2.Camera core operation model
3. Supported version
支持camera HAL v3版本的camera設備,在camera_device_t.common.version和
camera_info_t.device_version (來自於camera_module_t.get_camera_info)中,必須返回
CAMERA_DEVICE_API_VERSION_3_1。包含v3.1設備的camera模塊至少需要實現camera模塊接口的v2.0版本(由camera_module_t.common.module_api_version定義)。
Website:
https://source.android.com/devices/camera/camera3.html#supported-version