工作階段參數功能可讓相機用戶端主動設定昂貴的要求參數子集 (即工作階段參數),做為擷取工作階段初始化階段的一部分,藉此縮短延遲時間。有了這項功能,HAL 實作項目就能在串流設定階段 (而非第一次擷取要求) 接收用戶端參數,並根據參數值更有效率地準備及建構內部管道。
在 Android 10 中,您可以使用選用的工作階段重新設定查詢功能,進一步控制內部工作階段參數重新設定邏輯,藉此提升效能。詳情請參閱「工作階段重新設定查詢」。
範例和來源
參考工作階段參數實作項目已是 CameraHal 的一部分。這個 HAL 會使用舊版 Hal API。實作相機 HIDL API 的綁定 CameraHal 必須使用相應的 HIDL sessionParams 項目,才能在串流設定期間存取任何新的傳入工作階段參數。
相機用戶端可以呼叫 getAvailableSessionKeys()
,查詢所有支援的工作階段參數的鍵,並最終透過 setSessionParameters()
設定初始值。
實作
您的 CameraHal 實作必須在相應的靜態相機中繼資料中填入 ANDROID_REQUEST_AVAILABLE_SESSION_KEYS
,並提供 ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS
的子集,其中包含一長串難以逐格套用的鍵,如果在擷取工作階段生命週期內修改,可能會導致意外延遲。
常見的例子包括需要耗費大量時間重新設定硬體或變更內部相機管道的參數。擷取要求仍可控制工作階段參數,但用戶端應注意並預期應用程式會發生延遲。
架構會監控所有傳入的要求,如果偵測到工作階段參數的值有所變更,就會在內部重新設定攝影機。傳遞至 CameraHal 的新串流設定會包含更新後的工作階段參數值,用於更有效率地設定相機管道。
自訂
您可以在可用工作階段參數清單中定義標記,該參數已填入 CameraHal 端。如果 CameraHal 將可用的工作階段參數清單留空,這項功能就不會啟用。
驗證
CTS 包含下列新案例,用於測試工作階段參數:
CameraDeviceTest#testSessionConfiguration
CameraDeviceTest#testCreateSessionWithParameters
CameraDeviceTest#testSessionParametersStateLeak
NativeCameraDeviceTest#testCameraDevicePreviewWithSessionParameters
一般來說,某個參數成為工作階段鍵清單的一部分後,其目前的值就會納入工作階段參數,並在 HAL 層級的串流設定期間傳遞。
請務必謹慎選取工作階段參數。在串流設定之間,這些值不應經常變更。經常變更的參數 (例如擷取意圖) 並不適合,如果將這些參數新增至工作階段參數清單,可能會因過度內部重新設定而導致 CTS 失敗。
工作階段重新設定查詢
Android 10 推出了選用的會話重新設定查詢功能,可改善效能,因為會話參數值修改所導致的內部串流重新設定,可能會降低效能。為解決這個問題,HIDL ICameraDeviceSession
3.5 以上版本支援 isReconfigurationRequired
方法,可針對內部工作階段參數重新設定邏輯提供精細控制。使用此方法,即可在需要時精確執行串流重新設定。
isReconfigurationRequired
的引數會提供每個待處理的工作階段參數修改作業所需的資訊,允許各種裝置專屬的客製化設定。
這項功能僅在相機服務和相機 HAL 中實作。沒有公開 API。如果實作這項功能,攝影機用戶端在使用工作階段參數時,應可看到效能提升。
實作
如要支援工作階段重新設定查詢,您必須實作 isReconfigurationRequired
方法,以便檢查是否需要完整重新設定串流,以便取得新的會話參數值。
如果用戶端變更任何宣傳的工作階段參數值,相機架構會呼叫 isReconfigurationRequired
方法。視特定值而定,HAL 會決定是否需要重新設定完整的串流。如果 HAL 傳回 false
,相機架構就會略過內部重新設定。如果 HAL 傳回 true
,架構就會重新設定串流,並視情況傳送新的工作階段參數值。
在將含有新參數的要求提交至 HAL 之前,架構可以呼叫 isReconfigurationRequired
方法,且可以在提交前取消要求。因此,HAL 不得以任何方式使用這個方法呼叫來變更其行為。
HAL 實作必須符合下列規定:
- 在啟用工作階段設定後,架構必須能夠隨時呼叫
isReconfigurationRequired
方法。 - 不得影響待處理的攝影機要求效能。請特別注意,一般相機串流期間不得出現故障或延遲。
裝置和 HAL 實作方式必須符合下列效能規定:
- 不得變更攝影機的硬體和軟體設定。
- 不得對攝影機效能造成明顯影響。
isReconfigurationRequired
方法使用下列引數:
oldSessionParams
:上一個工作階段的工作階段參數。通常是現有工作階段參數。newSessionParams
:由用戶端設定的新工作階段參數。
預期的傳回狀態碼如下:
OK
:成功重新設定所需的查詢。METHOD_NOT_SUPPORTED
:攝影機裝置不支援重新設定查詢。INTERNAL_ERROR
:由於發生內部錯誤,因此無法完成重新設定查詢。
傳回值如下:
true
:需要重新設定串流。false
:不需要重新設定串流。
如要忽略工作階段重新設定查詢,HAL 會傳回 METHOD_NOT_SUPPORTED
或 false
。這會導致預設相機服務行為,在每次工作階段參數變更時觸發串流重新設定。
驗證
您可以使用 CameraHidlTest#configureStreamsWithSessionParameters
中的 VTS 測試案例,驗證工作階段重新設定查詢功能。