/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
// -*- c++ -*-
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

//                 M P 3   F I L E   P A R S E R

// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =


/**
 *  @file imp3ff.h
 *  @brief This file defines the MP3 File Format Interface Definition.
 *  It initializes and maintains the MP3 File Format Library
 */

#ifndef IMP3FF_H_INCLUDED
#define IMP3FF_H_INCLUDED


//----------------------------------------------------------------------
// Include Files
//----------------------------------------------------------------------

#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_VECTOR_H_INCLUDED
#include "oscl_vector.h"
#endif
#ifndef OSCL_String_H_INCLUDED
#include "oscl_string.h"

#endif
#ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
#include "oscl_string_containers.h"
#endif
#ifndef OSCL_FILE_IO_H_INCLUDED
#include "oscl_file_io.h"
#endif
#ifndef OSCL_MEM_H_INCLUDED
#include "oscl_mem.h"
#endif
#ifndef PVFILE_H_INCLUDED
#include "pvfile.h"
#endif

#ifndef PV_ID3_PARCOM_H_INCLUDED
#include "pv_id3_parcom.h"
#endif
// Header files reqd for multiple sample retrieval api
#ifndef OSCL_MEDIA_DATA_H
#include "oscl_media_data.h"
#endif
#ifndef PV_GAU_H_
#include "pv_gau.h"
#endif

// Header files for pvmf metadata handling
#ifndef PVMF_RETURN_CODES_H_INCLUDED
#include "pvmf_return_codes.h"
#endif
#ifndef PVMF_META_DATA_H_INCLUDED
#include "pvmf_meta_data_types.h"
#endif
#ifndef PVMI_KVP_INCLUDED
#include "pvmi_kvp.h"
#endif



//----------------------------------------------------------------------
// Global Type Declarations
//----------------------------------------------------------------------

typedef struct _MP3ContentFormatTypeTag
{
    uint32 Bitrate;
    uint32 SamplingRate;
    uint32 NumberOfChannels;
    uint32 NumberOfFrames;
    uint32 FrameSize;
    uint32 FileSizeInBytes;
    uint32 FrameSizeUnComp;
    uint32 ChannelMode;  //0: Stereo 1: Joint Ch. Stereo 2: Dual  Ch. Stereo 3: Mono
} MP3ContentFormatType;

typedef enum
{
    MP3_CHANNEL_MODE_STEREO = 0,
    MP3_CHANNEL_MODE_JOINT_CHANNEL_STEREO = 1,
    MP3_CHANNEL_MODE_DUAL_CHANNEL_STEREO = 2,
    MP3_CHANNEL_MODE_MONO = 3
} MP3ChannelMode;

typedef enum
{
    MP3_ERROR_UNKNOWN = 0,
    MP3_SUCCESS = 1,
    MP3_END_OF_FILE = 2,
    MP3_CRC_ERR = 3,
    MP3_FILE_READ_ERR = 4,
    MP3_FILE_HDR_READ_ERR = 5,
    MP3_FILE_HDR_DECODE_ERR = 6,
    MP3_FILE_XING_HDR_ERR = 7,
    MP3_FILE_VBRI_HDR_ERR = 8,
    MP3_ERR_NO_MEMORY = 9,
    MP3_NO_SYNC_FOUND = 10,
    MP3_FILE_OPEN_ERR = 11,
    /* PD related Error values*/
    MP3_ERROR_UNKNOWN_OBJECT = 12,
    MP3_FILE_OPEN_FAILED = 13,
    MP3_INSUFFICIENT_DATA = 14,
    MP3_METADATA_NOTPARSED = 15,
    /* Duration related Info value*/
    MP3_DURATION_PRESENT = 16
} MP3ErrorType;

//----------------------------------------------------------------------
// Forward Class Declarations
//----------------------------------------------------------------------
class MP3Parser;
class PVMFCPMPluginAccessInterfaceFactory;

/**
 *  @brief The IMpeg3File Class is the class that will construct and maintain all the
 *  necessary data structures to be able to render a valid MP3 file to disk.
 *
 */

class IMpeg3File
{
    public:
        /**
        * @brief Constructor
        *
        * @param filename MP3 filename
        * @param bSuccess Result of operation: true=successful, false=failed
        * @param fileServSession Pointer to opened file server session. Used when opening
        * and reading the file on certain operating systems.
        * @returns None
        */
        OSCL_IMPORT_REF  IMpeg3File(OSCL_wString& filename, MP3ErrorType &bSuccess, Oscl_FileServer* fileServSession = NULL, PVMFCPMPluginAccessInterfaceFactory*aCPM = NULL, OsclFileHandle*aHandle = NULL, bool enableCRC = true);

        /**
        * @brief Constructor
        *
        * @param bSuccess Result of operation: true=successful, false=failed
        * @returns None
        */
        OSCL_IMPORT_REF IMpeg3File(MP3ErrorType &bSuccess);

        /**
        * @brief Destructor
        *
        * @param None
        * @returns None
        */
        OSCL_IMPORT_REF ~IMpeg3File();

        /**
        * @brief Returns the parse status of the file
        *
        * @param None
        * @returns Result of operation
        */
        OSCL_IMPORT_REF MP3ErrorType ParseMp3File();

        /**
        * @brief Returns the configuration details of the file
        *
        * @param mp3Config Data structure that will contain config info
        * @returns Result of operation: 1=success; 0=fail
        */
        OSCL_IMPORT_REF MP3ErrorType GetConfigDetails(MP3ContentFormatType &mp3Config);

        /**
        * @brief Resets the parser variables so playback can be restarted at the
        * specified time.
        *
        * @param timestamp value as where to start repositioning to
        * @returns Result of operation: 1=success; 0=fail
        */
        OSCL_IMPORT_REF uint32 ResetPlayback(uint32 timestamp = 0);

        /**
        * @brief Attempts to read in the number of audio frames specified by n
        *
        * @param n Requested number of frames to be read from file
        * @param pgau Frame information structure of type GAU
        * @returns Result of operation: 1=success; 0=fail
        */
        OSCL_IMPORT_REF int32  GetNextBundledAccessUnits(uint32 *n, GAU *pgau, MP3ErrorType &err);

        /**
        * @brief Attempts to peek into the number of audio frames specified by n
        *
        * @param n Requested number of frames to be read from file
        * @param mInfo Frame information structure of type MediaMetaInfo
        * @returns Result of operation: 1=success; 0=fail
        */
        OSCL_IMPORT_REF int32  PeekNextBundledAccessUnits(uint32 *n, MediaMetaInfo *mInfo);

        /**
        * @brief Reads the next frame from the file
        *
        * @param buf Buffer containing the frame read
        * @param size Size of the buffer
        * @param framesize Size of the frame data read
        * @param timestamp Timestamp of the frame
        * @returns Result of operation: true=success; false=fail
        */
        OSCL_IMPORT_REF MP3ErrorType GetNextMediaSample(uint8 *buf, uint32 size, uint32& framesize, uint32& timestamp);

        /**
        * @brief Returns the timestamp of the current frame
        *
        * @param None
        * @returns Timestamp
        */
        OSCL_IMPORT_REF uint32 GetTimestampForCurrentSample();

        /**
        * @brief Moves the file pointer to the specified timestamp
        *
        * @param timestamp Time to seek to
        * @returns Timestamp seeked to. If timestamp is past end of clip, timestamp is 0.
        */
        OSCL_IMPORT_REF uint32  SeekToTimestamp(uint32 timestamp);

        /**
        * @brief Queries the seek point file positiion and timestamp corresponding to the specified timestamp
        *
        * @param timestamp Time to seek to. Will be set to the actual timestamp.
        * @returns File position closest to the specified timestamp. If timestamp is past end of clip, file position is set to 0.
        */
        OSCL_IMPORT_REF uint32  SeekPointFromTimestamp(uint32& timestamp);

        /**
        * @brief Queries the offset corresponding to the specified timestamp
        *
        * @param timestamp Time to seek to. Will be set to the actual timestamp.
        * @returns offset
        */
        OSCL_IMPORT_REF uint32  GetFileOffsetForAutoResume(uint32& timestamp);

        /**
        * @brief Returns whether random access is allowed or not.
        *
        * @param None
        * @returns true=allowed, false=not allowed
        */
        OSCL_IMPORT_REF uint8  RandomAccessDenied();

        /**
        * @brief Returns the number of tracks in the file.
        *
        * @param None
        * @returns Number of tracks
        */
        OSCL_IMPORT_REF int32 GetNumTracks();

        /**
        * @brief Returns the timescale used.
        *
        * @param None
        * @returns Timescale
        */
        OSCL_IMPORT_REF uint32 GetTimescale() const;

        /**
        * @brief Returns the duration of the clip.
        *
        * @param None
        * @returns Duration
        */
        OSCL_IMPORT_REF uint32 GetDuration() const;

        /**
        * @brief Returns the approximate duration of downloaded data.
        *
        * @param aFileSize, aNPTInMS
        * @returns aNPTInMS
        */
        OSCL_IMPORT_REF int32 ConvertSizeToTime(uint32 aFileSize, uint32& aNPTInMS) const;

        /**
        * @brief Returns the number of frames in the clip.
        *
        * @param None
        * @returns Number of frames
        */
        OSCL_IMPORT_REF int32 GetNumSampleEntries();

        /**
        * @brief Returns the mime type of the clip.
        *
        * @param None
        * @returns Mime type
        */
        OSCL_IMPORT_REF OSCL_wHeapString<OsclMemAllocator>  GetMIMEType();

        /**
        * @brief Returns the maximum buffer size used.
        *
        * @param None
        * @returns Buffer size
        */
        OSCL_IMPORT_REF int32 GetMaxBufferSizeDB();

        /**
        * @brief Returns the content of decoder specific info.
        *
        * @param None
        * @returns Decoder specific info
        */
        OSCL_IMPORT_REF uint8 const *GetDecoderSpecificInfoContent() const;

        /**
        * @brief Returns the size of decoder specific info.
        *
        * @param None
        * @returns Decoder specific info size
        */
        OSCL_IMPORT_REF uint32 GetDecoderSpecificInfoSize();

        /**
        * @brief Returns the number of available metadata keys. Subset is returned if a query string is specified
        *
        * @param aQueryString A query string for the keys to select a subset of the all available keys
        *
        * @returns Number of available metadata keys
        */
        OSCL_IMPORT_REF uint32 GetNumMetadataKeys(char* aQueryString = NULL);

        /**
        * @brief Returns the number of available metadata values based on the key list provided
        *
        * @param aKeyList A list of key strings to return the number of values
        *
        * @returns Number of available metadata values
        */
        OSCL_IMPORT_REF uint32 GetNumMetadataValues(PVMFMetadataList& aKeyList);

        /**
        * @brief Returns a list of the available metadata keys.
        *
        * @param aKeyList Reference to a keylist to be filled in by this method.
        * @param starting_index Zero based index of which keys to get.
        * @param max_entries Max # of entries this method should write to the key list.
        * @returns None
        */
        OSCL_IMPORT_REF PVMFStatus GetMetadataKeys(PVMFMetadataList& aKeyList, uint32 aStartingKeyIndex, int32 aMaxKeyEntries, char* aQueryString);

        /**
        * @brief Returns the metadata values corresponding to the specified keys.
        *
        * @param aKeyList Reference to a keylist specifying keys for which the values are being requested.
        * @param aValueList Reference to value list which this method will fill in.
        * @param starting_index
        */
        OSCL_IMPORT_REF PVMFStatus GetMetadataValues(PVMFMetadataList& aKeyList, Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 aStartingValueIndex, int32 aMaxValueEntries);

        /**
        * @brief Releases memory allocated for the metadata values
        *
        * @param aValueKVP Reference to metadata value stored in a KVP to release memory
        */
        OSCL_IMPORT_REF PVMFStatus ReleaseMetadataValue(PvmiKvp& aValueKVP);

        /**
        * @brief Requests call back for parser node when data stream is out of data
        *
        * @param aObserver - observer, which would receive the call back once
        *                   the file has been downloaded till provided offset.
        * @param aFileOffset - offset for which data is not available.
        * @param aContextData - context data
        */
        OSCL_IMPORT_REF  MP3ErrorType RequestReadCapacityNotification(PvmiDataStreamObserver& aObserver,
                uint32 aFileOffset,
                OsclAny* aContextData = NULL);
        /**
        * @brief Retrieves the Metadata size in the mp3 clip
        *
        * @param reference to metadatasize
        * @returns error type.
        */
        OSCL_IMPORT_REF MP3ErrorType GetMetadataSize(uint32& aMetaDataSize);

        /**
        * @brief Retrieves minimum bytes required for getting the config info
        *
        * @param
        * @returns byte size of firstframe and id3 tags.
        */
        OSCL_IMPORT_REF uint32 GetMinBytesRequired(bool aNextBytes = false);

        /**
        * @brief Sets the file size to the parser
        *
        * @param aFileSize
        * @returns error type.
        */
        OSCL_IMPORT_REF MP3ErrorType SetFileSize(const uint32 aFileSize);

        /**
        * @brief Verifies if the supplied file is valid mp3 file
        *
        * @param aFileName
        * @param aCPMAccessFactory
        * @param aEnableCRC - whether or not to enable crc check
        */
        OSCL_IMPORT_REF MP3ErrorType IsMp3File(OSCL_wString& aFileName,
                                               PVMFCPMPluginAccessInterfaceFactory *aCPMAccessFactory,
                                               uint32 aInitSearchFileSize);

        OSCL_EXPORT_REF MP3ErrorType ScanMP3File(uint32 aFramesToScan);

    private:
        OsclAny* AllocateKVPKeyArray(int32& leavecode, PvmiKvpValueType aValueType, int32 aNumElements);
        int32 PushKVPValue(PvmiKvp aKVP, Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList);
        int32 PushKVPKey(const char* aString, PVMFMetadataList& aKeyList);
        int32 PushKVPKey(OSCL_HeapString<OsclMemAllocator>& aString, Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator>& aKeyList);

        MP3Parser* pMP3Parser;
        PVFile iMP3File;
        bool iEnableCrcCalc;
        PVFile iScanFP;
        Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> iAvailableMetadataKeys;
};


#endif // #ifndef IMP3FF_H_INCLUDED
