Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) 2013 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_FAKE_CAMERA3_H
     18 #define HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA3_H
     19 
     20 /**
     21  * Contains declaration of a class EmulatedCamera that encapsulates
     22  * functionality of a fake camera that implements version 3 of the camera device
     23  * interace.
     24  */
     25 
     26 #include "EmulatedCamera3.h"
     27 #include "fake-pipeline2/Base.h"
     28 #include "fake-pipeline2/Sensor.h"
     29 #include "fake-pipeline2/JpegCompressor.h"
     30 #include <CameraMetadata.h>
     31 #include <utils/SortedVector.h>
     32 #include <utils/List.h>
     33 #include <utils/Mutex.h>
     34 
     35 using ::android::hardware::camera::common::V1_0::helper::CameraMetadata;
     36 
     37 namespace android {
     38 
     39 /**
     40  * Encapsulates functionality for a v3 HAL camera which produces synthetic data.
     41  *
     42  * Note that EmulatedCameraFactory instantiates an object of this class just
     43  * once, when EmulatedCameraFactory instance gets constructed. Connection to /
     44  * disconnection from the actual camera device is handled by calls to
     45  * connectDevice(), and closeCamera() methods of this class that are invoked in
     46  * response to hw_module_methods_t::open, and camera_device::close callbacks.
     47  */
     48 class EmulatedFakeCamera3 : public EmulatedCamera3,
     49         private Sensor::SensorListener {
     50 public:
     51 
     52     EmulatedFakeCamera3(int cameraId, bool facingBack,
     53             struct hw_module_t* module);
     54 
     55     virtual ~EmulatedFakeCamera3();
     56 
     57     /****************************************************************************
     58      * EmulatedCamera3 virtual overrides
     59      ***************************************************************************/
     60 
     61 public:
     62 
     63     virtual status_t Initialize();
     64 
     65     /****************************************************************************
     66      * Camera module API and generic hardware device API implementation
     67      ***************************************************************************/
     68 
     69 public:
     70     virtual status_t connectCamera(hw_device_t** device);
     71 
     72     virtual status_t closeCamera();
     73 
     74     virtual status_t getCameraInfo(struct camera_info *info);
     75 
     76     /****************************************************************************
     77      * EmulatedCamera3 abstract API implementation
     78      ***************************************************************************/
     79 
     80 protected:
     81 
     82     virtual status_t configureStreams(
     83         camera3_stream_configuration *streamList);
     84 
     85     virtual status_t registerStreamBuffers(
     86         const camera3_stream_buffer_set *bufferSet) ;
     87 
     88     virtual const camera_metadata_t* constructDefaultRequestSettings(
     89         int type);
     90 
     91     virtual status_t processCaptureRequest(camera3_capture_request *request);
     92 
     93     virtual status_t flush();
     94 
     95     /** Debug methods */
     96 
     97     virtual void dump(int fd);
     98 
     99 private:
    100 
    101     /**
    102      * Get the requested capability set for this camera
    103      */
    104     status_t getCameraCapabilities();
    105 
    106     bool hasCapability(AvailableCapabilities cap);
    107 
    108     /**
    109      * Build the static info metadata buffer for this device
    110      */
    111     status_t constructStaticInfo();
    112 
    113     /**
    114      * Run the fake 3A algorithms as needed. May override/modify settings
    115      * values.
    116      */
    117     status_t process3A(CameraMetadata &settings);
    118 
    119     status_t doFakeAE(CameraMetadata &settings);
    120     status_t doFakeAF(CameraMetadata &settings);
    121     status_t doFakeAWB(CameraMetadata &settings);
    122     void     update3A(CameraMetadata &settings);
    123 
    124     /** Signal from readout thread that it doesn't have anything to do */
    125     void     signalReadoutIdle();
    126 
    127     /** Handle interrupt events from the sensor */
    128     void     onSensorEvent(uint32_t frameNumber, Event e, nsecs_t timestamp);
    129 
    130     /****************************************************************************
    131      * Static configuration information
    132      ***************************************************************************/
    133 private:
    134     static const uint32_t kMaxRawStreamCount = 1;
    135     static const uint32_t kMaxProcessedStreamCount = 3;
    136     static const uint32_t kMaxJpegStreamCount = 1;
    137     static const uint32_t kMaxReprocessStreamCount = 2;
    138     static const uint32_t kMaxBufferCount = 4;
    139     // We need a positive stream ID to distinguish external buffers from
    140     // sensor-generated buffers which use a nonpositive ID. Otherwise, HAL3 has
    141     // no concept of a stream id.
    142     static const uint32_t kGenericStreamId = 1;
    143     static const int32_t  kAvailableFormats[];
    144     static const uint32_t kAvailableRawSizes[];
    145     static const int64_t  kSyncWaitTimeout     = 10000000; // 10 ms
    146     static const int32_t  kMaxSyncTimeoutCount = 1000; // 1000 kSyncWaitTimeouts
    147     static const uint32_t kFenceTimeoutMs      = 2000; // 2 s
    148     static const nsecs_t  kJpegTimeoutNs       = 5000000000l; // 5 s
    149 
    150     /****************************************************************************
    151      * Data members.
    152      ***************************************************************************/
    153 
    154     /* HAL interface serialization lock. */
    155     Mutex              mLock;
    156 
    157     /* Facing back (true) or front (false) switch. */
    158     bool               mFacingBack;
    159     int32_t            mSensorWidth;
    160     int32_t            mSensorHeight;
    161 
    162     SortedVector<AvailableCapabilities> mCapabilities;
    163 
    164     /**
    165      * Cache for default templates. Once one is requested, the pointer must be
    166      * valid at least until close() is called on the device
    167      */
    168     camera_metadata_t *mDefaultTemplates[CAMERA3_TEMPLATE_COUNT];
    169 
    170     /**
    171      * Private stream information, stored in camera3_stream_t->priv.
    172      */
    173     struct PrivateStreamInfo {
    174         bool alive;
    175     };
    176 
    177     // Shortcut to the input stream
    178     camera3_stream_t*  mInputStream;
    179 
    180     typedef List<camera3_stream_t*>           StreamList;
    181     typedef List<camera3_stream_t*>::iterator StreamIterator;
    182     typedef Vector<camera3_stream_buffer>     HalBufferVector;
    183 
    184     // All streams, including input stream
    185     StreamList         mStreams;
    186 
    187     // Cached settings from latest submitted request
    188     CameraMetadata     mPrevSettings;
    189 
    190     /** Fake hardware interfaces */
    191     sp<Sensor>         mSensor;
    192     sp<JpegCompressor> mJpegCompressor;
    193     friend class       JpegCompressor;
    194 
    195     /** Processing thread for sending out results */
    196 
    197     class ReadoutThread : public Thread, private JpegCompressor::JpegListener {
    198       public:
    199         ReadoutThread(EmulatedFakeCamera3 *parent);
    200         ~ReadoutThread();
    201 
    202         struct Request {
    203             uint32_t         frameNumber;
    204             CameraMetadata   settings;
    205             HalBufferVector *buffers;
    206             Buffers         *sensorBuffers;
    207         };
    208 
    209         /**
    210          * Interface to parent class
    211          */
    212 
    213         // Place request in the in-flight queue to wait for sensor capture
    214         void     queueCaptureRequest(const Request &r);
    215 
    216         // Test if the readout thread is idle (no in-flight requests, not
    217         // currently reading out anything
    218         bool     isIdle();
    219 
    220         // Wait until isIdle is true
    221         status_t waitForReadout();
    222 
    223       private:
    224         static const nsecs_t kWaitPerLoop  = 10000000L; // 10 ms
    225         static const nsecs_t kMaxWaitLoops = 1000;
    226         static const size_t  kMaxQueueSize = 2;
    227 
    228         EmulatedFakeCamera3 *mParent;
    229         Mutex mLock;
    230 
    231         List<Request> mInFlightQueue;
    232         Condition     mInFlightSignal;
    233         bool          mThreadActive;
    234 
    235         virtual bool threadLoop();
    236 
    237         // Only accessed by threadLoop
    238 
    239         Request mCurrentRequest;
    240 
    241         // Jpeg completion callbacks
    242 
    243         Mutex                 mJpegLock;
    244         bool                  mJpegWaiting;
    245         camera3_stream_buffer mJpegHalBuffer;
    246         uint32_t              mJpegFrameNumber;
    247         virtual void onJpegDone(const StreamBuffer &jpegBuffer, bool success);
    248         virtual void onJpegInputDone(const StreamBuffer &inputBuffer);
    249     };
    250 
    251     sp<ReadoutThread> mReadoutThread;
    252 
    253     /** Fake 3A constants */
    254 
    255     static const nsecs_t kNormalExposureTime;
    256     static const nsecs_t kFacePriorityExposureTime;
    257     static const int     kNormalSensitivity;
    258     static const int     kFacePrioritySensitivity;
    259     // Rate of converging AE to new target value, as fraction of difference between
    260     // current and target value.
    261     static const float   kExposureTrackRate;
    262     // Minimum duration for precapture state. May be longer if slow to converge
    263     // to target exposure
    264     static const int     kPrecaptureMinFrames;
    265     // How often to restart AE 'scanning'
    266     static const int     kStableAeMaxFrames;
    267     // Maximum stop below 'normal' exposure time that we'll wander to while
    268     // pretending to converge AE. In powers of 2. (-2 == 1/4 as bright)
    269     static const float   kExposureWanderMin;
    270     // Maximum stop above 'normal' exposure time that we'll wander to while
    271     // pretending to converge AE. In powers of 2. (2 == 4x as bright)
    272     static const float   kExposureWanderMax;
    273 
    274     /** Fake 3A state */
    275 
    276     uint8_t mControlMode;
    277     bool    mFacePriority;
    278     uint8_t mAeState;
    279     uint8_t mAfState;
    280     uint8_t mAwbState;
    281     uint8_t mAeMode;
    282     uint8_t mAfMode;
    283     uint8_t mAwbMode;
    284 
    285     int     mAeCounter;
    286     nsecs_t mAeCurrentExposureTime;
    287     nsecs_t mAeTargetExposureTime;
    288     int     mAeCurrentSensitivity;
    289 
    290 };
    291 
    292 } // namespace android
    293 
    294 #endif // HW_EMULATOR_CAMERA_EMULATED_CAMERA3_H
    295