Android [Camera 原始碼] 輸出流和剪裁(Output and Cropping) Google官方文件(六)
Google原始碼網地址連結:https://source.android.com/devices/camera
該Google Camera的文件為系列文章,文章列表:
overview
Camera3
HAL Subsystem
Metadata and Controls
3A Modes and State
Output and Cropping
Errors and Streams
Request Creation
External USB Cameras
Multi-Camera Support
Motion Tracking
Session Parameters
Single Producer,Multiple Consumer
Version Support
輸出流
相機子系統針對所有解析度和輸出格式都僅在基於 ANativeWindow 的管道上執行。您可以一次配置多個流,以便將單個幀傳送至多個目標,例如:GPU、視訊編碼器、RenderScript,或應用可見的緩衝區(RAW Bayer 緩衝區、經處理的 YUV 緩衝區或經 JPEG 編碼的緩衝區)。
出於優化的目的,這些輸出流必須提前配置,而且只有有限的輸出流可同時存在。這樣一來,就可以預先分配記憶體緩衝區和配置相機硬體,以便在提交列有多個或者不同輸出管道的請求時,不會出現請求延遲執行的情況。
有關取決於支援的硬體級別的保證流輸出組合的詳情,請參閱 createCaptureSession()。
剪裁
完整畫素陣列的剪裁(用於數字變焦和需要更小 FOV 的其他使用情況)通過 ANDROID_SCALER_CROP_REGION 設定進行傳遞。這個設定可按需更改,這種方式對於實現平滑的數字變焦至關重要。
該區域被定義為矩形(x 和 y 分別表示寬和高),其中 (x,y) 表示矩形的左上角。該矩形在感測器有源畫素陣列的座標系中進行定義,其中 (0,0) 對應有源畫素陣列的左上角畫素。因此,寬度和高度不能大於 ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY 靜態資訊欄位中所報告的尺寸。允許的最小寬度和高度由 HAL 通過 ANDROID_SCALER_MAX_DIGITAL_ZOOM 靜態資訊欄位進行報告,該欄位描述了所支援的縮放因子的最大值。因此,最小剪裁區域的寬度和高度為:
{width, height} =
{ floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM),
floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
如果剪裁區域需要滿足特定需求(例如:要求起始位置座標為偶數,並且其寬度/高度需均為偶數),則 HAL 必須進行必要的舍入運算,並寫出輸出結果元資料中所用的最終剪裁區域。同樣,HAL 要實現視訊防抖功能,則必須調整結果剪裁區域,以描述在應用視訊防抖功能後輸出結果中實際包含的區域。一般情況下,使用相機的應用必須能夠根據剪裁區域、影象感測器的尺寸和鏡頭焦距確定其接收的視野範圍。
由於剪裁區域適用於所有視訊流,這些視訊流的寬高比可能與剪裁區域的不同,所以每路視訊流所用的實際感測器區域可能小於剪裁區域。具體而言,每路視訊流應儘量避免進一步剪裁已定義的剪裁區域,以維持方形畫素及其寬高比。如果視訊流的寬高比大於剪裁區域,則該視訊流應該在垂直方向上進一步剪裁,如果視訊流的寬高比小於剪裁區域,則該視訊流應該在水平方向上進一步剪裁。
在所有情況下,視訊流剪裁均必須位於整個剪裁區域的中心位置,並且相對於整個剪裁區域,每路視訊流要麼在水平方向上進行剪裁,要麼在垂直方向上進行剪裁,但絕不能在這兩個方向上同時進行剪裁。
例如,如果兩路視訊流分別定義為 640x480(寬高比為 4:3)和 1280x720(寬高比為 16:9),並假設感測器為 300 萬畫素級(2000 x 1500 畫素陣列),則下面展示了針對幾個樣本剪裁區域,每路視訊流的預期輸出區域。
剪裁區域:(500、375、1000、750)(寬高比為 4:3)
640x480 視訊流剪裁:(500、375、1000、750)(與剪裁區域相同)
1280x720 視訊流剪裁:(500、469、1000、562)
圖 1. 寬高比為 4:3
剪裁區域:(500、375、1333、750)(寬高比為 16:9)
640x480 視訊流剪裁:(666、375、1000、750)
1280×720 視訊流剪裁:(500、375、1333、750)(與剪裁區域相同)
圖 2. 寬高比為 16:9
剪裁區域:(500、375、750、750)(寬高比為 1:1)
640x480 視訊流剪裁:(500、469、750、562)
1280x720 視訊流剪裁:(500、543、750、414)
圖 3. 寬高比為 1:1
最後一個示例是寬高比為 1024×1024(方形)的視訊流,而不是 480p 視訊流:
剪裁區域:(500、375、1000、750)(寬高比為 4:3)
1024x1024 視訊流剪裁:(625、375、750、750)
1280x720 視訊流剪裁:(500、469、1000、562)
圖 4. 寬高比為 4:3(方形)
重新處理
對原始圖片檔案提供額外的支援功能,即 RAW Bayer 資料重新處理支援功能。該支援功能允許相機管道處理之前捕獲的 RAW 緩衝區和元資料(之前記錄的整個幀),以生成新渲染的 YUV 或 JPEG 輸出。