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