#ifndef LCAMERA_BUFF_PIXEL_AND_COLOR_FORMAT_DECISIONS_H
#define LCAMERA_BUFF_PIXEL_AND_COLOR_FORMAT_DECISIONS_H

#include <cameraModeRequest.h>
#include <cstddef>

/**
 * Y/U/V channel sizing for lcameraBuff.
 *
 * lcameraBuff exports three quale ifaces (colour-yuv-y/u/v), each backed by a
 * separate deinterleaved channel buffer. libcamera, however, negotiates a single
 * configured pixel format (YUYV, NV12, YUV420, etc.) that may be packed or
 * multi-plane. This module bridges that gap at attach time: it classifies the
 * configured fourcc into a chroma subsampling family (420 / 422 / 444) and
 * computes how many bytes each deinterleaved Y, U, or V plane needs for the
 * negotiated width and height.
 *
 * What it provides to the stimbuff:
 * - YuvChromaSubsampling on YuvStimProducer (derived from configured mode)
 * - channelByteSize for each YuvChannelStimulusBuffer / StagingBuffer mmap
 *
 * Capture layout (packed vs planar, direct vs deinterleaved backing) is handled
 * separately by yuvCaptureLayout.h; this module is only plane geometry and
 * byte counts. Future capture/deinterleave stages must write into buffers sized
 * by these functions.
 */

namespace smo {
namespace stim_buff {
namespace lcamera_buff {

enum class YuvChannelKind
{
	Y,
	U,
	V,
};

enum class YuvChromaSubsampling
{
	Yuv420,
	Yuv422,
	Yuv444,
};

YuvChromaSubsampling classifyYuvChromaSubsampling(
	const lcamera_dev::LcameraDevConfiguredCameraMode& configuredMode);

size_t computeDeinterleavedChannelByteSize(
	YuvChannelKind channel,
	unsigned width,
	unsigned height,
	YuvChromaSubsampling subsampling);

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

#endif // LCAMERA_BUFF_PIXEL_AND_COLOR_FORMAT_DECISIONS_H
