Files
external_libcamera/include/libcamera/framebuffer.h
Laurent Pinchart 78875938e9 libcamera: framebuffer: Move planes check to constructor
The FrameBuffer::planes() function checks that planes are correctly
initialized with an offset. This can be done at construction time
instead, as the planes are constant. The backtrace generated by the
assertion will show where the faulty frame buffer is created instead of
where it is used, easing debugging.

As the runtime overhead is reduced, there's no real need to drop the
assertion in the future anymore, it can be useful to ensure that the
planes are correctly populated by the caller. Drop the comment that
calls for removing the check.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
2021-09-07 19:18:08 +03:00

78 lines
1.6 KiB
C++

/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* framebuffer.h - Frame buffer handling
*/
#ifndef __LIBCAMERA_FRAMEBUFFER_H__
#define __LIBCAMERA_FRAMEBUFFER_H__
#include <assert.h>
#include <limits>
#include <stdint.h>
#include <vector>
#include <libcamera/base/class.h>
#include <libcamera/file_descriptor.h>
namespace libcamera {
class Request;
struct FrameMetadata {
enum Status {
FrameSuccess,
FrameError,
FrameCancelled,
};
struct Plane {
unsigned int bytesused;
};
Status status;
unsigned int sequence;
uint64_t timestamp;
std::vector<Plane> planes;
};
class FrameBuffer final : public Extensible
{
LIBCAMERA_DECLARE_PRIVATE()
public:
struct Plane {
static constexpr unsigned int kInvalidOffset = std::numeric_limits<unsigned int>::max();
FileDescriptor fd;
unsigned int offset = kInvalidOffset;
unsigned int length;
};
FrameBuffer(const std::vector<Plane> &planes, unsigned int cookie = 0);
const std::vector<Plane> &planes() const { return planes_; }
Request *request() const;
const FrameMetadata &metadata() const { return metadata_; }
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)
friend class V4L2VideoDevice; /* Needed to update metadata_. */
std::vector<Plane> planes_;
FrameMetadata metadata_;
unsigned int cookie_;
};
} /* namespace libcamera */
#endif /* __LIBCAMERA_FRAMEBUFFER_H__ */