/*
* Copyright (c) 2016-2017, The Linux Foundation. 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 Linux Foundation 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 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER 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 __COLOR_METADATA_H__
#define __COLOR_METADATA_H__

#ifdef __cplusplus
extern "C" {
#else
#include <stdbool.h>
#endif
#include <stdint.h>

typedef enum ColorRange {
  Range_Limited = 0,
  Range_Full    = 1,
  Range_Max     = 0xff,
} ColorRange;

// The following values matches the HEVC spec
typedef enum ColorPrimaries {
  // Unused = 0;
  ColorPrimaries_BT709_5     = 1,  // ITU-R BT.709-5 or equivalent
  /* Unspecified = 2, Reserved = 3*/
  ColorPrimaries_BT470_6M    = 4,  // ITU-R BT.470-6 System M or equivalent
  ColorPrimaries_BT601_6_625 = 5,  // ITU-R BT.601-6 625 or equivalent
  ColorPrimaries_BT601_6_525 = 6,  // ITU-R BT.601-6 525 or equivalent
  ColorPrimaries_SMPTE_240M  = 7,  // SMPTE_240M
  ColorPrimaries_GenericFilm = 8,  // Generic Film
  ColorPrimaries_BT2020      = 9,  // ITU-R BT.2020 or equivalent
  ColorPrimaries_SMPTE_ST428 = 10,  // SMPTE_240M
  ColorPrimaries_AdobeRGB    = 11,
  ColorPrimaries_DCIP3       = 12,
  ColorPrimaries_EBU3213     = 22,
  ColorPrimaries_Max         = 0xff,
} ColorPrimaries;

typedef enum GammaTransfer {
  // Unused = 0;
  Transfer_sRGB            = 1,  // ITR-BT.709-5
  /* Unspecified = 2, Reserved = 3 */
  Transfer_Gamma2_2        = 4,
  Transfer_Gamma2_8        = 5,
  Transfer_SMPTE_170M      = 6,  // BT.601-6 525 or 625
  Transfer_SMPTE_240M      = 7,  // SMPTE_240M
  Transfer_Linear          = 8,
  Transfer_Log             = 9,
  Transfer_Log_Sqrt        = 10,
  Transfer_XvYCC           = 11,  // IEC 61966-2-4
  Transfer_BT1361          = 12,  // Rec.ITU-R BT.1361 extended gamut
  Transfer_sYCC            = 13,  // IEC 61966-2-1 sRGB or sYCC
  Transfer_BT2020_2_1      = 14,  // Rec. ITU-R BT.2020-2 (same as the values 1, 6, and 15)
  Transfer_BT2020_2_2      = 15,  // Rec. ITU-R BT.2020-2 (same as the values 1, 6, and 14)
  Transfer_SMPTE_ST2084    = 16,  // 2084
  // transfers unlikely to be required by Android
  Transfer_ST_428          = 17,  // SMPTE ST 428-1
  Transfer_HLG             = 18,  // ARIB STD-B67
  Transfer_Max             = 0xff,
} GammaTransfer;

typedef enum MatrixCoEfficients {
  MatrixCoEff_Identity           = 0,
  MatrixCoEff_BT709_5            = 1,
  /* Unspecified = 2, Reserved = 3 */
  MatrixCoeff_FCC_73_682         = 4,
  MatrixCoEff_BT601_6_625        = 5,
  MatrixCoEff_BT601_6_525        = 6,
  MatrixCoEff_SMPTE240M          = 7,  // used with 601_525_Unadjusted
  MatrixCoEff_YCgCo              = 8,
  MatrixCoEff_BT2020             = 9,
  MatrixCoEff_BT2020Constant     = 10,
  MatrixCoEff_BT601_6_Unadjusted = 11,  // Used with BT601_625(KR=0.222, KB=0.071)
  MatrixCoEff_DCIP3              = 12,
  MatrixCoEff_Chroma_NonConstant = 13,
  MatrixCoEff_Max                = 0xff,
} MatrixCoEfficients;

typedef struct Primaries {
  uint32_t rgbPrimaries[3][2];  // unit 1/50000;
  uint32_t whitePoint[2];  // unit 1/50000;
} Primaries;

typedef struct MasteringDisplay {
  bool      colorVolumeSEIEnabled;
  Primaries primaries;
  uint32_t  maxDisplayLuminance;  // unit: cd/m^2.
  uint32_t  minDisplayLuminance;  // unit: 1/10000 cd/m^2.
} MasteringDisplay;

typedef struct ContentLightLevel {
  bool     lightLevelSEIEnabled;
  uint32_t maxContentLightLevel;  // unit: cd/m^2.
  uint32_t minPicAverageLightLevel;  // unit: 1/10000 cd/m^2.
} ContentLightLevel;

typedef struct ColorRemappingInfo {
  bool               criEnabled;
  uint32_t           crId;
  uint32_t           crCancelFlag;
  uint32_t           crPersistenceFlag;
  uint32_t           crVideoSignalInfoPresentFlag;
  uint32_t           crRange;
  ColorPrimaries     crPrimaries;
  GammaTransfer      crTransferFunction;
  MatrixCoEfficients crMatrixCoefficients;
  uint32_t           crInputBitDepth;
  uint32_t           crOutputBitDepth;
  uint32_t           crPreLutNumValMinusOne[3];
  uint32_t           crPreLutCodedValue[3*33];
  uint32_t           crPreLutTargetValue[3*33];
  uint32_t           crMatrixPresentFlag;
  uint32_t           crLog2MatrixDenom;
  int32_t            crCoefficients[3*3];
  uint32_t           crPostLutNumValMinusOne[3];
  uint32_t           crPostLutCodedValue[3*33];
  uint32_t           crPostLutTargetValue[3*33];
} ColorRemappingInfo;

#define HDR_DYNAMIC_META_DATA_SZ 1024
typedef struct ColorMetaData {
  // Default values based on sRGB, needs to be overridden in gralloc
  // based on the format and size.
  ColorPrimaries     colorPrimaries;
  ColorRange         range;
  GammaTransfer      transfer;
  MatrixCoEfficients matrixCoefficients;

  MasteringDisplay   masteringDisplayInfo;
  ContentLightLevel  contentLightLevel;
  ColorRemappingInfo cRI;

  // Dynamic meta data elements
  bool dynamicMetaDataValid;
  uint32_t dynamicMetaDataLen;
  uint8_t dynamicMetaDataPayload[HDR_DYNAMIC_META_DATA_SZ];
} ColorMetaData;

typedef struct Color10Bit {
  uint32_t R: 10;
  uint32_t G: 10;
  uint32_t B: 10;
  uint32_t A: 2;
} Color10Bit;

typedef struct Lut3d {
  uint16_t dim;  // dimension of each side of LUT cube (ex: 13, 17)in lutEntries
  uint16_t gridSize;  // number of elements in the gridEntries
  /* Matrix ordering convension
  for (b = 0; b < dim; b++) {
    for (g = 0; g < dim; g++) {
      for (r = 0; r < dim; r++) {
        read/write [mR mG mB] associated w/ 3DLUT[r][g][b] to/from file
      }
    }
  } */
  Color10Bit *lutEntries;
  bool validLutEntries;  // Indicates if entries are valid and can be used.
  /*
   The grid is a 1D LUT for each of the R,G,B channels that can be
   used to apply an independent nonlinear transformation to each
   channel before it is used as a coordinate for addressing
   the uniform 3D LUT.  This effectively creates a non-uniformly
   sampled 3D LUT.  This is useful for having independent control
   of the sampling grid density along each dimension for greater
   precision in spite of having a relatively small number of samples.i
  */
  Color10Bit *gridEntries;
  bool validGridEntries;  // Indicates if entries are valid and can be used.
} Lut3d;

#ifdef __cplusplus
}
#endif

#endif  // __COLOR_METADATA_H__
