Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) 2011 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 #ifndef HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H
     18 #define HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H
     19 
     20 #include <utils/RefBase.h>
     21 #include "EmulatedBaseCamera.h"
     22 #include "QemuClient.h"
     23 
     24 namespace android {
     25 
     26 struct EmulatedCameraHotplugThread;
     27 
     28 /*
     29  * Contains declaration of a class EmulatedCameraFactory that manages cameras
     30  * available for the emulation. A global instance of this class is statically
     31  * instantiated and initialized when camera emulation HAL is loaded.
     32  */
     33 
     34 /* Class EmulatedCameraFactoryManages cameras available for the emulation.
     35  *
     36  * When the global static instance of this class is created on the module load,
     37  * it enumerates cameras available for the emulation by connecting to the
     38  * emulator's 'camera' service. For every camera found out there it creates an
     39  * instance of an appropriate class, and stores it an in array of emulated
     40  * cameras. In addition to the cameras reported by the emulator, a fake camera
     41  * emulator is always created, so there is always at least one camera that is
     42  * available.
     43  *
     44  * Instance of this class is also used as the entry point for the camera HAL API,
     45  * including:
     46  *  - hw_module_methods_t::open entry point
     47  *  - camera_module_t::get_number_of_cameras entry point
     48  *  - camera_module_t::get_camera_info entry point
     49  *
     50  */
     51 class EmulatedCameraFactory {
     52 public:
     53     /* Constructs EmulatedCameraFactory instance.
     54      * In this constructor the factory will create and initialize a list of
     55      * emulated cameras. All errors that occur on this constructor are reported
     56      * via mConstructedOK data member of this class.
     57      */
     58     EmulatedCameraFactory();
     59 
     60     /* Destructs EmulatedCameraFactory instance. */
     61     ~EmulatedCameraFactory();
     62 
     63     /****************************************************************************
     64      * Camera HAL API handlers.
     65      ***************************************************************************/
     66 
     67 public:
     68     /* Opens (connects to) a camera device.
     69      * This method is called in response to hw_module_methods_t::open callback.
     70      */
     71     int cameraDeviceOpen(int camera_id, hw_device_t** device);
     72 
     73     /* Gets emulated camera information.
     74      * This method is called in response to camera_module_t::get_camera_info callback.
     75      */
     76     int getCameraInfo(int camera_id, struct camera_info *info);
     77 
     78     /* Sets emulated camera callbacks.
     79      * This method is called in response to camera_module_t::set_callbacks callback.
     80      */
     81     int setCallbacks(const camera_module_callbacks_t *callbacks);
     82 
     83     /****************************************************************************
     84      * Camera HAL API callbacks.
     85      ***************************************************************************/
     86 
     87 public:
     88     /* camera_module_t::get_number_of_cameras callback entry point. */
     89     static int get_number_of_cameras(void);
     90 
     91     /* camera_module_t::get_camera_info callback entry point. */
     92     static int get_camera_info(int camera_id, struct camera_info *info);
     93 
     94     /* camera_module_t::set_callbacks callback entry point. */
     95     static int set_callbacks(const camera_module_callbacks_t *callbacks);
     96 
     97 private:
     98     /* hw_module_methods_t::open callback entry point. */
     99     static int device_open(const hw_module_t* module,
    100                            const char* name,
    101                            hw_device_t** device);
    102 
    103     /****************************************************************************
    104      * Public API.
    105      ***************************************************************************/
    106 
    107 public:
    108 
    109     /* Gets fake camera orientation. */
    110     int getFakeCameraOrientation() {
    111         /* TODO: Have a boot property that controls that. */
    112         return 90;
    113     }
    114 
    115     /* Gets qemu camera orientation. */
    116     int getQemuCameraOrientation() {
    117         /* TODO: Have a boot property that controls that. */
    118         return 270;
    119     }
    120 
    121     /* Gets number of emulated cameras.
    122      */
    123     int getEmulatedCameraNum() const {
    124         return mEmulatedCameraNum;
    125     }
    126 
    127     /* Checks whether or not the constructor has succeeded.
    128      */
    129     bool isConstructedOK() const {
    130         return mConstructedOK;
    131     }
    132 
    133     void onStatusChanged(int cameraId, int newStatus);
    134 
    135     /****************************************************************************
    136      * Private API
    137      ***************************************************************************/
    138 
    139 private:
    140     /* Populates emulated cameras array with cameras that are available via
    141      * 'camera' service in the emulator. For each such camera and instance of
    142      * the EmulatedCameraQemud will be created and added to the mEmulatedCameras
    143      * array.
    144      */
    145     void createQemuCameras();
    146 
    147     /* Checks if fake camera emulation is on for the camera facing back. */
    148     bool isBackFakeCameraEmulationOn();
    149 
    150     /* Gets camera device version number to use for back camera emulation */
    151     int getBackCameraHalVersion();
    152 
    153     /* Checks if fake camera emulation is on for the camera facing front. */
    154     bool isFrontFakeCameraEmulationOn();
    155 
    156     /* Gets camera device version number to use for front camera emulation */
    157     int getFrontCameraHalVersion();
    158 
    159     /****************************************************************************
    160      * Data members.
    161      ***************************************************************************/
    162 
    163 private:
    164     /* Connection to the camera service in the emulator. */
    165     FactoryQemuClient   mQemuClient;
    166 
    167     /* Array of cameras available for the emulation. */
    168     EmulatedBaseCamera**    mEmulatedCameras;
    169 
    170     /* Number of emulated cameras (including the fake ones). */
    171     int                 mEmulatedCameraNum;
    172 
    173     /* Number of emulated fake cameras. */
    174     int                 mFakeCameraNum;
    175 
    176     /* Flags whether or not constructor has succeeded. */
    177     bool                mConstructedOK;
    178 
    179     /* Camera callbacks (for status changing) */
    180     const camera_module_callbacks_t* mCallbacks;
    181 
    182     /* Hotplug thread (to call onStatusChanged) */
    183     sp<EmulatedCameraHotplugThread> mHotplugThread;
    184 
    185 public:
    186     /* Contains device open entry point, as required by HAL API. */
    187     static struct hw_module_methods_t   mCameraModuleMethods;
    188 };
    189 
    190 }; /* namespace android */
    191 
    192 /* References the global EmulatedCameraFactory instance. */
    193 extern android::EmulatedCameraFactory   gEmulatedCameraFactory;
    194 
    195 #endif  /* HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H */
    196