diff options
Diffstat (limited to 'src/android/camera_stream.cpp')
-rw-r--r-- | src/android/camera_stream.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp index f899be4f..eac14805 100644 --- a/src/android/camera_stream.cpp +++ b/src/android/camera_stream.cpp @@ -26,6 +26,11 @@ CameraStream::CameraStream(CameraDevice *cameraDevice, Type type, if (type_ == Type::Internal || type_ == Type::Mapped) encoder_ = std::make_unique<EncoderLibJpeg>(); + + if (type == Type::Internal) { + allocator_ = std::make_unique<FrameBufferAllocator>(cameraDevice_->camera()); + mutex_ = std::make_unique<std::mutex>(); + } } const StreamConfiguration &CameraStream::configuration() const @@ -46,6 +51,16 @@ int CameraStream::configure() return ret; } + if (allocator_) { + int ret = allocator_->allocate(stream()); + if (ret < 0) + return ret; + + /* Save a pointer to the reserved frame buffers */ + for (const auto &frameBuffer : allocator_->buffers(stream())) + buffers_.push_back(frameBuffer.get()); + } + camera3Stream_->max_buffers = configuration().bufferCount; return 0; @@ -109,3 +124,31 @@ int CameraStream::process(const libcamera::FrameBuffer &source, 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); +} |