cam: Add FrameSink base class
The FrameSink class serves as a base to implement components that consume frames. This allows handling frame sinks in a generic way, independent of their nature. The BufferWrite class will be ported to FrameSink in a second step. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
This commit is contained in:
parent
cb45af8a9e
commit
f929a2890c
3 changed files with 102 additions and 0 deletions
67
src/cam/frame_sink.cpp
Normal file
67
src/cam/frame_sink.cpp
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021, Ideas on Board Oy
|
||||||
|
*
|
||||||
|
* frame_sink.cpp - Base Frame Sink Class
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "frame_sink.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \class FrameSink
|
||||||
|
* \brief Abstract class to model a consumer of frames
|
||||||
|
*
|
||||||
|
* The FrameSink class models the consumer that processes frames after a request
|
||||||
|
* completes. It receives requests through processRequest(), and processes them
|
||||||
|
* synchronously or asynchronously. This allows frame sinks to hold onto frames
|
||||||
|
* for an extended period of time, for instance to display them until a new
|
||||||
|
* frame arrives.
|
||||||
|
*
|
||||||
|
* A frame sink processes whole requests, and is solely responsible for deciding
|
||||||
|
* how to handle different frame buffers in case multiple streams are captured.
|
||||||
|
*/
|
||||||
|
|
||||||
|
FrameSink::~FrameSink()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int FrameSink::configure([[maybe_unused]] const libcamera::CameraConfiguration &config)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameSink::mapBuffer([[maybe_unused]] libcamera::FrameBuffer *buffer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int FrameSink::start()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FrameSink::stop()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \fn FrameSink::processRequest()
|
||||||
|
* \param[in] request The request
|
||||||
|
*
|
||||||
|
* This function is called to instruct the sink to process a request. The sink
|
||||||
|
* may process the request synchronously or queue it for asynchronous
|
||||||
|
* processing.
|
||||||
|
*
|
||||||
|
* When the request is processed synchronously, this function shall return true.
|
||||||
|
* The \a request shall not be accessed by the FrameSink after the function
|
||||||
|
* returns.
|
||||||
|
*
|
||||||
|
* When the request is processed asynchronously, the FrameSink temporarily takes
|
||||||
|
* ownership of the \a request. The function shall return false, and the
|
||||||
|
* FrameSink shall emit the requestProcessed signal when the request processing
|
||||||
|
* completes. If the stop() function is called before the request processing
|
||||||
|
* completes, it shall release the request synchronously.
|
||||||
|
*
|
||||||
|
* \return True if the request has been processed synchronously, false if
|
||||||
|
* processing has been queued
|
||||||
|
*/
|
34
src/cam/frame_sink.h
Normal file
34
src/cam/frame_sink.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021, Ideas on Board Oy
|
||||||
|
*
|
||||||
|
* frame_sink.h - Base Frame Sink Class
|
||||||
|
*/
|
||||||
|
#ifndef __CAM_FRAME_SINK_H__
|
||||||
|
#define __CAM_FRAME_SINK_H__
|
||||||
|
|
||||||
|
#include <libcamera/base/signal.h>
|
||||||
|
|
||||||
|
namespace libcamera {
|
||||||
|
class CameraConfiguration;
|
||||||
|
class FrameBuffer;
|
||||||
|
class Request;
|
||||||
|
} /* namespace libcamera */
|
||||||
|
|
||||||
|
class FrameSink
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~FrameSink();
|
||||||
|
|
||||||
|
virtual int configure(const libcamera::CameraConfiguration &config);
|
||||||
|
|
||||||
|
virtual void mapBuffer(libcamera::FrameBuffer *buffer);
|
||||||
|
|
||||||
|
virtual int start();
|
||||||
|
virtual int stop();
|
||||||
|
|
||||||
|
virtual bool processRequest(libcamera::Request *request) = 0;
|
||||||
|
libcamera::Signal<libcamera::Request *> requestProcessed;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __CAM_FRAME_SINK_H__ */
|
|
@ -13,6 +13,7 @@ cam_sources = files([
|
||||||
'buffer_writer.cpp',
|
'buffer_writer.cpp',
|
||||||
'camera_session.cpp',
|
'camera_session.cpp',
|
||||||
'event_loop.cpp',
|
'event_loop.cpp',
|
||||||
|
'frame_sink.cpp',
|
||||||
'main.cpp',
|
'main.cpp',
|
||||||
'options.cpp',
|
'options.cpp',
|
||||||
'stream_options.cpp',
|
'stream_options.cpp',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue