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