/*
 * Copyright (C) 2012, Collabora Ltd.
 *   Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation
 * version 2.1 of the License.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
 *
 */

#ifndef __GST_AMC_CONSTANTS_H__
#define __GST_AMC_CONSTANTS_H__

/* FIXME: We might need to get these values from Java if there's
 * ever a device or Android version that changes these values
 */

/* Copies from MediaCodec.java */

enum
{
  BUFFER_FLAG_SYNC_FRAME = 1,
  BUFFER_FLAG_CODEC_CONFIG = 2,
  BUFFER_FLAG_END_OF_STREAM = 4,
  BUFFER_FLAG_PARTIAL_FRAME = 8,
};

enum
{
  CONFIGURE_FLAG_ENCODE = 1
};

enum
{
  INFO_TRY_AGAIN_LATER = -1,
  INFO_OUTPUT_FORMAT_CHANGED = -2,
  INFO_OUTPUT_BUFFERS_CHANGED = -3
};

/* Copies from MediaCodecInfo.java */
/* From https://android.googlesource.com/platform/frameworks/base/+/master/media/java/android/media/MediaCodecInfo.java
 * To update, cat MediaCodecInfo.java | sed -n -e 's/^.*int \(COLOR_[a-zA-Z0-9]*\)\ *\(= .*\);$/\1 \2,/p'
 * but watch out for additional platform specific constants below,
 * and COLOR_FormatSurface is called COLOR_FormatAndroidOpaque here for historic reasons
 */
enum
{
  COLOR_FormatMonochrome = 1,
  COLOR_Format8bitRGB332 = 2,
  COLOR_Format12bitRGB444 = 3,
  COLOR_Format16bitARGB4444 = 4,
  COLOR_Format16bitARGB1555 = 5,
  COLOR_Format16bitRGB565 = 6,
  COLOR_Format16bitBGR565 = 7,
  COLOR_Format18bitRGB666 = 8,
  COLOR_Format18bitARGB1665 = 9,
  COLOR_Format19bitARGB1666 = 10,
  COLOR_Format24bitRGB888 = 11,
  COLOR_Format24bitBGR888 = 12,
  COLOR_Format24bitARGB1887 = 13,
  COLOR_Format25bitARGB1888 = 14,
  COLOR_Format32bitBGRA8888 = 15,
  COLOR_Format32bitARGB8888 = 16,
  COLOR_FormatYUV411Planar = 17,
  COLOR_FormatYUV411PackedPlanar = 18,
  COLOR_FormatYUV420Planar = 19,
  COLOR_FormatYUV420PackedPlanar = 20,
  COLOR_FormatYUV420SemiPlanar = 21,
  COLOR_FormatYUV422Planar = 22,
  COLOR_FormatYUV422PackedPlanar = 23,
  COLOR_FormatYUV422SemiPlanar = 24,
  COLOR_FormatYCbYCr = 25,
  COLOR_FormatYCrYCb = 26,
  COLOR_FormatCbYCrY = 27,
  COLOR_FormatCrYCbY = 28,
  COLOR_FormatYUV444Interleaved = 29,
  COLOR_FormatRawBayer8bit = 30,
  COLOR_FormatRawBayer10bit = 31,
  COLOR_FormatRawBayer8bitcompressed = 32,
  COLOR_FormatL2 = 33,
  COLOR_FormatL4 = 34,
  COLOR_FormatL8 = 35,
  COLOR_FormatL16 = 36,
  COLOR_FormatL24 = 37,
  COLOR_FormatL32 = 38,
  COLOR_FormatYUV420PackedSemiPlanar = 39,
  COLOR_FormatYUV422PackedSemiPlanar = 40,
  COLOR_Format18BitBGR666 = 41,
  COLOR_Format24BitARGB6666 = 42,
  COLOR_Format24BitABGR6666 = 43,
  COLOR_FormatYUVP010 = 54,
  COLOR_FormatAndroidOpaque = 0x7F000789,
  COLOR_Format64bitABGRFloat = 0x7F000F16,
  COLOR_Format32bitABGR8888 = 0x7F00A000,
  COLOR_Format32bitABGR2101010 = 0x7F00AAA2,
  COLOR_FormatYUV420Flexible = 0x7F420888,
  COLOR_FormatYUV422Flexible = 0x7F422888,
  COLOR_FormatYUV444Flexible = 0x7F444888,
  COLOR_FormatRGBFlexible = 0x7F36B888,
  COLOR_FormatRGBAFlexible = 0x7F36A888,

  COLOR_INTEL_FormatYUV420PackedSemiPlanar = 0x7fa00e00,
  COLOR_INTEL_FormatYUV420PackedSemiPlanar_Tiled = 0x7fa00f00,

  COLOR_QCOM_FormatYUV420SemiPlanar     = 0x7fa30c00,
  COLOR_QCOM_FormatYUV420PackedSemiPlanar64x32Tile2m8ka = 0x7fa30c03,
  /* NV12 but with stride and plane heights aligned to 32 */
  COLOR_QCOM_FormatYVU420SemiPlanar32m = 0x7fa30c04,
  /* NV12 but with stride and plane heights aligned to 32, Stores two images,
   * one after the other in top-bottom layout */
  COLOR_QCOM_FormatYVU420SemiPlanar32mMultiView = 0x7fa30c05,

  COLOR_TI_FormatYUV420PackedSemiPlanar = 0x7f000100,
  /* From hardware/ti/omap4xxx/domx/omx_core/inc/OMX_TI_IVCommon.h */
  COLOR_TI_FormatYUV420PackedSemiPlanarInterlaced = 0x7f000001,
  /* This format is Exynos specific from the OMX vendor-specific
   * numeric range, but is defined in the Android OMX headers, so
   * we shouldn't find incompatible usage and crash horribly... right?
   * FIXME: Not actually implemented in the video decoder, it will just error out
   * The format seems to be equiv to V4L2_PIX_FMT_NV12MT_16X16 */
  COLOR_OMX_SEC_FormatNV12Tiled = 0x7fc00002,
  /* YV12: http://developer.android.com/reference/android/graphics/ImageFormat.html#YV12 */
  COLOR_FormatYV12 = 0x32315659,
};

enum
{
  HEVCProfileMain    = 0x01,
  HEVCProfileMain10  = 0x02,
  HEVCProfileMain10HDR10 = 0x1000,
  HEVCProfileMain10HDR10Plus = 0x2000,
  HEVCProfileMainStill = 0x4
};

enum
{
  HEVCMainTierLevel1  = 0x1,
  HEVCHighTierLevel1  = 0x2,
  HEVCMainTierLevel2  = 0x4,
  HEVCHighTierLevel2  = 0x8,
  HEVCMainTierLevel21 = 0x10,
  HEVCHighTierLevel21 = 0x20,
  HEVCMainTierLevel3  = 0x40,
  HEVCHighTierLevel3  = 0x80,
  HEVCMainTierLevel31 = 0x100,
  HEVCHighTierLevel31 = 0x200,
  HEVCMainTierLevel4  = 0x400,
  HEVCHighTierLevel4  = 0x800,
  HEVCMainTierLevel41 = 0x1000,
  HEVCHighTierLevel41 = 0x2000,
  HEVCMainTierLevel5  = 0x4000,
  HEVCHighTierLevel5  = 0x8000,
  HEVCMainTierLevel51 = 0x10000,
  HEVCHighTierLevel51 = 0x20000,
  HEVCMainTierLevel52 = 0x40000,
  HEVCHighTierLevel52 = 0x80000,
  HEVCMainTierLevel6  = 0x100000,
  HEVCHighTierLevel6  = 0x200000,
  HEVCMainTierLevel61 = 0x400000,
  HEVCHighTierLevel61 = 0x800000,
  HEVCMainTierLevel62 = 0x1000000,
  HEVCHighTierLevel62 = 0x2000000
};

enum
{
  AVCProfileBaseline = 0x01,
  AVCProfileConstrainedBaseline = 0x10000,
  AVCProfileConstrainedHigh = 0x80000,
  AVCProfileMain = 0x02,
  AVCProfileExtended = 0x04,
  AVCProfileHigh = 0x08,
  AVCProfileHigh10 = 0x10,
  AVCProfileHigh422 = 0x20,
  AVCProfileHigh444 = 0x40
};

enum
{
  AVCLevel1 = 0x01,
  AVCLevel1b = 0x02,
  AVCLevel11 = 0x04,
  AVCLevel12 = 0x08,
  AVCLevel13 = 0x10,
  AVCLevel2 = 0x20,
  AVCLevel21 = 0x40,
  AVCLevel22 = 0x80,
  AVCLevel3 = 0x100,
  AVCLevel31 = 0x200,
  AVCLevel32 = 0x400,
  AVCLevel4 = 0x800,
  AVCLevel41 = 0x1000,
  AVCLevel42 = 0x2000,
  AVCLevel5 = 0x4000,
  AVCLevel51 = 0x8000,
  AVCLevel6 = 0x20000,
  AVCLevel61 = 0x40000,
  AVCLevel62 = 0x80000
};

enum
{
  H263ProfileBaseline = 0x01,
  H263ProfileH320Coding = 0x02,
  H263ProfileBackwardCompatible = 0x04,
  H263ProfileISWV2 = 0x08,
  H263ProfileISWV3 = 0x10,
  H263ProfileHighCompression = 0x20,
  H263ProfileInternet = 0x40,
  H263ProfileInterlace = 0x80,
  H263ProfileHighLatency = 0x100
};

enum
{
  H263Level10 = 0x01,
  H263Level20 = 0x02,
  H263Level30 = 0x04,
  H263Level40 = 0x08,
  H263Level45 = 0x10,
  H263Level50 = 0x20,
  H263Level60 = 0x40,
  H263Level70 = 0x80
};

enum
{
  MPEG4ProfileSimple = 0x01,
  MPEG4ProfileSimpleScalable = 0x02,
  MPEG4ProfileCore = 0x04,
  MPEG4ProfileMain = 0x08,
  MPEG4ProfileNbit = 0x10,
  MPEG4ProfileScalableTexture = 0x20,
  MPEG4ProfileSimpleFace = 0x40,
  MPEG4ProfileSimpleFBA = 0x80,
  MPEG4ProfileBasicAnimated = 0x100,
  MPEG4ProfileHybrid = 0x200,
  MPEG4ProfileAdvancedRealTime = 0x400,
  MPEG4ProfileCoreScalable = 0x800,
  MPEG4ProfileAdvancedCoding = 0x1000,
  MPEG4ProfileAdvancedCore = 0x2000,
  MPEG4ProfileAdvancedScalable = 0x4000,
  MPEG4ProfileAdvancedSimple = 0x8000
};

enum
{
  MPEG4Level0 = 0x01,
  MPEG4Level0b = 0x02,
  MPEG4Level1 = 0x04,
  MPEG4Level2 = 0x08,
  MPEG4Level3 = 0x10,
  MPEG4Level4 = 0x20,
  MPEG4Level4a = 0x40,
  MPEG4Level5 = 0x80
};

enum
{
  AACObjectMain = 1,
  AACObjectLC = 2,
  AACObjectSSR = 3,
  AACObjectLTP = 4,
  AACObjectHE = 5,
  AACObjectScalable = 6,
  AACObjectERLC = 17,
  AACObjectERScalable = 20,
  AACObjectLD = 23,
  AACObjectHE_PS = 29,
  AACObjectELD = 39,
  AACObjectXHE = 42,
};

/* Copies from AudioFormat.java */
enum
{
  CHANNEL_OUT_FRONT_LEFT = 0x4,
  CHANNEL_OUT_FRONT_RIGHT = 0x8,
  CHANNEL_OUT_FRONT_CENTER = 0x10,
  CHANNEL_OUT_LOW_FREQUENCY = 0x20,
  CHANNEL_OUT_BACK_LEFT = 0x40,
  CHANNEL_OUT_BACK_RIGHT = 0x80,
  CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 0x100,
  CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x200,
  CHANNEL_OUT_BACK_CENTER = 0x400,
  CHANNEL_OUT_SIDE_LEFT = 0x800,
  CHANNEL_OUT_SIDE_RIGHT = 0x1000,
  CHANNEL_OUT_TOP_CENTER = 0x2000,
  CHANNEL_OUT_TOP_FRONT_LEFT = 0x4000,
  CHANNEL_OUT_TOP_FRONT_CENTER = 0x8000,
  CHANNEL_OUT_TOP_FRONT_RIGHT = 0x10000,
  CHANNEL_OUT_TOP_BACK_LEFT = 0x20000,
  CHANNEL_OUT_TOP_BACK_CENTER = 0x40000,
  CHANNEL_OUT_TOP_BACK_RIGHT = 0x80000
};

#endif
