Add threading to camera.
Camera now has special synchronized threads to enqueue
buffers and dequeue buffers.
BUG: 29334616
TEST: manually tested with test app
Change-Id: Ibce14cd6b269c4d26403534b3f7985914263bf2b
diff --git a/modules/camera/3_4/v4l2_camera.h b/modules/camera/3_4/v4l2_camera.h
index d299b9f..29583b0 100644
--- a/modules/camera/3_4/v4l2_camera.h
+++ b/modules/camera/3_4/v4l2_camera.h
@@ -20,10 +20,13 @@
#define V4L2_CAMERA_HAL_V4L2_CAMERA_H_
#include <array>
+#include <condition_variable>
#include <queue>
#include <string>
#include <camera/CameraMetadata.h>
+#include <utils/StrongPointer.h>
+#include <utils/Thread.h>
#include "camera.h"
#include "common.h"
@@ -78,13 +81,16 @@
int enqueueRequest(
std::shared_ptr<default_camera_hal::CaptureRequest> request) override;
- // Async request processing.
+ // Async request processing helpers.
// Dequeue a request from the waiting queue.
+ // Blocks until a request is available.
std::shared_ptr<default_camera_hal::CaptureRequest> dequeueRequest();
+
+ // Thread functions. Return true to loop, false to exit.
// Pass buffers for enqueued requests to the device.
- void enqueueRequestBuffers();
+ bool enqueueRequestBuffers();
// Retreive buffers from the device.
- void dequeueRequestBuffers();
+ bool dequeueRequestBuffers();
// V4L2 helper.
std::shared_ptr<V4L2Wrapper> device_;
@@ -95,6 +101,11 @@
request_queue_;
std::mutex in_flight_lock_;
std::queue<std::shared_ptr<default_camera_hal::CaptureRequest>> in_flight_;
+ // Threads require holding an Android strong pointer.
+ android::sp<android::Thread> buffer_enqueuer_;
+ android::sp<android::Thread> buffer_dequeuer_;
+ std::condition_variable requests_available_;
+ std::condition_variable buffers_in_flight_;
int32_t max_input_streams_;
std::array<int, 3> max_output_streams_; // {raw, non-stalling, stalling}.
@@ -104,4 +115,4 @@
} // namespace v4l2_camera_hal
-#endif // V4L2_CAMERA_HAL_V4L2_CAMERA_H
+#endif // V4L2_CAMERA_HAL_V4L2_CAMERA_H_