/* ------------------------------------------------------------------
 * Copyright (C) 2008 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.
 * -------------------------------------------------------------------
 */

#ifndef __PVVIDEODECBASE_H
#define __PVVIDEODECBASE_H


// includes
#include <e32std.h>
#include <e32base.h>
#include "mp4dec_api.h"
#include "dspmsgproto1.h"
#include "dspmsgproto2.h"
#include "dspmsgproto4.h"
#include "dsp_msg_proto6.h"
#include "DspMsgProto7.h"
#include "dspmsgproto9.h"
#include "dspmsgproto10.h"
#include "dspmsgproto11.h"
#include "dspmsgproto12.h"
#include "dspmsgproto13.h"
#include "dspmsgproto14.h"
#include "dspmsgproto15.h"
#include "dspmsgproto16.h"
#include "dspmsgproto17.h"
#include "dspmsgproto20.h"

#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif

#ifndef VISUAL_HEADER_H_INCLUDED
#include "visual_header.h"
#endif

#ifndef PVVIDEODECODERINTERFACE_H_INCLUDED
#include "pvvideodecoderinterface.h"
#endif

#include "pvzcdt.h"
#define UChar uint8
#define MAX_LAYERS 1

#define USING_SYNC_2STEP

class PVM4VDecoder_DPI : public PVVideoDecoderInterface
{
    public:

        PVM4VDecoder_DPI();
        PVM4VDecoder_DPI(CPVDsp* aDsp);
        ~PVM4VDecoder_DPI();
        static PVM4VDecoder_DPI* New(void);

        IMPORT_C static PVM4VDecoder_DPI* NewL(CPVDsp* aDsp);

        IMPORT_C bool InitVideoDecoder(uint8 *volbuf[], int32 *volbuf_size, int32 nLayers, int32* iWidth, int32* iHeight, int *mode);

////// not implemeneted/////////////////////////////////////////////////////////////////////////////////////////////////////////////
        IMPORT_C bool  GetVolInfo(VolInfo* pVolInfo) {};
        IMPORT_C void	DecPostProcess(uint8 *YUV) {};
        IMPORT_C void  DecSetEnhReference(uint8 *refYUV, uint32 timestamp) {};
        IMPORT_C void	SetReferenceYUV(uint8 *YUV) {};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        IMPORT_C void 	GetVideoDimensions(int32 *display_width, int32 *display_height)
        {
            *display_width = GetVideoWidth();
            *display_height = GetVideoHeight();
        };

#ifdef USING_SYNC_2STEP
        IMPORT_C bool	getSynchResponse(uint32 timestamp[], int32 buffer_size[]);
        IMPORT_C bool	DSPDecoderBusy();
#endif

        IMPORT_C int32	GetVideoWidth(void);
        IMPORT_C int32	GetVideoHeight(void);
        IMPORT_C int32	DPIFreeVideoDecCtrls(void);

        IMPORT_C void	CleanUpVideoDecoder(void);
        IMPORT_C bool	IsIFrame(void);

        IMPORT_C void	SetPostProcType(int32 aMode);

        IMPORT_C bool  DecodeVideoFrame(uint8 *bitstream[], uint32 *timestamp, int32 *buffer_size, uint *use_ext_ts, uint8 *YUV);
        IMPORT_C bool  DecodeVideoFrame(uint8 *bitstream[], uint32 *timestamp, int32 *buffer_size, uint *use_ext_ts, uint8 *YUV, TRequestStatus *aRequestStatus);
        IMPORT_C bool  DecodeVideoFrameAsyncResp(uint32 timestamp[], int32 buffer_size[]);

        IMPORT_C bool	DecodeStillVideoFrame(uint8 *buffer, int32 buf_size, uint8 *YUV);

        IMPORT_C bool	GetStillVideoFrameSize(uint8 *buffer, int32 buf_size, int32 *width, int32 *height);

        IMPORT_C uint8*  GetDecOutputFrame(void);
        IMPORT_C void    GetDecOutputFrame(uint8*);

        IMPORT_C uint8*  CopyDecOutputFrameToSharedMemBuf(void);

        IMPORT_C bool	ResetVideoDecoder(void);

        IMPORT_C TDspPointer DPIAllocVideoDecCtrls(void);

        IMPORT_C uint32	GetVideoTimestamp(void);

        IMPORT_C uint32 GetProfileAndLevel(void);

        IMPORT_C uint32 GetDecBitrate(void);

        // only port the API's used in PVPlayer 2.0

        IMPORT_C bool	ExtractVolHeader(uint8 *video_buffer, uint8 *vol_header, int32 *vol_header_size);

        IMPORT_C void DecSetReference(uint8 *refYUV, uint32 timestamp);

#if defined USE_PV_TRANSFER_BUFFER
        IMPORT_C inline RPVTransferBuffer& GetTxTransferBuffer()
        {
            return iTxTransferBuffer;
        }
        IMPORT_C inline RPVTransferBuffer& GetRxTransferBuffer()
        {
            return iRxTransferBuffer;
        }
#else
        IMPORT_C inline RTransferBuffer& GetTxTransferBuffer()
        {
            return iTxTransferBuffer;
        }

        IMPORT_C inline RTransferBuffer& GetRxTransferBuffer()
        {
            return iRxTransferBuffer;
        }
#endif

        IMPORT_C inline TInt GetNLayers()
        {
            return iNLayers;
        }

        IMPORT_C inline void SetNLayers(int32 aNLayers)
        {
            iNLayers = aNLayers;
        }

        TDspPointer iVideoCtrls;

    protected:

        void ConstructL(void);
        bool Construct();

        CPVDsp        *iDsp;
        TDspPointer   *iBitstreamDspPointer;
        int32           iNLayers;
        CDspMsgProto7  dspMsgProto7;
        CDspMsgProto15 dspMsgProto15;
        CDspMsgProto16 dspMsgProto16;

    private:

        bool iWaitingBitstream;

        // the order of object declaration is required to ensure the proper sequence of constructor invocation

#if defined USE_PV_TRANSFER_BUFFER
        RPVTransferBuffer iTxTransferBuffer;
        RPVTransferWindow iTxTransferWindow;
        RPVTransferBuffer iRxTransferBuffer;
        RPVTransferWindow iRxTransferWindow;
#else
        RTransferBuffer iTxTransferBuffer;
        RTransferWindow iTxTransferWindow;
        RTransferBuffer iRxTransferBuffer;
        RTransferWindow iRxTransferWindow;
#endif

        RPVTransferBuffer iVideoTransBuf[MAX_LAYERS];
        RPVTransferWindow iVideoTransWin[MAX_LAYERS];
        RPVTransferBuffer iVolHeaderTransBuf[MAX_LAYERS];
        RPVTransferWindow iVolHeaderTransWin[MAX_LAYERS];
        RPVTransferBuffer iDecodeBusyFlagTransBuf;
        RPVTransferWindow iDecodeBusyFlagTransWin;

        unsigned short *iDecodeBusyFlagPtr;
        unsigned char  *iVolHeader[MAX_LAYERS];
        unsigned char  *iVideoBuffer[MAX_LAYERS];

        uint iHeight;
        uint iWidth;

        uint iBufferHeight;
        uint iBufferWidth;

        CDspMsgProto1 dspMsgProto1;
        CDspMsgProto2 dspMsgProto2;
        CDspMsgProto4 dspMsgProto4;
        CDspMsgProto6 dspMsgProto6; //  for SBR
        CDspMsgProto9 dspMsgProto9;
        CDspMsgProto10 dspMsgProto10;
        CDspMsgProto11 dspMsgProto11;
        CDspMsgProto12 dspMsgProto12;
        CDspMsgProto13 dspMsgProto13;
        CDspMsgProto14 dspMsgProto14;
        CDspMsgProto17 dspMsgProto17;
        CDspMsgProto20 dspMsgProto20;

        int32 iCurrVideoTimeStamp;
        uint8* iYuvOutputPtr;
};

#endif
