Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) 2012 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 /*
     18  * Contains implementation of a class EmulatedCamera that encapsulates
     19  * functionality common to all version 2.0 emulated camera devices.  Instances
     20  * of this class (for each emulated camera) are created during the construction
     21  * of the EmulatedCameraFactory instance.  This class serves as an entry point
     22  * for all camera API calls that defined by camera2_device_ops_t API.
     23  */
     24 
     25 //#define LOG_NDEBUG 0
     26 #define LOG_TAG "EmulatedCamera2_Camera"
     27 #include <cutils/log.h>
     28 
     29 #include "EmulatedCamera2.h"
     30 #include "system/camera_metadata.h"
     31 
     32 namespace android {
     33 
     34 /* Constructs EmulatedCamera2 instance.
     35  * Param:
     36  *  cameraId - Zero based camera identifier, which is an index of the camera
     37  *      instance in camera factory's array.
     38  *  module - Emulated camera HAL module descriptor.
     39  */
     40 EmulatedCamera2::EmulatedCamera2(int cameraId,
     41         struct hw_module_t* module):
     42         EmulatedBaseCamera(cameraId,
     43                 CAMERA_DEVICE_API_VERSION_2_0,
     44                 &common,
     45                 module)
     46 {
     47     common.close = EmulatedCamera2::close;
     48     ops = &sDeviceOps;
     49     priv = this;
     50 
     51     mNotifyCb = NULL;
     52 
     53     mRequestQueueSrc = NULL;
     54     mFrameQueueDst = NULL;
     55 
     56     mVendorTagOps.get_camera_vendor_section_name =
     57             EmulatedCamera2::get_camera_vendor_section_name;
     58     mVendorTagOps.get_camera_vendor_tag_name =
     59             EmulatedCamera2::get_camera_vendor_tag_name;
     60     mVendorTagOps.get_camera_vendor_tag_type =
     61             EmulatedCamera2::get_camera_vendor_tag_type;
     62     mVendorTagOps.parent = this;
     63 
     64     mStatusPresent = true;
     65 }
     66 
     67 /* Destructs EmulatedCamera2 instance. */
     68 EmulatedCamera2::~EmulatedCamera2() {
     69 }
     70 
     71 /****************************************************************************
     72  * Abstract API
     73  ***************************************************************************/
     74 
     75 /****************************************************************************
     76  * Public API
     77  ***************************************************************************/
     78 
     79 status_t EmulatedCamera2::Initialize() {
     80     return NO_ERROR;
     81 }
     82 
     83 /****************************************************************************
     84  * Camera API implementation
     85  ***************************************************************************/
     86 
     87 status_t EmulatedCamera2::connectCamera(hw_device_t** device) {
     88     *device = &common;
     89     return NO_ERROR;
     90 }
     91 
     92 status_t EmulatedCamera2::closeCamera() {
     93     return NO_ERROR;
     94 }
     95 
     96 status_t EmulatedCamera2::getCameraInfo(struct camera_info* info) {
     97     return EmulatedBaseCamera::getCameraInfo(info);
     98 }
     99 
    100 /****************************************************************************
    101  * Camera Device API implementation.
    102  * These methods are called from the camera API callback routines.
    103  ***************************************************************************/
    104 
    105 /** Request input queue */
    106 
    107 int EmulatedCamera2::requestQueueNotify() {
    108     return INVALID_OPERATION;
    109 }
    110 
    111 /** Count of requests in flight */
    112 int EmulatedCamera2::getInProgressCount() {
    113     return INVALID_OPERATION;
    114 }
    115 
    116 /** Cancel all captures in flight */
    117 int EmulatedCamera2::flushCapturesInProgress() {
    118     return INVALID_OPERATION;
    119 }
    120 
    121 /** Construct a default request for a given use case */
    122 int EmulatedCamera2::constructDefaultRequest(
    123         int request_template,
    124         camera_metadata_t **request) {
    125     return INVALID_OPERATION;
    126 }
    127 
    128 /** Output stream creation and management */
    129 
    130 int EmulatedCamera2::allocateStream(
    131         uint32_t width,
    132         uint32_t height,
    133         int format,
    134         const camera2_stream_ops_t *stream_ops,
    135         uint32_t *stream_id,
    136         uint32_t *format_actual,
    137         uint32_t *usage,
    138         uint32_t *max_buffers) {
    139     return INVALID_OPERATION;
    140 }
    141 
    142 int EmulatedCamera2::registerStreamBuffers(
    143         uint32_t stream_id,
    144         int num_buffers,
    145         buffer_handle_t *buffers) {
    146     return INVALID_OPERATION;
    147 }
    148 
    149 
    150 int EmulatedCamera2::releaseStream(uint32_t stream_id) {
    151     return INVALID_OPERATION;
    152 }
    153 
    154 /** Reprocessing input stream management */
    155 
    156 int EmulatedCamera2::allocateReprocessStream(
    157         uint32_t width,
    158         uint32_t height,
    159         uint32_t format,
    160         const camera2_stream_in_ops_t *reprocess_stream_ops,
    161         uint32_t *stream_id,
    162         uint32_t *consumer_usage,
    163         uint32_t *max_buffers) {
    164     return INVALID_OPERATION;
    165 }
    166 
    167 int EmulatedCamera2::allocateReprocessStreamFromStream(
    168         uint32_t output_stream_id,
    169         const camera2_stream_in_ops_t *reprocess_stream_ops,
    170         uint32_t *stream_id) {
    171     return INVALID_OPERATION;
    172 }
    173 
    174 int EmulatedCamera2::releaseReprocessStream(uint32_t stream_id) {
    175     return INVALID_OPERATION;
    176 }
    177 
    178 /** 3A triggering */
    179 
    180 int EmulatedCamera2::triggerAction(uint32_t trigger_id,
    181                                    int ext1, int ext2) {
    182     return INVALID_OPERATION;
    183 }
    184 
    185 /** Custom tag query methods */
    186 
    187 const char* EmulatedCamera2::getVendorSectionName(uint32_t tag) {
    188     return NULL;
    189 }
    190 
    191 const char* EmulatedCamera2::getVendorTagName(uint32_t tag) {
    192     return NULL;
    193 }
    194 
    195 int EmulatedCamera2::getVendorTagType(uint32_t tag) {
    196     return -1;
    197 }
    198 
    199 /** Debug methods */
    200 
    201 int EmulatedCamera2::dump(int fd) {
    202     return INVALID_OPERATION;
    203 }
    204 
    205 /****************************************************************************
    206  * Private API.
    207  ***************************************************************************/
    208 
    209 /****************************************************************************
    210  * Camera API callbacks as defined by camera2_device_ops structure.  See
    211  * hardware/libhardware/include/hardware/camera2.h for information on each
    212  * of these callbacks. Implemented in this class, these callbacks simply
    213  * dispatch the call into an instance of EmulatedCamera2 class defined by the
    214  * 'camera_device2' parameter, or set a member value in the same.
    215  ***************************************************************************/
    216 
    217 EmulatedCamera2* getInstance(const camera2_device_t *d) {
    218     const EmulatedCamera2* cec = static_cast<const EmulatedCamera2*>(d);
    219     return const_cast<EmulatedCamera2*>(cec);
    220 }
    221 
    222 int EmulatedCamera2::set_request_queue_src_ops(const camera2_device_t *d,
    223         const camera2_request_queue_src_ops *queue_src_ops) {
    224     EmulatedCamera2* ec = getInstance(d);
    225     ec->mRequestQueueSrc = queue_src_ops;
    226     return NO_ERROR;
    227 }
    228 
    229 int EmulatedCamera2::notify_request_queue_not_empty(const camera2_device_t *d) {
    230     EmulatedCamera2* ec = getInstance(d);
    231     return ec->requestQueueNotify();
    232 }
    233 
    234 int EmulatedCamera2::set_frame_queue_dst_ops(const camera2_device_t *d,
    235         const camera2_frame_queue_dst_ops *queue_dst_ops) {
    236     EmulatedCamera2* ec = getInstance(d);
    237     ec->mFrameQueueDst = queue_dst_ops;
    238     return NO_ERROR;
    239 }
    240 
    241 int EmulatedCamera2::get_in_progress_count(const camera2_device_t *d) {
    242     EmulatedCamera2* ec = getInstance(d);
    243     return ec->getInProgressCount();
    244 }
    245 
    246 int EmulatedCamera2::flush_captures_in_progress(const camera2_device_t *d) {
    247     EmulatedCamera2* ec = getInstance(d);
    248     return ec->flushCapturesInProgress();
    249 }
    250 
    251 int EmulatedCamera2::construct_default_request(const camera2_device_t *d,
    252         int request_template,
    253         camera_metadata_t **request) {
    254     EmulatedCamera2* ec = getInstance(d);
    255     return ec->constructDefaultRequest(request_template, request);
    256 }
    257 
    258 int EmulatedCamera2::allocate_stream(const camera2_device_t *d,
    259         uint32_t width,
    260         uint32_t height,
    261         int format,
    262         const camera2_stream_ops_t *stream_ops,
    263         uint32_t *stream_id,
    264         uint32_t *format_actual,
    265         uint32_t *usage,
    266         uint32_t *max_buffers) {
    267     EmulatedCamera2* ec = getInstance(d);
    268     return ec->allocateStream(width, height, format, stream_ops,
    269             stream_id, format_actual, usage, max_buffers);
    270 }
    271 
    272 int EmulatedCamera2::register_stream_buffers(const camera2_device_t *d,
    273         uint32_t stream_id,
    274         int num_buffers,
    275         buffer_handle_t *buffers) {
    276     EmulatedCamera2* ec = getInstance(d);
    277     return ec->registerStreamBuffers(stream_id,
    278             num_buffers,
    279             buffers);
    280 }
    281 int EmulatedCamera2::release_stream(const camera2_device_t *d,
    282         uint32_t stream_id) {
    283     EmulatedCamera2* ec = getInstance(d);
    284     return ec->releaseStream(stream_id);
    285 }
    286 
    287 int EmulatedCamera2::allocate_reprocess_stream(const camera2_device_t *d,
    288         uint32_t width,
    289         uint32_t height,
    290         uint32_t format,
    291         const camera2_stream_in_ops_t *reprocess_stream_ops,
    292         uint32_t *stream_id,
    293         uint32_t *consumer_usage,
    294         uint32_t *max_buffers) {
    295     EmulatedCamera2* ec = getInstance(d);
    296     return ec->allocateReprocessStream(width, height, format,
    297             reprocess_stream_ops, stream_id, consumer_usage, max_buffers);
    298 }
    299 
    300 int EmulatedCamera2::allocate_reprocess_stream_from_stream(
    301             const camera2_device_t *d,
    302             uint32_t output_stream_id,
    303             const camera2_stream_in_ops_t *reprocess_stream_ops,
    304             uint32_t *stream_id) {
    305     EmulatedCamera2* ec = getInstance(d);
    306     return ec->allocateReprocessStreamFromStream(output_stream_id,
    307             reprocess_stream_ops, stream_id);
    308 }
    309 
    310 
    311 int EmulatedCamera2::release_reprocess_stream(const camera2_device_t *d,
    312         uint32_t stream_id) {
    313     EmulatedCamera2* ec = getInstance(d);
    314     return ec->releaseReprocessStream(stream_id);
    315 }
    316 
    317 int EmulatedCamera2::trigger_action(const camera2_device_t *d,
    318         uint32_t trigger_id,
    319         int ext1,
    320         int ext2) {
    321     EmulatedCamera2* ec = getInstance(d);
    322     return ec->triggerAction(trigger_id, ext1, ext2);
    323 }
    324 
    325 int EmulatedCamera2::set_notify_callback(const camera2_device_t *d,
    326         camera2_notify_callback notify_cb, void* user) {
    327     EmulatedCamera2* ec = getInstance(d);
    328     Mutex::Autolock l(ec->mMutex);
    329     ec->mNotifyCb = notify_cb;
    330     ec->mNotifyUserPtr = user;
    331     return NO_ERROR;
    332 }
    333 
    334 int EmulatedCamera2::get_metadata_vendor_tag_ops(const camera2_device_t *d,
    335         vendor_tag_query_ops_t **ops) {
    336     EmulatedCamera2* ec = getInstance(d);
    337     *ops = static_cast<vendor_tag_query_ops_t*>(
    338             &ec->mVendorTagOps);
    339     return NO_ERROR;
    340 }
    341 
    342 const char* EmulatedCamera2::get_camera_vendor_section_name(
    343         const vendor_tag_query_ops_t *v,
    344         uint32_t tag) {
    345     EmulatedCamera2* ec = static_cast<const TagOps*>(v)->parent;
    346     return ec->getVendorSectionName(tag);
    347 }
    348 
    349 const char* EmulatedCamera2::get_camera_vendor_tag_name(
    350         const vendor_tag_query_ops_t *v,
    351         uint32_t tag) {
    352     EmulatedCamera2* ec = static_cast<const TagOps*>(v)->parent;
    353     return ec->getVendorTagName(tag);
    354 }
    355 
    356 int EmulatedCamera2::get_camera_vendor_tag_type(
    357         const vendor_tag_query_ops_t *v,
    358         uint32_t tag)  {
    359     EmulatedCamera2* ec = static_cast<const TagOps*>(v)->parent;
    360     return ec->getVendorTagType(tag);
    361 }
    362 
    363 int EmulatedCamera2::dump(const camera2_device_t *d, int fd) {
    364     EmulatedCamera2* ec = getInstance(d);
    365     return ec->dump(fd);
    366 }
    367 
    368 int EmulatedCamera2::close(struct hw_device_t* device) {
    369     EmulatedCamera2* ec =
    370             static_cast<EmulatedCamera2*>(
    371                 reinterpret_cast<camera2_device_t*>(device) );
    372     if (ec == NULL) {
    373         ALOGE("%s: Unexpected NULL camera2 device", __FUNCTION__);
    374         return -EINVAL;
    375     }
    376     return ec->closeCamera();
    377 }
    378 
    379 void EmulatedCamera2::sendNotification(int32_t msgType,
    380         int32_t ext1, int32_t ext2, int32_t ext3) {
    381     camera2_notify_callback notifyCb;
    382     {
    383         Mutex::Autolock l(mMutex);
    384         notifyCb = mNotifyCb;
    385     }
    386     if (notifyCb != NULL) {
    387         notifyCb(msgType, ext1, ext2, ext3, mNotifyUserPtr);
    388     }
    389 }
    390 
    391 camera2_device_ops_t EmulatedCamera2::sDeviceOps = {
    392     EmulatedCamera2::set_request_queue_src_ops,
    393     EmulatedCamera2::notify_request_queue_not_empty,
    394     EmulatedCamera2::set_frame_queue_dst_ops,
    395     EmulatedCamera2::get_in_progress_count,
    396     EmulatedCamera2::flush_captures_in_progress,
    397     EmulatedCamera2::construct_default_request,
    398     EmulatedCamera2::allocate_stream,
    399     EmulatedCamera2::register_stream_buffers,
    400     EmulatedCamera2::release_stream,
    401     EmulatedCamera2::allocate_reprocess_stream,
    402     EmulatedCamera2::allocate_reprocess_stream_from_stream,
    403     EmulatedCamera2::release_reprocess_stream,
    404     EmulatedCamera2::trigger_action,
    405     EmulatedCamera2::set_notify_callback,
    406     EmulatedCamera2::get_metadata_vendor_tag_ops,
    407     EmulatedCamera2::dump
    408 };
    409 
    410 }; /* namespace android */
    411