/* 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
 */