Camera: Detect session parameter updates and re-configure camera
Camera clients are allowed to change session parameters during
active session, however some camera devices might not be able
to apply them without additional stream configuration. To resolve
this, detect whether any of the available session parameter changes
in the queued requests and re-configure the camera before trying
to apply it.
Bug: 64450664
Test: Manual, Camera CTS
Change-Id: I005d6b7d6c6b27d4b5bac4b0d0809c7c019af9a4
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index cc7eb35..8e7f2e0 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -552,11 +552,23 @@
const SurfaceMap &surfaceMap);
/**
+ * Internally re-configure camera device using new session parameters.
+ * This will get triggered by the request thread.
+ */
+ bool reconfigureCamera(const CameraMetadata& sessionParams);
+
+ /**
+ * Filter stream session parameters and configure camera HAL.
+ */
+ status_t filterParamsAndConfigureLocked(const CameraMetadata& sessionParams,
+ int operatingMode);
+
+ /**
* Take the currently-defined set of streams and configure the HAL to use
* them. This is a long-running operation (may be several hundered ms).
*/
status_t configureStreamsLocked(int operatingMode,
- const CameraMetadata& sessionParams);
+ const CameraMetadata& sessionParams, bool notifyRequestThread = true);
/**
* Cancel stream configuration that did not finish successfully.
@@ -655,7 +667,7 @@
RequestThread(wp<Camera3Device> parent,
sp<camera3::StatusTracker> statusTracker,
- sp<HalInterface> interface);
+ sp<HalInterface> interface, const Vector<int32_t>& sessionParamKeys);
~RequestThread();
void setNotificationListener(wp<NotificationListener> listener);
@@ -663,7 +675,8 @@
/**
* Call after stream (re)-configuration is completed.
*/
- void configurationComplete(bool isConstrainedHighSpeed);
+ void configurationComplete(bool isConstrainedHighSpeed,
+ const CameraMetadata& sessionParams);
/**
* Set or clear the list of repeating requests. Does not block
@@ -812,6 +825,12 @@
// Calculate the expected maximum duration for a request
nsecs_t calculateMaxExpectedDuration(const camera_metadata_t *request);
+ // Check and update latest session parameters based on the current request settings.
+ bool updateSessionParameters(const CameraMetadata& settings);
+
+ // Re-configure camera using the latest session parameters.
+ bool reconfigureCamera();
+
wp<Camera3Device> mParent;
wp<camera3::StatusTracker> mStatusTracker;
sp<HalInterface> mInterface;
@@ -869,6 +888,9 @@
static const int32_t kRequestLatencyBinSize = 40; // in ms
CameraLatencyHistogram mRequestLatency;
+
+ Vector<int32_t> mSessionParamKeys;
+ CameraMetadata mLatestSessionParams;
};
sp<RequestThread> mRequestThread;
@@ -1006,21 +1028,34 @@
*/
status_t clear();
+ /**
+ * Pause all preparation activities
+ */
+ void pause();
+
+ /**
+ * Resume preparation activities
+ */
+ status_t resume();
+
private:
Mutex mLock;
+ Condition mThreadActiveSignal;
virtual bool threadLoop();
// Guarded by mLock
wp<NotificationListener> mListener;
- List<sp<camera3::Camera3StreamInterface> > mPendingStreams;
+ std::unordered_map<int, sp<camera3::Camera3StreamInterface> > mPendingStreams;
bool mActive;
bool mCancelNow;
// Only accessed by threadLoop and the destructor
sp<camera3::Camera3StreamInterface> mCurrentStream;
+ int mCurrentMaxCount;
+ bool mCurrentPrepareComplete;
};
sp<PreparerThread> mPreparerThread;