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