C++程序  |  197行  |  6.75 KB

/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H
#define HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H

#include <utils/RefBase.h>

#include <utils/Vector.h>
#include "CameraConfiguration.h"
#include "EmulatedBaseCamera.h"
#include "common/libs/threads/cuttlefish_thread.h"
#include "guest/libs/platform_support/api_level_fixes.h"

namespace android {

class EmulatedCameraHotplugThread;

/*
 * Contains declaration of a class EmulatedCameraFactory that manages cameras
 * available for the emulation. A global instance of this class is statically
 * instantiated and initialized when camera emulation HAL is loaded.
 */

/* Class EmulatedCameraFactoryManages cameras available for the emulation.
 *
 * When the global static instance of this class is created on the module load,
 * it enumerates cameras available for the emulation by connecting to the
 * emulator's 'camera' service. For every camera found out there it creates an
 * instance of an appropriate class, and stores it an in array of emulated
 * cameras. In addition to the cameras reported by the emulator, a fake camera
 * emulator is always created, so there is always at least one camera that is
 * available.
 *
 * Instance of this class is also used as the entry point for the camera HAL
 * API, including:
 *  - hw_module_methods_t::open entry point
 *  - camera_module_t::get_number_of_cameras entry point
 *  - camera_module_t::get_camera_info entry point
 *
 */
class EmulatedCameraFactory {
 public:
  /* Constructs EmulatedCameraFactory instance.
   * In this constructor the factory will create and initialize a list of
   * emulated cameras. All errors that occur on this constructor are reported
   * via mConstructedOK data member of this class.
   */
  EmulatedCameraFactory();

  /* Destructs EmulatedCameraFactory instance. */
  ~EmulatedCameraFactory();

  /****************************************************************************
   * Camera HAL API handlers.
   ***************************************************************************/

 public:
  /* Returns a (singleton) instance of the EmulatedCameraFactory.
   */
  static EmulatedCameraFactory& Instance();

  /* Opens (connects to) a camera device.
   * This method is called in response to hw_module_methods_t::open callback.
   */
  int cameraDeviceOpen(int camera_id, hw_device_t** device);

  /* Gets emulated camera information.
   * This method is called in response to camera_module_t::get_camera_info
   * callback.
   */
  int getCameraInfo(int camera_id, struct camera_info* info);

#if VSOC_PLATFORM_SDK_AFTER(J_MR2)
  /* Sets emulated camera callbacks.
   * This method is called in response to camera_module_t::set_callbacks
   * callback.
   */
  int setCallbacks(const camera_module_callbacks_t* callbacks);

  /* Fill in vendor tags for the module
   * This method is called in response to camera_module_t::get_vendor_tag_ops
   * callback.
   */
  void getVendorTagOps(vendor_tag_ops_t* ops);
#endif

  int setTorchMode(const char* camera_id, bool enabled);

  /****************************************************************************
   * Camera HAL API callbacks.
   ***************************************************************************/

 public:
  /* camera_module_t::get_number_of_cameras callback entry point. */
  static int get_number_of_cameras(void);

  /* camera_module_t::get_camera_info callback entry point. */
  static int get_camera_info(int camera_id, struct camera_info* info);

#if VSOC_PLATFORM_SDK_AFTER(J_MR2)
  /* camera_module_t::set_callbacks callback entry point. */
  static int set_callbacks(const camera_module_callbacks_t* callbacks);

  /* camera_module_t::get_vendor_tag_ops callback entry point */
  static void get_vendor_tag_ops(vendor_tag_ops_t* ops);
#endif

  /* camera_module_t::open_legacy callback entry point */
  static int open_legacy(const struct hw_module_t* module, const char* id,
                         uint32_t halVersion, struct hw_device_t** device);

  static int set_torch_mode(const char* camera_id, bool enabled);

 private:
  /* hw_module_methods_t::open callback entry point. */
  static int device_open(const hw_module_t* module, const char* name,
                         hw_device_t** device);

  /****************************************************************************
   * Public API.
   ***************************************************************************/

 public:
  /* Gets fake camera orientation. */
  int getFakeCameraOrientation() {
    /* TODO: Have a boot property that controls that. */
    return 90;
  }

  /* Gets number of emulated cameras.
   */
  inline size_t getEmulatedCameraNum() const {
    return mCameraDefinitions.size();
  }

  void onStatusChanged(int cameraId, int newStatus);

  void onTorchModeStatusChanged(int cameraId, int newStatus);

  /****************************************************************************
   * Private API
   ***************************************************************************/

 private:
  /* Create new or return existing fake camera based on camera definition
   * found in mCameraDefinitions.
   * Returns NULL if cameraId is not valid (= not a valid index of
   * mCameraDefinitions)
   */
  EmulatedBaseCamera* getOrCreateFakeCamera(size_t cameraId);

  /****************************************************************************
   * Data members.
   ***************************************************************************/

 private:
  /* Array of cameras available for the emulation. */
  Vector<EmulatedBaseCamera*> mEmulatedCameras;

  /* Guards access to mEmulatedCameras. */
  cvd::Mutex mEmulatedCamerasMutex;

#if VSOC_PLATFORM_SDK_AFTER(J_MR2)
  /* Camera callbacks (for status changing) */
  const camera_module_callbacks_t* mCallbacks;

  /* Hotplug thread (to call onStatusChanged) */
  sp<EmulatedCameraHotplugThread> mHotplugThread;
#endif

  /* Back- and front camera properties accessed from the vsoc device. */
  cvd::CameraConfiguration mCameraConfiguration;
  Vector<cvd::CameraDefinition> mCameraDefinitions;

 public:
  /* Contains device open entry point, as required by HAL API. */
  static struct hw_module_methods_t mCameraModuleMethods;
};

}; /* namespace android */

#endif /* HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H */