

/*
* Copyright (c) 2009-2016, Freescale Semiconductor, Inc. 
* Copyright 2017-2018 NXP
 */

/*
* 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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
*/

/*
 *
 *  History :
 *  Date             Author              Version    Description
 *
 *  Oct, 2009        Amanda              1.0        Initial Version
 *  Jan, 2010        Amanda              1.1        Extend user data ID.
 *  Apr, 2010        Amanda              2.0        Further unify API, add entry point "FslParserInit" for DLL loading.
 *  Mar, 2010        Larry               2.1        Add API for getting Meta data
 *  Sep, 2011        Fanghui             2.2        Add USER_DATA_TRACKNUMBER, USER_DATA_TOTALTRACKNUMBER
 *  May, 2012        Fanghui             2.3		Change FslParserGetProgramTracks definition
 *  May, 2012        Fanghui             2.4		Add USER_DATA_LOCATION
 *  Jun, 2012        Fanghui             2.5		Add USER_DATA_PROGRAMINFO
 *  Sep, 2012        Fanghui             2.6		Add USER_DATA_PMT
 */

#ifndef _FSL_PARSER_COMMON_H
#define _FSL_PARSER_COMMON_H

#include "fsl_media_types.h"
#include "fsl_types.h"

#ifdef __cplusplus
#define EXTERN extern "C"
#else
#define EXTERN
#endif


/* Warning:
 * It's not recommended to use any enum types as API arguments or return value!
 * Please use data types that can explicitly tell the data length and asign them the listed enum values.
 * It's because different compilers can treat enum as different types such as integer or unsinged char.
 * If the parser library and plug-in(filter) are built by different compliers, the data length mismatch
 * will cause error.
 */


#ifdef __WINCE
	#define DEBUGMSG
    //#define PARSERMSG(cond, fmt, ...) DEBUGMSG(cond, _T(fmt), __VA_ARGS__))
    //#define PARSERMSG(fmt, ...) DEBUGMSG(1, (_T(fmt),  __VA_ARGS__))
    #define PARSERMSG(fmt, ...)
#elif WIN32
	#define DEBUGMSG(cond, fmt) printf fmt
	#define PARSERMSG(fmt, ...) printf(fmt, __VA_ARGS__)
#else /* linux platform */
    #ifdef DEBUG
        #define PARSERMSG printf
    #else
        #define PARSERMSG(fmt...)
    #endif
#endif


typedef void * FslParserHandle;

#define PARSER_INVALID_TRACK_NUMBER   (-1)

#define PARSER_UNKNOWN_DURATION 0    /* Unknown movie, track or sample duration.
                                       In some broadcasting sources (eg. MMS of broadcasting)
                                       or recording clips, the movie or track's duration is set to 0.
                                       It means the duration is unknown, not an empty clip or track.
                                       The plug-in and the core parser shall just try to read as many sample as possible until EOF.*/

#define PARSER_UNKNOWN_TIME_STAMP (-1) /* The time stamp is unknown. Usually used when the exact audio samples
                                        are not known until after decoding. And so only audio decoder can give
                                        a valid time stamp for each decoded audio frame.
                                        However, for the 1st sample after seeking,
                                        the parser MUST NOT use this value but shall give a valid time stamp.*/

#define PARSER_UNKNOWN_BITRATE  0    /* unknown bitrate */


/*
 * Common error codes of parsers,
 * within the range [-100 , +100].
 * Different parsers can extend the format specific errors OUTSIDE this range,
 * in their own API header files.
 */

enum
{
    PARSER_SUCCESS  = 0,
    PARSER_EOS = 1,    /* reach the end of the track/movie */
    PARSER_BOS = 2,    /* reach the beginning of the track/movie */
    PARSER_NEED_MORE_DATA = 3,  /* No longer used. Shall use "PARSER_INSUFFICIENT_DATA" */
    PARSER_NOT_READY = 4,  /* did not have subtitle sample when get next sample */

    /* errors */
    PARSER_ERR_UNKNOWN = -1, /* Unknown error, not captured by parser logic */

    PARSER_ERR_INVALID_API = -2, /* Some common API is not implemented properly */

    PARSER_NOT_IMPLEMENTED = -5, /* No support for some feature. */
    PARSER_ERR_INVALID_PARAMETER = -6, /* parameters are invalid */

    PARSER_INSUFFICIENT_MEMORY = -7, /* memory not enough, causing general memory allocation failure */
    PARSER_INSUFFICIENT_DATA = -8, /* data not enough, parser need more data to go ahead */

    PARSER_ERR_NO_OUTPUT_BUFFER = -9, /* can not get sample buffer for output */

    PARSER_FILE_OPEN_ERROR = -10,
    PARSER_READ_ERROR = -11, /* file read error, no need for further error concealment */
    PARSER_WRITE_ERROR = -12,
    PARSER_SEEK_ERROR = -13, /* file system seeking error */
    PARSER_ILLEAGAL_FILE_SIZE = -14, /* file size is wrong or exceeds parser's capacity.
                                       (some parser can not handle file larger than 2GB)*/
    PARSER_ILLEAGAL_OPERATION =-15, /* the parser is being used improperly */

    PARSER_ERR_INVALID_MEDIA = -20, /* invalid or unsupported media format */

    PARSER_ERR_NOT_SEEKABLE = -21, /* This file is not seekable and does not support trick mode */

    /* error concealment */
    PARSER_ERR_CONCEAL_FAIL = -22, /* Error in bitstream and no sample can be found by error concealment.
                                If the file is seekable, it's better to perform a seeking than further
                                searching the bit stream for the next sample. */

    PARSER_ERR_MEMORY_ACCESS_VIOLATION = -25, /* internal memory access error */

    PARSER_ERR_TRACK_DISABLED = -30, /* The track is disabled and no media samples can be read from it. Only enabled track can output samples.*/
    PARSER_ERR_INVALID_READ_MODE = -32, /* The reading mode is invalid, or some operation is illegal under current reading mode */


};


/*********************************************************************
 * Reading mode. There are two options:
 * a. File-based sample reading.
 *      The reading order is same as that of track interleaving in the file.
 *      Mainly for streaming application.
 *
 * b. Track-based sample reading.
 *      Each track can be read independently from each other.
 *
 * Note:
 * A parser may support only one reading mode. Setting it to a not-supported mode will fail.
 * And it usually has a default reading mode.
 ********************************************************************/
enum
{
    PARSER_READ_MODE_FILE_BASED = 0, /* File-based sample reading.*/
    PARSER_READ_MODE_TRACK_BASED /* Track-based sample reading.*/
};




/*********************************************************************
 * sample flags :
 * 32-bit long, properties of a sample read.
 * The low 16 bits is reserved for common flag.
 * Parsers can use high 16 bits to define their own flags.
 ********************************************************************/
#define FLAG_SYNC_SAMPLE 0X01  /* This is a sync sample */

#define FLAG_SAMPLE_ERR_CONCEALED 0X02 /* This sample is got by error concealment, such as searching the bitstream.*/

#define FLAG_SAMPLE_SUGGEST_SEEK 0X04   /* A seeking is suggested. Although sample is got by error concealment,
                                        A/V sync may be impacted.
                                        If the file is seekable, a seeking on all tracks can save the A/V sync.*/
#define FLAG_SAMPLE_NOT_FINISHED 0X08   /* Sample is NOT finished at this call, large samples can be output in several calls. */

#define FLAG_UNCOMPRESSED_SAMPLE 0X10 /* This is a uncompressed sample.
                                        Warning:
                                        A track may have both compressed & uncompressed samples.
                                        But some AVI clips seem to abuse this flag, sync samples are mark as uncompressed,
                                        although they are actually compressed ones.
                                        Now suggest not care this flag.*/

#define FLAG_SAMPLE_NEWSEG       0x20 /* A new segment of new sample */

#define FLAG_SAMPLE_CODEC_DATA   0x40 /* This is a sample of codec data */

#define FLAG_SAMPLE_PCR_INFO     0x80 /* This is a sample of PCR data, the data is stored in struct PCRInfo type */

#define FLAG_SAMPLE_H264_SEI_POS_DATA 0x100 /* This is a sample of h264 sei position data, the position data gives the offset and
                                             * size of the sei nalu in the h264 frame it belongs to */

#define FLAG_SAMPLE_COMPRESSED_SAMPLE 0x200 //drm sample flag, need to call drm api to get drm info

/*********************************************************************
 * seeking flags :
 when to seek, must set one of the following flags
 ********************************************************************/
#define SEEK_FLAG_NEAREST 0X01  /* Default flag. The actual seeked time shall be nearest one to the given time (can be later or earlier)*/
#define SEEK_FLAG_NO_LATER  0X02    /* The actual seeked time shall be no later than the given time */
#define SEEK_FLAG_NO_EARLIER 0X03    /* The actual seeked time shall be no earlier than the given time */
#define SEEK_FLAG_FUZZ 0X04 /* Reserved. No accurate request on time but request quick response.
                               Parsers shall optimize performances with other flags.*/
#define SEEK_FLAG_CLOSEST 0X05 /* this flag is only used for android when read options is ReadOptions::SEEK_CLOSEST in mp4 parser. */
#define SEEK_FLAG_FRAME_INDEX 0X06 /* android cts requires this feature for mp4 parser */

/*********************************************************************
 * direction for trick mode/sync sample reading
 ********************************************************************/
#define FLAG_BACKWARD   0X00
#define FLAG_FORWARD    0x01

/*********************************************************************
 * file flags:
 * return flags of GetFlag() in FslFileStream
 * Return value for some cases:
 *   0 local playback.(default)
 *   1 illegal
 *   2 http streaming, which source is seekable, but seek may affect the fluency of playback.
 *   3 live streaming such as rtp or udp streaming.
 ********************************************************************/
#define FILE_FLAG_NON_SEEKABLE   0X01
//file source should be read in sequence. You should not read from random position even if the file is seekable
#define FILE_FLAG_READ_IN_SEQUENCE   0X02

/*********************************************************************
 * flags for create parse2
 ********************************************************************/
//if set the flag, stream format was avc if codec data is presented, and format is bytestream if codec data is not found.
#define FLAG_H264_NO_CONVERT 0x04
//output pts if it exists
#define FLAG_OUTPUT_PTS 0x08
//if set the flag, do not convert id3 data to utf8 in parser, other components will do it. 
#define FLAG_ID3_FORMAT_NON_UTF8  0x10
//if set the flag, send out PCR data
#define FLAG_OUTPUT_PCR  0x20
//if set the flag, output sei position data in a sample buffer
#define FLAG_OUTPUT_H264_SEI_POS_DATA 0x40

/*********************************************************************
 * User data ID
 * Some File level metadata
*********************************************************************/
typedef enum FSL_PARSER_USER_DATA_TYPE
{
    USER_DATA_TITLE = 0,      /* title of the content */
    USER_DATA_LANGUAGE,       /* user data may tell the language of the movie as a string */
    USER_DATA_GENRE,          /* genre of the content, mainly music */
    USER_DATA_ARTIST,         /* main artist and performer */
    USER_DATA_COPYRIGHT,      /* copyright statement */
    USER_DATA_COMMENTS,       /* comments of the content */
    USER_DATA_CREATION_DATE,  /* date the movie content was created */
    USER_DATA_RATING,         /* ? */
    USER_DATA_ALBUM,          /* album name of music content */
    USER_DATA_VCODECNAME,     /* video codec name */
    USER_DATA_ACODECNAME,     /* audio codec name */
    USER_DATA_ARTWORK,        /* artwork of movie or music */
    USER_DATA_COMPOSER,       /* name of composer */
    USER_DATA_DIRECTOR,       /* name of movie's director */
    USER_DATA_INFORMATION,    /* information about the movie */
    USER_DATA_CREATOR,        /* name of the file creator or maker */
    USER_DATA_PRODUCER,       /* name of producer */
    USER_DATA_PERFORMER,      /* name of performer */
    USER_DATA_REQUIREMENTS,   /* special hardware and software requirements */
    USER_DATA_SONGWRITER,     /* name of songwriter */
    USER_DATA_MOVIEWRITER,    /* name of movie's writer */
    USER_DATA_TOOL,           /* writing application */
    USER_DATA_DESCRIPTION,    /* movie description */
    USER_DATA_TRACKNUMBER,    /* track number */
    USER_DATA_TOTALTRACKNUMBER,    /* total track number */
    USER_DATA_LOCATION,       /* geographic location */

    /* add more? */
    USER_DATA_CHAPTER_MENU,     /* Chapter Menu information */
    USER_DATA_FORMATVERSION,   /* container format version */
    USER_DATA_PROFILENAME,     /* Profile Name (DivX)*/

    USER_DATA_PROGRAMINFO,     /* program info for ts */
    USER_DATA_PMT,             /* program map table */

    USER_DATA_AUD_ENC_DELAY,   /* audio encoding delay */
    USER_DATA_AUD_ENC_PADDING, /* audio encoding padding */
    USER_DATA_DISCNUMBER,      /* disc number */

    USER_DATA_AUTHOR,         /* author */
    USER_DATA_COLLECTION,     /* collection user */
    USER_DATA_PUBLISHER,      /* publisher */
    USER_DATA_SOFTWARE,       /* software */
    USER_DATA_YEAR,           /* year */
    USER_DATA_KEYWORDS,       /* keywords */
    USER_DATA_ALBUMARTIST,
    USER_DATA_COMPILATION,
    USER_DATA_ANDROID_VERSION,
    USER_DATA_CAPTURE_FPS,
    USER_DATA_PSSH,
    USER_DATA_MP4_CREATION_TIME, //in seconds since midnite, Jan,1, 1904, in UTC time
    USER_DATA_MAX
} UserDataID;

/*********************************************************************
 * User data format
*********************************************************************/
typedef enum FSL_PARSER_USER_DATA_FORMAT
{
    USER_DATA_FORMAT_UTF8,         /* all strings in stream should be convert to UTF-8 and output */

    USER_DATA_FORMAT_INT_BE,
    USER_DATA_FORMAT_UINT_BE,
    USER_DATA_FORMAT_FLOAT32_BE,
    USER_DATA_FORMAT_FLOAT64_BE,

    USER_DATA_FORMAT_JPEG,
    USER_DATA_FORMAT_PNG,
    USER_DATA_FORMAT_BMP,
    USER_DATA_FORMAT_GIF,

    USER_DATA_FORMAT_CHAPTER_MENU,
    /* add more? */

    USER_DATA_FORMAT_PROGRAM_INFO,
    USER_DATA_FORMAT_PMT_INFO,

    USER_DATA_FORMAT_INT_LE,
    USER_DATA_FORMAT_UINT_LE,

    USER_DATA_FORMAT_MAX
} UserDataFormat;


/*********************************************************************
 * file I/O interface on a file or live source.

open
    Open a local file or URL.
    Arguments:
        fileName [in] File name or url to open.
                      To open the movie source file, just set file name to NULL.
                      To open another external file for some track (eg. MP4), set the url.

        mode [in] Open mode, same as libc. Such as "rb".

    Return value:
        Handle of the opened file. NULL for failure.

read
    Read data from the file.
    Arguments:
        handle [in] Handle of the file.
        buffer [in] Pointer to a block of memory, to receive the data.
        size[in] Data size to read, in bytes.

    Return value:
        The total number of bytes successfully read.
        If this number differs from the size parameter, either an error occurred or the EOF was reached.


seek
    Seek the stream.
    Arguments:
        handle [in] Handle of the file.
        offset [in] The offset.
                    To move to a position before the end-of-file, you need to pass a negative value in offset and set whence to SEEK_END.

        whence in]  The new position, measured in bytes from the beginning of the file,
                    is obtained by adding offset to the position specified by whence.
                    SEEK_SET - Set position equal to offset bytes.
                    SEEK_CUR - Set position to current location plus offset .
                    SEEK_END - Set position to end-of-file plus offset.
    Return value:
        Upon success, returns 0; otherwise, returns -1.

tell
    Tell the position of the file pointer
    Arguments:
        handle [in] Handle of the file.

    Return value:
        Returns the position of the file pointer in bytes; i.e., its offset into the file stream.
        If error occurs or this feature can not be supported (eg. broadcast application), returns -1.

size
    Tell the size of the entire file.
    Arguments:
        handle [in] Handle of the file.
    Return value:
        Returns the file size in bytes.
        If error occurs or this feature can not be supported (eg. broadcast application), returns -1.

check_available_bytes
    Tell the availble bytes of the file. Especially useful for a live source file (streaming).
    The parser can decide not to read if cached data is not enough and so avoid reading failure in unexpected context.
    For a local file, any bytes request from the parser can be met as long as it's within the file range.

    Arguments:
        handle [in] Handle of the file.
        bytes_requested [in]    Bytes requested for further parsing. This information can help the application
                                to cache enough data before calling parser API next time.
                                If the parser can not know the exact data size needed, set it to 0.

    Return value:
        If the file source can always meet the data reading request unless EOF (eg. a local file or a pull-mode live source),
        returns the data size from the current file pointer to the file end.

        Otherwise (eg. a push-mode live source), returns the cached data size.
        If error occurs or this feature can not be supported (eg. broadcast application), returns -1.

close
    Close the file.
    Arguments:
        handle [in] Handle of the file.

    Return value:
        Upon success, returns 0; otherwise, returns -1.
*/

typedef void * FslFileHandle;

/* Seek origin, position from where offset is added, same as libc */
#ifndef FSL_SEEK_SET
#define FSL_SEEK_SET 0 /* SEEK_SET, Beginning of file */
#endif
#ifndef FSL_SEEK_CUR
#define FSL_SEEK_CUR 1  /* SEEK_CUR, Current position of file pointer */
#endif
#ifndef FSL_SEEK_END
#define FSL_SEEK_END 2  /* SEEK_END, End of file */
#endif

typedef struct _FslFileStream
{
    FslFileHandle (*Open)(const uint8 * fileName, const uint8 * mode, void * context); /* Open a file or URL */
    int32 	(*Close)(FslFileHandle handle, void * context); /* Close the stream */
    uint32  (*Read)(FslFileHandle handle, void * buffer, uint32 size, void * context); /* Read data from the stream */
    int32 	(*Seek)(FslFileHandle handle, int64 offset, int32 whence, void * context);  /* Seek the stream */
    int64  	(*Tell)(FslFileHandle handle, void * context); /* Tell the current position from start of the stream */
    int64 	(*Size)(FslFileHandle handle, void * context); /* Get the size of the entire stream */
    int64   (*CheckAvailableBytes)(FslFileHandle handle, int64 bytesRequested, void * context); /* How many bytes cached but not read yet */
    uint32  (*GetFlag)(FslFileHandle handle, void * context);
    void * reserved[1];

} FslFileStream;


/*********************************************************************
 * Core parser memory callback function pointer table.
 *********************************************************************/
typedef struct
{
    void* (*Calloc) (uint32 numElements, uint32 size);
    void* (*Malloc) (uint32 size);
    void  (*Free) (void * ptr);
    void* (*ReAlloc)(void * ptr, uint32 size); /* necessary for index scanning!*/

}ParserMemoryOps; /* callback operation callback table */


/********************************************************************************************************
Callback functions to request/release an output buffer.
Usually, the core parser requests an output buffer, fill the media data and return it to the application
on GetNextSample(). But, on flushing (eg. on seek or deletion), the core parser need explicitly release
all buffers not returned yet.

RequestBuffer
    Request an output buffer.

    Arguments:
        streamNum [in] Track number, 0-based.

        size [in,out] The requested buffer size as input, and the size actually got as output, both in bytes.
                      The actually got size can be larger than the requested size, and the parser can
                      make full use of the buffer.

        bufContext [out] A buffer context from the application. The parser shall not modify it.

        parserContext [in] The parser context from the application, got on parser creation.

    Return value:
        Buffer pointer. NULL for failure.


ReleaseBuffer
    Release an output buffer explicitly.

    Arguments:
        streamNum [in] Track number, 0-based.
        pBuffer [in] Buffer to release.
        bufContext [in] The buffer context from the application, got on requestBuffer().
        parserContext [in] The parser context from the application, got on parser creation.

    Return value: none.

********************************************************************************************************/

typedef struct
{
    uint8* (*RequestBuffer) (uint32 streamNum, uint32 *size, void ** bufContext, void * parserContext);
    void (*ReleaseBuffer) (uint32 streamNum, uint8 * pBuffer, void * bufContext, void * parserContext);

}ParserOutputBufferOps;

typedef struct _ChapterInfo
{
    uint32 ChapterUID;      /* UID for chapter */
    uint32 dwStartTime;     /* Chapter's Start time in ms unit */
    uint32 dwStopTime;      /* Chapter's Stop time in ms unit */
    uint32 dwTitleSize;     /* Chapter Title size in byte */
    char * Title;           /* The string for Title */
}ChapterInfo;

typedef struct _strChapterMenu
{
    uint32 EditionUID;      /* UID for Movie/Edition */
    uint32 EdtionFlags;     /* Flags for Movie/Edition */
    uint32 dwChapterNum;    /* Total number of chapters in this Edition */
    ChapterInfo * pChapterList; /* the pointer to Chapter information list */
}ChapterMenu;

typedef struct _ProgramInfo
{
    uint32 m_dwChannel; //program_number in spec, for a broadcast channel.
    uint32 m_dwPID; //program PID(packet ID)
}ProgramInfo;

typedef struct _ProgramInfoMenu
{
    uint32 m_dwProgramNum;
    ProgramInfo m_atProgramInfo[0];
}ProgramInfoMenu;


#define INVALID_PID         (uint32)(-1)
#define INVALID_CHANNEL     (uint32)(-1)


typedef struct _TrackInfo
{
    uint32 m_dwTrackNo; //global track No
    uint32 m_dwPID;     //PID(packet ID)
    uint8 m_byLan[3];   //language
    uint32 m_dwReserved[16];
}TrackInfo;

//single program map table
typedef struct _PMTInfo
{
    uint32 m_dwChannel; //program_number in spec, for a broadcast channel.
    uint32 m_dwPID;     //PID(packet ID)
    uint32 m_dwReserved[8];
    uint32 m_dwTrackNum;
    TrackInfo *m_ptTrackInfo;
}PMTInfo;

//total program map table
typedef struct _PMTInfoList
{
    uint32 m_dwProgramNum;
    PMTInfo *m_ptPMTInfo;
}PMTInfoList;

//struct for FslParserGetTrackExtTag
typedef struct _TrackExtTagItem
{
    uint32 index;
    uint32 type;
    uint32 size;
    uint8* data;
    struct _TrackExtTagItem * nextItemPtr;
}TrackExtTagItem;

typedef struct TrackExtTagList
{
    int32 num;
    TrackExtTagItem * m_ptr;
}TrackExtTagList;

enum{
    FSL_PARSER_TRACKEXTTAG_CRPYTOKEY = 0,
    FSL_PARSER_TRACKEXTTAG_TX3G,
    FSL_PARSER_TRACKEXTTAG_CRPYTOMODE,
    FSL_PARSER_TRACKEXTTAG_CRPYTODEFAULTIVSIZE
}TrackExtTagIndex;

typedef struct _SeiPosition
{
    uint32 offset;
    uint32 size;
}SeiPosition;

typedef struct
{
    uint32 maxCLL;
    uint32 maxFALL;
    bool hasMasteringMetadata;
    float PrimaryRChromaticityX;
    float PrimaryRChromaticityY;
    float PrimaryGChromaticityX;
    float PrimaryGChromaticityY;
    float PrimaryBChromaticityX;
    float PrimaryBChromaticityY;
    float WhitePointChromaticityX;
    float WhitePointChromaticityY;
    float LuminanceMax;
    float LuminanceMin;
}VideoHDRColorInfo;

/*********************************************************************************************************
 *                  API Function Prototypes List
 *
 * There are mandatory and optional APIs.
 * A core parser must implement the mandatory APIs while need not implement the optional one.
 * And in its DLL entry point "FslParserInit", it shall set the not-implemented function pointers to NULL.
 *
 *********************************************************************************************************/

/***************************************************************************************
 *
 *                Creation & Deletion
 *
 ***************************************************************************************/
/* mandatory */
typedef const char * (*FslParserVersionInfo)();

typedef int32  (*FslCreateParser)(  bool isLive,
                                    FslFileStream * streamOps,
                                    ParserMemoryOps * memOps,
                                    ParserOutputBufferOps * outputBufferOps,
                                    void * context,
                                    FslParserHandle * parserHandle);

typedef int32 (*FslDeleteParser)(FslParserHandle parserHandle);

/* optional */
typedef int32  (*FslCreateParser2)( uint32 flags,
                                    FslFileStream * streamOps,
                                    ParserMemoryOps * memOps,
                                    ParserOutputBufferOps * outputBufferOps,
                                    void * context,
                                    FslParserHandle * parserHandle);

/***************************************************************************************
 *
 *                 Index Table Loading, Export & Import
 *
 ***************************************************************************************/
/* optional */
typedef int32 (*FslParserInitializeIndex)(FslParserHandle parserHandle); /*Loading index from the movie file */

typedef int32 (*FslParserImportIndex)(  FslParserHandle parserHandle, /* Import index from outside */
                                        uint8 * buffer,
                                        uint32 size);

typedef int32 (*FslParserExportIndex)(  FslParserHandle parserHandle,
                                        uint8 * buffer,
                                        uint32 *size);


/************************************************************************************************************
 *
 *               Movie Properties
 *
 ************************************************************************************************************/
/* mandatory */
typedef int32 (*FslParserIsSeekable)(FslParserHandle parserHandle, bool * seekable);

typedef int32 (*FslParserGetMovieDuration)(FslParserHandle parserHandle,  uint64 * usDuration);

typedef int32 (*FslParserGetUserData)(  FslParserHandle parserHandle,
                                        uint32 userDataId,
                                        uint16 ** unicodeString,
                                        uint32 * stringLength);

typedef int32 (*FslParserGetMetaData)(  FslParserHandle parserHandle,
                                        UserDataID userDataId,
                                        UserDataFormat * userDataFormat,
                                        uint8 ** userData,
                                        uint32 * userDataLength);

typedef int32 (*FslParserGetNumTracks)(FslParserHandle parserHandle, uint32 * numTracks); /* single program interface */

typedef int32 (*FslParserGetNumPrograms)(FslParserHandle parserHandle, uint32 * numPrograms); /* multiple program interface */
typedef int32 (*FslParserGetProgramTracks)( FslParserHandle parserHandle,
                                            uint32 programNum,
                                            uint32 * numTracks,
                                            uint32 ** ppTrackNumList);

typedef int32 (*FslParserGetPCR)( FslParserHandle parserHandle,
                                            uint32 programNum,
                                            uint64* usPCR);

/************************************************************************************************************
 *
 *              General Track Properties
 *
 ************************************************************************************************************/
typedef int32 (*FslParserGetTrackType)( FslParserHandle parserHandle,
                                        uint32 trackNum,
                                        uint32 * mediaType,
                                        uint32 * decoderType,
                                        uint32 * decoderSubtype);

typedef int32 (*FslParserGetTrackDuration)( FslParserHandle parserHandle,
                                            uint32 trackNum,
                                            uint64 * usDuration); /* Duration 0 means an empty track */

typedef int32 (*FslParserGetLanguage)(  FslParserHandle parserHandle,
                                        uint32 trackNum,
                                        uint8 * threeCharCode);

/* optional */
typedef int32 (*FslParserGetBitRate)(   FslParserHandle parserHandle,
                                        uint32 trackNum,
                                        uint32 * bitrate);

typedef int32 (*FslParserGetDecSpecificInfo)(   FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint8 ** data,
                                                uint32 * size);

typedef int32 (*FslParserGetTrackExtTag)(   FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                TrackExtTagList **pList);

/************************************************************************************************************
 *
 *               Video Properties, only for video media
 *
 ************************************************************************************************************/
/* mandatory */
typedef    int32 (*FslParserGetVideoFrameWidth)(FslParserHandle parserHandle, uint32 trackNum, uint32 *width);

typedef    int32 (*FslParserGetVideoFrameHeight)(FslParserHandle parserHandle, uint32 trackNum, uint32 *height);

/* optional */
typedef    int32 (*FslParserGetVideoFrameRate)( FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint32 * rate,
                                                uint32 * scale);

typedef    int32 (*FslParserGetVideoFrameRotation)(FslParserHandle parserHandle, uint32 trackNum, uint32 *rotation);

/* optional */
typedef    int32 (*FslParserGetVideoColorInfo)(FslParserHandle parserHandle, uint32 trackNum
                                                , int32* primaries,int32 * transfer, int32* coeff, int32* fullRange);


typedef    int32 (*FslParserGetVideoHDRColorInfo)(FslParserHandle parserHandle, uint32 trackNum, VideoHDRColorInfo *pInfo);

typedef    int32 (*FslParserGetVideoDisplayWidth)(FslParserHandle parserHandle, uint32 trackNum, uint32 *width);

typedef    int32 (*FslParserGetVideoDisplayHeight)(FslParserHandle parserHandle, uint32 trackNum, uint32 *height);

typedef    int32 (*FslParserGetVideoFrameCount)(FslParserHandle parserHandle, uint32 trackNum, uint32 *count);


/************************************************************************************************************
 *
 *               Audio Properties
 *
 ************************************************************************************************************/
/* mandatory */
typedef int32 (*FslParserGetAudioNumChannels)(  FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint32 * numchannels);

typedef int32 (*FslParserGetAudioSampleRate)(   FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint32 * sampleRate);

typedef int32 (*FslParserGetAudioBitsPerSample)(FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint32 * bitsPerSample); /* bit depth */

/* optional */
typedef int32 (*FslParserGetAudioBlockAlign)(FslParserHandle parserHandle,
                                             uint32 trackNum,
                                             uint32 * blockAlign);

typedef int32 (*FslParserGetAudioBitsPerFrame)( FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint32 *bits_per_frame); /* for Real audio */

typedef int32 (*FslParserGetAudioChannelMask)(  FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint32 * channelMask); /* for WMA audio */


/************************************************************************************************************
 *
 *               Text/Subtitle Properties
 *
 ************************************************************************************************************/
/* mandatory */
typedef int32 (*FslParserGetTextTrackWidth)(FslParserHandle parserHandle,
                                            uint32 trackNum,
                                            uint32 * width);

typedef int32 (*FslParserGetTextTrackHeight)(   FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint32 * height);

typedef int32 (*FslParserGetTextTrackMime)(   FslParserHandle parserHandle,
                                                uint32 trackNum,
                                                uint8 ** sampleBuffer,uint32 * dataSize);
/************************************************************************************************************
 *
 *               Sample Reading, Seek & Trick Mode
 *
 * NOTE: if the core parser can not give a valid sample duration,
 *       setting the sample duration to ZERO is a good choice.
 *
 ************************************************************************************************************/
/* mandatory */
typedef int32 (*FslParserGetReadMode)(FslParserHandle parserHandle, uint32 * readMode);
typedef int32 (*FslParserSetReadMode)(FslParserHandle parserHandle, uint32 readMode);

typedef int32 (*FslParserEnableTrack)(  FslParserHandle parserHandle,
                                        uint32 trackNum,
                                        bool enable);

typedef int32 (*FslParserGetNextSample)(FslParserHandle parserHandle,
                                        uint32 trackNum,
                                        uint8 ** sampleBuffer,
                                        void  ** bufferContext,
                                        uint32 * dataSize,
                                        uint64 * usStartTime,
                                        uint64 * usDuration,
                                        uint32 * sampleFlags); /* Only for track-based sample reading. The application tell which track to read.*/


/* optional */
typedef int32 (*FslParserGetNextSyncSample)(FslParserHandle parserHandle,
                                            uint32 direction,
                                            uint32 trackNum,
                                            uint8 ** sampleBuffer,
                                            void  ** bufferContext,
                                            uint32 * dataSize,
                                            uint64 * usStartTime,
                                            uint64 * usDuration,
                                            uint32 * flags); /* only for trick mode on video track */


typedef int32 (*FslParserGetFileNextSample)(FslParserHandle parserHandle,
                                            uint32 * trackNum,
                                            uint8 ** sampleBuffer,
                                            void  ** bufferContext,
                                            uint32 * dataSize,
                                            uint64 * usStartTime,
                                            uint64 * usDuration,
                                            uint32 * sampleFlags); /* Only for file-based sample reading. The parser tell which track is being read.*/


/* optional */
typedef int32 (*FslParserGetFileNextSyncSample)(FslParserHandle parserHandle,
                                            uint32 direction,
                                            uint32 * trackNum,
                                            uint8 ** sampleBuffer,
                                            void  ** bufferContext,
                                            uint32 * dataSize,
                                            uint64 * usStartTime,
                                            uint64 * usDuration,
                                            uint32 * flags); /* only for trick mode on video track */

//crypto info for android widevine
typedef int32 (*FslParserGetSampleCryptoInfo)(FslParserHandle parserHandle,
                                            uint32 trackNum,
                                            uint8** iv,
                                            uint32 * ivSize,
                                            uint8 ** clearBuffer,
                                            uint32 * clearSize,
                                            uint8 ** encryptedBuffer,
                                            uint32 * encryptedSize);

/* mandatory */
typedef int32 (*FslParserSeek)( FslParserHandle parserHandle,
                                uint32 trackNum,
                                uint64 * usTime,
                                uint32 flag);




/************************************************************************************************************
 *
 *               DLL entry point (mandatory) - to query parser interface
 *
 ************************************************************************************************************/
enum /* API function ID */
{
    /* creation & deletion */
    PARSER_API_GET_VERSION_INFO  = 0,
    PARSER_API_CREATE_PARSER     = 1,
    PARSER_API_DELETE_PARSER     = 2,
    PARSER_API_CREATE_PARSER2     = 5,

    /* index export/import */
    PARSER_API_INITIALIZE_INDEX  = 10,
    PARSER_API_IMPORT_INDEX      = 11,
    PARSER_API_EXPORT_INDEX      = 12,


    /* movie properties */
    PARSER_API_IS_MOVIE_SEEKABLE    = 20,
    PARSER_API_GET_MOVIE_DURATION   = 21,
    PARSER_API_GET_USER_DATA       = 22,
    PARSER_API_GET_META_DATA       = 23,

    PARSER_API_GET_NUM_TRACKS       = 25,

    PARSER_API_GET_NUM_PROGRAMS     = 26,
    PARSER_API_GET_PROGRAM_TRACKS   = 27,
    PARSER_API_GET_PCR              = 28,


    /* generic track properties */
    PARSER_API_GET_TRACK_TYPE                   = 30,
    PARSER_API_GET_TRACK_DURATION               = 31,
    PARSER_API_GET_LANGUAGE                     = 32,
    PARSER_API_GET_BITRATE                      = 36,
    PARSER_API_GET_DECODER_SPECIFIC_INFO        = 37,
    PARSER_API_GET_TRACK_EXT_TAG                = 38,

    /* video properties */
    PARSER_API_GET_VIDEO_FRAME_WIDTH        = 50,
    PARSER_API_GET_VIDEO_FRAME_HEIGHT       = 51,
    PARSER_API_GET_VIDEO_FRAME_RATE         = 52,
    PARSER_API_GET_VIDEO_FRAME_ROTATION     = 53,
    PARSER_API_GET_VIDEO_COLOR_INFO         = 54,
    PARSER_API_GET_VIDEO_HDR_COLOR_INFO     = 55,
    PARSER_API_GET_VIDEO_DISPLAY_WIDTH      = 56,
    PARSER_API_GET_VIDEO_DISPLAY_HEIGHT     = 57,
    PARSER_API_GET_VIDEO_FRAME_COUNT        = 58,

    /* audio properties */
    PARSER_API_GET_AUDIO_NUM_CHANNELS       = 60,
    PARSER_API_GET_AUDIO_SAMPLE_RATE        = 61,
    PARSER_API_GET_AUDIO_BITS_PER_SAMPLE    = 62,

    PARSER_API_GET_AUDIO_BLOCK_ALIGN        = 65,
    PARSER_API_GET_AUDIO_CHANNEL_MASK       = 66,
    PARSER_API_GET_AUDIO_BITS_PER_FRAME     = 67,


    /* text/subtitle properties */
    PARSER_API_GET_TEXT_TRACK_WIDTH = 80,
    PARSER_API_GET_TEXT_TRACK_HEIGHT= 81,
    PARSER_API_GET_TEXT_TRACK_MIME = 82,

    /* sample reading, seek & trick mode */
    PARSER_API_GET_READ_MODE = 100,
    PARSER_API_SET_READ_MODE = 101,

    PARSER_API_ENABLE_TRACK = 105,

    PARSER_API_GET_NEXT_SAMPLE = 110,
    PARSER_API_GET_NEXT_SYNC_SAMPLE = 111,


    PARSER_API_GET_FILE_NEXT_SAMPLE = 115,
    PARSER_API_GET_FILE_NEXT_SYNC_SAMPLE = 116,

    PARSER_API_GET_SAMPLE_CRYPTO_INFO = 117,

    PARSER_API_SEEK  = 120


};

/* prototype of entry point */
typedef int32 (*tFslParserQueryInterface)(uint32 id, void ** func);

/*
Every core parser shall implement this function and tell a specific API function pointer.
If the queried API is not implemented, the parser shall set funtion pointer to NULL and return PARSER_SUCCESS. */

EXTERN int32 FslParserQueryInterface(uint32 id, void ** func);


#endif /* _FSL_PARSER_COMMON_H */

