/* ------------------------------------------------------------------
 * 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_DUMMY_FILEINPUT_NODE_H_INCLUDED
#define PVMF_DUMMY_FILEINPUT_NODE_H_INCLUDED

#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#ifndef PVMF_NODE_UTILS_H_INCLUDED
#include "pvmf_node_utils.h"
#endif
#ifndef OSCL_SCHEDULER_AO_H_INCLUDED
#include "oscl_scheduler_ao.h"
#endif
#ifndef PVMF_FILEINPUT_PORT_H_INCLUDED
#include "pvmf_fileinput_port.h"
#endif
#ifndef PVMF_FILEINPUT_NODE_EXTENSION_H_INCLUDED
#include "pvmf_fileinput_node_extension.h"
#endif
#ifndef PVMF_FILEINPUT_NODE_EVENTS_H_INCLUDED
#include "pvmf_fileinput_node_events.h"
#endif
#ifndef OSCLCONFIG_IO_H_INCLUDED
#include "osclconfig_io.h"
#endif
#ifndef OSCL_FILE_IO_H_INCLUDED
#include "oscl_file_io.h"
#endif
#ifndef PVMF_FILEINPUT_NODE_INTERNAL_H_INCLUDED
#include "pvmf_fileinput_node_internal.h"
#endif
#ifndef PVMF_FILEINPUT_SETTINGS_H_INCLUDED
#include "pvmf_fileinput_settings.h"
#endif

// SEE DESCRIPTION IN pvmf_fileinput_node.cpp
//#define FRAGMENTATION_TEST

///////////////////////////////////////////////
// Port tags
///////////////////////////////////////////////

/** Enumerated list of port tags supported by the node,
** for the port requests.
*/
typedef enum
{
    // chesterc: Convention for now is for input/sink port to have tag value 0
    // and output/src port to have tag value 1.  Both author and player engines
    // relies on this assumption, and should be removed later on when capabilities
    // exchange is implemented on the node.  The engine would then query the node
    // for the list of supported tags for a given mime type.
    PVMF_DUMMY_FILEINPUT_NODE_PORT_TYPE_SOURCE = 1
} PVMFDummyFileInputNodePortType;

///////////////////////////////////////////////
// The PVMFDummyFileInputNode Node Implementation Class
///////////////////////////////////////////////

class PVLogger;

class PVMFDummyFileInputNode : public PVMFNodeInterface,
        public OsclTimerObject,
        public PVMFFileInputNodeExtensionInterface
        , public OsclMemPoolFixedChunkAllocatorObserver
{
    public:
        OSCL_IMPORT_REF PVMFDummyFileInputNode(PVMFFileInputSettings* aSettings, int32 aPriority);
        OSCL_IMPORT_REF ~PVMFDummyFileInputNode();

        //from PVMFNodeInterface
        OSCL_IMPORT_REF PVMFStatus ThreadLogon();
        OSCL_IMPORT_REF PVMFStatus ThreadLogoff();
        OSCL_IMPORT_REF PVMFStatus GetCapability(PVMFNodeCapability& aNodeCapability);
        OSCL_IMPORT_REF PVMFPortIter* GetPorts(const PVMFPortFilter* aFilter = NULL);
        OSCL_IMPORT_REF PVMFCommandId QueryUUID(PVMFSessionId, const PvmfMimeString& aMimeType,
                                                Oscl_Vector<PVUuid, PVMFFileInputNodeAllocator>& aUuids,
                                                bool aExactUuidsOnly = false,
                                                const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId QueryInterface(PVMFSessionId, const PVUuid& aUuid,
                PVInterface*& aInterfacePtr,
                const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId RequestPort(PVMFSessionId
                , int32 aPortTag, const PvmfMimeString* aPortConfig = NULL, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId ReleasePort(PVMFSessionId, PVMFPortInterface& aPort, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId Init(PVMFSessionId, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId Prepare(PVMFSessionId, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId Start(PVMFSessionId, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId Stop(PVMFSessionId, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId Flush(PVMFSessionId, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId Pause(PVMFSessionId, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId Reset(PVMFSessionId, const OsclAny* aContext = NULL);
        OSCL_IMPORT_REF PVMFCommandId CancelAllCommands(PVMFSessionId, const OsclAny* aContextData = NULL);
        OSCL_IMPORT_REF PVMFCommandId CancelCommand(PVMFSessionId, PVMFCommandId aCmdId, const OsclAny* aContextData = NULL);

        //from PVMFPortActivityHandler
        void HandlePortActivity(const PVMFPortActivity& aActivity);

        //from PVMFDummyFileInputNodeCustomInterface1
        OSCL_IMPORT_REF PVMFStatus GetStats(PVMFPortInterface* aPort, int32& aNumMsgGenerated, int32& aNumMsgConsumed);

        // Virtual functions of PVMFFileInputNodeExtensionInterface
        OSCL_IMPORT_REF void addRef();
        OSCL_IMPORT_REF void removeRef();
        OSCL_IMPORT_REF bool queryInterface(const PVUuid& uuid, PVInterface*& iface);
        OSCL_IMPORT_REF bool GetBitstreamConfig(OsclRefCounterMemFrag& aConfig);


    private: // private member functions

        //from OsclActiveObject
        void Run();
        void DoCancel();

        //Command processing
        PVMFCommandId QueueCommandL(PVMFFileInputNodeCommand&);
        bool ProcessCommand(PVMFFileInputNodeCommand&);
        void CommandComplete(PVMFFileInputNodeCmdQ&, PVMFFileInputNodeCommand&, PVMFStatus, OsclAny* aData = NULL);
        bool FlushPending();

        //Command handlers.
        void DoReset(PVMFFileInputNodeCommand&);
        void DoQueryUuid(PVMFFileInputNodeCommand&);
        void DoQueryInterface(PVMFFileInputNodeCommand&);
        void DoRequestPort(PVMFFileInputNodeCommand&);
        void DoReleasePort(PVMFFileInputNodeCommand&);
        void DoInit(PVMFFileInputNodeCommand&);
        void DoPrepare(PVMFFileInputNodeCommand&);
        void DoStart(PVMFFileInputNodeCommand&);
        void DoStop(PVMFFileInputNodeCommand&);
        void DoFlush(PVMFFileInputNodeCommand&);
        void DoPause(PVMFFileInputNodeCommand&);
        void DoCancelAllCommands(PVMFFileInputNodeCommand&);
        void DoCancelCommand(PVMFFileInputNodeCommand&);

        // Event reporting
        void ReportErrorEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL);
        void ReportInfoEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL);
        void SetState(TPVMFNodeInterfaceState);

        // Helper functions

        int32 LocateH263FrameHeader(uint8* video_buffer, int32 vop_size);

        int32 GetIF2FrameSize(uint8 aFrameType);

        void  ConstructInputSettings(PVMFFileInputSettings* aSettings);
        void  CloseInputFile();

        // Initialization function
        PVMFStatus Initialize();

        // Create and send out media messages
        PVMFStatus GenerateMediaMessage(PVMFSharedMediaMsgPtr& aMediaMsg);
#ifdef FRAGMENTATION_TEST
        // Create and send out media messages
        PVMFStatus GenerateMediaMessage2(PVMFSharedMediaMsgPtr& aMediaMsg, PVMFSharedMediaMsgPtr& aMediaMsg2);
#endif

        PVMFStatus SendNewMediaMessage();

    private: // private member variables

        // Vector of ports contained in this node
        PVMFPortVector<PVMFFileDummyInputPort, PVMFFileInputNodeAllocator> iPortVector;
        friend class PVMFFileDummyInputPort;

        // commands
        PVMFFileInputNodeCmdQ iInputCommands;
        PVMFFileInputNodeCmdQ iCurrentCommand;

        // Allocator
        OsclMemAllocator iCmdAlloc;
        OsclMemAllocDestructDealloc<uint8> iAlloc;

        // Allocator for simple media data buffer
        OsclMemPoolFixedChunkAllocator* iMediaBufferMemPool;
        PVMFSimpleMediaBufferCombinedAlloc* iMediaDataAlloc;
        OsclMemPoolFixedChunkAllocator iMediaDataMemPool;

        uint8* iAudioData;
        uint8* iVideoData;
        PVMFNodeCapability iCapability;
        PVLogger *iLogger;
        PVMFFileInputSettings iSettings;

        // Format specific info
        OsclRefCounterMemFrag iFormatSpecificInfo;
        int32 iFormatSpecificInfoSize;
        bool iSetFormatSpecificInfo;

        int32 iFileHeaderSize;

        // Input file
        Oscl_FileServer iFs;
        bool iFsOpen;
        Oscl_File iInputFile;
        bool iFileOpen;

        // Counter and size info for file read
        Oscl_Vector<uint32, OsclMemAllocator> iFrameSizeVector;
        Oscl_Vector<uint32, OsclMemAllocator> iMilliSecFrameDurationVector;
        int32 iDataEventCounter;
        int32 iTotalNumFrames;

        // Timing
        int32 iMicroSecondsPerTick;
        int32 iMilliSecondsPerDataEvent;
        int32 iMicroSecondsPerDataEvent;
        int32 iTSForRunIfInactive;
        PVMFTimestamp iTimeStamp;

        // Reference counter for extension
        uint32 iExtensionRefCount;


        void IncTimestamp();

        //from OsclMemPoolFixedChunkAllocatorObserver
        void freechunkavailable(OsclAny* aContextData);
        bool iWaitingOnFreeChunk;
        bool iEndOfFileReached;
};

#endif


