xref: /aosp_15_r20/hardware/libhardware/modules/usbcamera/UsbCamera.cpp (revision e01b6f769022e40d0923dee176e8dc7cd1d52984)
1*e01b6f76SAndroid Build Coastguard Worker /*
2*e01b6f76SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*e01b6f76SAndroid Build Coastguard Worker  *
4*e01b6f76SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e01b6f76SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e01b6f76SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e01b6f76SAndroid Build Coastguard Worker  *
8*e01b6f76SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e01b6f76SAndroid Build Coastguard Worker  *
10*e01b6f76SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e01b6f76SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e01b6f76SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e01b6f76SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e01b6f76SAndroid Build Coastguard Worker  * limitations under the License.
15*e01b6f76SAndroid Build Coastguard Worker  */
16*e01b6f76SAndroid Build Coastguard Worker 
17*e01b6f76SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*e01b6f76SAndroid Build Coastguard Worker #define LOG_TAG "UsbCameraDevice"
19*e01b6f76SAndroid Build Coastguard Worker 
20*e01b6f76SAndroid Build Coastguard Worker #include <stdint.h>
21*e01b6f76SAndroid Build Coastguard Worker 
22*e01b6f76SAndroid Build Coastguard Worker #include <log/log.h>
23*e01b6f76SAndroid Build Coastguard Worker 
24*e01b6f76SAndroid Build Coastguard Worker #define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
25*e01b6f76SAndroid Build Coastguard Worker #include <utils/Trace.h>
26*e01b6f76SAndroid Build Coastguard Worker 
27*e01b6f76SAndroid Build Coastguard Worker #include <system/camera_metadata.h>
28*e01b6f76SAndroid Build Coastguard Worker 
29*e01b6f76SAndroid Build Coastguard Worker #include "Camera.h"
30*e01b6f76SAndroid Build Coastguard Worker #include "UsbCamera.h"
31*e01b6f76SAndroid Build Coastguard Worker 
32*e01b6f76SAndroid Build Coastguard Worker #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
33*e01b6f76SAndroid Build Coastguard Worker 
34*e01b6f76SAndroid Build Coastguard Worker namespace usb_camera_hal {
35*e01b6f76SAndroid Build Coastguard Worker 
UsbCamera(int id)36*e01b6f76SAndroid Build Coastguard Worker UsbCamera::UsbCamera(int id) : Camera(id) {
37*e01b6f76SAndroid Build Coastguard Worker }
38*e01b6f76SAndroid Build Coastguard Worker 
~UsbCamera()39*e01b6f76SAndroid Build Coastguard Worker UsbCamera::~UsbCamera() {
40*e01b6f76SAndroid Build Coastguard Worker }
41*e01b6f76SAndroid Build Coastguard Worker 
initStaticInfo()42*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::initStaticInfo() {
43*e01b6f76SAndroid Build Coastguard Worker     /*
44*e01b6f76SAndroid Build Coastguard Worker      * Setup static camera info.  This will have to customized per camera
45*e01b6f76SAndroid Build Coastguard Worker      * device.
46*e01b6f76SAndroid Build Coastguard Worker      * TODO: this is just some sample code, need tailor for USB cameras.
47*e01b6f76SAndroid Build Coastguard Worker      */
48*e01b6f76SAndroid Build Coastguard Worker     if (mStaticInfo != NULL) {
49*e01b6f76SAndroid Build Coastguard Worker         free_camera_metadata(mStaticInfo);
50*e01b6f76SAndroid Build Coastguard Worker     }
51*e01b6f76SAndroid Build Coastguard Worker 
52*e01b6f76SAndroid Build Coastguard Worker     Metadata m;
53*e01b6f76SAndroid Build Coastguard Worker 
54*e01b6f76SAndroid Build Coastguard Worker     /* android.control */
55*e01b6f76SAndroid Build Coastguard Worker     int32_t android_control_ae_available_target_fps_ranges[] = {30, 30};
56*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
57*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_control_ae_available_target_fps_ranges),
58*e01b6f76SAndroid Build Coastguard Worker             android_control_ae_available_target_fps_ranges);
59*e01b6f76SAndroid Build Coastguard Worker 
60*e01b6f76SAndroid Build Coastguard Worker     int32_t android_control_ae_compensation_range[] = {-4, 4};
61*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
62*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_control_ae_compensation_range),
63*e01b6f76SAndroid Build Coastguard Worker             android_control_ae_compensation_range);
64*e01b6f76SAndroid Build Coastguard Worker 
65*e01b6f76SAndroid Build Coastguard Worker     camera_metadata_rational_t android_control_ae_compensation_step[] = {{2,1}};
66*e01b6f76SAndroid Build Coastguard Worker     m.addRational(ANDROID_CONTROL_AE_COMPENSATION_STEP,
67*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_control_ae_compensation_step),
68*e01b6f76SAndroid Build Coastguard Worker             android_control_ae_compensation_step);
69*e01b6f76SAndroid Build Coastguard Worker 
70*e01b6f76SAndroid Build Coastguard Worker     int32_t android_control_max_regions[] = {/*AE*/ 1,/*AWB*/ 1,/*AF*/ 1};
71*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_CONTROL_MAX_REGIONS,
72*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_control_max_regions),
73*e01b6f76SAndroid Build Coastguard Worker             android_control_max_regions);
74*e01b6f76SAndroid Build Coastguard Worker 
75*e01b6f76SAndroid Build Coastguard Worker     /* android.jpeg */
76*e01b6f76SAndroid Build Coastguard Worker     int32_t android_jpeg_available_thumbnail_sizes[] = {0, 0, 128, 96};
77*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
78*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_jpeg_available_thumbnail_sizes),
79*e01b6f76SAndroid Build Coastguard Worker             android_jpeg_available_thumbnail_sizes);
80*e01b6f76SAndroid Build Coastguard Worker 
81*e01b6f76SAndroid Build Coastguard Worker     int32_t android_jpeg_max_size[] = {13 * 1024 * 1024}; // 13MB
82*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_JPEG_MAX_SIZE,
83*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_jpeg_max_size),
84*e01b6f76SAndroid Build Coastguard Worker             android_jpeg_max_size);
85*e01b6f76SAndroid Build Coastguard Worker 
86*e01b6f76SAndroid Build Coastguard Worker     /* android.lens */
87*e01b6f76SAndroid Build Coastguard Worker     float android_lens_info_available_focal_lengths[] = {1.0};
88*e01b6f76SAndroid Build Coastguard Worker     m.addFloat(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
89*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_lens_info_available_focal_lengths),
90*e01b6f76SAndroid Build Coastguard Worker             android_lens_info_available_focal_lengths);
91*e01b6f76SAndroid Build Coastguard Worker 
92*e01b6f76SAndroid Build Coastguard Worker     /* android.request */
93*e01b6f76SAndroid Build Coastguard Worker     int32_t android_request_max_num_output_streams[] = {0, 3, 1};
94*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
95*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_request_max_num_output_streams),
96*e01b6f76SAndroid Build Coastguard Worker             android_request_max_num_output_streams);
97*e01b6f76SAndroid Build Coastguard Worker 
98*e01b6f76SAndroid Build Coastguard Worker     /* android.scaler */
99*e01b6f76SAndroid Build Coastguard Worker     int32_t android_scaler_available_formats[] = {
100*e01b6f76SAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_RAW16,
101*e01b6f76SAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_BLOB,
102*e01b6f76SAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_RGBA_8888,
103*e01b6f76SAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
104*e01b6f76SAndroid Build Coastguard Worker             // These are handled by YCbCr_420_888
105*e01b6f76SAndroid Build Coastguard Worker             //        HAL_PIXEL_FORMAT_YV12,
106*e01b6f76SAndroid Build Coastguard Worker             //        HAL_PIXEL_FORMAT_YCrCb_420_SP,
107*e01b6f76SAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_YCbCr_420_888};
108*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_SCALER_AVAILABLE_FORMATS,
109*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_scaler_available_formats),
110*e01b6f76SAndroid Build Coastguard Worker             android_scaler_available_formats);
111*e01b6f76SAndroid Build Coastguard Worker 
112*e01b6f76SAndroid Build Coastguard Worker     int64_t android_scaler_available_jpeg_min_durations[] = {1};
113*e01b6f76SAndroid Build Coastguard Worker     m.addInt64(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
114*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_scaler_available_jpeg_min_durations),
115*e01b6f76SAndroid Build Coastguard Worker             android_scaler_available_jpeg_min_durations);
116*e01b6f76SAndroid Build Coastguard Worker 
117*e01b6f76SAndroid Build Coastguard Worker     int32_t android_scaler_available_jpeg_sizes[] = {640, 480};
118*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
119*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_scaler_available_jpeg_sizes),
120*e01b6f76SAndroid Build Coastguard Worker             android_scaler_available_jpeg_sizes);
121*e01b6f76SAndroid Build Coastguard Worker 
122*e01b6f76SAndroid Build Coastguard Worker     float android_scaler_available_max_digital_zoom[] = {1};
123*e01b6f76SAndroid Build Coastguard Worker     m.addFloat(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
124*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_scaler_available_max_digital_zoom),
125*e01b6f76SAndroid Build Coastguard Worker             android_scaler_available_max_digital_zoom);
126*e01b6f76SAndroid Build Coastguard Worker 
127*e01b6f76SAndroid Build Coastguard Worker     int64_t android_scaler_available_processed_min_durations[] = {1};
128*e01b6f76SAndroid Build Coastguard Worker     m.addInt64(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
129*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_scaler_available_processed_min_durations),
130*e01b6f76SAndroid Build Coastguard Worker             android_scaler_available_processed_min_durations);
131*e01b6f76SAndroid Build Coastguard Worker 
132*e01b6f76SAndroid Build Coastguard Worker     int32_t android_scaler_available_processed_sizes[] = {640, 480};
133*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
134*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_scaler_available_processed_sizes),
135*e01b6f76SAndroid Build Coastguard Worker             android_scaler_available_processed_sizes);
136*e01b6f76SAndroid Build Coastguard Worker 
137*e01b6f76SAndroid Build Coastguard Worker     int64_t android_scaler_available_raw_min_durations[] = {1};
138*e01b6f76SAndroid Build Coastguard Worker     m.addInt64(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
139*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_scaler_available_raw_min_durations),
140*e01b6f76SAndroid Build Coastguard Worker             android_scaler_available_raw_min_durations);
141*e01b6f76SAndroid Build Coastguard Worker 
142*e01b6f76SAndroid Build Coastguard Worker     int32_t android_scaler_available_raw_sizes[] = {640, 480};
143*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
144*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_scaler_available_raw_sizes),
145*e01b6f76SAndroid Build Coastguard Worker             android_scaler_available_raw_sizes);
146*e01b6f76SAndroid Build Coastguard Worker 
147*e01b6f76SAndroid Build Coastguard Worker     /* android.sensor */
148*e01b6f76SAndroid Build Coastguard Worker 
149*e01b6f76SAndroid Build Coastguard Worker     int32_t android_sensor_info_active_array_size[] = {0, 0, 640, 480};
150*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
151*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_sensor_info_active_array_size),
152*e01b6f76SAndroid Build Coastguard Worker             android_sensor_info_active_array_size);
153*e01b6f76SAndroid Build Coastguard Worker 
154*e01b6f76SAndroid Build Coastguard Worker     int32_t android_sensor_info_sensitivity_range[] =
155*e01b6f76SAndroid Build Coastguard Worker             {100, 1600};
156*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
157*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_sensor_info_sensitivity_range),
158*e01b6f76SAndroid Build Coastguard Worker             android_sensor_info_sensitivity_range);
159*e01b6f76SAndroid Build Coastguard Worker 
160*e01b6f76SAndroid Build Coastguard Worker     int64_t android_sensor_info_max_frame_duration[] = {30000000000};
161*e01b6f76SAndroid Build Coastguard Worker     m.addInt64(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
162*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_sensor_info_max_frame_duration),
163*e01b6f76SAndroid Build Coastguard Worker             android_sensor_info_max_frame_duration);
164*e01b6f76SAndroid Build Coastguard Worker 
165*e01b6f76SAndroid Build Coastguard Worker     float android_sensor_info_physical_size[] = {3.2, 2.4};
166*e01b6f76SAndroid Build Coastguard Worker     m.addFloat(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
167*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_sensor_info_physical_size),
168*e01b6f76SAndroid Build Coastguard Worker             android_sensor_info_physical_size);
169*e01b6f76SAndroid Build Coastguard Worker 
170*e01b6f76SAndroid Build Coastguard Worker     int32_t android_sensor_info_pixel_array_size[] = {640, 480};
171*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
172*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_sensor_info_pixel_array_size),
173*e01b6f76SAndroid Build Coastguard Worker             android_sensor_info_pixel_array_size);
174*e01b6f76SAndroid Build Coastguard Worker 
175*e01b6f76SAndroid Build Coastguard Worker     int32_t android_sensor_orientation[] = {0};
176*e01b6f76SAndroid Build Coastguard Worker     m.addInt32(ANDROID_SENSOR_ORIENTATION,
177*e01b6f76SAndroid Build Coastguard Worker             ARRAY_SIZE(android_sensor_orientation),
178*e01b6f76SAndroid Build Coastguard Worker             android_sensor_orientation);
179*e01b6f76SAndroid Build Coastguard Worker 
180*e01b6f76SAndroid Build Coastguard Worker     /* End of static camera characteristics */
181*e01b6f76SAndroid Build Coastguard Worker 
182*e01b6f76SAndroid Build Coastguard Worker     mStaticInfo = clone_camera_metadata(m.get());
183*e01b6f76SAndroid Build Coastguard Worker 
184*e01b6f76SAndroid Build Coastguard Worker     return 0;
185*e01b6f76SAndroid Build Coastguard Worker }
186*e01b6f76SAndroid Build Coastguard Worker 
openDevice()187*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::openDevice() {
188*e01b6f76SAndroid Build Coastguard Worker     // TODO: implement usb camera device open sequence: open device nodes etc.
189*e01b6f76SAndroid Build Coastguard Worker 
190*e01b6f76SAndroid Build Coastguard Worker     return 0;
191*e01b6f76SAndroid Build Coastguard Worker }
192*e01b6f76SAndroid Build Coastguard Worker 
closeDevice()193*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::closeDevice() {
194*e01b6f76SAndroid Build Coastguard Worker     // TODO: implement usb camera device close sequence: close device nodes etc.
195*e01b6f76SAndroid Build Coastguard Worker 
196*e01b6f76SAndroid Build Coastguard Worker     return 0;
197*e01b6f76SAndroid Build Coastguard Worker }
198*e01b6f76SAndroid Build Coastguard Worker 
processCaptureBuffer(const camera3_stream_buffer_t * in,camera3_stream_buffer_t * out)199*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::processCaptureBuffer(const camera3_stream_buffer_t *in,
200*e01b6f76SAndroid Build Coastguard Worker         camera3_stream_buffer_t *out) {
201*e01b6f76SAndroid Build Coastguard Worker     if (in->acquire_fence != -1) {
202*e01b6f76SAndroid Build Coastguard Worker         int res = sync_wait(in->acquire_fence, CAMERA_SYNC_TIMEOUT_MS);
203*e01b6f76SAndroid Build Coastguard Worker         if (res == -ETIME) {
204*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: Timeout waiting on buffer acquire fence",
205*e01b6f76SAndroid Build Coastguard Worker                     __func__, mId);
206*e01b6f76SAndroid Build Coastguard Worker             return res;
207*e01b6f76SAndroid Build Coastguard Worker         } else if (res) {
208*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: Error waiting on buffer acquire fence: %s(%d)",
209*e01b6f76SAndroid Build Coastguard Worker                     __func__, mId, strerror(-res), res);
210*e01b6f76SAndroid Build Coastguard Worker             return res;
211*e01b6f76SAndroid Build Coastguard Worker         }
212*e01b6f76SAndroid Build Coastguard Worker     }
213*e01b6f76SAndroid Build Coastguard Worker 
214*e01b6f76SAndroid Build Coastguard Worker     out->stream = in->stream;
215*e01b6f76SAndroid Build Coastguard Worker     out->buffer = in->buffer;
216*e01b6f76SAndroid Build Coastguard Worker     out->status = CAMERA3_BUFFER_STATUS_OK;
217*e01b6f76SAndroid Build Coastguard Worker     // TODO: use driver-backed release fences
218*e01b6f76SAndroid Build Coastguard Worker     out->acquire_fence = -1;
219*e01b6f76SAndroid Build Coastguard Worker     out->release_fence = -1;
220*e01b6f76SAndroid Build Coastguard Worker 
221*e01b6f76SAndroid Build Coastguard Worker     // TODO: lock and software-paint buffer
222*e01b6f76SAndroid Build Coastguard Worker     return 0;
223*e01b6f76SAndroid Build Coastguard Worker }
224*e01b6f76SAndroid Build Coastguard Worker 
initDevice()225*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::initDevice() {
226*e01b6f76SAndroid Build Coastguard Worker     int res;
227*e01b6f76SAndroid Build Coastguard Worker     Metadata base;
228*e01b6f76SAndroid Build Coastguard Worker 
229*e01b6f76SAndroid Build Coastguard Worker     // Create standard settings templates from copies of base metadata
230*e01b6f76SAndroid Build Coastguard Worker     res = base.add1UInt8(ANDROID_CONTROL_MODE, ANDROID_CONTROL_MODE_OFF);
231*e01b6f76SAndroid Build Coastguard Worker     if (res)
232*e01b6f76SAndroid Build Coastguard Worker         return res;
233*e01b6f76SAndroid Build Coastguard Worker 
234*e01b6f76SAndroid Build Coastguard Worker     // Use base settings to create all other templates and set them. This is just some samples,
235*e01b6f76SAndroid Build Coastguard Worker     // More initialization may be needed.
236*e01b6f76SAndroid Build Coastguard Worker     res = initPreviewTemplate(base);
237*e01b6f76SAndroid Build Coastguard Worker     if (res)
238*e01b6f76SAndroid Build Coastguard Worker         return res;
239*e01b6f76SAndroid Build Coastguard Worker     res = initStillTemplate(base);
240*e01b6f76SAndroid Build Coastguard Worker     if (res)
241*e01b6f76SAndroid Build Coastguard Worker         return res;
242*e01b6f76SAndroid Build Coastguard Worker     res = initRecordTemplate(base);
243*e01b6f76SAndroid Build Coastguard Worker     if (res)
244*e01b6f76SAndroid Build Coastguard Worker         return res;
245*e01b6f76SAndroid Build Coastguard Worker     res = initSnapshotTemplate(base);
246*e01b6f76SAndroid Build Coastguard Worker     if (res)
247*e01b6f76SAndroid Build Coastguard Worker         return res;
248*e01b6f76SAndroid Build Coastguard Worker     res = initZslTemplate(base);
249*e01b6f76SAndroid Build Coastguard Worker     if (res)
250*e01b6f76SAndroid Build Coastguard Worker         return res;
251*e01b6f76SAndroid Build Coastguard Worker     res = initManualTemplate(base);
252*e01b6f76SAndroid Build Coastguard Worker     if (res)
253*e01b6f76SAndroid Build Coastguard Worker         return res;
254*e01b6f76SAndroid Build Coastguard Worker 
255*e01b6f76SAndroid Build Coastguard Worker     return 0;
256*e01b6f76SAndroid Build Coastguard Worker }
257*e01b6f76SAndroid Build Coastguard Worker 
initPreviewTemplate(Metadata m)258*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::initPreviewTemplate(Metadata m) {
259*e01b6f76SAndroid Build Coastguard Worker     // Setup default preview controls
260*e01b6f76SAndroid Build Coastguard Worker     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
261*e01b6f76SAndroid Build Coastguard Worker                             ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW);
262*e01b6f76SAndroid Build Coastguard Worker 
263*e01b6f76SAndroid Build Coastguard Worker     if (res)
264*e01b6f76SAndroid Build Coastguard Worker         return res;
265*e01b6f76SAndroid Build Coastguard Worker     // TODO: set fast auto-focus, auto-whitebalance, auto-exposure, auto flash
266*e01b6f76SAndroid Build Coastguard Worker     return setTemplate(CAMERA3_TEMPLATE_PREVIEW, m.get());
267*e01b6f76SAndroid Build Coastguard Worker }
268*e01b6f76SAndroid Build Coastguard Worker 
initStillTemplate(Metadata m)269*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::initStillTemplate(Metadata m) {
270*e01b6f76SAndroid Build Coastguard Worker     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
271*e01b6f76SAndroid Build Coastguard Worker                             ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
272*e01b6f76SAndroid Build Coastguard Worker     // Setup default still capture controls
273*e01b6f76SAndroid Build Coastguard Worker     if (res)
274*e01b6f76SAndroid Build Coastguard Worker         return res;
275*e01b6f76SAndroid Build Coastguard Worker     // TODO: set fast auto-focus, auto-whitebalance, auto-exposure, auto flash
276*e01b6f76SAndroid Build Coastguard Worker     return setTemplate(CAMERA3_TEMPLATE_STILL_CAPTURE, m.get());
277*e01b6f76SAndroid Build Coastguard Worker }
278*e01b6f76SAndroid Build Coastguard Worker 
initRecordTemplate(Metadata m)279*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::initRecordTemplate(Metadata m) {
280*e01b6f76SAndroid Build Coastguard Worker     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
281*e01b6f76SAndroid Build Coastguard Worker                             ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
282*e01b6f76SAndroid Build Coastguard Worker     // Setup default video record controls
283*e01b6f76SAndroid Build Coastguard Worker     if (res)
284*e01b6f76SAndroid Build Coastguard Worker         return res;
285*e01b6f76SAndroid Build Coastguard Worker     // TODO: set slow auto-focus, auto-whitebalance, auto-exposure, flash off
286*e01b6f76SAndroid Build Coastguard Worker     return setTemplate(CAMERA3_TEMPLATE_VIDEO_RECORD, m.get());
287*e01b6f76SAndroid Build Coastguard Worker }
288*e01b6f76SAndroid Build Coastguard Worker 
initSnapshotTemplate(Metadata m)289*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::initSnapshotTemplate(Metadata m) {
290*e01b6f76SAndroid Build Coastguard Worker     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
291*e01b6f76SAndroid Build Coastguard Worker                             ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT);
292*e01b6f76SAndroid Build Coastguard Worker     // Setup default video snapshot controls
293*e01b6f76SAndroid Build Coastguard Worker     if (res)
294*e01b6f76SAndroid Build Coastguard Worker         return res;
295*e01b6f76SAndroid Build Coastguard Worker     // TODO: set slow auto-focus, auto-whitebalance, auto-exposure, flash off
296*e01b6f76SAndroid Build Coastguard Worker     return setTemplate(CAMERA3_TEMPLATE_VIDEO_SNAPSHOT, m.get());
297*e01b6f76SAndroid Build Coastguard Worker }
298*e01b6f76SAndroid Build Coastguard Worker 
initZslTemplate(Metadata m)299*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::initZslTemplate(Metadata m) {
300*e01b6f76SAndroid Build Coastguard Worker     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
301*e01b6f76SAndroid Build Coastguard Worker                             ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG);
302*e01b6f76SAndroid Build Coastguard Worker     // Setup default zero shutter lag controls
303*e01b6f76SAndroid Build Coastguard Worker     if (res)
304*e01b6f76SAndroid Build Coastguard Worker         return res;
305*e01b6f76SAndroid Build Coastguard Worker     // TODO: set reprocessing parameters for zsl input queue
306*e01b6f76SAndroid Build Coastguard Worker     return setTemplate(CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG, m.get());
307*e01b6f76SAndroid Build Coastguard Worker }
308*e01b6f76SAndroid Build Coastguard Worker 
initManualTemplate(Metadata m)309*e01b6f76SAndroid Build Coastguard Worker int UsbCamera::initManualTemplate(Metadata m) {
310*e01b6f76SAndroid Build Coastguard Worker     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
311*e01b6f76SAndroid Build Coastguard Worker                             ANDROID_CONTROL_CAPTURE_INTENT_MANUAL);
312*e01b6f76SAndroid Build Coastguard Worker     // Setup manual controls
313*e01b6f76SAndroid Build Coastguard Worker     if (res)
314*e01b6f76SAndroid Build Coastguard Worker         return res;
315*e01b6f76SAndroid Build Coastguard Worker     // TODO: set reprocessing parameters for zsl input queue
316*e01b6f76SAndroid Build Coastguard Worker     return setTemplate(CAMERA3_TEMPLATE_MANUAL, m.get());
317*e01b6f76SAndroid Build Coastguard Worker }
318*e01b6f76SAndroid Build Coastguard Worker 
isValidCaptureSettings(const camera_metadata_t *)319*e01b6f76SAndroid Build Coastguard Worker bool UsbCamera::isValidCaptureSettings(const camera_metadata_t* /*settings*/) {
320*e01b6f76SAndroid Build Coastguard Worker     // TODO: reject settings that cannot be captured
321*e01b6f76SAndroid Build Coastguard Worker     return true;
322*e01b6f76SAndroid Build Coastguard Worker }
323*e01b6f76SAndroid Build Coastguard Worker 
324*e01b6f76SAndroid Build Coastguard Worker } // namespace usb_camera_hal
325