1/* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 19#ifndef PVMF_DUMMY_FILEINPUT_NODE_H_INCLUDED 20#define PVMF_DUMMY_FILEINPUT_NODE_H_INCLUDED 21 22#ifndef PVMF_NODE_INTERFACE_H_INCLUDED 23#include "pvmf_node_interface.h" 24#endif 25#ifndef PVMF_NODE_UTILS_H_INCLUDED 26#include "pvmf_node_utils.h" 27#endif 28#ifndef OSCL_SCHEDULER_AO_H_INCLUDED 29#include "oscl_scheduler_ao.h" 30#endif 31#ifndef PVMF_FILEINPUT_PORT_H_INCLUDED 32#include "pvmf_fileinput_port.h" 33#endif 34#ifndef PVMF_FILEINPUT_NODE_EXTENSION_H_INCLUDED 35#include "pvmf_fileinput_node_extension.h" 36#endif 37#ifndef PVMF_FILEINPUT_NODE_EVENTS_H_INCLUDED 38#include "pvmf_fileinput_node_events.h" 39#endif 40#ifndef OSCLCONFIG_IO_H_INCLUDED 41#include "osclconfig_io.h" 42#endif 43#ifndef OSCL_FILE_IO_H_INCLUDED 44#include "oscl_file_io.h" 45#endif 46#ifndef PVMF_FILEINPUT_NODE_INTERNAL_H_INCLUDED 47#include "pvmf_fileinput_node_internal.h" 48#endif 49#ifndef PVMF_FILEINPUT_SETTINGS_H_INCLUDED 50#include "pvmf_fileinput_settings.h" 51#endif 52 53// SEE DESCRIPTION IN pvmf_fileinput_node.cpp 54//#define FRAGMENTATION_TEST 55 56/////////////////////////////////////////////// 57// Port tags 58/////////////////////////////////////////////// 59 60/** Enumerated list of port tags supported by the node, 61** for the port requests. 62*/ 63typedef enum 64{ 65 // chesterc: Convention for now is for input/sink port to have tag value 0 66 // and output/src port to have tag value 1. Both author and player engines 67 // relies on this assumption, and should be removed later on when capabilities 68 // exchange is implemented on the node. The engine would then query the node 69 // for the list of supported tags for a given mime type. 70 PVMF_DUMMY_FILEINPUT_NODE_PORT_TYPE_SOURCE = 1 71} PVMFDummyFileInputNodePortType; 72 73/////////////////////////////////////////////// 74// The PVMFDummyFileInputNode Node Implementation Class 75/////////////////////////////////////////////// 76 77class PVLogger; 78 79class PVMFDummyFileInputNode : public PVMFNodeInterface, 80 public OsclTimerObject, 81 public PVMFFileInputNodeExtensionInterface 82 , public OsclMemPoolFixedChunkAllocatorObserver 83{ 84 public: 85 OSCL_IMPORT_REF PVMFDummyFileInputNode(PVMFFileInputSettings* aSettings, int32 aPriority); 86 OSCL_IMPORT_REF ~PVMFDummyFileInputNode(); 87 88 //from PVMFNodeInterface 89 OSCL_IMPORT_REF PVMFStatus ThreadLogon(); 90 OSCL_IMPORT_REF PVMFStatus ThreadLogoff(); 91 OSCL_IMPORT_REF PVMFStatus GetCapability(PVMFNodeCapability& aNodeCapability); 92 OSCL_IMPORT_REF PVMFPortIter* GetPorts(const PVMFPortFilter* aFilter = NULL); 93 OSCL_IMPORT_REF PVMFCommandId QueryUUID(PVMFSessionId, const PvmfMimeString& aMimeType, 94 Oscl_Vector<PVUuid, PVMFFileInputNodeAllocator>& aUuids, 95 bool aExactUuidsOnly = false, 96 const OsclAny* aContext = NULL); 97 OSCL_IMPORT_REF PVMFCommandId QueryInterface(PVMFSessionId, const PVUuid& aUuid, 98 PVInterface*& aInterfacePtr, 99 const OsclAny* aContext = NULL); 100 OSCL_IMPORT_REF PVMFCommandId RequestPort(PVMFSessionId 101 , int32 aPortTag, const PvmfMimeString* aPortConfig = NULL, const OsclAny* aContext = NULL); 102 OSCL_IMPORT_REF PVMFCommandId ReleasePort(PVMFSessionId, PVMFPortInterface& aPort, const OsclAny* aContext = NULL); 103 OSCL_IMPORT_REF PVMFCommandId Init(PVMFSessionId, const OsclAny* aContext = NULL); 104 OSCL_IMPORT_REF PVMFCommandId Prepare(PVMFSessionId, const OsclAny* aContext = NULL); 105 OSCL_IMPORT_REF PVMFCommandId Start(PVMFSessionId, const OsclAny* aContext = NULL); 106 OSCL_IMPORT_REF PVMFCommandId Stop(PVMFSessionId, const OsclAny* aContext = NULL); 107 OSCL_IMPORT_REF PVMFCommandId Flush(PVMFSessionId, const OsclAny* aContext = NULL); 108 OSCL_IMPORT_REF PVMFCommandId Pause(PVMFSessionId, const OsclAny* aContext = NULL); 109 OSCL_IMPORT_REF PVMFCommandId Reset(PVMFSessionId, const OsclAny* aContext = NULL); 110 OSCL_IMPORT_REF PVMFCommandId CancelAllCommands(PVMFSessionId, const OsclAny* aContextData = NULL); 111 OSCL_IMPORT_REF PVMFCommandId CancelCommand(PVMFSessionId, PVMFCommandId aCmdId, const OsclAny* aContextData = NULL); 112 113 //from PVMFPortActivityHandler 114 void HandlePortActivity(const PVMFPortActivity& aActivity); 115 116 //from PVMFDummyFileInputNodeCustomInterface1 117 OSCL_IMPORT_REF PVMFStatus GetStats(PVMFPortInterface* aPort, int32& aNumMsgGenerated, int32& aNumMsgConsumed); 118 119 // Virtual functions of PVMFFileInputNodeExtensionInterface 120 OSCL_IMPORT_REF void addRef(); 121 OSCL_IMPORT_REF void removeRef(); 122 OSCL_IMPORT_REF bool queryInterface(const PVUuid& uuid, PVInterface*& iface); 123 OSCL_IMPORT_REF bool GetBitstreamConfig(OsclRefCounterMemFrag& aConfig); 124 125 126 private: // private member functions 127 128 //from OsclActiveObject 129 void Run(); 130 void DoCancel(); 131 132 //Command processing 133 PVMFCommandId QueueCommandL(PVMFFileInputNodeCommand&); 134 bool ProcessCommand(PVMFFileInputNodeCommand&); 135 void CommandComplete(PVMFFileInputNodeCmdQ&, PVMFFileInputNodeCommand&, PVMFStatus, OsclAny* aData = NULL); 136 bool FlushPending(); 137 138 //Command handlers. 139 void DoReset(PVMFFileInputNodeCommand&); 140 void DoQueryUuid(PVMFFileInputNodeCommand&); 141 void DoQueryInterface(PVMFFileInputNodeCommand&); 142 void DoRequestPort(PVMFFileInputNodeCommand&); 143 void DoReleasePort(PVMFFileInputNodeCommand&); 144 void DoInit(PVMFFileInputNodeCommand&); 145 void DoPrepare(PVMFFileInputNodeCommand&); 146 void DoStart(PVMFFileInputNodeCommand&); 147 void DoStop(PVMFFileInputNodeCommand&); 148 void DoFlush(PVMFFileInputNodeCommand&); 149 void DoPause(PVMFFileInputNodeCommand&); 150 void DoCancelAllCommands(PVMFFileInputNodeCommand&); 151 void DoCancelCommand(PVMFFileInputNodeCommand&); 152 153 // Event reporting 154 void ReportErrorEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL); 155 void ReportInfoEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL); 156 void SetState(TPVMFNodeInterfaceState); 157 158 // Helper functions 159 160 int32 LocateH263FrameHeader(uint8* video_buffer, int32 vop_size); 161 162 int32 GetIF2FrameSize(uint8 aFrameType); 163 164 void ConstructInputSettings(PVMFFileInputSettings* aSettings); 165 void CloseInputFile(); 166 167 // Initialization function 168 PVMFStatus Initialize(); 169 170 // Create and send out media messages 171 PVMFStatus GenerateMediaMessage(PVMFSharedMediaMsgPtr& aMediaMsg); 172#ifdef FRAGMENTATION_TEST 173 // Create and send out media messages 174 PVMFStatus GenerateMediaMessage2(PVMFSharedMediaMsgPtr& aMediaMsg, PVMFSharedMediaMsgPtr& aMediaMsg2); 175#endif 176 177 PVMFStatus SendNewMediaMessage(); 178 179 private: // private member variables 180 181 // Vector of ports contained in this node 182 PVMFPortVector<PVMFFileDummyInputPort, PVMFFileInputNodeAllocator> iPortVector; 183 friend class PVMFFileDummyInputPort; 184 185 // commands 186 PVMFFileInputNodeCmdQ iInputCommands; 187 PVMFFileInputNodeCmdQ iCurrentCommand; 188 189 // Allocator 190 OsclMemAllocator iCmdAlloc; 191 OsclMemAllocDestructDealloc<uint8> iAlloc; 192 193 // Allocator for simple media data buffer 194 OsclMemPoolFixedChunkAllocator* iMediaBufferMemPool; 195 PVMFSimpleMediaBufferCombinedAlloc* iMediaDataAlloc; 196 OsclMemPoolFixedChunkAllocator iMediaDataMemPool; 197 198 uint8* iAudioData; 199 uint8* iVideoData; 200 PVMFNodeCapability iCapability; 201 PVLogger *iLogger; 202 PVMFFileInputSettings iSettings; 203 204 // Format specific info 205 OsclRefCounterMemFrag iFormatSpecificInfo; 206 int32 iFormatSpecificInfoSize; 207 bool iSetFormatSpecificInfo; 208 209 int32 iFileHeaderSize; 210 211 // Input file 212 Oscl_FileServer iFs; 213 bool iFsOpen; 214 Oscl_File iInputFile; 215 bool iFileOpen; 216 217 // Counter and size info for file read 218 Oscl_Vector<uint32, OsclMemAllocator> iFrameSizeVector; 219 Oscl_Vector<uint32, OsclMemAllocator> iMilliSecFrameDurationVector; 220 int32 iDataEventCounter; 221 int32 iTotalNumFrames; 222 223 // Timing 224 int32 iMicroSecondsPerTick; 225 int32 iMilliSecondsPerDataEvent; 226 int32 iMicroSecondsPerDataEvent; 227 int32 iTSForRunIfInactive; 228 PVMFTimestamp iTimeStamp; 229 230 // Reference counter for extension 231 uint32 iExtensionRefCount; 232 233 234 void IncTimestamp(); 235 236 //from OsclMemPoolFixedChunkAllocatorObserver 237 void freechunkavailable(OsclAny* aContextData); 238 bool iWaitingOnFreeChunk; 239 bool iEndOfFileReached; 240}; 241 242#endif 243 244 245