/* Copyright (c) 2007 NVIDIA Corporation.  All rights reserved.
 *
 * NVIDIA Corporation and its licensors retain all intellectual property
 * and proprietary rights in and to this software, related documentation
 * and any modifications thereto.  Any use, reproduction, disclosure or
 * distribution of this software and related documentation without an
 * express license agreement from NVIDIA Corporation is strictly prohibited.
 */

#ifndef _NVOMX_IndexExtensions_h_
#define _NVOMX_IndexExtensions_h_

#include <OMX_Core.h>
#include <OMX_Component.h>

#include "OMX_Core.h"

/** representation of timeout values, in milliseconds */
typedef OMX_U32 NvxTimeMs;
/** maximum timeout value, used to mean never timeout */
#define NVX_TIMEOUT_NEVER   0xffffffff
/** minimum timeout value */
#define NVX_TIMEOUT_MIN     0

typedef float NVX_F32;

#define NVX_INDEX_PARAM_FILENAME "OMX.Nvidia.index.param.filename" /**< Filename parameter for source, demux, and sink components that read/write files. */
typedef struct NVX_PARAM_FILENAME {
    OMX_U32 nSize;              /**< size of the structure in bytes */
    OMX_VERSIONTYPE nVersion;   /**< NVX extensions specification version information (1.0.0.0)*/
    OMX_STRING pFilename;       /**< name of file as supported by stdio implementation */
} NVX_PARAM_FILENAME;

#define NVX_INDEX_PARAM_DURATION "OMX.Nvidia.index.param.duration"
typedef struct NVX_PARAM_DURATION {
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_TICKS nDuration;  /** Duration in us */
} NVX_PARAM_DURATION;

typedef enum
{
    NvxStreamType_NONE,
    NvxStreamType_MPEG4,
    NvxStreamType_H264,
    NvxStreamType_H263,
    NvxStreamType_WMV,
    NvxStreamType_JPG,
    NvxStreamType_MP3,
    NvxStreamType_WAV,
    NvxStreamType_AAC,
    NvxStreamType_AACSBR,
    NvxStreamType_BSAC,
    NvxStreamType_WMA,
    NvxStreamType_WMAPro,
    NvxStreamType_WMALossless,
    NvxStreamType_AMRWB,
    NvxStreamType_AMRNB,
    NvxStreamType_VORBIS
} ENvxStreamType;

#define NVX_INDEX_PARAM_STREAMTYPE "OMX.Nvidia.index.param.streamtype"
typedef struct NVX_PARAM_STREAMTYPE {
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPort;
    ENvxStreamType eStreamType;
} NVX_PARAM_STREAMTYPE;

typedef enum
{
    NvxRecordingMode_Enable = 1,
    NvxRecordingMode_EnableExclusive,
    NvxRecordingMode_Disable,
    NvxRecordingMode_Force32 = 0x7FFFFFFF
} ENvxRecordingMode;

#define NVX_INDEX_PARAM_RECORDINGMODE "OMX.Nvidia.index.param.recordingmode"
typedef struct NVX_PARAM_RECORDINGMODE
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    ENvxRecordingMode RecordingMode;
} NVX_PARAM_RECORDINGMODE;

#define NVX_INDEX_PARAM_CHANNELID "OMX.Nvidia.index.param.channelid"
typedef struct NVX_PARAM_CHANNELID
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 ChannelID;
} NVX_PARAM_CHANNELID;

#define NVX_INDEX_PARAM_LOWMEMMODE "OMX.Nvidia.index.param.lowmemmode"
typedef struct NVX_PARAM_LOWMEMMODE {
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_BOOL bLowMemMode;
} NVX_PARAM_LOWMEMMODE;

typedef enum
{
    NvxMetadata_Artist,
    NvxMetadata_Album,
    NvxMetadata_Genre,
    NvxMetadata_Title,
    NvxMetadata_Year,
    NvxMetadata_TrackNum,
    NvMMetadata_Encoded,
    NvxMetadata_Comment,
    NvxMetadata_Composer,
    NvxMetadata_Publisher,
    NvxMetadata_OriginalArtist,
    NvxMetadata_AlbumArtist,
    NvxMetadata_Copyright,
    NvxMetadata_Url,
    NvxMetadata_BPM,
    NvxMetadata_CoverArt,
    NvxMetadata_CoverArtURL,
    NvxMetadata_MAX = 0x7FFFFFFF
} ENvxMetadataType;

/* Charset define to extend OMX_METADATACHARSETTYPE for a U32 type */
#define NVOMX_MetadataCharsetU32    0x10000000
#define NVOMX_MetadataFormatJPEG    0x10000001
#define NVOMX_MetadataFormatPNG     0x10000002
#define NVOMX_MetadataFormatBMP     0x10000003
#define NVOMX_MetadataFormatUnknown 0x10000004

/* If specified metadata not found, returns empty string.
 * or OMX_ErrorInsufficientResources if sValueStr is too small */
#define NVX_INDEX_CONFIG_QUERYMETADATA "OMX.Nvidia.index.config.querymetadata"
typedef struct NVX_CONFIG_QUERYMETADATA {
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    ENvxMetadataType eType;
    OMX_STRING sValueStr;
    OMX_U32 nValueLen;
    OMX_METADATACHARSETTYPE eCharSet;
} NVX_CONFIG_QUERYMETADATA;

#define NVX_INDEX_CONFIG_KEEPASPECT "OMX.Nvidia.index.config.keepaspect"
typedef struct NVX_CONFIG_KEEPASPECT {
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_BOOL bKeepAspect;
} NVX_CONFIG_KEEPASPECT;

#define NVX_INDEX_CONFIG_ULPMODE "OMX.Nvidia.index.config.ulpmode"
typedef struct NVX_CONFIG_ULPMODE {
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_BOOL enableUlpMode;
    OMX_U32 kpiMode;
} NVX_CONFIG_ULPMODE;

#define NVX_INDEX_CONFIG_AUDIO_OUTPUT "OMX.Nvidia.index.config.audio.output"
typedef enum NVX_AUDIO_OUTPUTTYPE {
    NVX_AUDIO_OutputI2S = 0,
    NVX_AUDIO_OutputHdmi,
    NVX_AUDIO_Force32 = 0x7FFFFFFF
} NVX_AUDIO_OUTPUTTYPE;

typedef struct NVX_CONFIG_AUDIOOUTPUT {
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    NVX_AUDIO_OUTPUTTYPE eOutputType;
} NVX_CONFIG_AUDIOOUTPUT;

#define NVX_INDEX_CONFIG_WHITEBALANCEOVERRIDE "OMX.Nvidia.index.config.whitebalanceoverride"
typedef struct NVX_CONFIG_WHITEBALANCEOVERRIDE
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    OMX_S32  wbIlluminantOverride;
    OMX_S32  wbGainAndColorCorrectionOverride[13];
} NVX_CONFIG_WHITEBALANCEOVERRIDE;

#define NVX_INDEX_CONFIG_PREVIEWENABLE "OMX.Nvidia.index.config.previewenable"

#define NVX_INDEX_CONFIG_CAPTUREPAUSE "OMX.Nvidia.index.config.capturepause"

#define NVX_INDEX_CONFIG_CONVERGEANDLOCK "OMX.Nvidia.index.config.convergeandlock"
typedef struct NVX_CONFIG_CONVERGEANDLOCK
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    OMX_BOOL bUnlock;
    OMX_BOOL bAutoFocus;
    OMX_BOOL bAutoExposure;
    OMX_BOOL bAutoWhiteBalance;
    OMX_U32  nTimeOutMS;
} NVX_CONFIG_CONVERGEANDLOCK;

#define NVX_INDEX_CONFIG_PRECAPTURECONVERGE "OMX.Nvidia.index.config.precaptureconverge"
typedef struct NVX_CONFIG_PRECAPTURECONVERGE
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    OMX_BOOL bPrecaptureConverge;
    OMX_BOOL bContinueDuringCapture;
    OMX_U32  nTimeOutMS;
} NVX_CONFIG_PRECAPTURECONVERGE;

#define NVX_INDEX_CONFIG_AUTOFRAMERATE "OMX.Nvidia.index.config.autoframerate"
typedef struct NVX_CONFIG_AUTOFRAMERATE
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    OMX_BOOL bEnabled;
    OMX_S32  low;
    OMX_S32  high;
} NVX_CONFIG_AUTOFRAMERATE;

#define NVX_INDEX_CONFIG_CAMERARAWCAPTURE "OMX.Nvidia.index.config.camera.rawcapture"
typedef struct NVX_CONFIG_CAMERARAWCAPTURE
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    OMX_U32 nCaptureCount;
    OMX_STRING Filename;
} NVX_CONFIG_CAMERARAWCAPTURE;

typedef enum
{
    NvxFlicker_Off,
    NvxFlicker_Auto,
    NvxFlicker_50HZ,
    NvxFlicker_60HZ
} ENvxFlickerType;
#define NVX_INDEX_CONFIG_FLICKER "OMX.Nvidia.index.config.flicker"
typedef struct NVX_CONFIG_FLICKER
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    ENvxFlickerType eFlicker;
} NVX_CONFIG_FLICKER;

// this is used for isp data dump
#define NVX_INDEX_CONFIG_ISPDATA "OMX.Nvidia.index.config.ispdata"
typedef struct NVX_CONFIG_ISPDATA
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    NVX_F32 ilData;
    NVX_F32 ilData2;
} NVX_CONFIG_ISPDATA;

#define NVX_INDEX_PARAM_VIDEO_ENCODE_PROPERTY "OMX.Nvidia.index.param.video.encode.prop"
typedef enum NVX_VIDEO_ERROR_RESILIENCY_LEVEL_TYPE {
    NVX_VIDEO_ErrorResiliency_None = 0,
    NVX_VIDEO_ErrorResiliency_Low,
    NVX_VIDEO_ErrorResiliency_High,
    NVX_VIDEO_ErrorResiliency_Invalid = 0x7FFFFFFF
} NVX_VIDEO_ERROR_RESILIENCY_LEVEL_TYPE;

typedef enum NVX_VIDEO_APPLICATION_TYPE {
    NVX_VIDEO_Application_Camcorder = 0,
    NVX_VIDEO_Application_VideoTelephony,
    NVX_VIDEO_Application_Invalid = 0x7FFFFFFF
} NVX_VIDEO_APPLICATION_TYPE;

/*new parameter to fine tune video encoder configuration*/
typedef struct NVX_PARAM_VIDENCPROPERTY
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;
    
    NVX_VIDEO_APPLICATION_TYPE eApplicationType;
    NVX_VIDEO_ERROR_RESILIENCY_LEVEL_TYPE eErrorResiliencyLevel;
} NVX_PARAM_VIDENCPROPERTY;

#define NVX_INDEX_PARAM_VIDEO_ENCODE_STRINGENTBITRATE "OMX.Nvidia.index.param.video.encode.stringentbitrate"

#define NVX_INDEX_PARAM_OTHER_3GPMUX_BUFFERCONFIG  "OMX.Nvidia.index.param.other.3gpmux.bufferconfig"
typedef struct NVX_PARAM_OTHER_3GPMUX_BUFFERCONFIG
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    OMX_BOOL bUseCache;
    OMX_U32 nBufferSize;
    OMX_U32 nPageSize;
} NVX_PARAM_OTHER_3GPMUX_BUFFERCONFIG;

#define NVX_INDEX_CONFIG_THUMBNAIL "OMX.Nvidia.index.config.thumbnail"
typedef struct NVX_CONFIG_THUMBNAIL
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    OMX_BOOL bEnabled;
    OMX_U32 nWidth;
    OMX_U32 nHeight;
} NVX_CONFIG_THUMBNAIL;

#define NVX_INDEX_CONFIG_PROFILE "OMX.Nvidia.index.config.profile"
typedef struct NVX_CONFIG_PROFILE
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    OMX_BOOL bProfile;
    OMX_BOOL bVerbose;
    OMX_BOOL bStubOutput;
    OMX_U32  nForceLocale; // 0 - no, 1 -cpu, 2 - avp
    OMX_U32  nNvMMProfile;
    OMX_BOOL bNoAVSync;
    OMX_BOOL enableUlpMode;
    OMX_U32 ulpkpiMode;
    OMX_S32  nAVSyncOffset;
    OMX_BOOL bFlip;
    OMX_U32  nFrameDrop;

    OMX_BOOL bSanity;
    OMX_U32  nAvgFPS;
    OMX_U32  nTotFrameDrops;

    // for camera
    OMX_U64 nTSPreviewStart;
    OMX_U64 nTSCaptureStart;
    OMX_U64 nTSCaptureEnd;
    OMX_U64 nTSPreviewEnd;
    OMX_U32 nPreviewStartFrameCount;
    OMX_U32 nPreviewEndFrameCount;
    OMX_U32 nCaptureStartFrameCount;
    OMX_U32 nCaptureEndFrameCount;

} NVX_CONFIG_PROFILE;


// put event extension here for now;
typedef enum NVX_EVENTTYPE_ENUM {
    NVX_EventVendorStartUnused = 0x70000000,
    
    NVX_EventCameraStart = (NVX_EventVendorStartUnused | 0xD00000),
    NVX_EventCamera_AlgorithmsLocked           = NVX_EventCameraStart,
    NVX_EventCamera_AutoFocusAchieved,
    NVX_EventCamera_AutoExposureAchieved,
    NVX_EventCamera_AutoWhiteBalanceAchieved,
    NVX_EventCamera_AutoFocusTimedOut,
    NVX_EventCamera_AutoExposureTimedOut,
    NVX_EventCamera_AutoWhiteBalanceTimedOut,
    NVX_EventCamera_CaptureAborted,
    NVX_EventCamera_CaptureStarted,

    NVX_EventCamera_StillCaptureReady,

    NVX_EventMax = OMX_EventMax,
} NVX_EVENTTYPE;


// Allow manual override on WinA to permit power optimizations from client side
typedef enum
{
    NvxWindow_A = 0,
    NvxWindow_MAX = 0x7FFFFFFF
} ENvxWindowType;

typedef enum
{
    NvxWindowAction_TurnOn = 0,
    NvxWindowAction_TurnOff,
    NvxWindowAction_MAX = 0x7FFFFFFF
} ENvxWindowDispActionType;

#define NVX_INDEX_CONFIG_WINDOW_DISP_OVERRIDE "OMX.Nvidia.index.config.windisp"
typedef struct NVX_CONFIG_WINDOWOVERRIDE
{
    OMX_U32 nSize;
    OMX_VERSIONTYPE nVersion;
    OMX_U32 nPortIndex;

    ENvxWindowType eWindow;
    ENvxWindowDispActionType eAction;
} NVX_CONFIG_WINDOWOVERRIDE;

#endif