/* Simple Plugin API
 *
 * Copyright © 2018 Wim Taymans
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef SPA_VIDEO_COLOR_H
#define SPA_VIDEO_COLOR_H

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \addtogroup spa_param
 * \{
 */

/**
 * Possible color range values. These constants are defined for 8 bit color
 * values and can be scaled for other bit depths.
 */
enum spa_video_color_range {
	SPA_VIDEO_COLOR_RANGE_UNKNOWN = 0,	/**< unknown range */
	SPA_VIDEO_COLOR_RANGE_0_255,		/**< [0..255] for 8 bit components */
	SPA_VIDEO_COLOR_RANGE_16_235		/**< [16..235] for 8 bit components. Chroma has
						     [16..240] range. */
};

/**
 * The color matrix is used to convert between Y'PbPr and
 * non-linear RGB (R'G'B')
 */
enum spa_video_color_matrix {
	SPA_VIDEO_COLOR_MATRIX_UNKNOWN = 0,	/**< unknown matrix */
	SPA_VIDEO_COLOR_MATRIX_RGB,		/**< identity matrix */
	SPA_VIDEO_COLOR_MATRIX_FCC,		/**< FCC color matrix */
	SPA_VIDEO_COLOR_MATRIX_BT709,		/**< ITU BT.709 color matrix */
	SPA_VIDEO_COLOR_MATRIX_BT601,		/**< ITU BT.601 color matrix */
	SPA_VIDEO_COLOR_MATRIX_SMPTE240M,	/**< SMTPE  240M color matrix */
	SPA_VIDEO_COLOR_MATRIX_BT2020,		/**<  ITU-R BT.2020 color matrix. since 1.6. */
};

/**
 * The video transfer function defines the formula for converting between
 * non-linear RGB (R'G'B') and linear RGB
 */
enum spa_video_transfer_function {
	SPA_VIDEO_TRANSFER_UNKNOWN = 0,	/**< unknown transfer function */
	SPA_VIDEO_TRANSFER_GAMMA10,	/**< linear RGB, gamma 1.0 curve */
	SPA_VIDEO_TRANSFER_GAMMA18,	/**< Gamma 1.8 curve */
	SPA_VIDEO_TRANSFER_GAMMA20,	/**< Gamma 2.0 curve */
	SPA_VIDEO_TRANSFER_GAMMA22,	/**< Gamma 2.2 curve */
	SPA_VIDEO_TRANSFER_BT709,	/**< Gamma 2.2 curve with a linear segment in the lower range */
	SPA_VIDEO_TRANSFER_SMPTE240M,	/**< Gamma 2.2 curve with a linear segment in the lower range */
	SPA_VIDEO_TRANSFER_SRGB,	/**< Gamma 2.4 curve with a linear segment in the lower range */
	SPA_VIDEO_TRANSFER_GAMMA28,	/**< Gamma 2.8 curve */
	SPA_VIDEO_TRANSFER_LOG100,	/**< Logarithmic transfer characteristic 100:1 range */
	SPA_VIDEO_TRANSFER_LOG316,	/**< Logarithmic transfer characteristic 316.22777:1 range */
	SPA_VIDEO_TRANSFER_BT2020_12,	/**< Gamma 2.2 curve with a linear segment in the lower
					 *   range. Used for BT.2020 with 12 bits per
					 *   component. \since 1.6. */
	SPA_VIDEO_TRANSFER_ADOBERGB,	/**< Gamma 2.19921875. \since 1.8 */
};

/**
 * The color primaries define the how to transform linear RGB values to and from
 * the CIE XYZ colorspace.
 */
enum spa_video_color_primaries {
	SPA_VIDEO_COLOR_PRIMARIES_UNKNOWN = 0,	/**< unknown color primaries */
	SPA_VIDEO_COLOR_PRIMARIES_BT709,	/**< BT709 primaries */
	SPA_VIDEO_COLOR_PRIMARIES_BT470M,	/**< BT470M primaries */
	SPA_VIDEO_COLOR_PRIMARIES_BT470BG,	/**< BT470BG primaries */
	SPA_VIDEO_COLOR_PRIMARIES_SMPTE170M,	/**< SMPTE170M primaries */
	SPA_VIDEO_COLOR_PRIMARIES_SMPTE240M,	/**< SMPTE240M primaries */
	SPA_VIDEO_COLOR_PRIMARIES_FILM,		/**< Generic film */
	SPA_VIDEO_COLOR_PRIMARIES_BT2020,	/**< BT2020 primaries. \since 1.6. */
	SPA_VIDEO_COLOR_PRIMARIES_ADOBERGB,	/**< Adobe RGB primaries. \since 1.8 */
};

/**
 * spa_video_colorimetry:
 *
 * Structure describing the color info.
 */
struct spa_video_colorimetry {
	enum spa_video_color_range range;	/**< The color range. This is the valid range for the
						 *    samples. It is used to convert the samples to Y'PbPr
						 *    values. */
	enum spa_video_color_matrix matrix;	/**< the color matrix. Used to convert between Y'PbPr and
						 *    non-linear RGB (R'G'B') */
	enum spa_video_transfer_function transfer; /**< The transfer function. Used to convert between
						    *   R'G'B' and RGB */
	enum spa_video_color_primaries primaries; /**< Color primaries. Used to convert between R'G'B'
						   *   and CIE XYZ */
};

/**
 * \}
 */

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* SPA_VIDEO_COLOR_H */
