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ả chụp cho hệ thống con máy ảnh. 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 đóng gói 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 các thông số như độ phân giải và định dạng pixel; chế độ điều khiển cảm biến, ống kính và đèn flash thủ công; chế độ hoạt động 3A; chế độ điều khiển 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 đầu ra và quá trình xử lý của kết quả. Nhiều yêu cầu có thể đang diễn ra cùng một 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ự nhận được.

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

Hình 1. Kiểu máy ảnh

HAL và hệ thống con máy ảnh

Hệ thống con máy ảnh bao gồm các phương thức triển khai cho các thành phần trong quy trình máy ảnh, chẳng hạn như thuật toán 3A và các chế độ điều khiển xử lý. HAL máy ảnh cung cấp các 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 trên nhiều 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 quy trình máy ảnh là ảo và không trực tiếp tương ứng với bất kỳ ISP thực nào. Tuy nhiên, quy trình này tương tự như quy trình xử lý thực tế để bạn có thể liên kết quy trình này với phần cứng một cách hiệu quả. Ngoài ra, lớp này đủ trừu tượng để cho phép nhiều thuật toán và thứ tự hoạt động khác nhau mà không làm ảnh hưởng đến chất lượng, hiệu quả hoặc khả năng tương thích trên nhiều thiết bị.

Quy trình máy ảnh 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 các tính năng như tự động lấy nét. Lớp này cũng gửi thông báo trở lại khung ứng dụng, thông báo cho các ứng dụng về các sự kiện như lỗi hoặc khoá tự động lấy nét.

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

Hình 2. Quy trình máy ảnh

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

  • Đầu ra RAW Bayer không trải qua quá trình xử lý bên trong ISP.
  • Số liệu thống kê được tạo dựa trên dữ liệu cảm biến thô.
  • Các khối xử lý chuyển đổi dữ liệu cảm biến thô sang YUV theo thứ tự tuỳ ý.
  • Mặc dù nhiều đơn vị tỷ lệ và cắt được hiển thị, nhưng tất cả các đơn vị tỷ lệ đều có chung các chế độ đ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 về cách sử dụng API
Đây là phần tóm tắt ngắn gọn về các bước sử dụng API máy ảnh Android. Hãy xem phần Khởi động và trình tự thao tác 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. Theo dõi và liệt kê các thiết bị máy ảnh.
  2. Mở thiết bị và kết nối trình 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, quay video, v.v.).
  4. Tạo(các) yêu cầu cho trường hợp sử dụng mục tiêu.
  5. Yêu cầu chụp/lặp lại và chụp hàng loạ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, hãy quay lại bước 3.

Tóm tắt về hoạt động của HAL

  • Các yêu cầu không đồng bộ để chụp ảnh đế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 vùng đệm hình ảnh đầu ra.
  • Lần đầu tiên vào, lần đầu tiên ra đố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ằng các yêu cầu tiếp theo.
  • Dấu thời gian phải giống nhau đối với tất cả đầu ra của một yêu cầu nhất định để khung có thể so khớp các đầu ra đó với nhau nếu cần.
  • Tất cả cấu hình và trạng thái chụp (ngoại trừ các quy trình 3A) đều được đóng gói trong các yêu cầu và kết quả.
Tổng quan về HAL máy ảnh

Hình 3. Tổng quan về HAL máy ảnh

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

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

Liệt kê, mở thiết bị máy ảnh và tạo một phiên đang hoạt động

  1. Sau khi khởi chạy, khung này sẽ bắt đầu nghe mọi trình cung cấp máy ảnh hiện có triển khai giao diện ICameraProvider. Nếu có nhà cung cấp hoặc nhà cung cấp như vậy, khung sẽ cố gắng thiết lập kết nối.
  2. Khung này liệt kê các thiết bị máy ảnh thông qua ICameraProvider::getCameraIdList().
  3. Khung này tạo bản sao của 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 một phiên chụp đang hoạt động mới ICameraDeviceSession.

Sử dụng phiên máy ảnh đang hoạt động

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

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

  • Khung này có thể ngừng gửi các yêu cầu mới, đợi các bản ghi hiện có hoàn tất (tất cả vùng đệ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à quy trình của máy ảnh cho một nhóm 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 này sẽ tiếp tục từ yêu cầu chụp đầu tiên đến HAL, nếu ít nhất một luồng đầu ra đã đăng ký vẫn còn. (Nếu không, bạn phải sử dụng ICameraDeviceSession::configureStreams() trước.)
  • Khung này có thể gọi ICameraDeviceSession::close() để kết thúc phiên máy ảnh. Bạn có thể gọi phương thức này bất cứ lúc nào khi không có lệnh gọi nào khác từ khung đang hoạt động, mặc dù lệnh gọi có thể chặn cho đến khi tất cả các lần chụp trong chuyến bay 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 sẽ không cho phép thêm lệnh gọi nào đến ICameraDeviceCallback. Sau khi lệnh gọi close() đang diễn ra, khung này có thể không gọi bất kỳ hàm thiết bị HAL nào khác.
  • 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() kèm theo thông báo lỗi/sự kiện thích hợp. Sau khi quay lại 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 huỷ hoặc hoàn tất tất cả các lần chụp chưa hoàn tất trước khi gọi notify(), để sau khi notify() được gọi với lỗi nghiêm trọng, khung sẽ không nhận được lệnh gọi lại nào khác 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ừ thông báo lỗi nghiêm trọng.
Quy trình hoạt động của máy ảnh

Hình 4. Quy trình hoạt động của 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 tuỳ thuộc vào khả năng của chúng. Để biết thêm thông tin, hãy xem phần cấp độ phần cứng được hỗ trợ.

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

Tuỳ thuộc vào chế độ cài đặt trong khối điều khiển 3A, quy trình máy ảnh sẽ bỏ qua một số tham số trong yêu cầu chụp của ứng dụng và sử dụng các giá trị do các quy trình điều khiển 3A cung cấp. Ví dụ: khi tính năng tự động phơi sáng đang hoạt động, các tham số thời gian phơi sáng, thời lượng khung hình và độ nhạy của cảm biến sẽ do thuật toán 3A của nền tảng kiểm soát và mọi giá trị do ứng dụng chỉ định sẽ bị bỏ qua. Các giá trị do các quy trình 3A chọn cho khung phải được báo cáo trong siêu dữ liệu đầu ra. Bảng sau đây 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 các chế độ này kiểm soát. Hãy xem tệp platform/system/media/camera/docs/docs.html để biết định nghĩa của các thuộc tính này.

Thông số Trạng thái Các thuộc tính được kiểm soát
android.control.aeMode ĐÃ TẮT Không có
ĐANG BẬT android.sensor.exposureTime android.sensor.frameDuration android.sensor.sensitivity android.lens.aperture (nếu được hỗ trợ) android.lens.filterDensity (nếu được hỗ trợ)
ON_AUTO_FLASH Tất cả đề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ó
WHITE_BALANCE_* android.colorCorrection.transform. Điều chỉnh theo nền tảng cụ thể nếu android.colorCorrection.mode là FAST hoặc HIGH_QUALITY.
android.control.afMode ĐÃ TẮT Không có
FOCUS_MODE_* android.lens.focusDistance
android.control.videoStabilization ĐÃ TẮT Không có
ĐANG BẬT Có thể điều chỉnh android.scaler.cropRegion để triển khai tính năng chống rung video
android.control.mode ĐÃ TẮT AE, AWB và AF bị tắt
TỰ ĐỘNG Sử dụng các chế độ cài đặt riêng lẻ cho AE, AWB và AF
SCENE_MODE_* Có thể ghi đè tất cả các tham số nêu trên. Các chế độ điều khiển 3A riêng lẻ bị tắt.

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

  • TẮT: Khối xử lý này bị tắt. Bạn không thể tắt các khối điều chỉnh đường cong màu, điều chỉnh màu và điều chỉnh màu.
  • NHANH: Ở 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ể trong phạm vi hạn chế đó. Thông thường, chế độ này sẽ được dùng cho chế độ xem trước hoặc quay video hoặc chụp ảnh liên tiếp đối với ảnh tĩnh. Trên một số thiết bị, chế độ này có thể tương đương với chế độ TẮT (không thể xử lý nếu không làm chậm tốc độ khung hình) và trên một số thiết bị, chế độ 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, chế độ này sẽ được dùng để chụp ảnh tĩnh chất lượng cao. Một số khối có chế độ điều khiển thủ công mà bạn có thể chọn thay vì FAST hoặc HIGH_QUALITY. Ví dụ: khối chỉnh màu hỗ trợ ma trận chuyển đổi màu, trong khi tính năng điều chỉnh đường cong tông màu hỗ trợ đường cong ánh xạ tông màu toàn cục tuỳ ý.

Tốc độ khung hình tối đa mà hệ thống con máy ảnh có thể hỗ trợ là một hàm 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
  • Khả năng sử dụng chế độ gộp/bỏ qua trên máy ảnh
  • Băng thông của giao diện máy ả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, nên giao diện HAL của máy ảnh cố gắng trừu tượng hoá 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 định 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 mà ứng dụng yêu cầu. Độ phân giải nhỏ nhất được xác định là ít nhất phải bằng kích thước luồng đầu ra lớn nhất được yêu cầu.
  • 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 định cấu hình, nên bạn phải định cấu hình cảm biến và ISP để hỗ trợ việc mở rộng một lần chụp thành tất cả các luồng cùng một lúc.
  • Luồng JPEG hoạt động giống như luồng YUV đã xử lý đối với các yêu cầu không bao gồm luồng JPEG; trong các yêu cầu mà luồng JPEG được tham chiếu trực tiếp, luồng JPEG sẽ hoạt động như luồng JPEG.
  • Bộ xử lý JPEG có thể chạy đồng thời với phần còn lại của quy trình máy ảnh nhưng không thể xử lý nhiều lần chụp cùng một lúc.