Hỗ trợ nhiều camera

Android 9 đã giới thiệu hỗ trợ API cho các thiết bị nhiều camera thông qua một thiết bị camera logic mới bao gồm hai hoặc nhiều thiết bị camera vật lý hướng về cùng một hướng. Thiết bị camera 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 camera được tích hợp HAL. Các ứng dụng có thể tùy ý truy cập và kiểm soát các luồng, siêu dữ liệu và điều khiển cơ bản của camera vật lý.

Hỗ trợ nhiều camera

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

Trong sơ đồ này, các ID camera khác nhau được mã hóa màu. Ứng dụng có thể truyền bộ đệm thô từ mỗi camera vật lý cùng một lúc. Cũng có thể đặt các điều khiển riêng biệt và nhận siêu dữ liệu riêng biệt từ các camera vật lý khác nhau.

Ví dụ và nguồn

Thiết bị nhiều camera phải được quảng cáo có khả năng nhiều camera hợp lý .

Máy khách máy ảnh có thể truy vấn ID máy ảnh của các thiết bị vật lý mà máy ảnh logic cụ thể được tạo ra bằng cách gọi getPhysicalCameraIds() . Sau đó, các ID được trả về như một phần của kết quả sẽ được sử dụng để điều khiển từng thiết bị vật lý thông qua setPhysicalCameraId() . Kết quả từ các yêu cầu riêng lẻ như vậy có thể được truy vấn từ kết quả hoàn chỉnh bằng cách gọi getPhysicalCameraResults() .

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

Luồng máy ảnh vật lý 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à bayer.

Thực hiện

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

Để thêm các 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ị camera phải hỗ trợ thay thế một luồng YUV/RAW logic bằng các luồng vật lý có cùng kích thước (không áp dụng cho luồng RAW) và cùng định dạng từ hai camera vật lý. Đ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ị camera HAL từ 3.5 trở lên, thiết bị camera phải hỗ trợ isStreamCombinationSupported để các ứng dụng truy vấn xem liệu một tổ hợp luồng cụ thể chứa các luồng vật lý có được hỗ trợ hay không.

Sơ đồ cấu hình luồng

Đối với máy ảnh logic, các kết hợp luồng bắt buộc dành cho thiết bị máy ảnh ở một mức phần cứng nhất định giống như những gì được 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à luồng logic.

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

Để tận dụng tính năng thu phóng quang do HAL triển khai bằng cách chuyển đổi giữa các camera phụ vật lý trong khi chụp RAW, các ứng dụng phải định cấu hình luồng camera phụ vật lý thay vì luồng RAW hợp lý.

Sự kết hợp luồng được đảm bảo

Cả camera logic và camera vật lý cơ bản của nó đều phải đảm bảo các kế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.

Một thiết bị camera logic phải hoạt động giống như một thiết bị camera vật lý dựa trên mức độ và khả năng phần cứng của nó. Chúng tôi khuyên rằng bộ tính năng của nó nên là bộ siêu bộ của các máy ảnh vật lý riêng lẻ.

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

  • Thay thế một YUV_420_888 logic hoặc luồng thô bằng hai luồng vật lý có cùng kích thước và định dạng, mỗi luồng từ một camera vật lý riêng biệt, vì kích thước và định dạng được camera vật lý hỗ trợ.

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

  • Sử dụng các luồng vật lý thay cho 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 quá trình chụp khi thời lượng khung hình tối thiểu của luồng vật lý và luồng logic là như nhau.

Cân nhắc về hiệu suất và sức mạnh

  • Hiệu suất:

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

    • Tối ưu hóa năng lượng của HAL 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 các luồng vật lý có thể ghi đè lên tính năng tối ưu hóa năng lượng bên trong của HAL và phát sinh nhiều điện năng sử dụng hơn.

Tùy chỉnh

Bạn có thể tùy chỉnh việc triển khai thiết bị của mình theo những cách sau.

  • Đầu ra hợp nhất của thiết bị camera 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 bắt nguồn từ camera vật lý là rõ ràng đối với ứng dụng và khung camera Android.
  • Các yêu cầu và kết quả vật lý riêng lẻ có thể được hỗ trợ tùy chọn. Tập hợp các 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 việc triển khai HAL cụ thể.
  • Từ Android 10, HAL có thể giảm số lượng camera mà một ứ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 . Việc gọi getPhysicalCameraCharacteristics sau đó phải trả về các đặc điểm của máy ảnh vật lý.

Thẩm định

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

Ba thử nghiệm ITS này nhắm vào các hệ thống nhiều camera để tạo điều kiện cho việc hợp nhất hình ảnh một cách thích hợp:

Thử nghiệm cảnh 1 và cảnh 4 được thực hiện bằng thiết bị thử nghiệm ITS-in-a-box . Bài kiểm tra test_multi_camera_match khẳng định rằng độ sáng ở giữa ảnh khớp nhau khi cả hai camera đều được bật. Kiểm tra test_multi_camera_alignment xác nhận rằng các thông số khoảng cách, hướng và độ méo của camera được tải đúng cách. Nếu hệ thống nhiều camera bao gồm camera Góc nhìn rộng (>90o) thì cần có phiên bản rev2 của hộp ITS.

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

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 rev1 ITS thông qua West-Mark ( www.west-mark.com , dgoodman@west-mark.com).

Thực hành tốt nhất

Để tận dụng tối đa các tính năng được hỗ trợ bởi nhiều camera 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 khi triển khai thiết bị nhiều camera hợp lý:

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