[libcamera-devel] [PATCH 12/15] android: camera_stream: Add methods to get/put buffers
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Oct 5 12:46:46 CEST 2020
From: Jacopo Mondi <jacopo at jmondi.org>
Add two methods to the CameraStream class to get and put FrameBuffer
pointers from the pool of allocated buffers.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/android/camera_stream.cpp | 35 +++++++++++++++++++++++++++++++++--
src/android/camera_stream.h | 4 ++++
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
index dbde1e786300..c4b727eee63e 100644
--- a/src/android/camera_stream.cpp
+++ b/src/android/camera_stream.cpp
@@ -19,21 +19,24 @@ LOG_DECLARE_CATEGORY(HAL);
CameraStream::CameraStream(CameraDevice *cameraDev, Type type,
camera3_stream_t *androidStream, unsigned int index)
: cameraDevice_(cameraDev), type_(type), androidStream_(androidStream),
- index_(index), encoder_(nullptr), allocator_(nullptr)
+ index_(index), encoder_(nullptr), allocator_(nullptr), mutex_(nullptr)
{
config_ = cameraDevice_->cameraConfiguration();
if (type_ == Type::Internal || type_ == Type::Mapped)
encoder_ = new EncoderLibJpeg();
- if (type == Type::Internal)
+ if (type == Type::Internal) {
allocator_ = new FrameBufferAllocator(cameraDevice_->camera());
+ mutex_ = new std::mutex();
+ }
}
CameraStream::~CameraStream()
{
delete encoder_;
delete allocator_;
+ delete mutex_;
}
const StreamConfiguration &CameraStream::streamConfiguration() const
@@ -135,3 +138,31 @@ int CameraStream::process(libcamera::FrameBuffer *source, MappedCamera3Buffer *d
return 0;
}
+
+FrameBuffer *CameraStream::getBuffer()
+{
+ if (!allocator_)
+ return nullptr;
+
+ std::lock_guard<std::mutex> locker(*mutex_);
+
+ if (buffers_.empty()) {
+ LOG(HAL, Error) << "Buffer underrun";
+ return nullptr;
+ }
+
+ FrameBuffer *buffer = buffers_.back();
+ buffers_.pop_back();
+
+ return buffer;
+}
+
+void CameraStream::putBuffer(libcamera::FrameBuffer *buffer)
+{
+ if (!allocator_)
+ return;
+
+ std::lock_guard<std::mutex> locker(*mutex_);
+
+ buffers_.push_back(buffer);
+}
diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
index c6ff79230b7e..b79a97606c60 100644
--- a/src/android/camera_stream.h
+++ b/src/android/camera_stream.h
@@ -8,6 +8,7 @@
#define __ANDROID_CAMERA_STREAM_H__
#include <memory>
+#include <mutex>
#include <vector>
#include <hardware/camera3.h>
@@ -127,6 +128,8 @@ public:
int process(libcamera::FrameBuffer *source,
MappedCamera3Buffer *dest,
CameraMetadata *metadata);
+ libcamera::FrameBuffer *getBuffer();
+ void putBuffer(libcamera::FrameBuffer *buffer);
private:
CameraDevice *cameraDevice_;
@@ -143,6 +146,7 @@ private:
Encoder *encoder_;
libcamera::FrameBufferAllocator *allocator_;
std::vector<libcamera::FrameBuffer *> buffers_;
+ std::mutex *mutex_;
};
#endif /* __ANDROID_CAMERA_STREAM__ */
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list