• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013-2018 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 ANDROID_SERVERS_CAMERA3DEVICE_H
18 #define ANDROID_SERVERS_CAMERA3DEVICE_H
19 
20 #include <utility>
21 #include <unordered_map>
22 #include <set>
23 
24 #include <utils/Condition.h>
25 #include <utils/Errors.h>
26 #include <utils/List.h>
27 #include <utils/Mutex.h>
28 #include <utils/Thread.h>
29 #include <utils/KeyedVector.h>
30 #include <utils/Timers.h>
31 
32 #include <android/hardware/camera/device/3.2/ICameraDevice.h>
33 #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h>
34 #include <android/hardware/camera/device/3.3/ICameraDeviceSession.h>
35 #include <android/hardware/camera/device/3.4/ICameraDeviceSession.h>
36 #include <android/hardware/camera/device/3.5/ICameraDeviceSession.h>
37 #include <android/hardware/camera/device/3.6/ICameraDeviceSession.h>
38 #include <android/hardware/camera/device/3.7/ICameraDeviceSession.h>
39 #include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h>
40 #include <android/hardware/camera/device/3.4/ICameraDeviceCallback.h>
41 #include <android/hardware/camera/device/3.5/ICameraDeviceCallback.h>
42 #include <fmq/MessageQueue.h>
43 
44 #include <camera/CaptureResult.h>
45 
46 #include "common/CameraDeviceBase.h"
47 #include "device3/BufferUtils.h"
48 #include "device3/StatusTracker.h"
49 #include "device3/Camera3BufferManager.h"
50 #include "device3/DistortionMapper.h"
51 #include "device3/ZoomRatioMapper.h"
52 #include "device3/RotateAndCropMapper.h"
53 #include "device3/UHRCropAndMeteringRegionMapper.h"
54 #include "device3/InFlightRequest.h"
55 #include "device3/Camera3OutputInterface.h"
56 #include "device3/Camera3OfflineSession.h"
57 #include "device3/Camera3StreamInterface.h"
58 #include "utils/TagMonitor.h"
59 #include "utils/LatencyHistogram.h"
60 #include <camera_metadata_hidden.h>
61 
62 using android::camera3::camera_capture_request_t;
63 using android::camera3::camera_jpeg_blob_t;
64 using android::camera3::camera_request_template;
65 using android::camera3::camera_stream_buffer_t;
66 using android::camera3::camera_stream_configuration_t;
67 using android::camera3::camera_stream_configuration_mode_t;
68 using android::camera3::CAMERA_TEMPLATE_COUNT;
69 using android::camera3::OutputStreamInfo;
70 
71 namespace android {
72 
73 namespace camera3 {
74 
75 class Camera3Stream;
76 class Camera3ZslStream;
77 class Camera3StreamInterface;
78 
79 } // namespace camera3
80 
81 /**
82  * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 or higher.
83  */
84 class Camera3Device :
85             public CameraDeviceBase,
86             virtual public hardware::camera::device::V3_5::ICameraDeviceCallback,
87             public camera3::SetErrorInterface,
88             public camera3::InflightRequestUpdateInterface,
89             public camera3::RequestBufferInterface,
90             public camera3::FlushBufferInterface {
91   public:
92 
93     explicit Camera3Device(const String8& id, bool overrideForPerfClass);
94 
95     virtual ~Camera3Device();
96 
97     /**
98      * CameraDeviceBase interface
99      */
100 
101     const String8& getId() const override;
102 
getVendorTagId()103     metadata_vendor_id_t getVendorTagId() const override { return mVendorTagId; }
104 
105     // Transitions to idle state on success.
106     status_t initialize(sp<CameraProviderManager> manager, const String8& monitorTags) override;
107     status_t disconnect() override;
108     status_t dump(int fd, const Vector<String16> &args) override;
109     const CameraMetadata& info() const override;
110     const CameraMetadata& infoPhysical(const String8& physicalId) const override;
111 
112     // Capture and setStreamingRequest will configure streams if currently in
113     // idle state
114     status_t capture(CameraMetadata &request, int64_t *lastFrameNumber = NULL) override;
115     status_t captureList(const List<const PhysicalCameraSettingsList> &requestsList,
116             const std::list<const SurfaceMap> &surfaceMaps,
117             int64_t *lastFrameNumber = NULL) override;
118     status_t setStreamingRequest(const CameraMetadata &request,
119             int64_t *lastFrameNumber = NULL) override;
120     status_t setStreamingRequestList(const List<const PhysicalCameraSettingsList> &requestsList,
121             const std::list<const SurfaceMap> &surfaceMaps,
122             int64_t *lastFrameNumber = NULL) override;
123     status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL) override;
124 
125     status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) override;
126 
127     // Actual stream creation/deletion is delayed until first request is submitted
128     // If adding streams while actively capturing, will pause device before adding
129     // stream, reconfiguring device, and unpausing. If the client create a stream
130     // with nullptr consumer surface, the client must then call setConsumers()
131     // and finish the stream configuration before starting output streaming.
132     status_t createStream(sp<Surface> consumer,
133             uint32_t width, uint32_t height, int format,
134             android_dataspace dataSpace, camera_stream_rotation_t rotation, int *id,
135             const String8& physicalCameraId,
136             const std::unordered_set<int32_t> &sensorPixelModesUsed,
137             std::vector<int> *surfaceIds = nullptr,
138             int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID,
139             bool isShared = false, bool isMultiResolution = false,
140             uint64_t consumerUsage = 0) override;
141 
142     status_t createStream(const std::vector<sp<Surface>>& consumers,
143             bool hasDeferredConsumer, uint32_t width, uint32_t height, int format,
144             android_dataspace dataSpace, camera_stream_rotation_t rotation, int *id,
145             const String8& physicalCameraId,
146             const std::unordered_set<int32_t> &sensorPixelModesUsed,
147             std::vector<int> *surfaceIds = nullptr,
148             int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID,
149             bool isShared = false, bool isMultiResolution = false,
150             uint64_t consumerUsage = 0) override;
151 
152     status_t createInputStream(
153             uint32_t width, uint32_t height, int format, bool isMultiResolution,
154             int *id) override;
155 
156     status_t getStreamInfo(int id, StreamInfo *streamInfo) override;
157     status_t setStreamTransform(int id, int transform) override;
158 
159     status_t deleteStream(int id) override;
160 
161     status_t configureStreams(const CameraMetadata& sessionParams,
162             int operatingMode =
163             camera_stream_configuration_mode_t::CAMERA_STREAM_CONFIGURATION_NORMAL_MODE) override;
164     status_t getInputBufferProducer(
165             sp<IGraphicBufferProducer> *producer) override;
166 
167     void getOfflineStreamIds(std::vector<int> *offlineStreamIds) override;
168 
169     status_t createDefaultRequest(camera_request_template_t templateId,
170             CameraMetadata *request) override;
171 
172     // Transitions to the idle state on success
173     status_t waitUntilDrained() override;
174 
175     status_t setNotifyCallback(wp<NotificationListener> listener) override;
176     bool     willNotify3A() override;
177     status_t waitForNextFrame(nsecs_t timeout) override;
178     status_t getNextResult(CaptureResult *frame) override;
179 
180     status_t triggerAutofocus(uint32_t id) override;
181     status_t triggerCancelAutofocus(uint32_t id) override;
182     status_t triggerPrecaptureMetering(uint32_t id) override;
183 
184     status_t flush(int64_t *lastFrameNumber = NULL) override;
185 
186     status_t prepare(int streamId) override;
187 
188     status_t tearDown(int streamId) override;
189 
190     status_t addBufferListenerForStream(int streamId,
191             wp<camera3::Camera3StreamBufferListener> listener) override;
192 
193     status_t prepare(int maxCount, int streamId) override;
194 
195     ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const override;
196     ssize_t getPointCloudBufferSize() const;
197     ssize_t getRawOpaqueBufferSize(int32_t width, int32_t height, bool maxResolution) const;
198 
199     // Methods called by subclasses
200     void             notifyStatus(bool idle); // updates from StatusTracker
201 
202     /**
203      * Set the deferred consumer surfaces to the output stream and finish the deferred
204      * consumer configuration.
205      */
206     status_t setConsumerSurfaces(
207             int streamId, const std::vector<sp<Surface>>& consumers,
208             std::vector<int> *surfaceIds /*out*/) override;
209 
210     /**
211      * Update a given stream.
212      */
213     status_t updateStream(int streamId, const std::vector<sp<Surface>> &newSurfaces,
214             const std::vector<OutputStreamInfo> &outputInfo,
215             const std::vector<size_t> &removedSurfaceIds,
216             KeyedVector<sp<Surface>, size_t> *outputMap/*out*/);
217 
218     /**
219      * Drop buffers for stream of streamId if dropping is true. If dropping is false, do not
220      * drop buffers for stream of streamId.
221      */
222     status_t dropStreamBuffers(bool dropping, int streamId) override;
223 
224     nsecs_t getExpectedInFlightDuration() override;
225 
226     status_t switchToOffline(const std::vector<int32_t>& streamsToKeep,
227             /*out*/ sp<CameraOfflineSessionBase>* session) override;
228 
229     // RequestBufferInterface
230     bool startRequestBuffer() override;
231     void endRequestBuffer() override;
232     nsecs_t getWaitDuration() override;
233 
234     // FlushBufferInterface
235     void getInflightBufferKeys(std::vector<std::pair<int32_t, int32_t>>* out) override;
236     void getInflightRequestBufferKeys(std::vector<uint64_t>* out) override;
237     std::vector<sp<camera3::Camera3StreamInterface>> getAllStreams() override;
238 
239     /**
240      * Set the current behavior for the ROTATE_AND_CROP control when in AUTO.
241      *
242      * The value must be one of the ROTATE_AND_CROP_* values besides AUTO,
243      * and defaults to NONE.
244      */
245     status_t setRotateAndCropAutoBehavior(
246             camera_metadata_enum_android_scaler_rotate_and_crop_t rotateAndCropValue);
247 
248     /**
249      * Whether camera muting (producing black-only output) is supported.
250      *
251      * Calling setCameraMute(true) when this returns false will return an
252      * INVALID_OPERATION error.
253      */
254     bool supportsCameraMute();
255 
256     /**
257      * Mute the camera.
258      *
259      * When muted, black image data is output on all output streams.
260      */
261     status_t setCameraMute(bool enabled);
262 
263     // Get the status trackeer for the camera device
getStatusTracker()264     wp<camera3::StatusTracker> getStatusTracker() { return mStatusTracker; }
265 
266     /**
267      * The injection camera session to replace the internal camera
268      * session.
269      */
270     status_t injectCamera(const String8& injectedCamId,
271                           sp<CameraProviderManager> manager);
272 
273     /**
274      * Stop the injection camera and restore to internal camera session.
275      */
276     status_t stopInjection();
277 
278     /**
279      * Helper functions to map between framework and HIDL values
280      */
281     static hardware::graphics::common::V1_0::PixelFormat mapToPixelFormat(int frameworkFormat);
282     static hardware::camera::device::V3_2::DataspaceFlags mapToHidlDataspace(
283             android_dataspace dataSpace);
284     static hardware::camera::device::V3_2::BufferUsageFlags mapToConsumerUsage(uint64_t usage);
285     static hardware::camera::device::V3_2::StreamRotation mapToStreamRotation(
286             camera_stream_rotation_t rotation);
287     // Returns a negative error code if the passed-in operation mode is not valid.
288     static status_t mapToStreamConfigurationMode(camera_stream_configuration_mode_t operationMode,
289             /*out*/ hardware::camera::device::V3_2::StreamConfigurationMode *mode);
290     static int mapToFrameworkFormat(hardware::graphics::common::V1_0::PixelFormat pixelFormat);
291     static android_dataspace mapToFrameworkDataspace(
292             hardware::camera::device::V3_2::DataspaceFlags);
293     static uint64_t mapConsumerToFrameworkUsage(
294             hardware::camera::device::V3_2::BufferUsageFlags usage);
295     static uint64_t mapProducerToFrameworkUsage(
296             hardware::camera::device::V3_2::BufferUsageFlags usage);
297 
298   private:
299     status_t disconnectImpl();
300 
301     // internal typedefs
302     using RequestMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>;
303 
304     static const size_t        kDumpLockAttempts  = 10;
305     static const size_t        kDumpSleepDuration = 100000; // 0.10 sec
306     static const nsecs_t       kActiveTimeout     = 500000000;  // 500 ms
307     static const nsecs_t       kMinWarnInflightDuration = 5000000000; // 5 s
308     static const size_t        kInFlightWarnLimit = 30;
309     static const size_t        kInFlightWarnLimitHighSpeed = 256; // batch size 32 * pipe depth 8
310     static const nsecs_t       kDefaultExpectedDuration = 100000000; // 100 ms
311     static const nsecs_t       kMinInflightDuration = 5000000000; // 5 s
312     static const nsecs_t       kBaseGetBufferWait = 3000000000; // 3 sec.
313     // SCHED_FIFO priority for request submission thread in HFR mode
314     static const int           kRequestThreadPriority = 1;
315 
316     struct                     RequestTrigger;
317     // minimal jpeg buffer size: 256KB + blob header
318     static const ssize_t       kMinJpegBufferSize = 256 * 1024 + sizeof(camera_jpeg_blob_t);
319     // Constant to use for stream ID when one doesn't exist
320     static const int           NO_STREAM = -1;
321 
322     // A lock to enforce serialization on the input/configure side
323     // of the public interface.
324     // Not locked by methods guarded by mOutputLock, since they may act
325     // concurrently to the input/configure side of the interface.
326     // Must be locked before mLock if both will be locked by a method
327     Mutex                      mInterfaceLock;
328 
329     // The main lock on internal state
330     Mutex                      mLock;
331 
332     // Camera device ID
333     const String8              mId;
334 
335     // Current stream configuration mode;
336     int                        mOperatingMode;
337     // Current session wide parameters
338     hardware::camera2::impl::CameraMetadataNative mSessionParams;
339 
340     // Constant to use for no set operating mode
341     static const int           NO_MODE = -1;
342 
343     // Flag indicating is the current active stream configuration is constrained high speed.
344     bool                       mIsConstrainedHighSpeedConfiguration;
345 
346     // FMQ to write result on. Must be guarded by mProcessCaptureResultLock.
347     std::unique_ptr<ResultMetadataQueue> mResultMetadataQueue;
348 
349     /**** Scope for mLock ****/
350 
351     /**
352      * Adapter for legacy HAL / HIDL HAL interface calls; calls either into legacy HALv3 or the
353      * HIDL HALv3 interfaces.
354      */
355     class HalInterface : public camera3::Camera3StreamBufferFreedListener,
356             public camera3::BufferRecordsInterface {
357       public:
358         HalInterface(sp<hardware::camera::device::V3_2::ICameraDeviceSession> &session,
359                      std::shared_ptr<RequestMetadataQueue> queue,
360                      bool useHalBufManager, bool supportOfflineProcessing);
361         HalInterface(const HalInterface &other);
362         HalInterface();
363 
364         // Returns true if constructed with a valid device or session, and not yet cleared
365         bool valid();
366 
367         // Reset this HalInterface object (does not call close())
368         void clear();
369 
370         // Calls into the HAL interface
371 
372         // Caller takes ownership of requestTemplate
373         status_t constructDefaultRequestSettings(camera_request_template templateId,
374                 /*out*/ camera_metadata_t **requestTemplate);
375         status_t configureStreams(const camera_metadata_t *sessionParams,
376                 /*inout*/ camera_stream_configuration_t *config,
377                 const std::vector<uint32_t>& bufferSizes);
378 
379         // The injection camera configures the streams to hal.
380         status_t configureInjectedStreams(
381                 const camera_metadata_t* sessionParams,
382                 /*inout*/ camera_stream_configuration_t* config,
383                 const std::vector<uint32_t>& bufferSizes,
384                 const CameraMetadata& cameraCharacteristics);
385 
386         // When the call succeeds, the ownership of acquire fences in requests is transferred to
387         // HalInterface. More specifically, the current implementation will send the fence to
388         // HAL process and close the FD in cameraserver process. When the call fails, the ownership
389         // of the acquire fence still belongs to the caller.
390         status_t processBatchCaptureRequests(
391                 std::vector<camera_capture_request_t*>& requests,
392                 /*out*/uint32_t* numRequestProcessed);
393         status_t flush();
394         status_t dump(int fd);
395         status_t close();
396 
397         void signalPipelineDrain(const std::vector<int>& streamIds);
398         bool isReconfigurationRequired(CameraMetadata& oldSessionParams,
399                 CameraMetadata& newSessionParams);
400 
401         // Upon successful return, HalInterface will return buffer maps needed for offline
402         // processing, and clear all its internal buffer maps.
403         status_t switchToOffline(
404                 const std::vector<int32_t>& streamsToKeep,
405                 /*out*/hardware::camera::device::V3_6::CameraOfflineSessionInfo* offlineSessionInfo,
406                 /*out*/sp<hardware::camera::device::V3_6::ICameraOfflineSession>* offlineSession,
407                 /*out*/camera3::BufferRecords* bufferRecords);
408 
409         /////////////////////////////////////////////////////////////////////
410         // Implements BufferRecordsInterface
411 
412         std::pair<bool, uint64_t> getBufferId(
413                 const buffer_handle_t& buf, int streamId) override;
414 
415         status_t popInflightBuffer(int32_t frameNumber, int32_t streamId,
416                 /*out*/ buffer_handle_t **buffer) override;
417 
418         status_t pushInflightRequestBuffer(
419                 uint64_t bufferId, buffer_handle_t* buf, int32_t streamId) override;
420 
421         status_t popInflightRequestBuffer(uint64_t bufferId,
422                 /*out*/ buffer_handle_t** buffer,
423                 /*optional out*/ int32_t* streamId = nullptr) override;
424 
425         /////////////////////////////////////////////////////////////////////
426 
427         // Get a vector of (frameNumber, streamId) pair of currently inflight
428         // buffers
429         void getInflightBufferKeys(std::vector<std::pair<int32_t, int32_t>>* out);
430 
431         // Get a vector of bufferId of currently inflight buffers
432         void getInflightRequestBufferKeys(std::vector<uint64_t>* out);
433 
434         void onStreamReConfigured(int streamId);
435 
436       private:
437         // Always valid
438         sp<hardware::camera::device::V3_2::ICameraDeviceSession> mHidlSession;
439         // Valid if ICameraDeviceSession is @3.3 or newer
440         sp<hardware::camera::device::V3_3::ICameraDeviceSession> mHidlSession_3_3;
441         // Valid if ICameraDeviceSession is @3.4 or newer
442         sp<hardware::camera::device::V3_4::ICameraDeviceSession> mHidlSession_3_4;
443         // Valid if ICameraDeviceSession is @3.5 or newer
444         sp<hardware::camera::device::V3_5::ICameraDeviceSession> mHidlSession_3_5;
445         // Valid if ICameraDeviceSession is @3.6 or newer
446         sp<hardware::camera::device::V3_6::ICameraDeviceSession> mHidlSession_3_6;
447         // Valid if ICameraDeviceSession is @3.7 or newer
448         sp<hardware::camera::device::V3_7::ICameraDeviceSession> mHidlSession_3_7;
449 
450         std::shared_ptr<RequestMetadataQueue> mRequestMetadataQueue;
451 
452         // The output HIDL request still depends on input camera_capture_request_t
453         // Do not free input camera_capture_request_t before output HIDL request
454         status_t wrapAsHidlRequest(camera_capture_request_t* in,
455                 /*out*/hardware::camera::device::V3_2::CaptureRequest* out,
456                 /*out*/std::vector<native_handle_t*>* handlesCreated,
457                 /*out*/std::vector<std::pair<int32_t, int32_t>>* inflightBuffers);
458 
459         status_t pushInflightBufferLocked(int32_t frameNumber, int32_t streamId,
460                 buffer_handle_t *buffer);
461 
462         // Pop inflight buffers based on pairs of (frameNumber,streamId)
463         void popInflightBuffers(const std::vector<std::pair<int32_t, int32_t>>& buffers);
464 
465         // Return true if the input caches match what we have; otherwise false
466         bool verifyBufferIds(int32_t streamId, std::vector<uint64_t>& inBufIds);
467 
468         // Delete and optionally close native handles and clear the input vector afterward
469         static void cleanupNativeHandles(
470                 std::vector<native_handle_t*> *handles, bool closeFd = false);
471 
472         virtual void onBufferFreed(int streamId, const native_handle_t* handle) override;
473 
474         std::mutex mFreedBuffersLock;
475         std::vector<std::pair<int, uint64_t>> mFreedBuffers;
476 
477         // Keep track of buffer cache and inflight buffer records
478         camera3::BufferRecords mBufferRecords;
479 
480         uint32_t mNextStreamConfigCounter = 1;
481 
482         const bool mUseHalBufManager;
483         bool mIsReconfigurationQuerySupported;
484 
485         const bool mSupportOfflineProcessing;
486     };
487 
488     sp<HalInterface> mInterface;
489 
490     CameraMetadata             mDeviceInfo;
491     bool                       mSupportNativeZoomRatio;
492     std::unordered_map<std::string, CameraMetadata> mPhysicalDeviceInfoMap;
493 
494     CameraMetadata             mRequestTemplateCache[CAMERA_TEMPLATE_COUNT];
495 
496     struct Size {
497         uint32_t width;
498         uint32_t height;
widthSize499         explicit Size(uint32_t w = 0, uint32_t h = 0) : width(w), height(h){}
500     };
501 
502     enum Status {
503         STATUS_ERROR,
504         STATUS_UNINITIALIZED,
505         STATUS_UNCONFIGURED,
506         STATUS_CONFIGURED,
507         STATUS_ACTIVE
508     }                          mStatus;
509 
510     // Only clear mRecentStatusUpdates, mStatusWaiters from waitUntilStateThenRelock
511     Vector<Status>             mRecentStatusUpdates;
512     int                        mStatusWaiters;
513 
514     Condition                  mStatusChanged;
515 
516     // Tracking cause of fatal errors when in STATUS_ERROR
517     String8                    mErrorCause;
518 
519     camera3::StreamSet         mOutputStreams;
520     sp<camera3::Camera3Stream> mInputStream;
521     bool                       mIsInputStreamMultiResolution;
522     SessionStatsBuilder        mSessionStatsBuilder;
523     // Map from stream group ID to physical cameras backing the stream group
524     std::map<int32_t, std::set<String8>> mGroupIdPhysicalCameraMap;
525 
526     int                        mNextStreamId;
527     bool                       mNeedConfig;
528 
529     int                        mFakeStreamId;
530 
531     // Whether to send state updates upstream
532     // Pause when doing transparent reconfiguration
533     bool                       mPauseStateNotify;
534 
535     // Need to hold on to stream references until configure completes.
536     Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams;
537 
538     // Whether the HAL will send partial result
539     bool                       mUsePartialResult;
540 
541     // Number of partial results that will be delivered by the HAL.
542     uint32_t                   mNumPartialResults;
543 
544     /**** End scope for mLock ****/
545 
546     // The offset converting from clock domain of other subsystem
547     // (video/hardware composer) to that of camera. Assumption is that this
548     // offset won't change during the life cycle of the camera device. In other
549     // words, camera device shouldn't be open during CPU suspend.
550     nsecs_t                    mTimestampOffset;
551 
552     class CaptureRequest : public LightRefBase<CaptureRequest> {
553       public:
554         PhysicalCameraSettingsList          mSettingsList;
555         sp<camera3::Camera3Stream>          mInputStream;
556         camera_stream_buffer_t              mInputBuffer;
557         camera3::Size                       mInputBufferSize;
558         Vector<sp<camera3::Camera3OutputStreamInterface> >
559                                             mOutputStreams;
560         SurfaceMap                          mOutputSurfaces;
561         CaptureResultExtras                 mResultExtras;
562         // The number of requests that should be submitted to HAL at a time.
563         // For example, if batch size is 8, this request and the following 7
564         // requests will be submitted to HAL at a time. The batch size for
565         // the following 7 requests will be ignored by the request thread.
566         int                                 mBatchSize;
567         //  Whether this request is from a repeating or repeating burst.
568         bool                                mRepeating;
569         // Whether this request has ROTATE_AND_CROP_AUTO set, so needs both
570         // overriding of ROTATE_AND_CROP value and adjustment of coordinates
571         // in several other controls in both the request and the result
572         bool                                mRotateAndCropAuto;
573         // Original value of TEST_PATTERN_MODE and DATA so that they can be
574         // restored when sensor muting is turned off
575         int32_t                             mOriginalTestPatternMode;
576         int32_t                             mOriginalTestPatternData[4];
577 
578         // Whether this capture request has its zoom ratio set to 1.0x before
579         // the framework overrides it for camera HAL consumption.
580         bool                                mZoomRatioIs1x;
581         // The systemTime timestamp when the request is created.
582         nsecs_t                             mRequestTimeNs;
583 
584 
585         // Whether this capture request's distortion correction update has
586         // been done.
587         bool                                mDistortionCorrectionUpdated = false;
588         // Whether this capture request's rotation and crop update has been
589         // done.
590         bool                                mRotationAndCropUpdated = false;
591         // Whether this capture request's zoom ratio update has been done.
592         bool                                mZoomRatioUpdated = false;
593         // Whether this max resolution capture request's  crop / metering region update has been
594         // done.
595         bool                                mUHRCropAndMeteringRegionsUpdated = false;
596     };
597     typedef List<sp<CaptureRequest> > RequestList;
598 
599     status_t checkStatusOkToCaptureLocked();
600 
601     status_t convertMetadataListToRequestListLocked(
602             const List<const PhysicalCameraSettingsList> &metadataList,
603             const std::list<const SurfaceMap> &surfaceMaps,
604             bool repeating, nsecs_t requestTimeNs,
605             /*out*/
606             RequestList *requestList);
607 
608     void convertToRequestList(List<const PhysicalCameraSettingsList>& requestsList,
609             std::list<const SurfaceMap>& surfaceMaps,
610             const CameraMetadata& request);
611 
612     status_t submitRequestsHelper(const List<const PhysicalCameraSettingsList> &requestsList,
613                                   const std::list<const SurfaceMap> &surfaceMaps,
614                                   bool repeating,
615                                   int64_t *lastFrameNumber = NULL);
616 
617 
618     /**
619      * Implementation of android::hardware::camera::device::V3_5::ICameraDeviceCallback
620      */
621 
622     hardware::Return<void> processCaptureResult_3_4(
623             const hardware::hidl_vec<
624                     hardware::camera::device::V3_4::CaptureResult>& results) override;
625     hardware::Return<void> processCaptureResult(
626             const hardware::hidl_vec<
627                     hardware::camera::device::V3_2::CaptureResult>& results) override;
628     hardware::Return<void> notify(
629             const hardware::hidl_vec<
630                     hardware::camera::device::V3_2::NotifyMsg>& msgs) override;
631 
632     hardware::Return<void> requestStreamBuffers(
633             const hardware::hidl_vec<
634                     hardware::camera::device::V3_5::BufferRequest>& bufReqs,
635             requestStreamBuffers_cb _hidl_cb) override;
636 
637     hardware::Return<void> returnStreamBuffers(
638             const hardware::hidl_vec<
639                     hardware::camera::device::V3_2::StreamBuffer>& buffers) override;
640 
641     // Handle one notify message
642     void notify(const hardware::camera::device::V3_2::NotifyMsg& msg);
643 
644     // lock to ensure only one processCaptureResult is called at a time.
645     Mutex mProcessCaptureResultLock;
646 
647     /**
648      * Common initialization code shared by both HAL paths
649      *
650      * Must be called with mLock and mInterfaceLock held.
651      */
652     status_t initializeCommonLocked();
653 
654     /**
655      * Get the last request submitted to the hal by the request thread.
656      *
657      * Must be called with mLock held.
658      */
659     virtual CameraMetadata getLatestRequestLocked();
660 
661     /**
662      * Update the current device status and wake all waiting threads.
663      *
664      * Must be called with mLock held.
665      */
666     void internalUpdateStatusLocked(Status status);
667 
668     /**
669      * Pause processing and flush everything, but don't tell the clients.
670      * This is for reconfiguring outputs transparently when according to the
671      * CameraDeviceBase interface we shouldn't need to.
672      * Must be called with mLock and mInterfaceLock both held.
673      */
674     status_t internalPauseAndWaitLocked(nsecs_t maxExpectedDuration);
675 
676     /**
677      * Resume work after internalPauseAndWaitLocked()
678      * Must be called with mLock and mInterfaceLock both held.
679      */
680     status_t internalResumeLocked();
681 
682     /**
683      * Wait until status tracker tells us we've transitioned to the target state
684      * set, which is either ACTIVE when active==true or IDLE (which is any
685      * non-ACTIVE state) when active==false.
686      *
687      * Needs to be called with mLock and mInterfaceLock held.  This means there
688      * can ever only be one waiter at most.
689      *
690      * During the wait mLock is released.
691      *
692      */
693     status_t waitUntilStateThenRelock(bool active, nsecs_t timeout);
694 
695     /**
696      * Implementation of waitUntilDrained. On success, will transition to IDLE state.
697      *
698      * Need to be called with mLock and mInterfaceLock held.
699      */
700     status_t waitUntilDrainedLocked(nsecs_t maxExpectedDuration);
701 
702     /**
703      * Do common work for setting up a streaming or single capture request.
704      * On success, will transition to ACTIVE if in IDLE.
705      */
706     sp<CaptureRequest> setUpRequestLocked(const PhysicalCameraSettingsList &request,
707                                           const SurfaceMap &surfaceMap);
708 
709     /**
710      * Build a CaptureRequest request from the CameraDeviceBase request
711      * settings.
712      */
713     sp<CaptureRequest> createCaptureRequest(const PhysicalCameraSettingsList &request,
714                                             const SurfaceMap &surfaceMap);
715 
716     /**
717      * Internally re-configure camera device using new session parameters.
718      * This will get triggered by the request thread.
719      */
720     bool reconfigureCamera(const CameraMetadata& sessionParams, int clientStatusId);
721 
722     /**
723      * Return true in case of any output or input abandoned streams,
724      * otherwise return false.
725      */
726     bool checkAbandonedStreamsLocked();
727 
728     /**
729      * Filter stream session parameters and configure camera HAL.
730      */
731     status_t filterParamsAndConfigureLocked(const CameraMetadata& sessionParams,
732             int operatingMode);
733 
734     /**
735      * Take the currently-defined set of streams and configure the HAL to use
736      * them. This is a long-running operation (may be several hundered ms).
737      */
738     status_t           configureStreamsLocked(int operatingMode,
739             const CameraMetadata& sessionParams, bool notifyRequestThread = true);
740 
741     /**
742      * Cancel stream configuration that did not finish successfully.
743      */
744     void               cancelStreamsConfigurationLocked();
745 
746     /**
747      * Add a fake stream to the current stream set as a workaround for
748      * not allowing 0 streams in the camera HAL spec.
749      */
750     status_t           addFakeStreamLocked();
751 
752     /**
753      * Remove a fake stream if the current config includes real streams.
754      */
755     status_t           tryRemoveFakeStreamLocked();
756 
757     /**
758      * Set device into an error state due to some fatal failure, and set an
759      * error message to indicate why. Only the first call's message will be
760      * used. The message is also sent to the log.
761      */
762     void               setErrorState(const char *fmt, ...) override;
763     void               setErrorStateLocked(const char *fmt, ...) override;
764     void               setErrorStateV(const char *fmt, va_list args);
765     void               setErrorStateLockedV(const char *fmt, va_list args);
766 
767     /////////////////////////////////////////////////////////////////////
768     // Implements InflightRequestUpdateInterface
769 
770     void onInflightEntryRemovedLocked(nsecs_t duration) override;
771     void checkInflightMapLengthLocked() override;
772     void onInflightMapFlushedLocked() override;
773 
774     /////////////////////////////////////////////////////////////////////
775 
776     /**
777      * Debugging trylock/spin method
778      * Try to acquire a lock a few times with sleeps between before giving up.
779      */
780     bool               tryLockSpinRightRound(Mutex& lock);
781 
782     /**
783      * Helper function to get the offset between MONOTONIC and BOOTTIME
784      * timestamp.
785      */
786     static nsecs_t getMonoToBoottimeOffset();
787 
788     struct RequestTrigger {
789         // Metadata tag number, e.g. android.control.aePrecaptureTrigger
790         uint32_t metadataTag;
791         // Metadata value, e.g. 'START' or the trigger ID
792         int32_t entryValue;
793 
794         // The last part of the fully qualified path, e.g. afTrigger
getTagNameRequestTrigger795         const char *getTagName() const {
796             return get_camera_metadata_tag_name(metadataTag) ?: "NULL";
797         }
798 
799         // e.g. TYPE_BYTE, TYPE_INT32, etc.
getTagTypeRequestTrigger800         int getTagType() const {
801             return get_camera_metadata_tag_type(metadataTag);
802         }
803     };
804 
805     /**
806      * Thread for managing capture request submission to HAL device.
807      */
808     class RequestThread : public Thread {
809 
810       public:
811 
812         RequestThread(wp<Camera3Device> parent,
813                 sp<camera3::StatusTracker> statusTracker,
814                 sp<HalInterface> interface,
815                 const Vector<int32_t>& sessionParamKeys,
816                 bool useHalBufManager,
817                 bool supportCameraMute);
818         ~RequestThread();
819 
820         void     setNotificationListener(wp<NotificationListener> listener);
821 
822         /**
823          * Call after stream (re)-configuration is completed.
824          */
825         void     configurationComplete(bool isConstrainedHighSpeed,
826                 const CameraMetadata& sessionParams,
827                 const std::map<int32_t, std::set<String8>>& groupIdPhysicalCameraMap);
828 
829         /**
830          * Set or clear the list of repeating requests. Does not block
831          * on either. Use waitUntilPaused to wait until request queue
832          * has emptied out.
833          */
834         status_t setRepeatingRequests(const RequestList& requests,
835                                       /*out*/
836                                       int64_t *lastFrameNumber = NULL);
837         status_t clearRepeatingRequests(/*out*/
838                                         int64_t *lastFrameNumber = NULL);
839 
840         status_t queueRequestList(List<sp<CaptureRequest> > &requests,
841                                   /*out*/
842                                   int64_t *lastFrameNumber = NULL);
843 
844         /**
845          * Remove all queued and repeating requests, and pending triggers
846          */
847         status_t clear(/*out*/int64_t *lastFrameNumber = NULL);
848 
849         /**
850          * Flush all pending requests in HAL.
851          */
852         status_t flush();
853 
854         /**
855          * Queue a trigger to be dispatched with the next outgoing
856          * process_capture_request. The settings for that request only
857          * will be temporarily rewritten to add the trigger tag/value.
858          * Subsequent requests will not be rewritten (for this tag).
859          */
860         status_t queueTrigger(RequestTrigger trigger[], size_t count);
861 
862         /**
863          * Pause/unpause the capture thread. Doesn't block, so use
864          * waitUntilPaused to wait until the thread is paused.
865          */
866         void     setPaused(bool paused);
867 
868         /**
869          * Wait until thread processes the capture request with settings'
870          * android.request.id == requestId.
871          *
872          * Returns TIMED_OUT in case the thread does not process the request
873          * within the timeout.
874          */
875         status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout);
876 
877         /**
878          * Shut down the thread. Shutdown is asynchronous, so thread may
879          * still be running once this method returns.
880          */
881         virtual void requestExit();
882 
883         /**
884          * Get the latest request that was sent to the HAL
885          * with process_capture_request.
886          */
887         CameraMetadata getLatestRequest() const;
888 
889         /**
890          * Returns true if the stream is a target of any queued or repeating
891          * capture request
892          */
893         bool isStreamPending(sp<camera3::Camera3StreamInterface>& stream);
894 
895         /**
896          * Returns true if the surface is a target of any queued or repeating
897          * capture request
898          */
899         bool isOutputSurfacePending(int streamId, size_t surfaceId);
900 
901         // dump processCaptureRequest latency
dumpCaptureRequestLatency(int fd,const char * name)902         void dumpCaptureRequestLatency(int fd, const char* name) {
903             mRequestLatency.dump(fd, name);
904         }
905 
906         void signalPipelineDrain(const std::vector<int>& streamIds);
907         void resetPipelineDrain();
908 
909         status_t switchToOffline(
910                 const std::vector<int32_t>& streamsToKeep,
911                 /*out*/hardware::camera::device::V3_6::CameraOfflineSessionInfo* offlineSessionInfo,
912                 /*out*/sp<hardware::camera::device::V3_6::ICameraOfflineSession>* offlineSession,
913                 /*out*/camera3::BufferRecords* bufferRecords);
914 
915         void clearPreviousRequest();
916 
917         status_t setRotateAndCropAutoBehavior(
918                 camera_metadata_enum_android_scaler_rotate_and_crop_t rotateAndCropValue);
919 
920         status_t setCameraMute(int32_t muteMode);
921 
922         status_t setHalInterface(sp<HalInterface> newHalInterface);
923 
924       protected:
925 
926         virtual bool threadLoop();
927 
928       private:
929         static const String8& getId(const wp<Camera3Device> &device);
930 
931         status_t           queueTriggerLocked(RequestTrigger trigger);
932         // Mix-in queued triggers into this request
933         int32_t            insertTriggers(const sp<CaptureRequest> &request);
934         // Purge the queued triggers from this request,
935         //  restoring the old field values for those tags.
936         status_t           removeTriggers(const sp<CaptureRequest> &request);
937 
938         // HAL workaround: Make sure a trigger ID always exists if
939         // a trigger does
940         status_t           addFakeTriggerIds(const sp<CaptureRequest> &request);
941 
942         // Override rotate_and_crop control if needed; returns true if the current value was changed
943         bool               overrideAutoRotateAndCrop(const sp<CaptureRequest> &request);
944 
945         // Override test_pattern control if needed for camera mute; returns true
946         // if the current value was changed
947         bool               overrideTestPattern(const sp<CaptureRequest> &request);
948 
949         static const nsecs_t kRequestTimeout = 50e6; // 50 ms
950 
951         // TODO: does this need to be adjusted for long exposure requests?
952         static const nsecs_t kRequestSubmitTimeout = 200e6; // 200 ms
953 
954         // Used to prepare a batch of requests.
955         struct NextRequest {
956             sp<CaptureRequest>              captureRequest;
957             camera_capture_request_t       halRequest;
958             Vector<camera_stream_buffer_t> outputBuffers;
959             bool                            submitted;
960         };
961 
962         // Wait for the next batch of requests and put them in mNextRequests. mNextRequests will
963         // be empty if it times out.
964         void waitForNextRequestBatch();
965 
966         // Waits for a request, or returns NULL if times out. Must be called with mRequestLock hold.
967         sp<CaptureRequest> waitForNextRequestLocked();
968 
969         // Prepare HAL requests and output buffers in mNextRequests. Return TIMED_OUT if getting any
970         // output buffer timed out. If an error is returned, the caller should clean up the pending
971         // request batch.
972         status_t prepareHalRequests();
973 
974         // Return buffers, etc, for requests in mNextRequests that couldn't be fully constructed and
975         // send request errors if sendRequestError is true. The buffers will be returned in the
976         // ERROR state to mark them as not having valid data. mNextRequests will be cleared.
977         void cleanUpFailedRequests(bool sendRequestError);
978 
979         // Stop the repeating request if any of its output streams is abandoned.
980         void checkAndStopRepeatingRequest();
981 
982         // Release physical camera settings and camera id resources.
983         void cleanupPhysicalSettings(sp<CaptureRequest> request,
984                 /*out*/camera_capture_request_t *halRequest);
985 
986         // Pause handling
987         bool               waitIfPaused();
988         void               unpauseForNewRequests();
989 
990         // Relay error to parent device object setErrorState
991         void               setErrorState(const char *fmt, ...);
992 
993         // If the input request is in mRepeatingRequests. Must be called with mRequestLock hold
994         bool isRepeatingRequestLocked(const sp<CaptureRequest>&);
995 
996         // Clear repeating requests. Must be called with mRequestLock held.
997         status_t clearRepeatingRequestsLocked(/*out*/ int64_t *lastFrameNumber = NULL);
998 
999         // send request in mNextRequests to HAL in a batch. Return true = sucssess
1000         bool sendRequestsBatch();
1001 
1002         // Calculate the expected maximum duration for a request
1003         nsecs_t calculateMaxExpectedDuration(const camera_metadata_t *request);
1004 
1005         // Check and update latest session parameters based on the current request settings.
1006         bool updateSessionParameters(const CameraMetadata& settings);
1007 
1008         // Check whether FPS range session parameter re-configuration is needed in constrained
1009         // high speed recording camera sessions.
1010         bool skipHFRTargetFPSUpdate(int32_t tag, const camera_metadata_ro_entry_t& newEntry,
1011                 const camera_metadata_entry_t& currentEntry);
1012 
1013         // Update next request sent to HAL
1014         void updateNextRequest(NextRequest& nextRequest);
1015 
1016         wp<Camera3Device>  mParent;
1017         wp<camera3::StatusTracker>  mStatusTracker;
1018         sp<HalInterface>   mInterface;
1019 
1020         wp<NotificationListener> mListener;
1021 
1022         const String8&     mId;       // The camera ID
1023         int                mStatusId; // The RequestThread's component ID for
1024                                       // status tracking
1025 
1026         Mutex              mRequestLock;
1027         Condition          mRequestSignal;
1028         Condition          mRequestSubmittedSignal;
1029         RequestList        mRequestQueue;
1030         RequestList        mRepeatingRequests;
1031         bool               mFirstRepeating;
1032         // The next batch of requests being prepped for submission to the HAL, no longer
1033         // on the request queue. Read-only even with mRequestLock held, outside
1034         // of threadLoop
1035         Vector<NextRequest> mNextRequests;
1036 
1037         // To protect flush() and sending a request batch to HAL.
1038         Mutex              mFlushLock;
1039 
1040         bool               mReconfigured;
1041 
1042         // Used by waitIfPaused, waitForNextRequest, waitUntilPaused, and signalPipelineDrain
1043         Mutex              mPauseLock;
1044         bool               mDoPause;
1045         Condition          mDoPauseSignal;
1046         bool               mPaused;
1047         bool               mNotifyPipelineDrain;
1048         std::vector<int>   mStreamIdsToBeDrained;
1049 
1050         sp<CaptureRequest> mPrevRequest;
1051         int32_t            mPrevTriggers;
1052         std::set<std::string> mPrevCameraIdsWithZoom;
1053 
1054         uint32_t           mFrameNumber;
1055 
1056         mutable Mutex      mLatestRequestMutex;
1057         Condition          mLatestRequestSignal;
1058         // android.request.id for latest process_capture_request
1059         int32_t            mLatestRequestId;
1060         CameraMetadata     mLatestRequest;
1061         std::unordered_map<std::string, CameraMetadata> mLatestPhysicalRequest;
1062 
1063         typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
1064         Mutex              mTriggerMutex;
1065         TriggerMap         mTriggerMap;
1066         TriggerMap         mTriggerRemovedMap;
1067         TriggerMap         mTriggerReplacedMap;
1068         uint32_t           mCurrentAfTriggerId;
1069         uint32_t           mCurrentPreCaptureTriggerId;
1070         camera_metadata_enum_android_scaler_rotate_and_crop_t mRotateAndCropOverride;
1071         int32_t            mCameraMute; // 0 = no mute, otherwise the TEST_PATTERN_MODE to use
1072         bool               mCameraMuteChanged;
1073 
1074         int64_t            mRepeatingLastFrameNumber;
1075 
1076         // Flag indicating if we should prepare video stream for video requests.
1077         bool               mPrepareVideoStream;
1078 
1079         bool               mConstrainedMode;
1080 
1081         static const int32_t kRequestLatencyBinSize = 40; // in ms
1082         CameraLatencyHistogram mRequestLatency;
1083 
1084         Vector<int32_t>    mSessionParamKeys;
1085         CameraMetadata     mLatestSessionParams;
1086 
1087         std::map<int32_t, std::set<String8>> mGroupIdPhysicalCameraMap;
1088 
1089         const bool         mUseHalBufManager;
1090         const bool         mSupportCameraMute;
1091     };
1092     sp<RequestThread> mRequestThread;
1093 
1094     /**
1095      * In-flight queue for tracking completion of capture requests.
1096      */
1097     std::mutex                    mInFlightLock;
1098     camera3::InFlightRequestMap   mInFlightMap;
1099     nsecs_t                       mExpectedInflightDuration = 0;
1100     int64_t                       mLastCompletedRegularFrameNumber = -1;
1101     int64_t                       mLastCompletedReprocessFrameNumber = -1;
1102     int64_t                       mLastCompletedZslFrameNumber = -1;
1103     // End of mInFlightLock protection scope
1104 
1105     int mInFlightStatusId; // const after initialize
1106 
1107     status_t registerInFlight(uint32_t frameNumber,
1108             int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput,
1109             bool callback, nsecs_t maxExpectedDuration,
1110             const std::set<std::set<String8>>& physicalCameraIds,
1111             bool isStillCapture, bool isZslCapture, bool rotateAndCropAuto,
1112             const std::set<std::string>& cameraIdsWithZoom, const SurfaceMap& outputSurfaces,
1113             nsecs_t requestTimeNs);
1114 
1115     /**
1116      * Tracking for idle detection
1117      */
1118     sp<camera3::StatusTracker> mStatusTracker;
1119 
1120     /**
1121      * Graphic buffer manager for output streams. Each device has a buffer manager, which is used
1122      * by the output streams to get and return buffers if these streams are registered to this
1123      * buffer manager.
1124      */
1125     sp<camera3::Camera3BufferManager> mBufferManager;
1126 
1127     /**
1128      * Thread for preparing streams
1129      */
1130     class PreparerThread : private Thread, public virtual RefBase {
1131       public:
1132         PreparerThread();
1133         ~PreparerThread();
1134 
1135         void setNotificationListener(wp<NotificationListener> listener);
1136 
1137         /**
1138          * Queue up a stream to be prepared. Streams are processed by a background thread in FIFO
1139          * order.  Pre-allocate up to maxCount buffers for the stream, or the maximum number needed
1140          * for the pipeline if maxCount is ALLOCATE_PIPELINE_MAX.
1141          */
1142         status_t prepare(int maxCount, sp<camera3::Camera3StreamInterface>& stream);
1143 
1144         /**
1145          * Cancel all current and pending stream preparation
1146          */
1147         status_t clear();
1148 
1149         /**
1150          * Pause all preparation activities
1151          */
1152         void pause();
1153 
1154         /**
1155          * Resume preparation activities
1156          */
1157         status_t resume();
1158 
1159       private:
1160         Mutex mLock;
1161         Condition mThreadActiveSignal;
1162 
1163         virtual bool threadLoop();
1164 
1165         // Guarded by mLock
1166 
1167         wp<NotificationListener> mListener;
1168         std::unordered_map<int, sp<camera3::Camera3StreamInterface> > mPendingStreams;
1169         bool mActive;
1170         bool mCancelNow;
1171 
1172         // Only accessed by threadLoop and the destructor
1173 
1174         sp<camera3::Camera3StreamInterface> mCurrentStream;
1175         int mCurrentMaxCount;
1176         bool mCurrentPrepareComplete;
1177     };
1178     sp<PreparerThread> mPreparerThread;
1179 
1180     /**
1181      * Output result queue and current HAL device 3A state
1182      */
1183 
1184     // Lock for output side of device
1185     std::mutex             mOutputLock;
1186 
1187     /**** Scope for mOutputLock ****/
1188     // the minimal frame number of the next non-reprocess result
1189     uint32_t               mNextResultFrameNumber;
1190     // the minimal frame number of the next reprocess result
1191     uint32_t               mNextReprocessResultFrameNumber;
1192     // the minimal frame number of the next ZSL still capture result
1193     uint32_t               mNextZslStillResultFrameNumber;
1194     // the minimal frame number of the next non-reprocess shutter
1195     uint32_t               mNextShutterFrameNumber;
1196     // the minimal frame number of the next reprocess shutter
1197     uint32_t               mNextReprocessShutterFrameNumber;
1198     // the minimal frame number of the next ZSL still capture shutter
1199     uint32_t               mNextZslStillShutterFrameNumber;
1200     std::list<CaptureResult>    mResultQueue;
1201     std::condition_variable  mResultSignal;
1202     wp<NotificationListener> mListener;
1203 
1204     /**** End scope for mOutputLock ****/
1205 
1206     /**** Scope for mInFlightLock ****/
1207 
1208     // Remove the in-flight map entry of the given index from mInFlightMap.
1209     // It must only be called with mInFlightLock held.
1210     void removeInFlightMapEntryLocked(int idx);
1211 
1212     // Remove all in-flight requests and return all buffers.
1213     // This is used after HAL interface is closed to cleanup any request/buffers
1214     // not returned by HAL.
1215     void flushInflightRequests();
1216 
1217     /**** End scope for mInFlightLock ****/
1218 
1219     /**
1220      * Distortion correction support
1221      */
1222     // Map from camera IDs to its corresponding distortion mapper. Only contains
1223     // 1 ID if the device isn't a logical multi-camera. Otherwise contains both
1224     // logical camera and its physical subcameras.
1225     std::unordered_map<std::string, camera3::DistortionMapper> mDistortionMappers;
1226 
1227     /**
1228      * Zoom ratio mapper support
1229      */
1230     std::unordered_map<std::string, camera3::ZoomRatioMapper> mZoomRatioMappers;
1231 
1232     /**
1233      * UHR request crop / metering region mapper support
1234      */
1235     std::unordered_map<std::string, camera3::UHRCropAndMeteringRegionMapper>
1236             mUHRCropAndMeteringRegionMappers;
1237 
1238     /**
1239      * RotateAndCrop mapper support
1240      */
1241     std::unordered_map<std::string, camera3::RotateAndCropMapper> mRotateAndCropMappers;
1242 
1243     // Debug tracker for metadata tag value changes
1244     // - Enabled with the -m <taglist> option to dumpsys, such as
1245     //   dumpsys -m android.control.aeState,android.control.aeMode
1246     // - Disabled with -m off
1247     // - dumpsys -m 3a is a shortcut for ae/af/awbMode, State, and Triggers
1248     TagMonitor mTagMonitor;
1249 
1250     void monitorMetadata(TagMonitor::eventSource source, int64_t frameNumber,
1251             nsecs_t timestamp, const CameraMetadata& metadata,
1252             const std::unordered_map<std::string, CameraMetadata>& physicalMetadata);
1253 
1254     metadata_vendor_id_t mVendorTagId;
1255 
1256     // Cached last requested template id
1257     int mLastTemplateId;
1258 
1259     // Synchronizes access to status tracker between inflight updates and disconnect.
1260     // b/79972865
1261     Mutex mTrackerLock;
1262 
1263     // Whether HAL request buffers through requestStreamBuffers API
1264     bool mUseHalBufManager = false;
1265 
1266     // Lock to ensure requestStreamBuffers() callbacks are serialized
1267     std::mutex mRequestBufferInterfaceLock;
1268 
1269     // The state machine to control when requestStreamBuffers should allow
1270     // HAL to request buffers.
1271     enum RequestBufferState {
1272         /**
1273          * This is the initial state.
1274          * requestStreamBuffers call will return FAILED_CONFIGURING in this state.
1275          * Will switch to RB_STATUS_READY after a successful configureStreams or
1276          * processCaptureRequest call.
1277          */
1278         RB_STATUS_STOPPED,
1279 
1280         /**
1281          * requestStreamBuffers call will proceed in this state.
1282          * When device is asked to stay idle via waitUntilStateThenRelock() call:
1283          *     - Switch to RB_STATUS_STOPPED if there is no inflight requests and
1284          *       request thread is paused.
1285          *     - Switch to RB_STATUS_PENDING_STOP otherwise
1286          */
1287         RB_STATUS_READY,
1288 
1289         /**
1290          * requestStreamBuffers call will proceed in this state.
1291          * Switch to RB_STATUS_STOPPED when all inflight requests are fulfilled
1292          * and request thread is paused
1293          */
1294         RB_STATUS_PENDING_STOP,
1295     };
1296 
1297     class RequestBufferStateMachine {
1298       public:
1299         status_t initialize(sp<camera3::StatusTracker> statusTracker);
1300 
1301         // Return if the state machine currently allows for requestBuffers
1302         // If the state allows for it, mRequestBufferOngoing will be set to true
1303         // and caller must call endRequestBuffer() later to unset the flag
1304         bool startRequestBuffer();
1305         void endRequestBuffer();
1306 
1307         // Events triggered by application API call
1308         void onStreamsConfigured();
1309         void onWaitUntilIdle();
1310 
1311         // Events usually triggered by hwBinder processCaptureResult callback thread
1312         // But can also be triggered on request thread for failed request, or on
1313         // hwbinder notify callback thread for shutter/error callbacks
1314         void onInflightMapEmpty();
1315 
1316         // Events triggered by RequestThread
1317         void onSubmittingRequest();
1318         void onRequestThreadPaused();
1319 
1320         // Events triggered by successful switchToOffline call
1321         // Return true is there is no ongoing requestBuffer call.
1322         bool onSwitchToOfflineSuccess();
1323 
1324       private:
1325         void notifyTrackerLocked(bool active);
1326 
1327         // Switch to STOPPED state and return true if all conditions allows for it.
1328         // Otherwise do nothing and return false.
1329         bool checkSwitchToStopLocked();
1330 
1331         std::mutex mLock;
1332         RequestBufferState mStatus = RB_STATUS_STOPPED;
1333 
1334         bool mRequestThreadPaused = true;
1335         bool mInflightMapEmpty = true;
1336         bool mRequestBufferOngoing = false;
1337         bool mSwitchedToOffline = false;
1338 
1339         wp<camera3::StatusTracker> mStatusTracker;
1340         int  mRequestBufferStatusId;
1341     } mRequestBufferSM;
1342 
1343     // Fix up result metadata for monochrome camera.
1344     bool mNeedFixupMonochromeTags;
1345 
1346     // Whether HAL supports offline processing capability.
1347     bool mSupportOfflineProcessing = false;
1348 
1349     // Whether the HAL supports camera muting via test pattern
1350     bool mSupportCameraMute = false;
1351     // Whether the HAL supports SOLID_COLOR or BLACK if mSupportCameraMute is true
1352     bool mSupportTestPatternSolidColor = false;
1353 
1354     // Whether the camera framework overrides the device characteristics for
1355     // performance class.
1356     bool mOverrideForPerfClass;
1357 
1358     // Injection camera related methods.
1359     class Camera3DeviceInjectionMethods : public virtual RefBase {
1360       public:
1361         Camera3DeviceInjectionMethods(wp<Camera3Device> parent);
1362 
1363         ~Camera3DeviceInjectionMethods();
1364 
1365         // Initialize the injection camera and generate an hal interface.
1366         status_t injectionInitialize(
1367                 const String8& injectedCamId, sp<CameraProviderManager> manager,
1368                 const sp<
1369                     android::hardware::camera::device::V3_2 ::ICameraDeviceCallback>&
1370                     callback);
1371 
1372         // Injection camera will replace the internal camera and configure streams
1373         // when device is IDLE and request thread is paused.
1374         status_t injectCamera(
1375                 camera3::camera_stream_configuration& injectionConfig,
1376                 std::vector<uint32_t>& injectionBufferSizes);
1377 
1378         // Stop the injection camera and switch back to backup hal interface.
1379         status_t stopInjection();
1380 
1381         bool isInjecting();
1382 
1383         const String8& getInjectedCamId() const;
1384 
1385         void getInjectionConfig(/*out*/ camera3::camera_stream_configuration* injectionConfig,
1386                 /*out*/ std::vector<uint32_t>* injectionBufferSizes);
1387 
1388       private:
1389         // Configure the streams of injection camera, it need wait until the
1390         // output streams are created and configured to the original camera before
1391         // proceeding.
1392         status_t injectionConfigureStreams(
1393                 camera3::camera_stream_configuration& injectionConfig,
1394                 std::vector<uint32_t>& injectionBufferSizes);
1395 
1396         // Disconnect the injection camera and delete the hal interface.
1397         void injectionDisconnectImpl();
1398 
1399         // Use injection camera hal interface to replace and backup original
1400         // camera hal interface.
1401         status_t replaceHalInterface(sp<HalInterface> newHalInterface,
1402                 bool keepBackup);
1403 
1404         wp<Camera3Device> mParent;
1405 
1406         // Backup of the original camera hal interface.
1407         sp<HalInterface> mBackupHalInterface;
1408 
1409         // Generated injection camera hal interface.
1410         sp<HalInterface> mInjectedCamHalInterface;
1411 
1412         // Copy the configuration of the internal camera.
1413         camera3::camera_stream_configuration mInjectionConfig;
1414 
1415         // Copy the bufferSizes of the output streams of the internal camera.
1416         std::vector<uint32_t> mInjectionBufferSizes;
1417 
1418         // Synchronizes access to injection camera between initialize and
1419         // disconnect.
1420         Mutex mInjectionLock;
1421 
1422         // The injection camera ID.
1423         String8 mInjectedCamId;
1424     };
1425     sp<Camera3DeviceInjectionMethods> mInjectionMethods;
1426 
1427 }; // class Camera3Device
1428 
1429 }; // namespace android
1430 
1431 #endif
1432