Cấu hình luồng

Android có các tính năng cho phép ứng dụng camera chọn luồng camera tối ưu cho các trường hợp sử dụng cụ thể và đảm bảo rằng thiết bị camera hỗ trợ một số tổ hợp luồng nhất định. Cấu hình luồng đề cập đến một luồng camera duy nhất được định cấu hình trong thiết bị camera và tổ hợp luồng đề cập đến một hoặc nhiều nhóm luồng được định cấu hình trong thiết bị camera. Để biết thêm thông tin về các tính năng này, hãy xem phần cấu hình luồng được đề xuấtAPI để truy vấn các tổ hợp tính năng.

Triển khai tham chiếu

Có một quy trình triển khai tham chiếu phía nhà cung cấp về các luồng cấu hình được đề xuất và API để truy vấn các tính năng kết hợp luồng. Bạn có thể tìm thấy quy trình triển khai này tại QCamera3HWI.cpp

Nhà cung cấp camera có thể quảng cáo các cấu hình luồng được đề xuất cho các trường hợp sử dụng cụ thể cho khách hàng camera. Các cấu hình luồng được đề xuất này (là các tập hợp con của StreamConfigurationMap) có thể giúp các ứng dụng camera chọn cấu hình tối ưu.

Mặc dù StreamConfigurationMap cung cấp thông tin đầy đủ về cấu hình luồng cho các ứng dụng camera, nhưng không cung cấp thông tin nào về hiệu quả, mức tiêu thụ điện năng hoặc tác động đến hiệu suất khi chọn một luồng thay vì một luồng khác. Ứng dụng camera có thể tự do chọn trong số tất cả các cấu hình luồng có thể có, nhưng trong nhiều trường hợp, điều này dẫn đến việc ứng dụng sử dụng các cấu hình camera không tối ưu và các ứng dụng thực hiện các tìm kiếm cạn kiệt tốn thời gian.

Ví dụ: mặc dù một số định dạng YUV đã xử lý là bắt buộc và phải được hỗ trợ, nhưng thiết bị camera có thể không hỗ trợ các định dạng này một cách tự nhiên. Điều này dẫn đến một lượt xử lý bổ sung cho quá trình chuyển đổi định dạng và làm giảm hiệu quả. Kích thước và tỷ lệ khung hình tương ứng cũng có thể có tác động tương tự, khiến các phương diện cụ thể trở nên phù hợp hơn về sức mạnh và hiệu suất.

Bạn không cần phải có cấu hình luồng được đề xuất toàn diện so với StreamConfigurationMap. Các cấu hình đề xuất phải tuân thủ các yêu cầu trong phần triển khai và có thể bao gồm mọi định dạng, kích thước hoặc giá trị khác có trong StreamConfigurationMap. Bạn không thể đưa các định dạng, kích thước hoặc giá trị khác bị ẩn không có trong StreamConfigurationMap vào các bản đồ cấu hình luồng được đề xuất.

Tất cả các kiểm thử đều không thay đổi và không được nới lỏng tuỳ thuộc vào cấu hình luồng được đề xuất.

Các cấu hình luồng được đề xuất do quá trình triển khai camera cung cấp là không bắt buộc và ứng dụng camera có thể bỏ qua các cấu hình này.

Triển khai

Hãy làm theo các bước sau để triển khai tính năng này.

Mục siêu dữ liệu

Để bật tính năng này, HAL của camera phải điền sẵn các mục siêu dữ liệu tĩnh sau:

  • android.scaler.availableRecommendedStreamConfigurations: Tập hợp con được đề xuất của các cấu hình luồng cho các trường hợp sử dụng cụ thể. Khai báo này sử dụng các bitmap cho biết các trường hợp sử dụng được đề xuất dưới dạng [1 << PREVIEW | 1 << RECORD..]. Các trường hợp sử dụng mở rộng bộ dữ liệu thông thường (định dạng, chiều rộng, chiều cao, đầu vào) bằng một mục bổ sung. Bạn không được phép đặt các trường hợp sử dụng công khai không tồn tại hoặc bất kỳ bit nào khác trong phạm vi [PUBLIC_END, VENDOR_START].

    Thông tin này được lưu trữ trong thẻ siêu dữ liệu availableRecommendedStreamConfigurations.

    Ví dụ sau đây cho thấy một mảng cho cấu hình luồng được đề xuất cho một thiết bị camera chỉ hỗ trợ 4K và 1080p, trong đó cả hai độ phân giải đều được ưu tiên để quay video nhưng chỉ có 1080p được đề xuất cho bản xem trước.

    [3840, 2160, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
    (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT),
    1920, 1080, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
    (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PREVIEW |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT)]
    
  • android.depth.availableRecommendedDepthStreamConfigurations (chỉ có sẵn nếu được thiết bị hỗ trợ): Cấu hình luồng không gian dữ liệu độ sâu được đề xuất cho thiết bị camera này. Tương tự như mục siêu dữ liệu ở trên, một bitmap trường hợp sử dụng bổ sung cho biết các trường hợp sử dụng được đề xuất.

    Thông tin này được lưu trữ trong thẻ siêu dữ liệu availableRecommendedInputOutputFormatsMap.

  • android.scaler.availableRecommendedInputOutputFormatsMap (chỉ có nếu thiết bị hỗ trợ): Mối liên kết giữa các định dạng hình ảnh được đề xuất cho thiết bị camera này đối với luồng đầu vào và các định dạng đầu ra tương ứng.

    Thông tin này được lưu trữ trong thẻ siêu dữ liệu availableRecommendedDepthStreamConfigurations.

Thông tin này được cung cấp cho các ứng dụng camera thông qua API RecommendedStreamConfigurationMap.

Các trường hợp sử dụng bắt buộc

Bạn phải cung cấp cấu hình luồng được đề xuất cho các trường hợp sử dụng sau đây và đáp ứng các yêu cầu tương ứng:

Trường hợp sử dụng Yêu cầu
PREVIEW Bản xem trước chỉ được bao gồm các cấu hình luồng đã xử lý không bị gián đoạn với các định dạng đầu ra như YUV_420_888IMPLEMENTATION_DEFINED.
RECORD Bản ghi video phải có cấu hình luồng phát phù hợp với hồ sơ nội dung nghe nhìn được hỗ trợ mà bạn quảng cáo theo định dạng IMPLEMENTATION_DEFINED.
VIDEO_SNAPSHOT Ảnh chụp nhanh video phải bao gồm các cấu hình luồng có kích thước ít nhất bằng độ phân giải GHI tối đa và chỉ có tổ hợp định dạng/không gian dữ liệu BLOB + DATASPACE_JFIF (JPEG). Các cấu hình này không được gây ra lỗi xem trước và phải chạy được ở tốc độ 30 khung hình/giây.
SNAPSHOT Cấu hình luồng ảnh chụp nhanh phải có ít nhất một cấu hình có kích thước gần bằng android.sensor.info.activeArraySize với tổ hợp BLOB + DATASPACE_JFIF (JPEG). Có tính đến các hạn chế về tỷ lệ khung hình, căn chỉnh và các hạn chế khác dành riêng cho nhà cung cấp, diện tích của kích thước tối đa được đề xuất không được nhỏ hơn 97% diện tích kích thước mảng cảm biến.
ZSL (nếu được hỗ trợ) Nếu được thiết bị camera hỗ trợ, bạn chỉ được quảng cáo các cấu hình luồng đầu vào được đề xuất cùng với các định dạng đầu ra bị xử lý hoặc bị tạm dừng khác.
RAW (nếu được hỗ trợ) Nếu được thiết bị camera hỗ trợ, các cấu hình luồng thô được đề xuất chỉ được bao gồm các định dạng đầu ra dựa trên RAW.

Các trường hợp sử dụng khác

Bạn có thể cung cấp thêm các luồng cấu hình được đề xuất cho các trường hợp sử dụng cụ thể cho việc triển khai của mình.

Xác nhận kết quả

Để kiểm thử việc triển khai các luồng cấu hình được đề xuất, hãy chạy các kiểm thử CTS và VTS sau:

API để truy vấn các tổ hợp tính năng

Kể từ Android 15, nền tảng Android cung cấp một API để truy vấn các tổ hợp tính năng. API này cho phép các ứng dụng camera truy vấn xem thiết bị có thể hỗ trợ một tổ hợp tính năng cụ thể hay không. API này là cần thiết vì API camera2 mô hình hoá các tính năng khác nhau như 4k, 60 khung hình/giây, video HDR, UltraHDR, thu phóng siêu rộng và tính năng ổn định dưới dạng các chế độ kiểm soát trực giao.

Yêu cầu

Để hỗ trợ API truy vấn các tổ hợp tính năng, HAL máy ảnh phải triển khai phiên bản 3 của giao diện ICameraDevice. Để biết thông tin chi tiết, hãy xem phần Triển khai.

Khi API được hỗ trợ, tính năng chống rung khi xem trước phải độc lập với các tính năng khác. Điều này có nghĩa là đối với một thiết bị camera hỗ trợ tính năng ổn định bản xem trước, giá trị trả về của isStreamCombinationWithSettingsSupported cho một tổ hợp cụ thể phải có cùng giá trị khi tính năng ổn định bản xem trước ở trạng thái bật hoặc tắt. Điều này giúp giảm không gian tìm kiếm cho các truy vấn tổ hợp tính năng.

Ngoài ra, đối với lớp hiệu suất nội dung nghe nhìn 15, camera sau chính phải hỗ trợ tính năng ổn định bản xem trước với bản xem trước HLG10 10 bit cho bản xem trước 1080p và 720p cũng như ảnh JPEG có kích thước tối đa. Để biết thêm thông tin chi tiết về các yêu cầu này, hãy xem phần 2.2.7.2. Camera của CDD.

Triển khai

Để hỗ trợ API truy vấn các tổ hợp tính năng, hãy triển khai các API truy vấn tổ hợp tính năng sau đây trong phiên bản 3 của ICameraDevice:

  • constructDefaultRequestSettings: Tạo chế độ cài đặt mặc định cho một loại CaptureRequest được chỉ định. HAL có thể sử dụng quy trình triển khai ICameraDeviceSession::constructDefaultRequestSettings.

  • isStreamCombinationWithSettingsSupported: Kiểm tra xem thiết bị có hỗ trợ một tổ hợp luồng camera cụ thể hay không bằng các tham số phiên và các khoá CaptureRequest bổ sung. Phải trả về true cho các tổ hợp được hỗ trợ và false cho các tổ hợp tính năng không được hỗ trợ. HAL có thể sử dụng chế độ triển khai isStreamCombinationSupported và thêm tính năng hỗ trợ để kiểm tra các chế độ cài đặt CaptureRequest đang được truyền trong sessionParams.

  • getSessionCharacteristics: Lấy một tổ hợp luồng được hỗ trợ với các tham số phiên và trả về các đặc điểm dành riêng cho phiên.

  • INFO_SESSION_CONFIGURATION_QUERY_VERSION: Liệt kê tất cả các cấu hình phiên thường dùng. Các cấu hình này được xác minh bằng kiểm thử tuân thủ.

Đối với các phiên bản thấp hơn phiên bản 3 của giao diện ICameraDevice, HAL phải triển khai phương thức isStreamCombinationSupported.

Để biết thêm thông tin về các tổ hợp tính năng mà API truy vấn, hãy xem tài liệu về sessionConfigurationQueryVersion trong system/media/camera/docs/metadata_definitions.xml.

Để biết thông tin về cách triển khai tham chiếu của tính năng này, hãy xem hardware/google/camera/devices/EmulatedCamera/hwl/.

API công khai

Các ứng dụng có thể dùng những API công khai sau đây để truy vấn các tổ hợp tính năng được thiết bị hỗ trợ:

  • CameraDevice.CameraDeviceSetup: Một phiên bản giới hạn của CameraDevice có thể dùng để truy vấn các tổ hợp tính năng mà không cần phiên bản CameraDevice.

  • getCameraDeviceSetup: Nhận đối tượng CameraDeviceSetup cho một mã nhận dạng camera nhất định nếu isCameraDeviceSetupSupported trả về true.

  • INFO_SESSION_CONFIGURATION_QUERY_VERSION: Hỗ trợ các truy vấn kết hợp tính năng nếu giá trị này là VANILLA_ICE_CREAM trở lên.

  • OutputConfiguration: Một lớp mô tả đầu ra của camera, có thể chứa một vùng hiển thị bị hoãn lại cho mục đích truy vấn kết hợp tính năng có độ trễ thấp.

  • SessionConfiguration: Một lớp tiện ích mô tả cấu hình phiên, bao gồm các tổ hợp luồng và thông số phiên. Bạn có thể dùng lớp này cho các truy vấn kết hợp tính năng.

Xác nhận kết quả

Để xác thực việc triển khai tính năng này, hãy sử dụng các kiểm thử VTS, CTS và Camera ITS (CTS Verifier) sau:

VTS

CTS

Camera ITS