/* ------------------------------------------------------------------
 * 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.
 * -------------------------------------------------------------------
 */
#ifndef PVMF_MP4FFPARSER_OUTPORT_H_INCLUDED
#define PVMF_MP4FFPARSER_OUTPORT_H_INCLUDED


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

#ifndef PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif

#ifndef PVMF_PORT_BASE_IMPL_H_INCLUDED
#include "pvmf_port_base_impl.h"
#endif

#ifndef PVMI_CONFIG_AND_CAPABILITY_UTILS_H_INCLUDED
#include "pvmi_config_and_capability_utils.h"
#endif

#ifndef OSCL_MEM_MEMPOOL_H_INCLUDED
#include "oscl_mem_mempool.h"
#endif

#ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED
#include "pvmf_simple_media_buffer.h"
#endif

#ifndef PVMF_TIMEDTEXT_H_INCLUDED
#include "pvmf_timedtext.h"
#endif

#ifndef PVMF_MEMPOOL_H_INCLUDED
#include "pvmf_mempool.h"
#endif

#ifndef PVMF_MEDIA_FRAG_GROUP_H_INCLUDED
#include "pvmf_media_frag_group.h"
#endif

#ifndef OSCL_TIMER_H_INCLUDED
#include "oscl_timer.h"
#endif

#ifndef PVMF_RESIZABLE_SIMPLE_MEDIAMSG_H_INCLUDED
#include "pvmf_resizable_simple_mediamsg.h"
#endif

#include "pvmf_mp4ffparser_node.h"

#define PVMF_MP4FFPARSERNODE_LOGERROR(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_ERR,m);
#define PVMF_MP4FFPARSERNODE_LOGWARNING(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_WARNING,m);
#define PVMF_MP4FFPARSERNODE_LOGINFOHI(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG,iLogger,PVLOGMSG_INFO,m);
#define PVMF_MP4FFPARSERNODE_LOGINFOMED(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_MLDBG,iLogger,PVLOGMSG_INFO,m);
#define PVMF_MP4FFPARSERNODE_LOGINFOLOW(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG,iLogger,PVLOGMSG_INFO,m);
#define PVMF_MP4FFPARSERNODE_LOGINFO(m) PVMF_MP4FFPARSERNODE_LOGINFOMED(m)
#define PVMF_MP4FFPARSERNODE_LOGDATATRAFFIC(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iDataPathLogger,PVLOGMSG_INFO,m);
#define PVMF_MP4FFPARSERNODE_LOGDATATRAFFIC_AVC(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iAVCDataPathLogger,PVLOGMSG_INFO,m);
#define PVMF_MP4FFPARSERNODE_LOGCLOCK(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iClockLogger,PVLOGMSG_INFO,m);
#define PVMF_MP4FFPARSERNODE_LOGBIN(iPortLogger, m) PVLOGGER_LOGBIN(PVLOGMSG_INST_LLDBG, iPortLogger, PVLOGMSG_ERR, m);
#define PVMF_MP4FFPARSERNODE_LOGDIAGNOSTICS(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF,iDiagnosticsLogger,PVLOGMSG_INFO,m);
/**
* Port/Track information
*/
class MediaClockConverter;

class VideoTrackDimensionInfo
{
    public:
        VideoTrackDimensionInfo() {};
        virtual ~VideoTrackDimensionInfo() {};
        VideoTrackDimensionInfo(const VideoTrackDimensionInfo& aSrc)
        {
            iTrackId = aSrc.iTrackId;
            iWidth = aSrc.iWidth;
            iHeight = aSrc.iHeight;
            iDisplayWidth = aSrc.iDisplayWidth;
            iDisplayHeight = aSrc.iDisplayHeight;

        };

        uint32 iTrackId;
        int32 iWidth;
        int32 iHeight;
        int32 iDisplayWidth;
        int32 iDisplayHeight;
};

class PVMP4FFNodeTrackPortInfo : public OsclMemPoolFixedChunkAllocatorObserver,
        public OsclMemPoolResizableAllocatorObserver
{
    public:
        enum TrackState
        {
            TRACKSTATE_UNINITIALIZED,
            TRACKSTATE_INITIALIZED,
            TRACKSTATE_TRANSMITTING_GETDATA,
            TRACKSTATE_TRANSMITTING_SENDDATA,
            TRACKSTATE_TRACKDATAPOOLEMPTY,
            TRACKSTATE_MEDIADATAPOOLEMPTY,
            TRACKSTATE_MEDIADATAFRAGGROUPPOOLEMPTY,
            TRACKSTATE_DESTFULL,
            TRACKSTATE_INSUFFICIENTDATA,
            TRACKSTATE_ENDOFTRACK,
            TRACKSTATE_ERROR,
            TRACKSTATE_DOWNLOAD_AUTOPAUSE,
            TRACKSTATE_SEND_ENDOFTRACK,
            TRACKSTATE_TRACKMAXDATASIZE_RESIZE,
            TRACKSTATE_SKIP_CORRUPT_SAMPLE
        };

        PVMP4FFNodeTrackPortInfo()
        {
            iTrackId = -1;
            iPortInterface = NULL;
            iFormatType = PVMF_MIME_FORMAT_UNKNOWN;
            iFormatTypeInteger = 0;
            iClockConverter = NULL;
            iState = TRACKSTATE_UNINITIALIZED;
            iTrackMaxDataSize = 0;
            iTrackMaxQueueDepth = 0;
            iTrackDataMemoryPool = NULL;
            iMediaDataImplAlloc = NULL;
            iTextMediaDataImplAlloc = NULL;
            iMediaDataMemPool = NULL;
            iMediaDataGroupImplMemPool = NULL;
            iMediaDataGroupAlloc = NULL;
            iNode = NULL;
            iTimestamp = 0;
            iFirstFrameAfterRepositioning = false;
            iSeqNum = 0;
            iSendBOS = false;

            iNumAMRSamplesToRetrieve = 0;
            iCurrentTextSampleEntryIndex = 0;

            /* bitstream logging */
            iPortLogger = NULL;
            oFormatSpecificInfoLogged = false;
            iMinTime = 0;
            iMaxTime = 0;
            iSumTime = 0;
            iNumTimesMediaSampleRead = 0;
            iNumSamples = 0;

            //thumb nail mode
            iThumbSampleDone = false;

            iTargetNPTInMediaTimeScale = 0;
            iLogger = PVLogger::GetLoggerObject("datapath.sourcenode.mp4parsernode");
            //PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0,"PVMP4FFNodeTrackPortInfo::PVMP4FFNodeTrackPortInfo"));

        }

        PVMP4FFNodeTrackPortInfo(const PVMP4FFNodeTrackPortInfo& aSrc) :
                OsclMemPoolFixedChunkAllocatorObserver(aSrc),
                OsclMemPoolResizableAllocatorObserver(aSrc)
        {
            iTrackId = aSrc.iTrackId;
            iPortInterface = aSrc.iPortInterface;
            iMimeType = aSrc.iMimeType;
            iFormatType = aSrc.iFormatType;
            iFormatTypeInteger = aSrc.iFormatTypeInteger;
            iClockConverter = aSrc.iClockConverter;
            iFormatSpecificConfig = aSrc.iFormatSpecificConfig;
            iFormatSpecificConfigAndFirstSample = aSrc.iFormatSpecificConfigAndFirstSample;
            iMediaData = aSrc.iMediaData;
            iState = aSrc.iState;
            iTrackMaxDataSize = aSrc.iTrackMaxDataSize;
            iTrackMaxQueueDepth = aSrc.iTrackMaxQueueDepth;
            iTrackDataMemoryPool = aSrc.iTrackDataMemoryPool;
            iMediaDataImplAlloc = aSrc.iMediaDataImplAlloc;
            iTextMediaDataImplAlloc = aSrc.iTextMediaDataImplAlloc;
            iMediaDataMemPool = aSrc.iMediaDataMemPool;
            iMediaDataGroupImplMemPool = aSrc.iMediaDataGroupImplMemPool;
            iMediaDataGroupAlloc = aSrc.iMediaDataGroupAlloc;
            iNode = aSrc.iNode;
            iTimestamp = aSrc.iTimestamp;
            iFirstFrameAfterRepositioning = aSrc.iFirstFrameAfterRepositioning;
            iSeqNum = aSrc.iSeqNum;
            iSendBOS = aSrc.iSendBOS;

            iNumAMRSamplesToRetrieve = aSrc.iNumAMRSamplesToRetrieve;
            iCurrentTextSampleEntryIndex = aSrc.iCurrentTextSampleEntryIndex;
            iCurrentTextSampleEntry = aSrc.iCurrentTextSampleEntry;

            /* bitstream logging */
            iPortLogger = aSrc.iPortLogger;
            iLogFile = aSrc.iLogFile;
            oFormatSpecificInfoLogged = aSrc.oFormatSpecificInfoLogged;
            iBinAppenderPtr = aSrc.iBinAppenderPtr;
            iNumSamples = aSrc.iNumSamples;
            iMinTime = aSrc.iMinTime;
            iMaxTime = aSrc.iMaxTime;
            iSumTime = aSrc.iSumTime;
            iNumTimesMediaSampleRead = aSrc.iNumTimesMediaSampleRead;
            iThumbSampleDone = aSrc.iThumbSampleDone;

            iTargetNPTInMediaTimeScale = aSrc.iTargetNPTInMediaTimeScale;

            iLogger = aSrc.iLogger;
        }

        virtual ~PVMP4FFNodeTrackPortInfo()
        {
            iCurrentTextSampleEntry.Unbind();
        }

        // From OsclMemPoolFixedChunkAllocatorObserver
        void freechunkavailable(OsclAny*)
        {

            if (iState == TRACKSTATE_MEDIADATAPOOLEMPTY || iState == TRACKSTATE_MEDIADATAFRAGGROUPPOOLEMPTY)
            {
                //PVLogger* iDataPathLogger = PVLogger::GetLoggerObject("datapath.sourcenode.mp4parsernode");
                //PVMF_MP4FFPARSERNODE_LOGDATATRAFFIC((0, "PVMP4PN - freechunkavailable - %s, TrackID=%d", this->iMimeType.get_cstr(), this->iTrackId));
                // Change state
                iState = TRACKSTATE_TRANSMITTING_GETDATA;
                if (iNode)
                {
                    if (iNode->IsAdded())
                    {
                        // Activate the parent node if necessary
                        iNode->RunIfNotReady();
                    }
                }
            }
        }

        // From OsclMemPoolResizableAllocatorObserver
        // Callback handler when mempool's deallocate() is called after
        // calling notifyfreeblockavailable() on the mempool
        void freeblockavailable(OsclAny*)
        {
            // Check if track is waiting for track data to be available
            if (iState == TRACKSTATE_TRACKDATAPOOLEMPTY)
            {
                //PVLogger* iDataPathLogger = PVLogger::GetLoggerObject("datapath.sourcenode.mp4parsernode");
                //PVMF_MP4FFPARSERNODE_LOGDATATRAFFIC((0, "PVMP4PN - freechunkavailable - %s, TrackID=%d", this->iMimeType.get_cstr(), this->iTrackId));
                // Change state
                iState = TRACKSTATE_TRANSMITTING_GETDATA;
                if (iNode)
                {
                    if (iNode->IsAdded())
                    {
                        // Activate the parent node if necessary
                        iNode->RunIfNotReady();
                    }
                }
            }
        }

        // Track ID number in MP4 FF
        int32 iTrackId;
        // Output port to send the data downstream
        PVMFPortInterface* iPortInterface;
        // Mime type for the port
        OSCL_HeapString<OsclMemAllocator> iMimeType;
        // Format type for the port
        PVMFFormatType iFormatType;
        // Integer Format type for the port
        uint32 iFormatTypeInteger;
        // Converter to convert from track timescale to milliseconds
        MediaClockConverter* iClockConverter;
        // Shared memory pointer holding the decoder specific config info for this track
        OsclRefCounterMemFrag iFormatSpecificConfig;
        // Shared memory pointer holding the decoder specific config info plus
        // the first sample for this track
        OsclRefCounterMemFrag iFormatSpecificConfigAndFirstSample;
        // Shared memory pointer holding the currently retrieved track data
        PVMFSharedMediaDataPtr iMediaData;
        // Current state of this track
        TrackState iState;
        // The maximum expected track data size (depends on format)
        uint32 iTrackMaxDataSize;
        // The maximum queue depth for the track data (depend on format)
        uint32 iTrackMaxQueueDepth;
        // Output buffer memory pool
        OsclMemPoolResizableAllocator *iTrackDataMemoryPool;
        // Allocator for simple media data buffer impl
        PVMFResizableSimpleMediaMsgAlloc *iMediaDataImplAlloc;
        // Allocator for text track simple media data buffer impl
        PVMFTimedTextMediaDataAlloc* iTextMediaDataImplAlloc;
        // Memory pool for simple media data
        PVMFMemPoolFixedChunkAllocator *iMediaDataMemPool;
        // Memory pool for media data buffer impl that holds multiple media fragments
        OsclMemPoolFixedChunkAllocator* iMediaDataGroupImplMemPool;
        // Allocator for media frag group
        PVMFMediaFragGroupCombinedAlloc<OsclMemAllocator>* iMediaDataGroupAlloc;

        // MP4 FF parser node handle as AO class
        OsclTimerObject* iNode;
        // Timestamp
        uint32 iTimestamp;
        // Flag to indicate that next frame will be the first frame after repositioning
        bool iFirstFrameAfterRepositioning;
        // Sequence Number
        uint32 iSeqNum;
        // bos flag
        bool iSendBOS;

        // Format specific variables
        // AMR track
        uint32 iNumAMRSamplesToRetrieve;
        // Timed text track
        uint32 iCurrentTextSampleEntryIndex;
        OsclSharedPtr<PVMFTimedTextSampleEntry> iCurrentTextSampleEntry;

        /* bitstream logging */
        PVLogger* iPortLogger;
        PVLogger *iLogger;

        OSCL_HeapString<OsclMemAllocator> iLogFile;
        bool oFormatSpecificInfoLogged;
        OsclSharedPtr<PVLoggerAppender> iBinAppenderPtr;
        uint32 iMinTime;
        uint32 iMaxTime;
        uint32 iSumTime;
        uint32 iNumSamples;
        uint32 iNumTimesMediaSampleRead;

        //thumb nail mode
        bool iThumbSampleDone;

        // no-render related
        uint32 iTargetNPTInMediaTimeScale;
};

class PVMP4FFNodeTrackOMA2DRMInfo
{
    public:
        PVMP4FFNodeTrackOMA2DRMInfo()
        {
            iTrackId = 0;
            iDRMInfoSize = 0;
            iDRMInfo = NULL;
            iOMA2TrackAuthorizationInProgress = false;
            iOMA2TrackAuthorizationComplete = false;
            iOMA2TrackAuthorized = false;
        };

        PVMP4FFNodeTrackOMA2DRMInfo(const PVMP4FFNodeTrackOMA2DRMInfo& aSrc)
        {
            Copy(aSrc);
        };


        virtual ~PVMP4FFNodeTrackOMA2DRMInfo()
        {
            if (iDRMInfo != NULL)
            {
                OSCL_ARRAY_DELETE(iDRMInfo);
                iDRMInfo = NULL;
            }
        };

        void Copy(const PVMP4FFNodeTrackOMA2DRMInfo& aSrc)
        {
            iTrackId = aSrc.iTrackId;
            iDRMInfoSize = aSrc.iDRMInfoSize;
            if (iDRMInfoSize > 0)
            {
                iDRMInfo = OSCL_ARRAY_NEW(uint8, iDRMInfoSize);
                oscl_memcpy((OsclAny*)iDRMInfo, (OsclAny*)(aSrc.iDRMInfo), iDRMInfoSize);
            }
            iOMA2TrackAuthorizationInProgress = aSrc.iOMA2TrackAuthorizationInProgress;
            iOMA2TrackAuthorizationComplete = aSrc.iOMA2TrackAuthorizationComplete;
            iOMA2TrackAuthorized = aSrc.iOMA2TrackAuthorized;
        };

        uint32 iTrackId;
        uint32 iDRMInfoSize;
        uint8* iDRMInfo;
        bool iOMA2TrackAuthorizationInProgress;
        bool iOMA2TrackAuthorizationComplete;
        bool iOMA2TrackAuthorized;
};

class PVMFMP4FFParserNode;

class PVMFMP4FFParserOutPort : public PvmfPortBaseImpl,
        public PvmiCapabilityAndConfigPortFormatImpl
{
    public:
        PVMFMP4FFParserOutPort(int32 aTag, PVMFNodeInterface* aNode, const char*);
        PVMFMP4FFParserOutPort(int32 aTag
                               , PVMFNodeInterface* aNode
                               , uint32 aInCapacity
                               , uint32 aInReserve
                               , uint32 aInThreshold
                               , uint32 aOutCapacity
                               , uint32 aOutReserve
                               , uint32 aOutThreshold
                               , const char*name);
        ~PVMFMP4FFParserOutPort();

        // From PvmiCapabilityAndConfigPortFormatImpl interface
        bool IsFormatSupported(PVMFFormatType);
        void FormatUpdated();

        // To support config interface
        void QueryInterface(const PVUuid &aUuid, OsclAny*&aPtr)
        {
            if (aUuid == PVMI_CAPABILITY_AND_CONFIG_PVUUID)
            {
                aPtr = (PvmiCapabilityAndConfig*)this;
            }
            else
            {
                aPtr = NULL;
            }
        }
        /* Over ride Connect() */
        PVMFStatus Connect(PVMFPortInterface* aPort);

        /* Implement pure virtuals from PvmiCapabilityAndConfig interface */
        PVMFStatus getParametersSync(PvmiMIOSession aSession, PvmiKeyType aIdentifier,
                                     PvmiKvp*& aParameters, int& num_parameter_elements,    PvmiCapabilityContext aContext);
        PVMFStatus releaseParameters(PvmiMIOSession aSession, PvmiKvp* aParameters, int num_elements);
        void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters,
                               int num_elements, PvmiKvp * & aRet_kvp);
        PVMFStatus verifyParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int num_elements);

        /* Unsupported PvmiCapabilityAndConfig methods */
        void setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver)
        {
            OSCL_UNUSED_ARG(aObserver);
        };
        void createContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext)
        {
            OSCL_UNUSED_ARG(aSession);
            OSCL_UNUSED_ARG(aContext);
        };
        void setContextParameters(PvmiMIOSession aSession, PvmiCapabilityContext& aContext,
                                  PvmiKvp* aParameters, int num_parameter_elements)
        {
            OSCL_UNUSED_ARG(aSession);
            OSCL_UNUSED_ARG(aContext);
            OSCL_UNUSED_ARG(aParameters);
            OSCL_UNUSED_ARG(num_parameter_elements);
        };
        void DeleteContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext)
        {
            OSCL_UNUSED_ARG(aSession);
            OSCL_UNUSED_ARG(aContext);
        };
        PVMFCommandId setParametersAsync(PvmiMIOSession aSession, PvmiKvp* aParameters,
                                         int num_elements, PvmiKvp*& aRet_kvp, OsclAny* context = NULL)
        {
            OSCL_UNUSED_ARG(aRet_kvp);
            OSCL_UNUSED_ARG(aSession);
            OSCL_UNUSED_ARG(aParameters);
            OSCL_UNUSED_ARG(num_elements);
            OSCL_UNUSED_ARG(context);
            return -1;
        }
        uint32 getCapabilityMetric(PvmiMIOSession aSession)
        {
            OSCL_UNUSED_ARG(aSession);
            return 0;
        }


    private:
        void Construct();
        bool pvmiSetPortFormatSpecificInfoSync(PvmiCapabilityAndConfig *aPort,
                                               const char* aFormatValType);

        bool pvmiGetPortFormatSpecificInfoSync(const char* aFormatValType,
                                               PvmiKvp*& aKvp);
        PVLogger *iLogger;
        uint32 iNumFramesGenerated; //number of source frames generated.
        uint32 iNumFramesConsumed; //number of frames consumed & discarded.

        friend class PVMFMP4FFParserNode;
        PVMFMP4FFParserNode* iMP4FFParserNode;
};

#endif // PVMF_MP4FFPARSER_OUTPORT_H_INCLUDED
