1b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/*
2b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Copyright (C) 2011 The Android Open Source Project
3b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
4b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Licensed under the Apache License, Version 2.0 (the "License");
5b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * you may not use this file except in compliance with the License.
6b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * You may obtain a copy of the License at
7b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
8b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *      http://www.apache.org/licenses/LICENSE-2.0
9b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
10b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Unless required by applicable law or agreed to in writing, software
11b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * distributed under the License is distributed on an "AS IS" BASIS,
12b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * See the License for the specific language governing permissions and
14b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * limitations under the License.
15b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine */
16b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
17b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#ifndef HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H
18b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#define HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H
19b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
20d6a3832650c70e3cfd6efe88077d62b96a357e70Eino-Ville Talvala#include "EmulatedBaseCamera.h"
2133bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine#include "QemuClient.h"
22b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
23b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkinenamespace android {
24b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
25b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/*
26b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Contains declaration of a class EmulatedCameraFactory that manages cameras
27b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * available for the emulation. A global instance of this class is statically
28b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * instantiated and initialized when camera emulation HAL is loaded.
29b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine */
30b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
31b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/* Class EmulatedCameraFactoryManages cameras available for the emulation.
32b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
33b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * When the global static instance of this class is created on the module load,
34b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * it enumerates cameras available for the emulation by connecting to the
35b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * emulator's 'camera' service. For every camera found out there it creates an
36b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * instance of an appropriate class, and stores it an in array of emulated
37b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * cameras. In addition to the cameras reported by the emulator, a fake camera
38b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * emulator is always created, so there is always at least one camera that is
39b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * available.
40b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
41b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Instance of this class is also used as the entry point for the camera HAL API,
42b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * including:
43b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *  - hw_module_methods_t::open entry point
44b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *  - camera_module_t::get_number_of_cameras entry point
45b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *  - camera_module_t::get_camera_info entry point
46b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
47b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine */
48b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkineclass EmulatedCameraFactory {
49b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkinepublic:
50b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Constructs EmulatedCameraFactory instance.
51b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * In this constructor the factory will create and initialize a list of
52b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * emulated cameras. All errors that occur on this constructor are reported
535467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine     * via mConstructedOK data member of this class.
54b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     */
55b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    EmulatedCameraFactory();
56b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
57b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Destructs EmulatedCameraFactory instance. */
58b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    ~EmulatedCameraFactory();
59b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
60b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /****************************************************************************
61b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * Camera HAL API handlers.
62b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     ***************************************************************************/
63b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
64b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkinepublic:
65b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Opens (connects to) a camera device.
66b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * This method is called in response to hw_module_methods_t::open callback.
67b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     */
685467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    int cameraDeviceOpen(int camera_id, hw_device_t** device);
69b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
70b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Gets emulated camera information.
71b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * This method is called in response to camera_module_t::get_camera_info callback.
72b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     */
735467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    int getCameraInfo(int camera_id, struct camera_info *info);
74b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
75b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /****************************************************************************
76b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * Camera HAL API callbacks.
77b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     ***************************************************************************/
78b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
79b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkinepublic:
80b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* camera_module_t::get_number_of_cameras callback entry point. */
81b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    static int get_number_of_cameras(void);
82b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
83b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* camera_module_t::get_camera_info callback entry point. */
84b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    static int get_camera_info(int camera_id, struct camera_info *info);
85b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
86b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkineprivate:
87b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* hw_module_methods_t::open callback entry point. */
88b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    static int device_open(const hw_module_t* module,
89b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine                           const char* name,
90b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine                           hw_device_t** device);
91b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
92b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /****************************************************************************
93b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * Public API.
94b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     ***************************************************************************/
95b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
96b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkinepublic:
9733bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine
9833bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine    /* Gets fake camera orientation. */
995467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    int getFakeCameraOrientation() {
10033bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine        /* TODO: Have a boot property that controls that. */
10133bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine        return 90;
10233bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine    }
10333bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine
10433bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine    /* Gets qemu camera orientation. */
1055467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    int getQemuCameraOrientation() {
10633bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine        /* TODO: Have a boot property that controls that. */
10733bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine        return 270;
10833bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine    }
10933bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine
110b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Gets number of emulated cameras.
111b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     */
1125467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    int getEmulatedCameraNum() const {
1135467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine        return mEmulatedCameraNum;
114b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    }
115b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
116b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Checks whether or not the constructor has succeeded.
117b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     */
1185467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    bool isConstructedOK() const {
1195467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine        return mConstructedOK;
120b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    }
121b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
122b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /****************************************************************************
123b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * Private API
124b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     ***************************************************************************/
125b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
126b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkineprivate:
127b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Populates emulated cameras array with cameras that are available via
128b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * 'camera' service in the emulator. For each such camera and instance of
1295467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine     * the EmulatedCameraQemud will be created and added to the mEmulatedCameras
130b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * array.
131b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     */
1325467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    void createQemuCameras();
13333bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine
134c9d6edeea5921a11e305273f3dd604278c45e9d7Vladimir Chtchetkine    /* Checks if fake camera emulation is on for the camera facing back. */
135c9d6edeea5921a11e305273f3dd604278c45e9d7Vladimir Chtchetkine    bool isBackFakeCameraEmulationOn();
136c9d6edeea5921a11e305273f3dd604278c45e9d7Vladimir Chtchetkine
1370819e42a0b8c0da6db7a8267d067f235d060e37fEino-Ville Talvala    /* Gets camera device version number to use for back camera emulation */
1380819e42a0b8c0da6db7a8267d067f235d060e37fEino-Ville Talvala    int getBackCameraHalVersion();
1390819e42a0b8c0da6db7a8267d067f235d060e37fEino-Ville Talvala
140c9d6edeea5921a11e305273f3dd604278c45e9d7Vladimir Chtchetkine    /* Checks if fake camera emulation is on for the camera facing front. */
141c9d6edeea5921a11e305273f3dd604278c45e9d7Vladimir Chtchetkine    bool isFrontFakeCameraEmulationOn();
142b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
1430819e42a0b8c0da6db7a8267d067f235d060e37fEino-Ville Talvala    /* Gets camera device version number to use for front camera emulation */
1440819e42a0b8c0da6db7a8267d067f235d060e37fEino-Ville Talvala    int getFrontCameraHalVersion();
1450819e42a0b8c0da6db7a8267d067f235d060e37fEino-Ville Talvala
146b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /****************************************************************************
147b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     * Data members.
148b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine     ***************************************************************************/
149b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
150b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkineprivate:
15133bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine    /* Connection to the camera service in the emulator. */
1525467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    FactoryQemuClient   mQemuClient;
15333bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine
154b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Array of cameras available for the emulation. */
155d6a3832650c70e3cfd6efe88077d62b96a357e70Eino-Ville Talvala    EmulatedBaseCamera**    mEmulatedCameras;
156b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
157c9d6edeea5921a11e305273f3dd604278c45e9d7Vladimir Chtchetkine    /* Number of emulated cameras (including the fake ones). */
1585467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    int                 mEmulatedCameraNum;
159b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
160c9d6edeea5921a11e305273f3dd604278c45e9d7Vladimir Chtchetkine    /* Number of emulated fake cameras. */
161c9d6edeea5921a11e305273f3dd604278c45e9d7Vladimir Chtchetkine    int                 mFakeCameraNum;
162b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
163b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Flags whether or not constructor has succeeded. */
1645467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    bool                mConstructedOK;
165b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
166b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkinepublic:
167b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    /* Contains device open entry point, as required by HAL API. */
1685467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine    static struct hw_module_methods_t   mCameraModuleMethods;
169b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine};
170b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
171b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine}; /* namespace android */
172b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
173b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/* References the global EmulatedCameraFactory instance. */
1745467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkineextern android::EmulatedCameraFactory   gEmulatedCameraFactory;
175b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
176b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#endif  /* HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H */
177