diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h index 620f8a66f..e0af00900 100644 --- a/include/libcamera/buffer.h +++ b/include/libcamera/buffer.h @@ -53,6 +53,8 @@ public: unsigned int cookie() const { return cookie_; } void setCookie(unsigned int cookie) { cookie_ = cookie; } + void cancel() { metadata_.status = FrameMetadata::FrameCancelled; } + private: LIBCAMERA_DISABLE_COPY_AND_MOVE(FrameBuffer) diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp index 75b269328..7635226b9 100644 --- a/src/libcamera/buffer.cpp +++ b/src/libcamera/buffer.cpp @@ -226,6 +226,14 @@ FrameBuffer::FrameBuffer(const std::vector &planes, unsigned int cookie) * core never modifies the buffer cookie. */ +/** + * \fn FrameBuffer::cancel() + * \brief Marks the buffer as cancelled + * + * If a buffer is not used by a request, it shall be marked as cancelled to + * indicate that the metadata is invalid. + */ + /** * \class MappedBuffer * \brief Provide an interface to support managing memory mapped buffers diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 51446fcf5..73306cea6 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -1257,8 +1257,11 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer) /* If the buffer is cancelled force a complete of the whole request. */ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { - for (auto it : request->buffers()) - pipe_->completeBuffer(request, it.second); + for (auto it : request->buffers()) { + FrameBuffer *b = it.second; + b->cancel(); + pipe_->completeBuffer(request, b); + } frameInfos_.remove(info); pipe_->completeRequest(request);