/*
Copyright (c) 2012, Broadcom Europe Ltd
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of the copyright holder nor the
      names of its contributors may be used to endorse or promote products
      derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef MMAL_ENCODINGS_H
#define MMAL_ENCODINGS_H

#include "mmal_common.h"

/** \defgroup MmalEncodings List of pre-defined encodings
 * This defines a list of common encodings. This list isn't exhaustive and is only
 * provided as a convenience to avoid clients having to use FourCC codes directly.
 * However components are allowed to define and use their own FourCC codes. */
/* @{ */

/** \name Pre-defined video encodings */
/* @{ */
#define MMAL_ENCODING_H264             MMAL_FOURCC('H','2','6','4')
#define MMAL_ENCODING_MVC              MMAL_FOURCC('M','V','C',' ')
#define MMAL_ENCODING_H263             MMAL_FOURCC('H','2','6','3')
#define MMAL_ENCODING_MP4V             MMAL_FOURCC('M','P','4','V')
#define MMAL_ENCODING_MP2V             MMAL_FOURCC('M','P','2','V')
#define MMAL_ENCODING_MP1V             MMAL_FOURCC('M','P','1','V')
#define MMAL_ENCODING_WMV3             MMAL_FOURCC('W','M','V','3')
#define MMAL_ENCODING_WMV2             MMAL_FOURCC('W','M','V','2')
#define MMAL_ENCODING_WMV1             MMAL_FOURCC('W','M','V','1')
#define MMAL_ENCODING_WVC1             MMAL_FOURCC('W','V','C','1')
#define MMAL_ENCODING_VP8              MMAL_FOURCC('V','P','8',' ')
#define MMAL_ENCODING_VP7              MMAL_FOURCC('V','P','7',' ')
#define MMAL_ENCODING_VP6              MMAL_FOURCC('V','P','6',' ')
#define MMAL_ENCODING_THEORA           MMAL_FOURCC('T','H','E','O')
#define MMAL_ENCODING_SPARK            MMAL_FOURCC('S','P','R','K')
#define MMAL_ENCODING_MJPEG            MMAL_FOURCC('M','J','P','G')

#define MMAL_ENCODING_JPEG             MMAL_FOURCC('J','P','E','G')
#define MMAL_ENCODING_GIF              MMAL_FOURCC('G','I','F',' ')
#define MMAL_ENCODING_PNG              MMAL_FOURCC('P','N','G',' ')
#define MMAL_ENCODING_PPM              MMAL_FOURCC('P','P','M',' ')
#define MMAL_ENCODING_TGA              MMAL_FOURCC('T','G','A',' ')
#define MMAL_ENCODING_BMP              MMAL_FOURCC('B','M','P',' ')

#define MMAL_ENCODING_I420             MMAL_FOURCC('I','4','2','0')
#define MMAL_ENCODING_I420_SLICE       MMAL_FOURCC('S','4','2','0')
#define MMAL_ENCODING_YV12             MMAL_FOURCC('Y','V','1','2')
#define MMAL_ENCODING_I422             MMAL_FOURCC('I','4','2','2')
#define MMAL_ENCODING_I422_SLICE       MMAL_FOURCC('S','4','2','2')
#define MMAL_ENCODING_YUYV             MMAL_FOURCC('Y','U','Y','V')
#define MMAL_ENCODING_YVYU             MMAL_FOURCC('Y','V','Y','U')
#define MMAL_ENCODING_UYVY             MMAL_FOURCC('U','Y','V','Y')
#define MMAL_ENCODING_VYUY             MMAL_FOURCC('V','Y','U','Y')
#define MMAL_ENCODING_NV12             MMAL_FOURCC('N','V','1','2')
#define MMAL_ENCODING_NV21             MMAL_FOURCC('N','V','2','1')
#define MMAL_ENCODING_ARGB             MMAL_FOURCC('A','R','G','B')
#define MMAL_ENCODING_ARGB_SLICE       MMAL_FOURCC('a','r','g','b')
#define MMAL_ENCODING_RGBA             MMAL_FOURCC('R','G','B','A')
#define MMAL_ENCODING_RGBA_SLICE       MMAL_FOURCC('r','g','b','a')
#define MMAL_ENCODING_ABGR             MMAL_FOURCC('A','B','G','R')
#define MMAL_ENCODING_ABGR_SLICE       MMAL_FOURCC('a','b','g','r')
#define MMAL_ENCODING_BGRA             MMAL_FOURCC('B','G','R','A')
#define MMAL_ENCODING_BGRA_SLICE       MMAL_FOURCC('b','g','r','a')
#define MMAL_ENCODING_RGB16            MMAL_FOURCC('R','G','B','2')
#define MMAL_ENCODING_RGB16_SLICE      MMAL_FOURCC('r','g','b','2')
#define MMAL_ENCODING_RGB24            MMAL_FOURCC('R','G','B','3')
#define MMAL_ENCODING_RGB24_SLICE      MMAL_FOURCC('r','g','b','3')
#define MMAL_ENCODING_RGB32            MMAL_FOURCC('R','G','B','4')
#define MMAL_ENCODING_RGB32_SLICE      MMAL_FOURCC('r','g','b','4')
#define MMAL_ENCODING_BGR16            MMAL_FOURCC('B','G','R','2')
#define MMAL_ENCODING_BGR16_SLICE      MMAL_FOURCC('b','g','r','2')
#define MMAL_ENCODING_BGR24            MMAL_FOURCC('B','G','R','3')
#define MMAL_ENCODING_BGR24_SLICE      MMAL_FOURCC('b','g','r','3')
#define MMAL_ENCODING_BGR32            MMAL_FOURCC('B','G','R','4')
#define MMAL_ENCODING_BGR32_SLICE      MMAL_FOURCC('b','g','r','4')

/** YUV 4:2:0 planar, 16bit/component.
*/
#define MMAL_ENCODING_I420_16          MMAL_FOURCC('i','4','2','0')
/** YUV 4:2:0 planar, 10bit/component as least sig 10bits of 16 bit words.
*/
#define MMAL_ENCODING_I420_10          MMAL_FOURCC('i','4','1','0')

/** YUV 4:2:0 planar but with U and V in side-by-side format
 *   So U and V have same pitch as Y, but V = U + pitch/2
*/
#define MMAL_ENCODING_I420_S           MMAL_FOURCC('I','4','2','S')

//Bayer formats
//FourCC values copied from V4L2 where defined.
//10 bit per pixel packed Bayer formats.
#define MMAL_ENCODING_BAYER_SBGGR10P   MMAL_FOURCC('p','B','A','A')  //BGGR
#define MMAL_ENCODING_BAYER_SGRBG10P   MMAL_FOURCC('p','g','A','A')  //GRBG
#define MMAL_ENCODING_BAYER_SGBRG10P   MMAL_FOURCC('p','G','A','A')  //GBRG
#define MMAL_ENCODING_BAYER_SRGGB10P   MMAL_FOURCC('p','R','A','A')  //RGGB

//8 bit per pixel Bayer formats.
#define MMAL_ENCODING_BAYER_SBGGR8     MMAL_FOURCC('B','A','8','1')  //BGGR
#define MMAL_ENCODING_BAYER_SGBRG8     MMAL_FOURCC('G','B','R','G')  //GBRG
#define MMAL_ENCODING_BAYER_SGRBG8     MMAL_FOURCC('G','R','B','G')  //GRBG
#define MMAL_ENCODING_BAYER_SRGGB8     MMAL_FOURCC('R','G','G','B')  //RGGB

//12 bit per pixel Bayer formats - not defined in V4L2, only 12bit expanded to 16.
//Copy 10bpp packed 4CC pattern
#define MMAL_ENCODING_BAYER_SBGGR12P   MMAL_FOURCC('p','B','1','2')  //BGGR
#define MMAL_ENCODING_BAYER_SGRBG12P   MMAL_FOURCC('p','g','1','2')  //GRBG
#define MMAL_ENCODING_BAYER_SGBRG12P   MMAL_FOURCC('p','G','1','2')  //GBRG
#define MMAL_ENCODING_BAYER_SRGGB12P   MMAL_FOURCC('p','R','1','2')  //RGGB

//14 bit per pixel Bayer formats.
#define MMAL_ENCODING_BAYER_SBGGR14P   MMAL_FOURCC('p','B','E','E')  //BGGR
#define MMAL_ENCODING_BAYER_SGBRG14P   MMAL_FOURCC('p','G','E','E')  //GBRG
#define MMAL_ENCODING_BAYER_SGRBG14P   MMAL_FOURCC('p','g','E','E')  //GRBG
#define MMAL_ENCODING_BAYER_SRGGB14P   MMAL_FOURCC('p','R','E','E')  //RGGB

//16 bit per pixel Bayer formats.
#define MMAL_ENCODING_BAYER_SBGGR16    MMAL_FOURCC('B','G','1','6')  //BGGR
#define MMAL_ENCODING_BAYER_SGBRG16    MMAL_FOURCC('G','B','1','6')  //GBRG
#define MMAL_ENCODING_BAYER_SGRBG16    MMAL_FOURCC('G','R','1','6')  //GRBG
#define MMAL_ENCODING_BAYER_SRGGB16    MMAL_FOURCC('R','G','1','6')  //RGGB

//10 bit per pixel DPCM compressed to 8bits Bayer formats.
#define MMAL_ENCODING_BAYER_SBGGR10DPCM8 MMAL_FOURCC('b','B','A','8')  //BGGR
#define MMAL_ENCODING_BAYER_SGBRG10DPCM8 MMAL_FOURCC('b','G','A','8')  //GBRG
#define MMAL_ENCODING_BAYER_SGRBG10DPCM8 MMAL_FOURCC('B','D','1','0')  //GRBG
#define MMAL_ENCODING_BAYER_SRGGB10DPCM8 MMAL_FOURCC('b','R','A','8')  //RGGB

//10 bit per pixel unpacked (16bit) Bayer formats.
#define MMAL_ENCODING_BAYER_SBGGR10    MMAL_FOURCC('B','G','1','0')  //BGGR
#define MMAL_ENCODING_BAYER_SGRBG10    MMAL_FOURCC('B','A','1','0')  //GRBG
#define MMAL_ENCODING_BAYER_SGBRG10    MMAL_FOURCC('G','B','1','0')  //GBRG
#define MMAL_ENCODING_BAYER_SRGGB10    MMAL_FOURCC('R','G','1','0')  //RGGB

//12 bit per pixel unpacked (16bit) Bayer formats
#define MMAL_ENCODING_BAYER_SBGGR12    MMAL_FOURCC('B','G','1','2')  //BGGR
#define MMAL_ENCODING_BAYER_SGRBG12    MMAL_FOURCC('B','A','1','2')  //GRBG
#define MMAL_ENCODING_BAYER_SGBRG12    MMAL_FOURCC('G','B','1','2')  //GBRG
#define MMAL_ENCODING_BAYER_SRGGB12    MMAL_FOURCC('R','G','1','2')  //RGGB

//14 bit per pixel unpacked (16bit) Bayer formats
#define MMAL_ENCODING_BAYER_SBGGR14    MMAL_FOURCC('B','G','1','4')  //BGGR
#define MMAL_ENCODING_BAYER_SGBRG14    MMAL_FOURCC('G','B','1','4')  //GBRG
#define MMAL_ENCODING_BAYER_SGRBG14    MMAL_FOURCC('G','R','1','4')  //GRBG
#define MMAL_ENCODING_BAYER_SRGGB14    MMAL_FOURCC('R','G','1','4')  //RGGB

//MIPI packed monochrome images
#define MMAL_ENCODING_GREY    MMAL_FOURCC('G', 'R', 'E', 'Y') //8bpp Greyscale
#define MMAL_ENCODING_Y10P    MMAL_FOURCC('Y', '1', '0', 'P') //10bpp  Greyscale, MIPI RAW10 packed
#define MMAL_ENCODING_Y12P    MMAL_FOURCC('Y', '1', '2', 'P') //12bpp  Greyscale, MIPI RAW12 packed
#define MMAL_ENCODING_Y14P    MMAL_FOURCC('Y', '1', '4', 'P') //14bpp  Greyscale, MIPI RAW14 packed
#define MMAL_ENCODING_Y16     MMAL_FOURCC('Y', '1', '6', ' ') //16bpp  Greyscale
//Unpacked monochrome formats (16bit per sample, but only N LSBs used)
#define MMAL_ENCODING_Y10     MMAL_FOURCC('Y', '1', '0', ' ') //10bpp Greyscale
#define MMAL_ENCODING_Y12     MMAL_FOURCC('Y', '1', '2', ' ') //12bpp Greyscale
#define MMAL_ENCODING_Y14     MMAL_FOURCC('Y', '1', '4', ' ') //14bpp Greyscale


/** SAND Video (YUVUV128) format, native format understood by VideoCore.
 * This format is *not* opaque - if requested you will receive full frames
 * of YUV_UV video.
 */
#define MMAL_ENCODING_YUVUV128         MMAL_FOURCC('S','A','N','D')
/** HEVC codec format. YUV 420, 10bpc, arranged with 3 values packed into
 * 4 bytes with 2 bits of padding.
 * The image is split into columns or 128 bytes / 96 samples wide, with the
 * column of luma first, followed by the column of sample interleaved chroma.
 */
#define MMAL_ENCODING_YUV10_COL	       MMAL_FOURCC('Y','1','0','C')
/** 16 bit SAND Video (YUVUV64_16) format.
 * This format is *not* opaque - if requested you will receive full frames
 * of YUV_UV_16 video.
 */
#define MMAL_ENCODING_YUVUV64_16      MMAL_FOURCC('S','A','1','6')
/** 10 bit SAND Video format, packed as least sig 10 bits of 16 bit words.
 */
#define MMAL_ENCODING_YUVUV64_10      MMAL_FOURCC('S','A','1','0')

/** VideoCore opaque image format, image handles are returned to
 * the host but not the actual image data.
 */
#define MMAL_ENCODING_OPAQUE           MMAL_FOURCC('O','P','Q','V')

/** An EGL image handle
 */
#define MMAL_ENCODING_EGL_IMAGE        MMAL_FOURCC('E','G','L','I')

/** ISP image statistics format
 */
#define MMAL_ENCODING_BRCM_STATS       MMAL_FOURCC('S','T','A','T')

/* }@ */

/** \name Pre-defined audio encodings */
/* @{ */
#define MMAL_ENCODING_PCM_UNSIGNED_BE  MMAL_FOURCC('P','C','M','U')
#define MMAL_ENCODING_PCM_UNSIGNED_LE  MMAL_FOURCC('p','c','m','u')
#define MMAL_ENCODING_PCM_SIGNED_BE    MMAL_FOURCC('P','C','M','S')
#define MMAL_ENCODING_PCM_SIGNED_LE    MMAL_FOURCC('p','c','m','s')
#define MMAL_ENCODING_PCM_FLOAT_BE     MMAL_FOURCC('P','C','M','F')
#define MMAL_ENCODING_PCM_FLOAT_LE     MMAL_FOURCC('p','c','m','f')
/* Defines for native endianness */
#ifdef MMAL_IS_BIG_ENDIAN
#define MMAL_ENCODING_PCM_UNSIGNED     MMAL_ENCODING_PCM_UNSIGNED_BE
#define MMAL_ENCODING_PCM_SIGNED       MMAL_ENCODING_PCM_SIGNED_BE
#define MMAL_ENCODING_PCM_FLOAT        MMAL_ENCODING_PCM_FLOAT_BE
#else
#define MMAL_ENCODING_PCM_UNSIGNED     MMAL_ENCODING_PCM_UNSIGNED_LE
#define MMAL_ENCODING_PCM_SIGNED       MMAL_ENCODING_PCM_SIGNED_LE
#define MMAL_ENCODING_PCM_FLOAT        MMAL_ENCODING_PCM_FLOAT_LE
#endif

#define MMAL_ENCODING_MP4A             MMAL_FOURCC('M','P','4','A')
#define MMAL_ENCODING_MPGA             MMAL_FOURCC('M','P','G','A')
#define MMAL_ENCODING_ALAW             MMAL_FOURCC('A','L','A','W')
#define MMAL_ENCODING_MULAW            MMAL_FOURCC('U','L','A','W')
#define MMAL_ENCODING_ADPCM_MS         MMAL_FOURCC('M','S',0x0,0x2)
#define MMAL_ENCODING_ADPCM_IMA_MS     MMAL_FOURCC('M','S',0x0,0x1)
#define MMAL_ENCODING_ADPCM_SWF        MMAL_FOURCC('A','S','W','F')
#define MMAL_ENCODING_WMA1             MMAL_FOURCC('W','M','A','1')
#define MMAL_ENCODING_WMA2             MMAL_FOURCC('W','M','A','2')
#define MMAL_ENCODING_WMAP             MMAL_FOURCC('W','M','A','P')
#define MMAL_ENCODING_WMAL             MMAL_FOURCC('W','M','A','L')
#define MMAL_ENCODING_WMAV             MMAL_FOURCC('W','M','A','V')
#define MMAL_ENCODING_AMRNB            MMAL_FOURCC('A','M','R','N')
#define MMAL_ENCODING_AMRWB            MMAL_FOURCC('A','M','R','W')
#define MMAL_ENCODING_AMRWBP           MMAL_FOURCC('A','M','R','P')
#define MMAL_ENCODING_AC3              MMAL_FOURCC('A','C','3',' ')
#define MMAL_ENCODING_EAC3             MMAL_FOURCC('E','A','C','3')
#define MMAL_ENCODING_DTS              MMAL_FOURCC('D','T','S',' ')
#define MMAL_ENCODING_MLP              MMAL_FOURCC('M','L','P',' ')
#define MMAL_ENCODING_FLAC             MMAL_FOURCC('F','L','A','C')
#define MMAL_ENCODING_VORBIS           MMAL_FOURCC('V','O','R','B')
#define MMAL_ENCODING_SPEEX            MMAL_FOURCC('S','P','X',' ')
#define MMAL_ENCODING_ATRAC3           MMAL_FOURCC('A','T','R','3')
#define MMAL_ENCODING_ATRACX           MMAL_FOURCC('A','T','R','X')
#define MMAL_ENCODING_ATRACL           MMAL_FOURCC('A','T','R','L')
#define MMAL_ENCODING_MIDI             MMAL_FOURCC('M','I','D','I')
#define MMAL_ENCODING_EVRC             MMAL_FOURCC('E','V','R','C')
#define MMAL_ENCODING_NELLYMOSER       MMAL_FOURCC('N','E','L','Y')
#define MMAL_ENCODING_QCELP            MMAL_FOURCC('Q','C','E','L')
#define MMAL_ENCODING_MP4V_DIVX_DRM    MMAL_FOURCC('M','4','V','D')
/* @} */

/* @} MmalEncodings List */

/** \defgroup MmalEncodingVariants List of pre-defined encoding variants
 * This defines a list of common encoding variants. This list isn't exhaustive and is only
 * provided as a convenience to avoid clients having to use FourCC codes directly.
 * However components are allowed to define and use their own FourCC codes. */
/* @{ */

/** \name Pre-defined H264 encoding variants */
/* @{ */
/** ISO 14496-10 Annex B byte stream format */
#define MMAL_ENCODING_VARIANT_H264_DEFAULT   0
/** ISO 14496-15 AVC stream format */
#define MMAL_ENCODING_VARIANT_H264_AVC1      MMAL_FOURCC('A','V','C','1')
/** Implicitly delineated NAL units without emulation prevention */
#define MMAL_ENCODING_VARIANT_H264_RAW       MMAL_FOURCC('R','A','W',' ')
/* @} */

/** \name Pre-defined MPEG4 audio encoding variants */
/* @{ */
/** Raw stream format */
#define MMAL_ENCODING_VARIANT_MP4A_DEFAULT   0
/** ADTS stream format */
#define MMAL_ENCODING_VARIANT_MP4A_ADTS      MMAL_FOURCC('A','D','T','S')
/* @} */

/* @} MmalEncodingVariants List */

/** \defgroup MmalColorSpace List of pre-defined video color spaces
 * This defines a list of common color spaces. This list isn't exhaustive and is only
 * provided as a convenience to avoid clients having to use FourCC codes directly.
 * However components are allowed to define and use their own FourCC codes. */
/* @{ */

/** Unknown color space */
#define MMAL_COLOR_SPACE_UNKNOWN       0
/** ITU-R BT.601-5 [SDTV] */
#define MMAL_COLOR_SPACE_ITUR_BT601    MMAL_FOURCC('Y','6','0','1')
/** ITU-R BT.709-3 [HDTV] */
#define MMAL_COLOR_SPACE_ITUR_BT709    MMAL_FOURCC('Y','7','0','9')
/** JPEG JFIF */
#define MMAL_COLOR_SPACE_JPEG_JFIF     MMAL_FOURCC('Y','J','F','I')
/** Title 47 Code of Federal Regulations (2003) 73.682 (a) (20) */
#define MMAL_COLOR_SPACE_FCC           MMAL_FOURCC('Y','F','C','C')
/** Society of Motion Picture and Television Engineers 240M (1999) */
#define MMAL_COLOR_SPACE_SMPTE240M     MMAL_FOURCC('Y','2','4','0')
/** ITU-R BT.470-2 System M */
#define MMAL_COLOR_SPACE_BT470_2_M     MMAL_FOURCC('Y','_','_','M')
/** ITU-R BT.470-2 System BG */
#define MMAL_COLOR_SPACE_BT470_2_BG    MMAL_FOURCC('Y','_','B','G')
/** JPEG JFIF, but with 16..255 luma */
#define MMAL_COLOR_SPACE_JFIF_Y16_255  MMAL_FOURCC('Y','Y','1','6')
/** Rec2020 */
#define MMAL_COLOR_SPACE_REC2020       MMAL_FOURCC('2','0','2','0')
/* @} MmalColorSpace List */

#endif /* MMAL_ENCODINGS_H */
