Yêu cầu
Khung ứng dụng đưa ra các yêu cầu về kết quả được thu thập gửi đến hệ thống con máy ảnh. Một yêu cầu tương ứng với một nhóm 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 thu thập và xử lý các kết quả đó. Chẳng hạn như độ phân giải và định dạng pixel; cảm biến thủ công, ống kính và điều khiển đèn flash; 3A chế độ hoạt động; Kiểm soát xử lý từ RAW sang YUV; và tạo số liệu thống kê. Điều này cho phép kiểm soát kết quả nhiều hơn đầu ra và xử lý. Nhiều yêu cầu có thể đang thực hiện cùng một lúc và gửi yêu cầu không chặn. Yêu cầu luôn được xử lý theo đơn đặt hàng mà họ nhận được.
Hệ thống lớp trừu tượng phần cứng (HAL) và máy ảnh phụ
Hệ thống con của camera bao gồm phương thức triển khai cho các thành phần trong camera chẳng hạn như thuật toán 3A và các biện pháp kiểm soát quá trình xử lý. Lớp trừu tượng phần cứng (HAL) cho máy ảnh cung cấp giao diện để bạn triển khai các phiên bản của những thành phần này. Người nhận duy trì khả năng tương thích giữa 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), đường ống camera là mô hình ảo và không tương ứng trực tiếp với bất kỳ nhà cung cấp dịch vụ Internet (ISP) thực nào. Tuy nhiên, việc này đủ tương tự với quy trình xử lý thực tế để bạn có thể ánh xạ nó đến phần cứng một cách hiệu quả. Ngoài ra, mô hình này đủ trừu tượng để cho phép các 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 máy ảnh cũng hỗ trợ những điều kiện 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. Công cụ này 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ư lỗi hoặc khoá tự động lấy nét.
Xin lưu ý, một số khối xử lý hình ảnh được trình bày trong biểu đồ ở trên không được xác định rõ trong bản phát hành đầu tiên. Quy trình máy ảnh thực hiện những việc sau giả định:
- Dữ liệu đầ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ô.
- Nhiều khối xử lý chuyển đổi dữ liệu cảm biến thô sang YUV nằm trong thứ tự tùy ý.
- Mặc dù nhiều đơn vị tỷ lệ và đơn vị cắt được hiển thị, nhưng tất cả các đơn vị chia tỷ lệ đều dùng chung điều khiển khu vực đầ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.
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 của Android. Xem
Phần trình tự khởi động và hoạt động dự kiến để cung cấp thông tin chi tiết về
các bước này, bao gồm cả lệnh gọi API.
- Nghe và liệt kê các thiết bị camera.
- Mở thiết bị và kết nối người nghe.
- Đị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).
- Tạo(các) yêu cầu cho trường hợp sử dụng mục tiêu.
- Chụp/lặp lại các yêu cầu và loạt ảnh.
- Nhận siêu dữ liệu kết quả và dữ liệu hình ảnh.
- Khi chuyển đổi các 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 lớp trừu tượng phần cứng (HAL)
- Các yêu cầu không đồng bộ cho việc ghi dữ liệu đến từ khung.
- Thiết bị HAL phải xử lý 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.
- Ưu tiên trước tiên đối với các yêu cầu và kết quả, và đối với các luồng được tham chiếu theo các yêu cầu tiếp theo.
- Đối với tất cả dữ liệu đầu ra của một yêu cầu cụ thể, dấu thời gian phải giống nhau để có thể kết hợ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 là được gói gọn trong yêu cầu và kết quả.
Khởi động và trình tự hoạt động dự kiến
Phần này giải thích chi tiết các bước cần thực hiện khi sử dụng API camera. Vui lòng xem nền tảng/phần cứng/giao diện/camera/ cho giao diện HIDL định nghĩa.
Liệt kê, mở thiết bị máy ảnh và tạo một phiên đang hoạt động
- Sau khi khởi chạy, khung sẽ bắt đầu theo dõi mọi trình tự
những nhà cung cấp máy ảnh triển khai
Giao diện
ICameraProvider
. Nếu nhà cung cấp đó hoặc nhà cung cấp khác, khung này sẽ cố gắng thiết lập kết nối. - Khung này liệt kê các thiết bị camera qua
ICameraProvider::getCameraIdList()
. - Khung sẽ tạo thực thể cho một
ICameraDevice
mới bằng cách gọi hàm tương ứngICameraProvider::getCameraDeviceInterface_VX_X()
- Khung này gọi
ICameraDevice::open()
để tạo một mã mới phiên chụp đang hoạt động ICameraDeviceSession.
Sử dụng một phiên máy ảnh đang hoạt động
- Khung này gọi
ICameraDeviceSession::configureStreams()
kèm theo danh sách luồng đầu vào/đầu ra tới thiết bị HAL. - Khung này yêu cầu các chế độ cài đặt mặc định cho một số trường hợp sử dụng với
cuộc gọi đến
ICameraDeviceSession::constructDefaultRequestSettings()
. Điều này có thể xảy ra bất cứ lúc nào sau khiICameraDeviceSession
diễn ra doICameraDevice::open
tạo. - Khung này xây dựng và gửi yêu cầu thu thập đầu tiên đến HAL bằng
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 mà khung đã đăng ký trước đó. Tin nhắn này đã được gửi
đến HAL bằng
ICameraDeviceSession::processCaptureRequest()
. HAL phải chặn lệnh gọi lại này cho đến khi lệnh gọi này sẵn sàng cho lệnh gọi tiếp theo yêu cầu gửi đi. - Khung này sẽ tiếp tục gửi yêu cầu và lệnh gọi
ICameraDeviceSession::constructDefaultRequestSettings()
để tải 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. - Khi quá trình chụp một yêu cầu bắt đầu (cảm biến bắt đầu hiển thị cho
chụp), HAL gọi
ICameraDeviceCallback::notify()
bằng thông báo SHUTTER, bao gồm cả số khung hình và dấu thời gian để bắt đầu mức chịu tiếng ồn. Lệnh gọi lại thông báo này không cần phải xảy ra trước lệnh gọi lại đầu tiênprocessCaptureResult()
gọi một yêu cầu, nhưng không có kết quả nào được phân phối đến một ứng dụng để chụp cho đếnnotify()
cho lần chụp đó sẽ được gọi. - Sau một chút thời gian trễ, HAL bắt đầu trả về ảnh chụp đã hoàn tất
khung này bằng
ICameraDeviceCallback::processCaptureResult()
. Các yêu cầu này được trả lại theo thứ tự tương tự như khi yêu cầu được gửi. Nhiều có thể đang thực hiện cùng một lúc, tuỳ thuộc vào chiều sâu của kênh thiết bị lớp trừu tượng phần cứng (HAL) cho máy ảnh.
Sau một khoảng 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 các yêu cầu mới, hãy đợi
ảnh chụp hiện có cần hoàn tất (tất cả bộ đệm được lấp đầy, tất cả kết quả
trả về), sau đó gọi
ICameraDeviceSession::configureStreams()
một lần nữa. Thao tác này sẽ đặt lại phần cứng và quy trình máy ảnh cho một nhóm luồng đầu vào/đầu ra. Bạn có thể sử dụng lại một số sự kiện trực tiếp của . Sau đó, khung này sẽ tiếp tục từ yêu cầu chụp đầu tiên với HAL, nếu có ít nhất một vẫn còn luồng đầu ra đã đăng ký. (Nếu không, Phải nhậpICameraDeviceSession::configureStreams()
trước.) - Khung này có thể gọi
ICameraDeviceSession::close()
để kết thúc phiên camera. Cuộc gọi này có thể được gọi bất cứ lúc nào khi không có cuộc gọi nào khác từ khung đều đang hoạt động, mặc dù lệnh gọi có thể chặn cho đến khi tất cả ảnh chụp trong máy bay đã hoàn tất (tất cả kết quả được trả về, tất cả vùng đệm được điền). Sau khi cuộc gọiclose()
quay lại, sẽ không còn cuộc gọi nào đến HAL (Lớp trừu tượng phần cứng) cho phép sử dụngICameraDeviceCallback
. Khi Lệnh gọiclose()
đang diễn ra, khung có thể không gọi bất kỳ lệnh nào khác Chức năng 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 lựa chọn thích hợp thông báo lỗi/sự kiện. Sau khi trở lại từ một thông báo lỗi nghiêm trọng trên toàn thiết bị, HAL (Lớp trừu tượng phần cứng) phải hành động như thểclose()
được gọi trên đó. Tuy nhiên, HAL phải hủy hoặc hủy hoặc hoàn tất tất cả ảnh chưa được xử lý trước khi gọinotify()
, để một khinotify()
được gọi kèm theo một lỗi nghiêm trọng, khung này sẽ không nhận thêm các lệnh gọi lại từ thiết bị. Các phương thức bên cạnhclose()
sẽ trả về -ESUV hoặc NULL sau khi phương thứcnotify()
trả về từ một lỗi nghiêm trọng .
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 các chức năng khác nhau. Để biết thêm thông tin, hãy xem được hỗ trợ ở cấp độ phần cứng.
Hoạt động tương tác giữa yêu cầu chụp ảnh ứng dụng, đối tượng kiểm soát 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 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 quy trình kiểm soát 3A cung cấp. Ví dụ: khi chế độ phơi sáng tự động hoạt động, thời gian phơi sáng, thời lượng khung hình và độ nhạy của cảm biến được kiểm soát bởi thuật toán nền tảng 3A và bất kỳ giá trị nào do ứng dụng chỉ định sẽ bị bỏ qua. Bạn phải báo cáo những giá trị được chọn cho khung theo quy trình 3A trong siêu dữ liệu đầu ra. Bảng sau đây mô tả các chế độ khác nhau của 3Khối điều khiển và các thuộc tính được kiểm soát bởi các chế độ nà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 | Tài sản được kiểm soát |
---|---|---|
android.control.aeMode | ĐÃ TẮT | Không có |
ĐANG BẬT | android.sensor.expomentsTime android.sensor.frameDuration android.sensor.sensitivity android.lens.aperture (nếu được hỗ trợ) android.lens.filterDensity (nếu được hỗ trợ) | |
BẬT_TỰ ĐỘNG_FLASH | Mọi thứ đều BẬT cùng với android.flash.firingPower, android.flash.firingTime và android.flash.mode | |
BẬT_ALWAYS_FLASH | Tương tự như ON_auto_FLASH | |
BẬT_TỰ ĐỘNG_FLASH_RED_EYE | Tương tự như ON_auto_FLASH | |
android.control.awbMode | ĐÃ TẮT | Không có |
TRẮNG_Cân_ bằng_* | android.colorCorrection.transform. Điều chỉnh dành riêng cho nền tảng nếu android.colorCorrection.mode là FAST hoặc HIGH_quality. | |
android.control.afMode | ĐÃ TẮT | Không có |
TẬP TRUNG_ĐẠI_CHẾ_* | android.lens.focusDistance | |
android.control.videoS ổn định | ĐÃ TẮT | Không có |
ĐANG BẬT | 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 | Chế độ cài đặt AE, AWB và AF riêng lẻ được sử dụng | |
SCENE_MODE_* | Có thể ghi đè mọi thông số nêu trên. Từng bộ điều khiển 3A đã bị tắt. |
Các thành phần điều khiển trong khối Xử lý hình ảnh ở Hình 2 đều hoạt động trên nguyên tắc tương tự và thường mỗi khối có ba chế độ:
- TẮT: Khối xử lý này đã bị tắt. Tranh tranh khảm, chỉnh màu và không thể tắt các khối điều chỉnh đường cong tông màu.
- FAST: Ở chế độ này, khối xử lý có thể không làm chậm khung hình đầu ra so với chế độ TẮT, nhưng sẽ tạo ra chất lượng tốt nhất đầu ra thì có thể có hạn chế đó. Thông thường, URL này sẽ được sử dụng cho chế độ xem trước/quay video hoặc chụp hàng loạt đối với ảnh tĩnh. Đối với 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 có làm chậm tốc độ khung hình) và trên một số thiết bị, tốc độ 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ả tốt nhất chất lượng cao nhất có thể, làm chậm tốc độ khung hình đầu ra khi cần. Thông thường, tính năng này thường 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 tuỳ ý thay vì NHANH hoặc CHẤT_ LƯỢNG CAO. Ví dụ: khối chỉnh màu hỗ trợ một màu biến đổi ma trận, trong khi việc điều chỉnh đường cong tông màu hỗ trợ phép biến đổi đường cong ánh xạ tông màu.
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 đối với luồng hình ảnh đầu ra
- Khả năng sử dụng chế độ gộp/bỏ qua trên hình ảnh
- Băng thông của giao diện hình ảnh
- Băng thông của nhiều khối xử lý ISP khác nhau
Do những yếu tố này có thể khác nhau đáng kể giữa các ISP và cảm biến khác nhau, nên giao diện HAL của máy ảnh cố gắng tóm tắt các giới hạn băng thông sao cho đơn giản mô hình nhiều 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 để đưa ra độ phân giải nhỏ nhất dựa trên kích thước luồng đầu ra được yêu cầu của ứng dụng. Nhỏ nhất độ phân giải được xác định là ít nhất bằng độ phân giải được yêu cầu lớn nhất kích thước luồng đầu ra.
- Vì mọi yêu cầu đều có thể sử dụng bất kỳ hoặc tất cả luồng đầu ra hiện được định cấu hình, bạn phải định cấu hình cảm biến và ISP để hỗ trợ chia tỷ lệ 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 như luồng YUV đã xử lý cho các yêu cầu chứa luồng này không bao gồm; trong các yêu cầu mà chúng được tham chiếu trực tiếp, chúng đóng vai trò như một 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 ảnh chụp cùng một lúc.