Hệ thống con HAL

Yêu cầu

Khung ứng dụng đưa ra các yêu cầu về kết quả được ghi lại cho hệ thống con camera. Một yêu cầu tương ứng với một tập hợp kết quả. Một yêu cầu gói gọn tất cả thông tin cấu hình về việc thu thập và xử lý các kết quả đó. Điều này bao gồm những thứ như độ phân giải và định dạng pixel; cảm biến, ống kính và điều khiển đèn flash bằng tay; Chế độ hoạt động 3A; Kiểm soát xử lý RAW sang YUV; và tạo số liệu thống kê. Điều này cho phép kiểm soát nhiều hơn đối với kết quả đầu ra và quá trình xử lý. Nhiều yêu cầu có thể được thực hiện cùng lúc và việc gửi yêu cầu không bị chặn. Và các yêu cầu luôn được xử lý theo thứ tự chúng được nhận.

Mô hình yêu cầu máy ảnh

Hình 1. Mẫu máy ảnh

Hệ thống con HAL và camera

Hệ thống con camera bao gồm việc triển khai các thành phần trong quy trình camera chẳng hạn như thuật toán 3A và các điều khiển xử lý. Camera HAL cung cấp giao diện để bạn triển khai các phiên bản của các thành phần này. Để duy trì khả năng tương thích đa nền tảng giữa nhiều nhà sản xuất thiết bị và nhà cung cấp Bộ xử lý tín hiệu hình ảnh (ISP hoặc cảm biến máy ảnh), mô hình đường dẫn camera là ảo và không tương ứng trực tiếp với bất kỳ ISP thực nào. Tuy nhiên, nó tương tự như các quy trình xử lý thực tế để bạn có thể ánh xạ nó tới phần cứng của mình một cách hiệu quả. Ngoài ra, nó đủ trừu tượng để cho phép thực hiện nhiều thuật toán và thứ tự hoạt động khác nhau mà không ảnh hưởng đến chất lượng, hiệu quả hoặc khả năng tương thích giữa các thiết bị.

Quy trình camera cũng hỗ trợ các trình kích hoạt mà khung ứng dụng có thể khởi tạo để bật những thứ như tính năng tự động lấy nét. Nó cũng gửi thông báo trở lại khung ứng dụng, thông báo cho ứng dụng về các sự kiện như khóa lấy nét tự động hoặc lỗi.

Lớp trừu tượng phần cứng máy ảnh

Hình 2. Đường ống camera

Xin lưu ý, một số khối xử lý hình ảnh hiển thị trong sơ đồ trên không được xác định rõ trong bản phát hành đầu tiên. Quy trình camera đưa ra các giả định sau:

  • Đầu ra RAW của Bayer không trải qua quá trình xử lý bên trong ISP.
  • Số liệu thống kê được tạo ra dựa trên dữ liệu cảm biến thô.
  • Các khối xử lý khác nhau chuyển đổi dữ liệu cảm biến thô sang YUV theo thứ tự tùy ý.
  • Trong khi nhiều đơn vị chia tỷ lệ và cắt xén được hiển thị, tất cả các đơn vị chia tỷ lệ đều chia sẻ các điều khiển vùng đầu ra (thu phóng kỹ thuật số). Tuy nhiên, mỗi đơn vị có thể có độ phân giải đầu ra và định dạng pixel khác nhau.

Tóm tắt việc sử dụng API
Đây là bản tóm tắt ngắn gọn về các bước sử dụng API máy ảnh Android. Xem phần Khởi động và trình tự hoạt động dự kiến ​​để biết thông tin chi tiết về các bước này, bao gồm cả lệnh gọi API.

  1. Nghe và liệt kê các thiết bị camera.
  2. Mở thiết bị và kết nối người nghe.
  3. Định cấu hình đầu ra cho trường hợp sử dụng mục tiêu (chẳng hạn như chụp ảnh tĩnh, ghi âm, v.v.).
  4. Tạo (các) yêu cầu cho trường hợp sử dụng mục tiêu.
  5. Ghi lại/lặp lại các yêu cầu và các đợt.
  6. Nhận siêu dữ liệu kết quả và dữ liệu hình ảnh.
  7. Khi chuyển đổi trường hợp sử dụng, quay lại bước 3.

Tóm tắt hoạt động HAL

  • Yêu cầu chụp không đồng bộ đến từ khung.
  • Thiết bị HAL phải xử lý các yêu cầu theo thứ tự. Và đối với mỗi yêu cầu, hãy tạo siêu dữ liệu kết quả đầu ra và một hoặc nhiều bộ đệm hình ảnh đầu ra.
  • Nhập trước, xuất trước đối với các yêu cầu và kết quả cũng như đối với các luồng được tham chiếu bởi các yêu cầu tiếp theo.
  • Dấu thời gian phải giống hệt nhau đối với tất cả kết quả đầu ra từ một yêu cầu nhất định để khung có thể khớp chúng với nhau nếu cần.
  • Tất cả cấu hình và trạng thái chụp (ngoại trừ quy trình 3A) được gói gọn trong các yêu cầu và kết quả.
Tổng quan về máy ảnh HAL

Hình 3. Tổng quan về camera HAL

Trình tự khởi động và hoạt động dự kiến

Phần này chứa giải thích chi tiết về các bước cần thực hiện khi sử dụng API máy ảnh. Vui lòng xem nền tảng/phần cứng/giao diện/máy ảnh/ để biết định nghĩa giao diện HIDL.

Liệt kê, mở thiết bị camera và tạo phiên hoạt động

  1. Sau khi khởi tạo, khung bắt đầu lắng nghe bất kỳ nhà cung cấp máy ảnh hiện tại nào triển khai giao diện ICameraProvider . Nếu nhà cung cấp hoặc các nhà cung cấp đó có mặt, khung sẽ cố gắng thiết lập kết nối.
  2. Khung liệt kê các thiết bị máy ảnh thông qua ICameraProvider::getCameraIdList() .
  3. Khung này khởi tạo một ICameraDevice mới bằng cách gọi ICameraProvider::getCameraDeviceInterface_VX_X() tương ứng.
  4. Khung này gọi ICameraDevice::open() để tạo phiên chụp hoạt động mới ICameraDeviceSession.

Sử dụng phiên camera đang hoạt động

  1. Khung gọi ICameraDeviceSession::configureStreams() với danh sách các luồng đầu vào/đầu ra tới thiết bị HAL.
  2. Khung yêu cầu cài đặt mặc định cho một số trường hợp sử dụng có lệnh gọi tới ICameraDeviceSession::constructDefaultRequestSettings() . Điều này có thể xảy ra bất kỳ lúc nào sau khi ICameraDeviceSession được tạo bởi ICameraDevice::open .
  3. Khung xây dựng và gửi yêu cầu chụp đầu tiên tới HAL với các cài đặt dựa trên một trong các bộ cài đặt mặc định và với ít nhất một luồng đầu ra đã được khung đăng ký trước đó. Điều này được gửi tới HAL bằng ICameraDeviceSession::processCaptureRequest() . HAL phải chặn việc trả lại cuộc gọi này cho đến khi nó sẵn sàng cho yêu cầu tiếp theo được gửi đi.
  4. Khung tiếp tục gửi yêu cầu và gọi ICameraDeviceSession::constructDefaultRequestSettings() để nhận vùng đệm cài đặt mặc định cho các trường hợp sử dụng khác nếu cần.
  5. Khi bắt đầu chụp yêu cầu (cảm biến bắt đầu hiển thị để chụp), HAL gọi ICameraDeviceCallback::notify() bằng thông báo SHUTTER, bao gồm số khung và dấu thời gian để bắt đầu hiển thị. Cuộc gọi lại thông báo này không nhất thiết phải xảy ra trước lệnh gọi processCaptureResult() đầu tiên cho một yêu cầu, nhưng không có kết quả nào được gửi đến ứng dụng để chụp cho đến sau khi gọi notify() cho lần chụp đó.
  6. Sau một số độ trễ quy trình, HAL bắt đầu trả lại các ảnh chụp đã hoàn thành về khung bằng ICameraDeviceCallback::processCaptureResult() . Chúng được trả về theo thứ tự giống như các yêu cầu đã được gửi. Nhiều yêu cầu có thể được thực hiện cùng lúc, tùy thuộc vào độ sâu đường ống của thiết bị HAL camera.

Sau một thời gian, một trong những điều sau đây sẽ xảy ra:

  • Khung có thể ngừng gửi yêu cầu mới, đợi quá trình chụp hiện có hoàn tất (tất cả bộ đệm đã được lấp đầy, tất cả kết quả được trả về), sau đó gọi lại ICameraDeviceSession::configureStreams() . Thao tác này sẽ đặt lại phần cứng và đường dẫn của máy ảnh cho một tập hợp luồng đầu vào/đầu ra mới. Một số luồng có thể được sử dụng lại từ cấu hình trước đó. Sau đó, khung tiếp tục từ yêu cầu chụp đầu tiên đến HAL, nếu vẫn còn ít nhất một luồng đầu ra đã đăng ký. (Nếu không, ICameraDeviceSession::configureStreams() là bắt buộc trước tiên.)
  • Khung có thể gọi ICameraDeviceSession::close() để kết thúc phiên camera. Lệnh này có thể được gọi bất kỳ lúc nào khi không có lệnh gọi nào khác từ khung hoạt động, mặc dù lệnh gọi có thể chặn cho đến khi tất cả quá trình chụp trong khi đang thực hiện hoàn tất (tất cả kết quả được trả về, tất cả bộ đệm đã được lấp đầy). Sau khi lệnh gọi close() trả về, HAL không cho phép gọi tới ICameraDeviceCallback nữa. Khi lệnh gọi close() đang được thực hiện, khung không được gọi bất kỳ chức năng nào khác của thiết bị HAL.
  • Trong trường hợp xảy ra lỗi hoặc sự kiện không đồng bộ khác, HAL phải gọi ICameraDeviceCallback::notify() với thông báo lỗi/sự kiện thích hợp. Sau khi trả về từ một thông báo lỗi nghiêm trọng trên toàn thiết bị, HAL sẽ hoạt động như thể close() đã được gọi trên đó. Tuy nhiên, HAL phải hủy hoặc hoàn thành tất cả các lần chụp chưa xử lý trước khi gọi notify() , để khi notify() được gọi với một lỗi nghiêm trọng, khung sẽ không nhận được thêm lệnh gọi lại từ thiết bị. Các phương thức ngoài close() phải trả về -ENODEV hoặc NULL sau khi phương thức notify() trả về từ một thông báo lỗi nghiêm trọng.
Luồng thao tác của máy ảnh

Hình 4. Quy trình vận hành camera

Cấp độ phần cứng

Các thiết bị máy ảnh có thể triển khai một số cấp độ phần cứng tùy thuộc vào khả năng của chúng. Để biết thêm thông tin, hãy xem cấp độ phần cứng được hỗ trợ .

Tương tác giữa yêu cầu chụp ứng dụng, điều khiển 3A và quy trình xử lý

Tùy thuộc vào cài đặt trong khối điều khiển 3A, đường dẫn camera sẽ bỏ qua một số tham số trong yêu cầu chụp của ứng dụng và thay vào đó sử dụng các giá trị do quy trình điều khiển 3A cung cấp. Ví dụ: khi tính năng tự động phơi sáng được kích hoạt, các thông số về thời gian phơi sáng, thời lượng khung hình và độ nhạy của cảm biến sẽ được điều khiển bằng thuật toán nền tảng 3A và mọi giá trị do ứng dụng chỉ định đều bị bỏ qua. Các giá trị được chọn cho khung theo quy trình 3A phải được báo cáo trong siêu dữ liệu đầu ra. Bảng sau mô tả các chế độ khác nhau của khối điều khiển 3A và các thuộc tính được điều khiển bởi các chế độ này. Xem tệp platform/system/media/Camera/docs/docs.html để biết định nghĩa về các thuộc tính này.

Tham số Tình trạng Thuộc tính được kiểm soát
android.control.aeMode TẮT Không có
TRÊN android.sensor.exposureTime android.sensor.frameDuration android.sensor.sensitive android.lens.aperture (nếu được hỗ trợ) android.lens.filterDensity (nếu được hỗ trợ)
ON_AUTO_FLASH Mọi thứ đều BẬT, cộng với android.flash.firingPower, android.flash.firingTime và android.flash.mode
ON_ALWAYS_FLASH Tương tự như ON_AUTO_FLASH
ON_AUTO_FLASH_RED_EYE Tương tự như ON_AUTO_FLASH
android.control.awbMode TẮT Không có
CÂN BẰNG TRẮNG_* android.colorCorrection.transform. Các điều chỉnh dành riêng cho nền tảng nếu android.colorCorrection.mode là NHANH CHÓNG hoặc CAO_QUALITY.
android.control.afMode TẮT Không có
CHẾ ĐỘ TẬP TRUNG_* android.lens.focusKhoảng cách
android.control.videoỔn định TẮT Không có
TRÊN Có thể điều chỉnh android.scaler.cropRegion để triển khai tính năng ổn định video
android.control.mode TẮT AE, AWB và AF bị tắt
TỰ ĐỘNG Cài đặt AE, AWB và AF riêng lẻ được sử dụng
SCENE_MODE_* Có thể ghi đè tất cả các tham số được liệt kê ở trên. Điều khiển 3A riêng lẻ bị vô hiệu hóa.

Các điều khiển trong khối Xử lý ảnh trong Hình 2 đều hoạt động theo nguyên tắc tương tự và nhìn chung mỗi khối có ba chế độ:

  • TẮT: Khối xử lý này bị vô hiệu hóa. Không thể tắt các khối điều chỉnh demosaic, chỉnh màu và đường cong tông màu.
  • NHANH CHÓNG: Ở chế độ này, khối xử lý có thể không làm chậm tốc độ khung hình đầu ra so với chế độ TẮT, nhưng sẽ tạo ra đầu ra chất lượng tốt nhất có thể do hạn chế đó. Thông thường, điều này sẽ được sử dụng cho chế độ xem trước hoặc quay video hoặc chụp liên tục cho ảnh tĩnh. Trên một số thiết bị, điều này có thể tương đương với chế độ TẮT (không thể thực hiện xử lý mà không làm chậm tốc độ khung hình) và trên một số thiết bị, điều này có thể tương đương với chế độ HIGH_QUALITY (chất lượng tốt nhất vẫn không làm chậm tốc độ khung hình).
  • HIGH_QUALITY: Ở chế độ này, khối xử lý sẽ tạo ra kết quả chất lượng tốt nhất có thể, làm chậm tốc độ khung hình đầu ra nếu cần. Thông thường, điều này sẽ được sử dụng để chụp ảnh tĩnh chất lượng cao. Một số khối bao gồm điều khiển thủ công có thể được chọn tùy ý thay vì FAST hoặc HIGH_QUALITY. Ví dụ: khối hiệu chỉnh màu hỗ trợ ma trận biến đổi màu, trong khi điều chỉnh đường cong tông màu hỗ trợ đường cong ánh xạ tông màu tổng thể tùy ý.

Tốc độ khung hình tối đa có thể được hệ thống con camera hỗ trợ là hàm số của nhiều yếu tố:

  • Độ phân giải được yêu cầu của luồng hình ảnh đầu ra
  • Có sẵn các chế độ gộp/bỏ qua trên máy ảnh
  • Băng thông của giao diện hình ảnh
  • Băng thông của các khối xử lý ISP khác nhau

Vì các yếu tố này có thể khác nhau rất nhiều giữa các ISP và cảm biến khác nhau nên giao diện HAL của máy ảnh sẽ cố gắng trừu tượng hóa các hạn chế về băng thông thành mô hình đơn giản nhất có thể. Mô hình được trình bày có các đặc điểm sau:

  • Cảm biến hình ảnh luôn được cấu hình để xuất ra độ phân giải nhỏ nhất có thể dựa trên kích thước luồng đầu ra được yêu cầu của ứng dụng. Độ phân giải nhỏ nhất được xác định là ít nhất phải lớn bằng kích thước luồng đầu ra được yêu cầu lớn nhất.
  • Vì mọi yêu cầu đều có thể sử dụng bất kỳ hoặc tất cả các luồng đầu ra hiện được cấu hình nên cảm biến và ISP phải được cấu hình để hỗ trợ mở rộng quy mô một lần chụp cho tất cả các luồng cùng một lúc.
  • Các luồng JPEG hoạt động giống như các luồng YUV đã được xử lý đối với các yêu cầu không được đưa vào; trong các yêu cầu mà chúng được tham chiếu trực tiếp, chúng hoạt động như các luồng JPEG.
  • Bộ xử lý JPEG có thể chạy đồng thời với phần còn lại của hệ thống máy ảnh nhưng không thể xử lý nhiều ảnh chụp cùng một lúc.