1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <system/camera_metadata.h>
18 #include "Camera.h"
19 
20 //#define LOG_NDEBUG 0
21 #define LOG_TAG "ExampleCamera"
22 #include <cutils/log.h>
23 
24 #define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
25 #include <utils/Trace.h>
26 
27 #include "ExampleCamera.h"
28 
29 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
30 
31 namespace default_camera_hal {
32 
ExampleCamera(int id)33 ExampleCamera::ExampleCamera(int id) : Camera(id)
34 {
35 }
36 
~ExampleCamera()37 ExampleCamera::~ExampleCamera()
38 {
39 }
40 
initStaticInfo()41 camera_metadata_t *ExampleCamera::initStaticInfo()
42 {
43     /*
44      * Setup static camera info.  This will have to customized per camera
45      * device.
46      */
47     Metadata m;
48 
49     /* android.control */
50     int32_t android_control_ae_available_target_fps_ranges[] = {30, 30};
51     m.addInt32(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
52             ARRAY_SIZE(android_control_ae_available_target_fps_ranges),
53             android_control_ae_available_target_fps_ranges);
54 
55     int32_t android_control_ae_compensation_range[] = {-4, 4};
56     m.addInt32(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
57             ARRAY_SIZE(android_control_ae_compensation_range),
58             android_control_ae_compensation_range);
59 
60     camera_metadata_rational_t android_control_ae_compensation_step[] = {{2,1}};
61     m.addRational(ANDROID_CONTROL_AE_COMPENSATION_STEP,
62             ARRAY_SIZE(android_control_ae_compensation_step),
63             android_control_ae_compensation_step);
64 
65     int32_t android_control_max_regions[] = {/*AE*/ 1,/*AWB*/ 1,/*AF*/ 1};
66     m.addInt32(ANDROID_CONTROL_MAX_REGIONS,
67             ARRAY_SIZE(android_control_max_regions),
68             android_control_max_regions);
69 
70     /* android.jpeg */
71     int32_t android_jpeg_available_thumbnail_sizes[] = {0, 0, 128, 96};
72     m.addInt32(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
73             ARRAY_SIZE(android_jpeg_available_thumbnail_sizes),
74             android_jpeg_available_thumbnail_sizes);
75 
76     int32_t android_jpeg_max_size[] = {13 * 1024 * 1024}; // 13MB
77     m.addInt32(ANDROID_JPEG_MAX_SIZE,
78             ARRAY_SIZE(android_jpeg_max_size),
79             android_jpeg_max_size);
80 
81     /* android.lens */
82     float android_lens_info_available_focal_lengths[] = {1.0};
83     m.addFloat(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
84             ARRAY_SIZE(android_lens_info_available_focal_lengths),
85             android_lens_info_available_focal_lengths);
86 
87     /* android.request */
88     int32_t android_request_max_num_output_streams[] = {0, 3, 1};
89     m.addInt32(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
90             ARRAY_SIZE(android_request_max_num_output_streams),
91             android_request_max_num_output_streams);
92 
93     /* android.scaler */
94     int32_t android_scaler_available_formats[] = {
95             HAL_PIXEL_FORMAT_RAW16,
96             HAL_PIXEL_FORMAT_BLOB,
97             HAL_PIXEL_FORMAT_RGBA_8888,
98             HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
99             // These are handled by YCbCr_420_888
100             //        HAL_PIXEL_FORMAT_YV12,
101             //        HAL_PIXEL_FORMAT_YCrCb_420_SP,
102             HAL_PIXEL_FORMAT_YCbCr_420_888};
103     m.addInt32(ANDROID_SCALER_AVAILABLE_FORMATS,
104             ARRAY_SIZE(android_scaler_available_formats),
105             android_scaler_available_formats);
106 
107     int64_t android_scaler_available_jpeg_min_durations[] = {1};
108     m.addInt64(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
109             ARRAY_SIZE(android_scaler_available_jpeg_min_durations),
110             android_scaler_available_jpeg_min_durations);
111 
112     int32_t android_scaler_available_jpeg_sizes[] = {640, 480};
113     m.addInt32(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
114             ARRAY_SIZE(android_scaler_available_jpeg_sizes),
115             android_scaler_available_jpeg_sizes);
116 
117     float android_scaler_available_max_digital_zoom[] = {1};
118     m.addFloat(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
119             ARRAY_SIZE(android_scaler_available_max_digital_zoom),
120             android_scaler_available_max_digital_zoom);
121 
122     int64_t android_scaler_available_processed_min_durations[] = {1};
123     m.addInt64(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
124             ARRAY_SIZE(android_scaler_available_processed_min_durations),
125             android_scaler_available_processed_min_durations);
126 
127     int32_t android_scaler_available_processed_sizes[] = {640, 480};
128     m.addInt32(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
129             ARRAY_SIZE(android_scaler_available_processed_sizes),
130             android_scaler_available_processed_sizes);
131 
132     int64_t android_scaler_available_raw_min_durations[] = {1};
133     m.addInt64(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
134             ARRAY_SIZE(android_scaler_available_raw_min_durations),
135             android_scaler_available_raw_min_durations);
136 
137     int32_t android_scaler_available_raw_sizes[] = {640, 480};
138     m.addInt32(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
139             ARRAY_SIZE(android_scaler_available_raw_sizes),
140             android_scaler_available_raw_sizes);
141 
142     /* android.sensor */
143 
144     int32_t android_sensor_info_active_array_size[] = {0, 0, 640, 480};
145     m.addInt32(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
146             ARRAY_SIZE(android_sensor_info_active_array_size),
147             android_sensor_info_active_array_size);
148 
149     int32_t android_sensor_info_sensitivity_range[] =
150             {100, 1600};
151     m.addInt32(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
152             ARRAY_SIZE(android_sensor_info_sensitivity_range),
153             android_sensor_info_sensitivity_range);
154 
155     int64_t android_sensor_info_max_frame_duration[] = {30000000000};
156     m.addInt64(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
157             ARRAY_SIZE(android_sensor_info_max_frame_duration),
158             android_sensor_info_max_frame_duration);
159 
160     float android_sensor_info_physical_size[] = {3.2, 2.4};
161     m.addFloat(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
162             ARRAY_SIZE(android_sensor_info_physical_size),
163             android_sensor_info_physical_size);
164 
165     int32_t android_sensor_info_pixel_array_size[] = {640, 480};
166     m.addInt32(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
167             ARRAY_SIZE(android_sensor_info_pixel_array_size),
168             android_sensor_info_pixel_array_size);
169 
170     int32_t android_sensor_orientation[] = {0};
171     m.addInt32(ANDROID_SENSOR_ORIENTATION,
172             ARRAY_SIZE(android_sensor_orientation),
173             android_sensor_orientation);
174 
175     /* End of static camera characteristics */
176 
177     return clone_camera_metadata(m.get());
178 }
179 
initDevice()180 int ExampleCamera::initDevice()
181 {
182     int res;
183     Metadata base;
184 
185     // Create standard settings templates from copies of base metadata
186     // TODO: use vendor tags in base metadata
187     res = base.add1UInt8(ANDROID_CONTROL_MODE, ANDROID_CONTROL_MODE_OFF);
188     if (res)
189         return res;
190 
191     // Use base settings to create all other templates and set them
192     res = setPreviewTemplate(base);
193     if (res)
194         return res;
195     res = setStillTemplate(base);
196     if (res)
197         return res;
198     res = setRecordTemplate(base);
199     if (res)
200         return res;
201     res = setSnapshotTemplate(base);
202     if (res)
203         return res;
204     res = setZslTemplate(base);
205     if (res)
206         return res;
207 
208     return 0;
209 }
210 
setPreviewTemplate(Metadata m)211 int ExampleCamera::setPreviewTemplate(Metadata m)
212 {
213     // Setup default preview controls
214     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
215                             ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW);
216 
217     if (res)
218         return res;
219     // TODO: set fast auto-focus, auto-whitebalance, auto-exposure, auto flash
220     return setTemplate(CAMERA3_TEMPLATE_PREVIEW, m.get());
221 }
222 
setStillTemplate(Metadata m)223 int ExampleCamera::setStillTemplate(Metadata m)
224 {
225     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
226                             ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
227     // Setup default still capture controls
228     if (res)
229         return res;
230     // TODO: set fast auto-focus, auto-whitebalance, auto-exposure, auto flash
231     return setTemplate(CAMERA3_TEMPLATE_STILL_CAPTURE, m.get());
232 }
233 
setRecordTemplate(Metadata m)234 int ExampleCamera::setRecordTemplate(Metadata m)
235 {
236     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
237                             ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
238     // Setup default video record controls
239     if (res)
240         return res;
241     // TODO: set slow auto-focus, auto-whitebalance, auto-exposure, flash off
242     return setTemplate(CAMERA3_TEMPLATE_VIDEO_RECORD, m.get());
243 }
244 
setSnapshotTemplate(Metadata m)245 int ExampleCamera::setSnapshotTemplate(Metadata m)
246 {
247     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
248                             ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT);
249     // Setup default video snapshot controls
250     if (res)
251         return res;
252     // TODO: set slow auto-focus, auto-whitebalance, auto-exposure, flash off
253     return setTemplate(CAMERA3_TEMPLATE_VIDEO_SNAPSHOT, m.get());
254 }
255 
setZslTemplate(Metadata m)256 int ExampleCamera::setZslTemplate(Metadata m)
257 {
258     int res = m.add1UInt8(ANDROID_CONTROL_CAPTURE_INTENT,
259                             ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG);
260     // Setup default zero shutter lag controls
261     if (res)
262         return res;
263     // TODO: set reprocessing parameters for zsl input queue
264     return setTemplate(CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG, m.get());
265 }
266 
isValidCaptureSettings(const camera_metadata_t *)267 bool ExampleCamera::isValidCaptureSettings(
268         const camera_metadata_t* /*settings*/)
269 {
270     // TODO: reject settings that cannot be captured
271     return true;
272 }
273 
274 } // namespace default_camera_hal
275