#ifndef LCAMERA_BUFF_YUV_CHANNEL_STIMULUS_BUFFER_H
#define LCAMERA_BUFF_YUV_CHANNEL_STIMULUS_BUFFER_H

#include <config.h>
#include <user/deviceAttachmentSpec.h>
#include <user/stagingBuffer.h>
#include <user/stimulusBuffer.h>
#include <pixelAndColorFormatDecisions.h>
#define CL_TARGET_OPENCL_VERSION 120
#include <CL/cl.h>
#include <unistd.h>

namespace smo {
namespace stim_buff {
namespace lcamera_buff {

class YuvStimProducer;

StagingBuffer::IOEngineConstraints yuvChannelStagingInputConstraints(
	size_t channelByteSize);

/**
 * Channel stimbuff placeholder for Stage 2 setup-only attach. Uses mmap-backed
 * StagingBuffer sized for deinterleaved Y/U/V component storage.
 */
class YuvChannelStimulusBuffer
:	public StimulusBuffer
{
public:
	static YuvChannelKind yuvChannelKindFromQualeIfaceApi(
		const std::string& qualeIfaceApi);

	YuvChannelStimulusBuffer(
		StimulusProducer& parent,
		const std::shared_ptr<device::DeviceAttachmentSpec>& deviceAttachmentSpec,
		int histbuffMs,
		YuvChannelKind channelKind,
		size_t channelByteSize,
		const SmoCallbacks& callbacks,
		cl_mem_flags flags);

public:
	YuvChannelKind channelKind;
	size_t channelByteSize;
};

} // namespace lcamera_buff
} // namespace stim_buff
} // namespace smo

#endif // LCAMERA_BUFF_YUV_CHANNEL_STIMULUS_BUFFER_H
