• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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