[libcamera-devel] [PATCH 12/15] android: camera_stream: Add methods to get/put buffers
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Oct 6 14:45:46 CEST 2020
Hi Jacopo,
On 05/10/2020 13:32, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Mon, Oct 05, 2020 at 01:46:46PM +0300, Laurent Pinchart wrote:
>> 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.
>
> You may want to explain in the commit message that you're actually
> creating a pool of buffers, and what it is used for.
>
>> 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();
>
> I'd embed this in the class.
Agreed.
Or - as it only protects the BufferPool - we could bring back a class
BufferPool(), and have it in there with the allocate/get/put interface ...
</me misses his BufferPool :D >
I digress - A full BufferPool object/interface isn't needed right now ;-)
Anyway, with the mutex as part of the class instead of allocated.
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
>> + }
>> }
>>
>> 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
--
Kieran
More information about the libcamera-devel
mailing list