Cấu hình luồng

Android 10 ra mắt các tính năng hỗ trợ ứng dụng máy ảnh để chọn camera tối ưu cho các trường hợp sử dụng cụ thể và để đảm bảo rằng một số tổ hợp luồng nhất định được thiết bị máy ảnh hỗ trợ. Cấu hình luồng đề cập đến một luồng camera được định cấu hình trong thiết bị camera và tổ hợp luồng dữ liệu tham chiếu đến vào một hoặc nhiều nhóm luồng được định cấu hình trong thiết bị máy ảnh. Tìm hiểu thêm về các tính năng này, hãy xem cấu hình luồng đề xuấtAPI để truy vấn các tổ hợp luồng.

Cách triển khai tệp đối chiếu

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

Các nhà cung cấp máy ảnh có thể quảng cáo các cấu hình luồng được đề xuất cho mục đích sử dụng cụ thể cho đến máy khách máy ảnh. Dưới đây là các cấu hình luồng được đề xuất, tập hợp con của StreamConfigurationMap, có thể giúp khách hàng sử dụng máy ảnh 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 các ứng dụng máy ảnh, không cung cấp bất kỳ thông tin nào về hiệu suất, sức mạnh hoặc hiệu suất tác động của việc chọn một luồng thay vì một luồng khác. Khách hàng có thể thoải mái lựa chọn máy ảnh từ 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 những máy khách đang sử dụng cấu hình máy ảnh dưới mức tối ưu và những ứng dụng khiến tốn nhiều thời gian của bạn.

Ví dụ: mặc dù một số định dạng YUV đã xử lý là bắt buộc và được hỗ trợ, thiết bị máy ảnh có thể không có hỗ trợ riêng cho các định dạng. Chiến dịch này dẫn đến thời gian xử lý bổ sung cho chuyển đổi định dạng và giảm sự hiệu quả. Kích thước và tỷ lệ khung hình tương ứng cũng có thể có làm cho các kích thước cụ thể trở nên phù hợp hơn về 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 bắt buộc phải đầy đủ so với StreamConfigurationMap. Sơ đồ cấu hình được đề xuất phải tuân theo các yêu cầu trong implementation (triển khai) và có thể bao gồm bất kỳ đoạn mã nào các định dạng, kích thước có sẵn hoặc các giá trị khác được tìm thấy trong StreamConfigurationMap. Không tìm thấy các định dạng, kích thước hoặc giá trị khác trong StreamConfigurationMap không thể có trong sơ đồ cấu hình luồng được đề xuất.

Tất cả các thử nghiệm đều không thay đổi và không nới lỏng tuỳ thuộc vào khuyến nghị cấu hình luồng.

Các cấu hình luồng đề xuất do việc triển khai máy ảnh cung cấp bao gồm không bắt buộc và ứng dụng máy ảnh có thể bỏ qua chúng.

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 máy ảnh phải điền giá trị tĩnh các mục siêu dữ liệu:

  • android.scaler.availableRecommendedStreamConfigurations: nên sử dụng một số cấu hình luồng cho các trường hợp sử dụng cụ thể. Chiến lược phát hành đĩa đơn sử dụng bitmap cho biết các trường hợp sử dụng được đề xuất trong 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, dữ liệu đầu vào) cùng với 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] bị cấm.

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

    Ví dụ sau đây minh hoạ một mảng cho luồng đề xuất cho thiết bị máy ảnh chỉ hỗ trợ 4K và 1080p, trong đó cả hai độ phân giải đều được ưu tiên khi quay video, nhưng chỉ 1080p được đề xuất để 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ợ): Không gian dữ liệu chiều sâu được đề xuất các cấu hình luồng được đề xuất cho thiết bị máy ảnh này. Tương tự như ở trên mục siêu dữ liệu, một bitmap trường hợp sử dụng bổ sung cho biết các trường hợp sử dụng.

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

  • android.scaler.availableRecommendedInputOutputFormatsMap (có sẵn chỉ khi 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ị camera này cho luồng đầu vào, định dạng đầu ra tương ứng.

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

Thông tin này có sẵn cho các ứng dụng máy ảnh thông qua RecommendedStreamConfigurationMap API.

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 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ị tạm ngưng 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 phù hợp với quảng cáo hồ sơ nội dung nghe nhìn được hỗ trợ bằng định dạng IMPLEMENTATION_DEFINED.
VIDEO_SNAPSHOT Một ảnh chụp nhanh video phải bao gồm cấu hình luồng ít nhất là lớn đến mức tối đa RECORD và chỉ dùng với BLOB + Tổ hợp định dạng/không gian dữ liệu DATASPACE_JFIF (JPEG). Cấu hình không được gây ra sự cố khi xem trước và phải 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 cấu hình có kích thước gần đến android.sensor.info.activeArraySize bằng BLOB + Tổ hợp định dạng/không gian dữ liệu 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 tuỳ theo nhà cung cấp, diện tích của kích thước tối đa đề xuất không được nhỏ hơn 97% cảm biến mảng kích thước.
ZSL (nếu được hỗ trợ) Nếu thiết bị máy ảnh hỗ trợ, bạn nên sử dụng cấu hình luồng đầu vào chỉ được quảng cáo cùng với đầu ra khác đã được xử lý hoặc trì hoãn .
RAW (nếu được hỗ trợ) Nếu được thiết bị máy ảnh hỗ trợ, bạn nên sử dụng 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 bạn.

Xác nhận kết quả

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

API để truy vấn các tổ hợp luồng

Nền tảng Android hỗ trợ một API để truy vấn các tổ hợp luồng. Triển khai API này cho phép ứng dụng máy ảnh truy vấn các 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 mã hợp lệ CameraDevice (Thiết bị máy ảnh) loại bỏ chi phí khởi tạo phiên chụp ảnh và khả năng xảy ra các trường hợp ngoại lệ tiếp theo về camera, bao gồm cả việc camera bị hỏng, đồng thời cho phép truy vấn nhanh hơn.

Tính năng này cũng cho phép ứng dụng máy ảnh nhận danh sách các tổ hợp sự kiện phát trực tiếp được biên dịch theo nguyên tắc cho CameraDevice và cấp phần cứng được hỗ trợ. Có các bài kiểm thử CTS để 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ỏ những kiểu kết hợp phát trực tiếp 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 thêm một API HIDL trong HAL của máy ảnh.

Triển khai

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

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ợ tính năng phát trực tiếp truy vấn kết hợp.
  • INTERNAL_ERROR: Không thể hoàn tất truy vấn kết hợp luồng do lỗi nội bộ.

API trả về giá trị true nếu tổ hợp luồng được hỗ trợ. Nếu không, sẽ trả về false.

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 máy ảnh hỗ trợ hay không thiết bị.

Các lệnh gọi đến 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. API không được thay đổi trạng thái nội bộ hoặc làm chậm hiệu suất của camera. Hãy đảm bảo rằng sau khi lớp trừu tượng phần cứng (HAL) của máy ảnh xác thực thành công một tổ hợp luồng, ứng dụng máy ảnh có thể định cấu hình thành công tổ hợp luồng. Để tránh các vấn đề này, 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 khi phát trực tiếp các cụm từ tìm kiếm kết hợp, thay đổi trạng thái nội bộ của chiến dịch hoặc tương tác tốn nhiều thời gian.

Xác nhận kết quả

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

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

VTS của máy ảnh:

VtsHalCameraProviderV2_4TargetTest.cpp