Cấu hình luồng

Android 10 giới thiệu các tính năng cho phép khách hà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 các kết hợp luồng nhất định được thiết bị camera hỗ trợ. 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à kết hợp luồng đề cập đến một hoặc nhiều bộ luồng được định cấu hình trong thiết bị camera. Để biết thêm về các tính năng này, hãy xem cấu hình luồng được đề xuấtAPI để kết hợp luồng truy vấn .

Thực hiện tham khảo

Có một 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à các tính năng kết hợp API cho luồng truy vấn. Bạn có thể tìm thấy cách triển khai này tại QCamera3HWI.cpp

Nhà cung cấp máy ảnh có thể quảng cáo 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 máy ảnh. Các cấu hình luồng được đề xuất này, là tập hợp con của StreamConfigurationMap , có thể giúp khách hàng camera chọn cấu hình tối ưu.

Mặc dù StreamConfigurationMap cung cấp thông tin cấu hình luồng đầy đủ cho máy khách nhưng nó không cung cấp bất kỳ thông tin nào về tác động hiệu quả, sức mạnh hoặc hiệu suất của việc chọn luồng này thay vì luồng khác. Máy khách có thể tự do lựa 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 máy khách sử dụng cấu hình máy ảnh và ứng dụng dưới mức tối ưu khiến việc tìm kiếm toàn diện 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ị máy ảnh có thể không có hỗ trợ gốc cho các định dạng đó. Điều này dẫn đến một lượt xử lý bổ sung cho việc 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 kích thước cụ thể trở nên phù hợp hơn về mặt sức mạnh và hiệu suất.

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

Tất cả các thử nghiệm vẫn không thay đổi và không bị nới lỏng tùy 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à tùy chọn và ứng dụng khách camera có thể bỏ qua chúng.

Thực hiện

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

Mục nhập siêu dữ liệu

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

  • android.scaler.availableRecommendedStreamConfigurations : Tập hợp con cấu hình luồng được đề xuất cho các trường hợp sử dụng cụ thể. Tuyên bố sử dụng các bitmap đơn giản cho biết các trường hợp sử dụng được đề xuất ở 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 nhập bổ sung. 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 được đặt trong phạm vi [PUBLIC_END, VENDOR_START] đều bị cấm.

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

    Ví dụ sau đây hiển thị một mảng cho cấu hình luồng được đề xuất cho 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ỉ đề xuất 1080p để 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ỉ khả dụng 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 được đề xuất cho thiết bị máy ảnh này. Tương tự như mục nhập siêu dữ liệu ở trên, 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ỉ khả dụng nếu được thiết bị hỗ trợ): Ánh xạ các định dạng hình ảnh được đề xuất được đề xuất cho thiết bị máy ảnh này cho luồng đầu vào tới định dạng đầu ra tương ứng của chúng.

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

Thông tin này có sẵn cho khách hàng máy ảnh thông qua API được đề xuất. Cấu hình bản đồ .

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

Cấu hình luồng được đề xuất phải được cung cấp cho các trường hợp sử dụng sau 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 được xử lý không bị treo với các định dạng đầu ra như YUV_420_888IMPLEMENTATION_DEFINED .
RECORD Bản ghi video phải bao gồm cấu hình luồng khớp với cấu hình phương tiện được hỗ trợ được quảng cáo với đị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 ít nhất phải lớn bằng độ phân giải RECORD tối đa và chỉ với kết hợp định dạng/không gian dữ liệu BLOB + DATASPACE_JFIF (JPEG). Cấu hình không được gây ra trục trặc khi xem trước và có thể chạy ở tốc độ 30 khung hình/giây.
SNAPSHOT Cấu hình luồng ảnh chụp nhanh phải bao gồm ít nhất một luồng có kích thước gần bằng android.sensor.info.activeArraySize với kết hợp định dạng/không gian dữ liệu 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 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ị máy ảnh hỗ trợ, các cấu hình luồng đầu vào được đề xuất chỉ được quảng cáo cùng với các định dạng đầu ra đã được xử lý hoặc bị đình trệ khác.
RAW (nếu được hỗ trợ) Nếu được thiết bị máy ảnh hỗ trợ, 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 các luồng cấu hình bổ sung được đề xuất cho các trường hợp sử dụng cụ thể cho việc triển khai của bạn.

Thẩm định

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

API để kết hợp luồng truy vấn

Nền tảng Android hỗ trợ API để kết hợp luồng truy vấn. Việc triển khai API này cho phép máy khách máy ảnh truy vấn các kết hợp luồng một cách an toàn tại bất kỳ thời điểm nào sau khi nhận được phiên bản CameraDevice hợp lệ, loại bỏ chi phí khởi tạo phiên chụp máy ảnh cũng như khả năng xảy ra các trường hợp ngoại lệ tiếp theo đối với máy ảnh, bao gồm cả hỏng máy ảnh và cho phép truy vấn nhanh hơn.

Tính năng này cũng cho phép máy khách nhận được danh sách các kết hợp luồng được biên soạn theo nguyên tắc dành cho CameraDevice và mức CTNH được hỗ trợ. Các thử nghiệm CTS có sẵn để thực thi tính chính xác của kết quả truy vấn nhiều nhất có thể, bao gồm một tập hợp con nhỏ của các kết hợp luồng phổ biến nhất.

Bạn có thể chọn hỗ trợ tính năng này bằng cách triển khai một lệnh gọi API HIDL bổ sung trong Camera HAL.

Thực hiện

Để hỗ trợ API truy vấn các kết hợp luồng, Camera HAL phải cung cấp cách triển khai cho giao diện API HIDL isStreamCombinationSupported . Giao diện này kiểm tra xem thiết bị camera có hỗ trợ kết hợp luồng camera được chỉ định hay không.

Khi được gọi, API phải trả về một trong các mã trạng thái sau:

  • OK : Truy vấn kết hợp luồng đã thành công.
  • METHOD_NOT_SUPPORTED : Thiết bị camera không hỗ trợ truy vấn kết hợp luồng.
  • INTERNAL_ERROR : Truy vấn kết hợp luồng không thể hoàn thành do lỗi nội bộ.

API trả về true nếu kết hợp luồng được hỗ trợ. Nếu không, nó trả về sai.

Khung này sử dụng API công khai isSessionConfigurationSupported để kiểm tra xem cấu hình phiên cụ thể có được thiết bị máy ảnh hỗ trợ hay không.

Các lệnh gọi API không được có bất kỳ tác dụng phụ nào đối với hoạt động bình thường của máy ảnh. Lệnh gọi API không được thay đổi bất kỳ trạng thái nội bộ nào hoặc làm chậm hiệu suất của máy ảnh. Đảm bảo rằng sau khi Camera HAL xác thực thành công kết hợp luồng, ứng dụng khách camera có thể định cấu hình thành công kết hợp luồng. Để tránh sự cố, hãy đảm bảo quá trình triển khai không lưu trữ bất kỳ thông tin nào trong quá trình truy vấn kết hợp luồng, thay đổi trạng thái nội bộ hoặc tham gia vào các hoạt động tốn thời gian.

Thẩm định

Để xác thực tính năng này, hãy chạy các trường hợp kiểm tra CTS và VTS của camera sau:

Mô-đun CTS của máy ảnh:

Camera VTS:

VtsHalCameraProviderV2_4TargetTest.cpp