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 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 bao gồm tất cả thông tin cấu hình về việc ghi lại và xử lý những kết quả đó. Trong đó có những yếu tố như độ phân giải và định dạng pixel; cảm biến, ống kính và chế độ điều khiển đèn flash thủ công; chế độ hoạt động 3A; chế độ kiểm soát xử lý RAW sang YUV; và chế độ tạo số liệu thống kê. Điều này giúp bạn kiểm soát nhiều hơn đối với kết quả đầu ra và quá trình xử lý. Bạn có thể gửi nhiều yêu cầu cùng một lúc và việc gửi yêu cầu sẽ không bị chặn. Các yêu cầu luôn được xử lý theo thứ tự nhận được.

Mô hình yêu cầu camera

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

HAL và hệ thống con camera

Hệ thống con camera bao gồm các cách triển khai cho các thành phần trong quy trình camera, chẳng hạn như thuật toán 3A và các chế độ điều khiển xử lý. HAL camera cung cấp các giao diện để bạn triển khai các phiên bản của những 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 camera), mô hình quy trình 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ó đủ giống với các quy trình xử lý thực để bạn có thể ánh xạ nó một cách hiệu quả vào phần cứng của mình. Ngoài ra, nó đủ 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 ả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 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 các tính năng như 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 các ứng dụng về những sự kiện như khoá lấy nét tự động hoặc lỗi.

Lớp trừu tượng phần cứng camera

Hình 2. Quy trình camera

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

  • Đầu ra Bayer thô không trải qua quá trình xử lý nào 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ý khác nhau chuyển đổi dữ liệu cảm biến thô thành YUV theo một thứ tự tuỳ ý.
  • Mặc dù có nhiều đơn vị thu phóng và cắt, nhưng tất cả các đơn vị thu phóng đều dùng chung các chế độ kiểm soát 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 cách 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 camera Android. Hãy xem phần Trình tự khởi động và 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. Lắng nghe và liệt kê các thiết bị camera.
  2. Mở thiết bị và kết nối với thiết bị trợ thính.
  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 hình, 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 và chuỗi chụp/lặp lại.
  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.

Thông tin tóm tắt về hoạt động của HAL

  • Các yêu cầu không đồng bộ về hoạt động ghi hình bắt nguồn từ khung.
  • Thiết bị HAL phải xử lý các yêu cầu theo thứ tự. Đố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.
  • Vào trước, ra 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 yêu cầu tham chiếu bởi các yêu cầu tiếp theo.
  • Dấu thời gian phải giống nhau cho tất cả các đầu ra từ một yêu cầu nhất định, để khung có thể so 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ừ 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 camera

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

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

Phần này trình bày chi tiết các bước dự kiến khi sử dụng API camera. Vui lòng xem platform/hardware/interfaces/camera/ để biết các định nghĩa về giao diện HIDL.

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

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

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

  1. Khung này gọi ICameraDeviceSession::configureStreams() bằng 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 bằng cá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 ICameraDeviceSession được ICameraDevice::open tạo.
  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à lệnh gọi ICameraDeviceSession::constructDefaultRequestSettings() để nhận các vùng đệm chế độ cài đặt mặc định cho các trường hợp sử dụng khác khi 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 cho thời gian bắt đầu phơi sáng. Lệnh gọi lại thông báo này không cần diễn 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 một ứng dụng để chụp cho đến sau khi notify() cho hoạt động chụp đó được gọi.
  6. Sau một khoảng thời gian trễ của quy trình, HAL bắt đầu trả lại các bản chụp đã hoàn tất cho khung bằng ICameraDeviceCallback::processCaptureResult(). Các yêu cầu này được trả về theo thứ tự giống như khi bạn gửi yêu cầu. Có thể có nhiều yêu cầu đang được xử lý cùng lúc, tuỳ thuộc vào độ sâu của quy trình thiết bị HAL camera.

Sau một thời gian, một trong những trường hợp sau sẽ xảy ra:

  • Khung này có thể ngừng gửi yêu cầu mới, đợi các hoạt động ghi hiện có hoàn tất (đã điền tất cả các vùng đệm, đã trả về tất cả các kết quả), rồi 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 camera cho một nhóm luồng đầu vào/đầu ra mới. Một số luồng có thể được 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 còn lại ít nhất một luồng đầu ra đã đăng ký. (Nếu không, bạn phải có 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 hoạt động chụp đang diễn ra hoàn tất (tất cả kết quả được trả về, tất cả bộ đệm được điền). Sau khi lệnh gọi close() trả về, HAL sẽ không được phép thực hiện thêm lệnh gọi nào đến ICameraDeviceCallback. Sau khi lệnh gọi close() đang diễn ra, khung 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 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 thông báo đó. Tuy nhiên, HAL phải huỷ hoặc hoàn tất tất cả các hoạt động chụp ảnh đang chờ 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 thêm lệnh gọi lại nào từ thiết bị. Các phương thức ngoài close() sẽ trả về -ENODEV hoặc NULL sau khi phương thức notify() trả về thông báo lỗi nghiêm trọng.
Quy trình hoạt động của camera

Hình 4. Quy trình hoạt động của camera

Cấp độ phần cứng

Các thiết bị camera 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 cấp độ phần cứng được hỗ trợ.

Tương tác giữa yêu cầu chụp ứng dụng, chế độ kiểm soát 3A và quy trình xử lý

Tuỳ thuộc vào các chế độ cài đặt trong khối điều khiển 3A, quy trình camera 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 chế độ phơi sáng tự động đang hoạt động, thời gian phơi sáng, thời lượng khung hình và các thông số độ 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 đều bị bỏ qua. Các giá trị mà quy trình 3A chọn cho khung hình 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 do 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 về các thuộc tính này.

Tham số Trạng thái Các tài sản đượ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 (if supported) android.lens.filterDensity (if supported)
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ó
WHITE_BALANCE_* android.colorCorrection.transform. Các chế độ đ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 Các chế độ 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. Các chế độ kiểm soát 3A riêng lẻ bị tắt.

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

  • TẮT: Khối xử lý này bị vô hiệu hoá. Bạn không thể tắt các khối điều chỉnh đường cong khử răng cưa, chỉnh màu và tông màu.
  • NHANH: Ở chế độ này, khối xử lý có thể không làm giảm tốc độ khung hình đầu ra so với chế độ TẮT, nhưng nếu không, khối xử lý sẽ tạo ra đầu ra có 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ế độ chụp liên tục cho ả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ý mà không làm giả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 giảm tốc độ khung hình).
  • HIGH_QUALITY: Ở chế độ này, khối xử lý sẽ tạo ra kết quả có chất lượng tốt nhất có thể, làm chậm tốc độ khung hình đầu ra khi cần. Thông thường, bạn sẽ dùng chế độ này để 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 (NHANH) hoặc HIGH_QUALITY (CHẤT LƯỢNG CAO). Ví dụ: khối chỉnh màu hỗ trợ ma trận biến đổi màu, trong khi chế độ điều chỉnh đường cong tông màu hỗ trợ một đường cong ánh xạ tông màu chung tuỳ ý.

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