Hỗ trợ nhiều camera

Android 9 đã ra mắt tính năng hỗ trợ API cho các thiết bị nhiều máy ảnh thông qua một thiết bị máy ảnh logic mới bao gồm hai hoặc nhiều thiết bị máy ảnh thực tế hướng về cùng một hướng. Thiết bị máy ảnh logic được hiển thị dưới dạng một CameraDevice/CaptureSession duy nhất cho một ứng dụng cho phép tương tác với các tính năng nhiều máy ảnh tích hợp HAL. Ứng dụng có thể tuỳ ý truy cập và kiểm soát các luồng máy ảnh thực tế, siêu dữ liệu và các chế độ điều khiển cơ bản.

Hỗ trợ nhiều camera

Hình 1 Hỗ trợ nhiều camera

Trong sơ đồ này, các mã nhận dạng máy ảnh khác nhau được mã hoá bằng màu sắc. Ứng dụng có thể truyền trực tuyến vùng đệm thô từ mỗi máy ảnh thực tế cùng một lúc. Bạn cũng có thể đặt các chế độ điều khiển riêng biệt và nhận siêu dữ liệu riêng biệt từ các máy ảnh thực khác nhau.

Ví dụ và nguồn

Các thiết bị nhiều camera phải được quảng cáo có chức năng logic nhiều camera.

Ứng dụng máy ảnh có thể truy vấn mã nhận dạng máy ảnh của các thiết bị thực tế mà một máy ảnh logic cụ thể được tạo bằng cách gọi getPhysicalCameraIds(). Sau đó, các mã nhận dạng được trả về trong kết quả sẽ được dùng để điều khiển từng thiết bị thực thông qua setPhysicalCameraId(). Bạn có thể truy vấn kết quả của từng yêu cầu như vậy từ kết quả đầy đủ bằng cách gọi getPhysicalCameraResults().

Các yêu cầu về máy ảnh thực tế riêng lẻ có thể chỉ hỗ trợ một số thông số hạn chế. Để nhận danh sách các tham số được hỗ trợ, nhà phát triển có thể gọi getAvailablePhysicalCameraRequestKeys().

Luồng camera thực chỉ được hỗ trợ cho các yêu cầu không xử lý lại và chỉ dành cho cảm biến đơn sắc và cảm biến bayer.

Triển khai

Danh sách kiểm tra hỗ trợ

Cách thêm thiết bị nhiều camera hợp lý ở phía HAL:

Đối với các thiết bị chạy Android 9, thiết bị máy ảnh phải hỗ trợ việc thay thế một luồng YUV/RAW logic bằng các luồng thực có cùng kích thước (không áp dụng cho luồng RAW) và cùng định dạng từ hai máy ảnh thực. Điều này không áp dụng cho các thiết bị chạy Android 10.

Đối với các thiết bị chạy Android 10 có phiên bản thiết bị HAL máy ảnh là 3.5 trở lên, thiết bị máy ảnh phải hỗ trợ isStreamCombinationSupported để ứng dụng truy vấn xem một tổ hợp luồng cụ thể có chứa luồng thực tế có được hỗ trợ hay không.

Bản đồ cấu hình luồng

Đối với máy ảnh logic, các tổ hợp luồng bắt buộc cho thiết bị máy ảnh ở một cấp phần cứng nhất định giống với yêu cầu trong CameraDevice.createCaptureSession. Tất cả các luồng trong bản đồ cấu hình luồng phải là các luồng logic.

Đối với thiết bị máy ảnh logic hỗ trợ tính năng RAW với các máy ảnh phụ thực có kích thước khác nhau, nếu một ứng dụng định cấu hình luồng RAW logic, thì thiết bị máy ảnh logic không được chuyển sang máy ảnh phụ thực có kích thước cảm biến khác nhau. Điều này giúp đảm bảo các ứng dụng chụp ảnh RAW hiện có không bị lỗi.

Để tận dụng tính năng thu phóng quang học do HAL triển khai bằng cách chuyển đổi giữa các máy ảnh phụ thực tế trong quá trình chụp RAW, ứng dụng phải định cấu hình luồng máy ảnh phụ thực tế thay vì luồng RAW logic.

Tổ hợp luồng được đảm bảo

Cả máy ảnh logic và máy ảnh thực tế cơ bản của máy ảnh đó đều phải đảm bảo các tổ hợp luồng bắt buộc cần thiết cho các cấp thiết bị của chúng.

Thiết bị máy ảnh logic phải hoạt động giống như thiết bị máy ảnh thực dựa trên cấp độ phần cứng và chức năng của thiết bị. Bạn nên đặt bộ tính năng của máy ảnh này là tập hợp con của các máy ảnh thực tế riêng lẻ.

Trên các thiết bị chạy Android 9, đối với mỗi tổ hợp luồng được đảm bảo, máy ảnh logic phải hỗ trợ:

  • Thay thế một luồng YUV_420_888 logic hoặc luồng thô bằng hai luồng thực có cùng kích thước và định dạng, mỗi luồng từ một máy ảnh thực riêng biệt, với điều kiện là kích thước và định dạng được máy ảnh thực hỗ trợ.

  • Thêm hai luồng thô, một luồng từ mỗi máy ảnh thực, nếu máy ảnh logic không quảng cáo khả năng RAW nhưng các máy ảnh thực cơ bản lại có. Điều này thường xảy ra khi các máy ảnh thực có kích thước cảm biến khác nhau.

  • Sử dụng luồng thực tế thay cho một luồng logic có cùng kích thước và định dạng. Điều này không được làm chậm tốc độ khung hình của bản ghi khi thời lượng khung hình tối thiểu của luồng vật lý và luồng logic giống nhau.

Những điểm cần cân nhắc về hiệu suất và nguồn điện

  • Hiệu suất:

    • Việc định cấu hình và truyền trực tuyến luồng vật lý có thể làm chậm tốc độ chụp của máy ảnh logic do các hạn chế về tài nguyên.
    • Việc áp dụng chế độ cài đặt của máy ảnh thực có thể làm chậm tốc độ chụp nếu các máy ảnh cơ sở được đặt ở các tốc độ khung hình khác nhau.
  • Nguồn điện:

    • Tính năng tối ưu hoá nguồn điện của HAL vẫn tiếp tục hoạt động trong trường hợp mặc định.
    • Việc định cấu hình hoặc yêu cầu luồng thực tế có thể ghi đè tính năng tối ưu hoá nguồn điện nội bộ của HAL và tiêu tốn nhiều điện năng hơn.

Tuỳ chỉnh

Bạn có thể tuỳ chỉnh cách triển khai thiết bị theo các cách sau.

  • Đầu ra kết hợp của thiết bị máy ảnh logic phụ thuộc hoàn toàn vào việc triển khai HAL. Quyết định về cách các luồng logic hợp nhất được lấy từ máy ảnh thực tế sẽ được ứng dụng và khung máy ảnh Android hiển thị một cách minh bạch.
  • Bạn có thể chọn hỗ trợ các yêu cầu và kết quả riêng lẻ về địa điểm thực tế. Tệp tham số có sẵn trong các yêu cầu như vậy cũng hoàn toàn phụ thuộc vào cách triển khai HAL cụ thể.
  • Kể từ Android 10, HAL có thể giảm số lượng máy ảnh mà ứng dụng có thể mở trực tiếp bằng cách chọn không quảng cáo một số hoặc tất cả PHYSICAL_ID trong getCameraIdList. Sau đó, lệnh gọi getPhysicalCameraCharacteristics phải trả về các đặc điểm của máy ảnh thực.

Xác nhận kết quả

Các thiết bị nhiều máy ảnh logic phải vượt qua CTS của máy ảnh như mọi máy ảnh thông thường khác. Bạn có thể tìm thấy các trường hợp kiểm thử nhắm đến loại thiết bị này trong mô-đun LogicalCameraDeviceTest.

Ba bài kiểm thử ITS này nhắm đến các hệ thống nhiều máy ảnh để hỗ trợ việc hợp nhất hình ảnh đúng cách:

Các kiểm thử cảnh 1 và cảnh 4 chạy bằng thiết bị kiểm thử ITS-in-a-box. Kiểm thử test_multi_camera_match xác nhận rằng độ sáng của tâm hình ảnh khớp nhau khi cả hai camera đều được bật. Quy trình kiểm thử test_multi_camera_alignment xác nhận rằng khoảng cách, hướng và các tham số méo của máy ảnh được tải đúng cách. Nếu hệ thống nhiều camera có máy ảnh có trường nhìn rộng (>90o), thì bạn phải dùng hộp ITS phiên bản rev2.

Sensor_fusion là thiết bị thử nghiệm thứ hai cho phép chuyển động điện thoại được lặp lại, theo quy định và xác nhận rằng dấu thời gian của con quay hồi chuyển và cảm biến hình ảnh khớp nhau cũng như các khung hình của nhiều máy ảnh đồng bộ với nhau.

Tất cả các hộp đều có sẵn thông qua AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) và MYWAY Manufacturing (www.myway.tw, sales@myway.tw). Ngoài ra, bạn có thể mua hộp ITS rev1 thông qua West-Mark (www.west-mark.com, dgoodman@west-mark.com).

Các phương pháp hay nhất

Để khai thác tối đa các tính năng do nhiều máy ảnh hỗ trợ trong khi vẫn duy trì khả năng tương thích của ứng dụng, hãy làm theo các phương pháp hay nhất sau đây khi triển khai thiết bị nhiều máy ảnh logic:

  • (Android 10 trở lên) Ẩn máy ảnh phụ thực tế khỏi getCameraIdList. Điều này làm giảm số lượng máy ảnh mà các ứng dụng có thể mở trực tiếp, nhờ đó không cần các ứng dụng phải có logic lựa chọn máy ảnh phức tạp.
  • (Android 11 trở lên) Đối với thiết bị nhiều camera logic hỗ trợ tính năng thu phóng quang học, hãy triển khai API ANDROID_CONTROL_ZOOM_RATIO và chỉ sử dụng ANDROID_SCALER_CROP_REGION để cắt theo tỷ lệ khung hình. ANDROID_CONTROL_ZOOM_RATIO cho phép thiết bị thu nhỏ và duy trì độ chính xác cao hơn. Trong trường hợp này, HAL phải điều chỉnh hệ toạ độ của ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLESANDROID_STATISTICS_FACE_LANDMARKS để coi trường nhìn sau khi thu phóng là mảng cảm biến đang hoạt động. Để biết thêm thông tin về cách ANDROID_SCALER_CROP_REGION hoạt động cùng với ANDROID_CONTROL_ZOOM_RATIO, hãy xem camera3_crop_reprocess#cropping.
  • Đối với các thiết bị nhiều camera có máy ảnh thực có nhiều tính năng, hãy đảm bảo thiết bị chỉ quảng cáo hỗ trợ một giá trị hoặc phạm vi nhất định cho một chế độ điều khiển nếu toàn bộ phạm vi thu phóng hỗ trợ giá trị hoặc phạm vi đó. Ví dụ: nếu máy ảnh logic bao gồm một máy ảnh siêu rộng, một máy ảnh rộng và một máy ảnh tele, hãy làm như sau:
    • Nếu kích thước mảng hoạt động của máy ảnh thực khác nhau, HAL của máy ảnh phải ánh xạ từ mảng hoạt động của máy ảnh thực đến mảng hoạt động logic của máy ảnh thực cho ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLESANDROID_STATISTICS_FACE_LANDMARKS sao cho mảng toạ độ của ứng dụng từ góc nhìn của ứng dụng là kích thước hoạt động.
    • Nếu camera góc rộng và camera tiêu cự dài hỗ trợ tính năng tự động lấy nét, nhưng camera siêu rộng là tiêu điểm cố định, hãy đảm bảo camera logic quảng cáo tính năng hỗ trợ tự động lấy nét. HAL phải mô phỏng một máy trạng thái tự động lấy nét cho máy ảnh góc siêu rộng để khi ứng dụng thu nhỏ đến ống kính góc siêu rộng, ứng dụng sẽ biết được rằng máy ảnh thực tế cơ bản đang lấy nét cố định và máy trạng thái tự động lấy nét cho các chế độ AF được hỗ trợ sẽ hoạt động như dự kiến.
    • Nếu máy ảnh góc rộng và máy ảnh tele hỗ trợ 4K ở tốc độ 60 khung hình/giây, còn máy ảnh góc siêu rộng chỉ hỗ trợ 4K ở tốc độ 30 khung hình/giây hoặc 1080p ở tốc độ 60 khung hình/giây nhưng không hỗ trợ 4K ở tốc độ 60 khung hình/giây, hãy đảm bảo máy ảnh logic không quảng cáo 4K ở tốc độ 60 khung hình/giây trong các cấu hình luồng được hỗ trợ. Điều này đảm bảo tính toàn vẹn của các chức năng máy ảnh logic, đảm bảo rằng ứng dụng sẽ không gặp phải vấn đề không đạt được 4k ở tốc độ 60 fps với giá trị ANDROID_CONTROL_ZOOM_RATIO dưới 1.
  • Kể từ Android 10, bạn không cần phải có nhiều máy ảnh logic để hỗ trợ các tổ hợp luồng bao gồm cả luồng thực. Nếu HAL hỗ trợ kết hợp với luồng vật lý:
    • (Android 11 trở lên) Để xử lý tốt hơn các trường hợp sử dụng như chiều sâu từ âm thanh nổi và tính năng theo dõi chuyển động, hãy đặt trường nhìn của đầu ra luồng thực tế lớn nhất có thể đạt được bằng phần cứng. Tuy nhiên, nếu một luồng thực và một luồng logic bắt nguồn từ cùng một máy ảnh thực, thì các giới hạn về phần cứng có thể buộc trường nhìn của luồng thực phải giống với luồng logic.
    • Để giải quyết áp lực bộ nhớ do nhiều luồng thực gây ra, hãy đảm bảo ứng dụng sử dụng discardFreeBuffers để phân bổ lại vùng đệm trống (vùng đệm do người dùng giải phóng nhưng nhà sản xuất chưa loại bỏ khỏi hàng đợi) nếu luồng thực dự kiến sẽ ở trạng thái rảnh trong một khoảng thời gian.
    • Nếu các luồng thực tế từ nhiều máy ảnh thực tế thường không được đính kèm vào cùng một yêu cầu, hãy đảm bảo rằng các ứng dụng sử dụng surface group để một hàng đợi bộ đệm được dùng để sao lưu hai nền tảng hướng đến ứng dụng, giảm mức sử dụng bộ nhớ.