blob: ada313e01d05951ca1d223f213a114e223fe2e62 [file] [log] [blame]
/* ------------------------------------------------------------------
* 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_NODE_H_INCLUDED
#define PVMF_MP4FFPARSER_NODE_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
#include "pvmf_media_clock.h"
#endif
#ifndef OSCL_TIMER_H_INCLUDED
#include "oscl_timer.h"
#endif
#ifndef OSCL_SCHEDULER_AO_H_INCLUDED
#include "oscl_scheduler_ao.h"
#endif
#ifndef OSCL_FILE_IO_H_INCLUDED
#include "oscl_file_io.h"
#endif
#ifndef OSCL_STRING_H_INCLUDED
#include "oscl_string.h"
#endif
#ifndef PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif
#ifndef PVLOGGER_FILE_APPENDER_H_INCLUDED
#include "pvlogger_file_appender.h"
#endif
#ifndef OSCL_BIN_STREAM_H_INCLUDED
#include "oscl_bin_stream.h"
#endif
#ifndef PVMF_FORMAT_TYPE_H_INCLUDED
#include "pvmf_format_type.h"
#endif
#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_PRIQUEUE_H_INCLUDED
#include "oscl_priqueue.h"
#endif
#ifndef PVMF_MEDIA_DATA_H_INCLUDED
#include "pvmf_media_data.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_MEDIA_FRAG_GROUP_H_INCLUDED
#include "pvmf_media_frag_group.h"
#endif
#ifndef PVMF_MP4FFPARSER_DEFS_H_INCLUDED
#include "pvmf_mp4ffparser_defs.h"
#endif
#ifndef PVMF_DATA_SOURCE_PLAYBACK_CONTROL_H_INCLUDED
#include "pvmf_data_source_playback_control.h"
#endif
#ifndef PVMF_META_DATA_EXTENSION_H_INCLUDED
#include "pvmf_meta_data_extension.h"
#endif
#ifndef PVMF_DATA_SOURCE_INIT_EXTENSION_H_INCLUDED
#include "pvmf_data_source_init_extension.h"
#endif
#ifndef PVMF_TRACK_SELECTION_EXTENSION_H_INCLUDED
#include "pvmf_track_selection_extension.h"
#endif
#ifndef PVMF_MEDIA_PRESENTATION_INFO_H_INCLUDED
#include "pvmf_media_presentation_info.h"
#endif
#ifndef PVMF_TRACK_LEVEL_INFO_EXTENSION_H_INCLUDED
#include "pvmf_track_level_info_extension.h"
#endif
#ifndef PVMF_MP4_PROGDOWNLOAD_SUPPORT_EXTENSION_H_INCLUDED
#include "pvmf_mp4_progdownload_support_extension.h"
#endif
#ifndef CPM_H_INCLUDED
#include "cpm.h"
#endif
#ifndef PVMF_CPMPLUGIN_ACCESS_INTERFACE_H_INCLUDED
#include "pvmf_cpmplugin_access_interface.h"
#endif
#ifndef PVMF_LOCAL_DATA_SOURCE_H_INCLUDED
#include "pvmf_local_data_source.h"
#endif
#ifndef PVMF_MEMPOOL_H_INCLUDED
#include "pvmf_mempool.h"
#endif
#ifndef PVMF_TIMEDTEXT_H_INCLUDED
#include "pvmf_timedtext.h"
#endif
#ifndef PV_GAU_H_
#include "pv_gau.h"
#endif
#ifndef PVMF_FORMAT_PROGDOWNLOAD_SUPPORT_EXTENSION_H_INCLUDED
#include "pvmf_format_progdownload_support_extension.h"
#endif
#ifndef PVMF_DOWNLOAD_PROGRESS_EXTENSION_H
#include "pvmf_download_progress_interface.h"
#endif
#ifndef PVMI_DATASTREAMUSER_INTERFACE_H_INCLUDED
#include "pvmi_datastreamuser_interface.h"
#endif
#ifndef PVMF_MP4FFPARSER_OUTPORT_H_INCLUDED
#include "pvmf_mp4ffparser_outport.h"
#endif
#ifndef PVMF_SOURCE_CONTEXT_DATA_H_INCLUDED
#include "pvmf_source_context_data.h"
#endif
#ifndef PVMF_CPMPLUGIN_LICENSE_INTERFACE_H_INCLUDED
#include "pvmf_cpmplugin_license_interface.h"
#endif
#ifndef PVMI_KVP_UTIL_H_INCLUDED
#include "pvmi_kvp_util.h"
#endif
#ifndef PVMF_BASIC_ERRORINFOMESSAGE_H_INCLUDED
#include "pvmf_basic_errorinfomessage.h"
#endif
#ifndef PVMF_DATA_SOURCE_DIRECTION_CONTROL_H_INCLUDED
#include "pvmf_data_source_direction_control.h"
#endif
/**
* Node command handling
*/
class PVMFMP4ParserNodeLoggerDestructDealloc : public OsclDestructDealloc
{
public:
void destruct_and_dealloc(OsclAny* ptr)
{
PVLoggerAppender* p = OSCL_REINTERPRET_CAST(PVLoggerAppender*, ptr);
BinaryFileAppender* binPtr = OSCL_REINTERPRET_CAST(BinaryFileAppender*, p);
if (!binPtr)
return;
OSCL_DELETE(binPtr);
}
};
#define PVMF_MP4FFPARSERNODE_UNDERFLOW_STATUS_TIMER_ID 1
#define PVMF_MP4FFPARSERNODE_MAX_CPM_METADATA_KEYS 256
#define NORMAL_PLAYRATE 100000
typedef PVMFGenericNodeCommand<OsclMemAllocator> PVMFMP4FFParserNodeCommandBase;
enum PVMFMP4FFParserNodeCommandType
{
PVMP4FF_NODE_CMD_SETDATASOURCEPOSITION = PVMF_GENERIC_NODE_COMMAND_LAST
, PVMP4FF_NODE_CMD_QUERYDATASOURCEPOSITION
, PVMP4FF_NODE_CMD_SETDATASOURCERATE
, PVMP4FF_NODE_CMD_GETNODEMETADATAKEYS
, PVMP4FF_NODE_CMD_GETNODEMETADATAVALUES
, PVMP4FF_NODE_CMD_GET_LICENSE_W
, PVMP4FF_NODE_CMD_GET_LICENSE
, PVMP4FF_NODE_CMD_CANCEL_GET_LICENSE
, PVMF_MP4_PARSER_NODE_CAPCONFIG_SETPARAMS
, PVMP4FF_NODE_CMD_SETDATASOURCEDIRECTION
};
class PVMFMP4FFParserNodeCommand : public PVMFMP4FFParserNodeCommandBase
{
public:
// Constructor and parser for GetNodeMetadataKeys
void Construct(PVMFSessionId s, int32 cmd
, PVMFMetadataList& aKeyList
, uint32 aStartingIndex
, int32 aMaxEntries
, char* aQueryKey
, const OsclAny* aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*) & aKeyList;
iParam2 = (OsclAny*)aStartingIndex;
iParam3 = (OsclAny*)aMaxEntries;
if (aQueryKey)
{
//allocate a copy of the query key string.
Oscl_TAlloc<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> str;
iParam4 = str.ALLOC_AND_CONSTRUCT(aQueryKey);
}
}
void Parse(PVMFMetadataList*& MetaDataListPtr, uint32 &aStartingIndex, int32 &aMaxEntries, char*& aQueryKey)
{
MetaDataListPtr = (PVMFMetadataList*)iParam1;
aStartingIndex = (uint32)iParam2;
aMaxEntries = (int32)iParam3;
aQueryKey = NULL;
if (iParam4)
{
OSCL_HeapString<OsclMemAllocator>* keystring = (OSCL_HeapString<OsclMemAllocator>*)iParam4;
aQueryKey = keystring->get_str();
}
}
// Constructor and parser for GetNodeMetadataValue
void Construct(PVMFSessionId s, int32 cmd, PVMFMetadataList& aKeyList, Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 aStartIndex, int32 aMaxEntries, const OsclAny* aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*) & aKeyList;
iParam2 = (OsclAny*) & aValueList;
iParam3 = (OsclAny*)aStartIndex;
iParam4 = (OsclAny*)aMaxEntries;
}
void Parse(PVMFMetadataList* &aKeyList, Oscl_Vector<PvmiKvp, OsclMemAllocator>* &aValueList, uint32 &aStartingIndex, int32 &aMaxEntries)
{
aKeyList = (PVMFMetadataList*)iParam1;
aValueList = (Oscl_Vector<PvmiKvp, OsclMemAllocator>*)iParam2;
aStartingIndex = (uint32)iParam3;
aMaxEntries = (int32)iParam4;
}
/* Constructor and parser for setParametersAsync */
void Construct(PVMFSessionId s, int32 cmd, PvmiMIOSession aSession,
PvmiKvp* aParameters, int num_elements,
PvmiKvp*& aRet_kvp, OsclAny* aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)aSession;
iParam2 = (OsclAny*)aParameters;
iParam3 = (OsclAny*)num_elements;
iParam4 = (OsclAny*) & aRet_kvp;
}
void Parse(PvmiMIOSession& aSession, PvmiKvp*& aParameters,
int &num_elements, PvmiKvp** &ppRet_kvp)
{
aSession = (PvmiMIOSession)iParam1;
aParameters = (PvmiKvp*)iParam2;
num_elements = (int)iParam3;
ppRet_kvp = (PvmiKvp**)iParam4;
}
// Constructor and parser for SetDataSourcePosition
void Construct(PVMFSessionId s, int32 cmd, PVMFTimestamp aTargetNPT, PVMFTimestamp& aActualNPT, PVMFTimestamp& aActualMediaDataTS,
bool aSeekToSyncPoint, uint32 aStreamID, const OsclAny*aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)aTargetNPT;
iParam2 = (OsclAny*) & aActualNPT;
iParam3 = (OsclAny*) & aActualMediaDataTS;
iParam4 = (OsclAny*)aSeekToSyncPoint;
iParam5 = (OsclAny*)aStreamID;
}
void Parse(PVMFTimestamp& aTargetNPT, PVMFTimestamp*& aActualNPT, PVMFTimestamp*& aActualMediaDataTS, bool& aSeekToSyncPoint, uint32& aStreamID)
{
aTargetNPT = (PVMFTimestamp)iParam1;
aActualNPT = (PVMFTimestamp*)iParam2;
aActualMediaDataTS = (PVMFTimestamp*)iParam3;
aSeekToSyncPoint = (iParam4) ? true : false;
aStreamID = (uint32)iParam5;
}
// Constructor and parser for QueryDataSourcePosition
void Construct(PVMFSessionId s, int32 cmd, PVMFTimestamp aTargetNPT, PVMFTimestamp &aActualNPT,
bool aSeekToSyncPoint, const OsclAny*aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)aTargetNPT;
iParam2 = (OsclAny*) & aActualNPT;
iParam3 = (OsclAny*)aSeekToSyncPoint;
iParam4 = NULL;
iParam5 = NULL;
}
// Constructor and parser for QueryDataSourcePosition with aSeekPointBeforeTargetNPT and aSeekPointAfterTargetNPT
void Construct(PVMFSessionId s, int32 cmd, PVMFTimestamp aTargetNPT,
PVMFTimestamp& aSeekPointBeforeTargetNPT, PVMFTimestamp& aSeekPointAfterTargetNPT,
const OsclAny*aContext, bool aSeekToSyncPoint)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)aTargetNPT;
iParam3 = (OsclAny*)aSeekToSyncPoint;
iParam4 = (OsclAny*) & aSeekPointBeforeTargetNPT;
iParam5 = (OsclAny*) & aSeekPointAfterTargetNPT;
}
void Parse(PVMFTimestamp& aTargetNPT, PVMFTimestamp*& aActualNPT, bool& aSeekToSyncPoint)
{
aTargetNPT = (PVMFTimestamp)iParam1;
aActualNPT = (PVMFTimestamp*)iParam2;
aSeekToSyncPoint = (iParam3) ? true : false;
}
void Parse(PVMFTimestamp& aTargetNPT, PVMFTimestamp*& aSeekPointBeforeTargetNPT,
bool& aSeekToSyncPoint, PVMFTimestamp*& aSeekPointAfterTargetNPT)
{
aTargetNPT = (PVMFTimestamp)iParam1;
aSeekPointBeforeTargetNPT = (PVMFTimestamp*)iParam4;
aSeekPointAfterTargetNPT = (PVMFTimestamp*)iParam5;
aSeekToSyncPoint = (iParam3) ? true : false;
}
/* Constructor and parser for SetDataSourceDirection */
void Construct(PVMFSessionId s, int32 cmd, int32 aDirection,
PVMFTimestamp& aActualNPT, PVMFTimestamp& aActualMediaDataTS,
PVMFTimebase* aTimebase, OsclAny* aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)aDirection;
iParam2 = (OsclAny*) & aActualNPT;
iParam3 = (OsclAny*) & aActualMediaDataTS;
iParam4 = (OsclAny*)aTimebase;
iParam5 = NULL;
}
void Parse(int32& aDirection,
PVMFTimestamp*& aActualNPT,
PVMFTimestamp*& aActualMediaDataTS,
PVMFTimebase*& aTimebase)
{
aDirection = (int32)iParam1;
aActualNPT = (PVMFTimestamp*)iParam2;
aActualMediaDataTS = (PVMFTimestamp*)iParam3;
aTimebase = (PVMFTimebase*)iParam4;
}
// Constructor and parser for SetDataSourceRate
void Construct(PVMFSessionId s, int32 cmd, int32 aRate, PVMFTimebase* aTimebase, const OsclAny*aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)aRate;
iParam2 = (OsclAny*)aTimebase;
iParam3 = NULL;
iParam4 = NULL;
iParam5 = NULL;
}
void Parse(int32& aRate, PVMFTimebase*& aTimebase)
{
aRate = (int32)iParam1;
aTimebase = (PVMFTimebase*)iParam2;
}
/* Constructor and parser for GetLicenseW */
void Construct(PVMFSessionId s,
int32 cmd,
OSCL_wString& aContentName,
OsclAny* aLicenseData,
uint32 aDataSize,
int32 aTimeoutMsec,
OsclAny* aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*) & aContentName;
iParam2 = (OsclAny*)aLicenseData;
iParam3 = (OsclAny*)aDataSize;
iParam4 = (OsclAny*)aTimeoutMsec;
iParam5 = NULL;
}
void Parse(OSCL_wString*& aContentName,
OsclAny*& aLicenseData,
uint32& aDataSize,
int32& aTimeoutMsec)
{
aContentName = (OSCL_wString*)iParam1;
aLicenseData = (PVMFTimestamp*)iParam2;
aDataSize = (uint32)iParam3;
aTimeoutMsec = (int32)iParam4;
}
/* Constructor and parser for GetLicense */
void Construct(PVMFSessionId s,
int32 cmd,
OSCL_String& aContentName,
OsclAny* aLicenseData,
uint32 aDataSize,
int32 aTimeoutMsec,
OsclAny* aContext)
{
PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*) & aContentName;
iParam2 = (OsclAny*)aLicenseData;
iParam3 = (OsclAny*)aDataSize;
iParam4 = (OsclAny*)aTimeoutMsec;
iParam5 = NULL;
}
void Parse(OSCL_String*& aContentName,
OsclAny*& aLicenseData,
uint32& aDataSize,
int32& aTimeoutMsec)
{
aContentName = (OSCL_String*)iParam1;
aLicenseData = (PVMFTimestamp*)iParam2;
aDataSize = (uint32)iParam3;
aTimeoutMsec = (int32)iParam4;
}
// Need to overlaod the base Destroy routine to cleanup metadata key.
void Destroy()
{
PVMFGenericNodeCommand<OsclMemAllocator>::Destroy();
switch (iCmd)
{
case PVMP4FF_NODE_CMD_GETNODEMETADATAKEYS:
if (iParam4)
{
//cleanup the allocated string
Oscl_TAlloc<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> str;
str.destruct_and_dealloc(iParam4);
}
break;
default:
break;
}
}
// Need to overlaod the base Copy routine to copy metadata key.
void Copy(const PVMFGenericNodeCommand<OsclMemAllocator>& aCmd)
{
PVMFGenericNodeCommand<OsclMemAllocator>::Copy(aCmd);
switch (aCmd.iCmd)
{
case PVMP4FF_NODE_CMD_GETNODEMETADATAKEYS:
if (aCmd.iParam4)
{
//copy the allocated string
OSCL_HeapString<OsclMemAllocator>* aStr = (OSCL_HeapString<OsclMemAllocator>*)aCmd.iParam4;
Oscl_TAlloc<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> str;
iParam4 = str.ALLOC_AND_CONSTRUCT(*aStr);
}
break;
default:
break;
}
}
};
typedef PVMFNodeCommandQueue<PVMFMP4FFParserNodeCommand, OsclMemAllocator> PVMFMP4FFParserNodeCmdQueue;
//Command queue type
typedef PVMFNodeCommandQueue<PVMFMP4FFParserNodeCommand, OsclMemAllocator> PVMFMP4FFParserNodeCmdQueue;
/**
* The Node class
*/
class IMpeg4File;
class PVMFMP4FFParserOutPort;
class PVMFMP4FFPortIter;
class PVLogger;
class PVMFMediaClock;
enum BaseKeys_SelectionType
{
INVALID = 0,
NET,
FILE_IO
};
#define PVMFFFPARSERNODE_MAX_NUM_TRACKS 6
class PVMFMP4FFParserNode : public OsclTimerObject,
public PVMFNodeInterface,
public PVMFDataSourceInitializationExtensionInterface,
public PVMFTrackSelectionExtensionInterface,
public PvmfDataSourcePlaybackControlInterface,
public PVMFMetadataExtensionInterface,
public PVMFTrackLevelInfoExtensionInterface,
public PVMFCPMStatusObserver,
public PvmiDataStreamObserver,
public PVMIDatastreamuserInterface,
public PVMFFormatProgDownloadSupportInterface,
public OsclTimerObserver,
public PVMFCPMPluginLicenseInterface,
public PvmiCapabilityAndConfig,
public PVMFMediaClockStateObserver, // For observing the playback clock states
public PvmfDataSourceDirectionControlInterface
{
public:
PVMFMP4FFParserNode(int32 aPriority = OsclActiveObject::EPriorityNominal);
virtual ~PVMFMP4FFParserNode();
// From PVMFNodeInterface
PVMFStatus ThreadLogon();
PVMFStatus ThreadLogoff();
PVMFStatus GetCapability(PVMFNodeCapability& aNodeCapability);
PVMFPortIter* GetPorts(const PVMFPortFilter* aFilter = NULL);
PVMFCommandId QueryUUID(PVMFSessionId aSessionId,
const PvmfMimeString& aMimeType,
Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids,
bool aExactUuidsOnly = false,
const OsclAny* aContext = NULL);
PVMFCommandId QueryInterface(PVMFSessionId aSessionId,
const PVUuid& aUuid,
PVInterface*& aInterfacePtr,
const OsclAny* aContext = NULL);
PVMFCommandId RequestPort(PVMFSessionId aSessionId, int32 aPortTag,
const PvmfMimeString* aPortConfig = NULL,
const OsclAny* aContext = NULL);
PVMFStatus ReleasePort(PVMFSessionId aSessionId, PVMFPortInterface& aPort,
const OsclAny* aContext = NULL);
PVMFCommandId Init(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Prepare(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Start(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Stop(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Flush(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Pause(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Reset(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
PVMFCommandId CancelAllCommands(PVMFSessionId aSessionId, const OsclAny* aContextData = NULL);
PVMFCommandId CancelCommand(PVMFSessionId aSessionId, PVMFCommandId aCmdId, const OsclAny* aContextData = NULL);
PVMFStatus QueryInterfaceSync(PVMFSessionId aSession,
const PVUuid& aUuid,
PVInterface*& aInterfacePtr);
/* cap config interface */
virtual void setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver)
{
ciObserver = aObserver;
}
virtual PVMFStatus getParametersSync(PvmiMIOSession aSession,
PvmiKeyType aIdentifier,
PvmiKvp*& aParameters,
int& aNumParamElements,
PvmiCapabilityContext aContext);
virtual PVMFStatus releaseParameters(PvmiMIOSession aSession,
PvmiKvp* aParameters,
int num_elements);
virtual void createContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext);
virtual void setContextParameters(PvmiMIOSession aSession, PvmiCapabilityContext& aContext,
PvmiKvp* aParameters, int num_parameter_elements);
virtual void DeleteContext(PvmiMIOSession aSession,
PvmiCapabilityContext& aContext);
virtual void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters,
int num_elements, PvmiKvp * & aRet_kvp);
virtual PVMFCommandId setParametersAsync(PvmiMIOSession aSession,
PvmiKvp* aParameters,
int num_elements,
PvmiKvp*& aRet_kvp,
OsclAny* context = NULL);
virtual uint32 getCapabilityMetric(PvmiMIOSession aSession);
virtual PVMFStatus verifyParametersSync(PvmiMIOSession aSession,
PvmiKvp* aParameters,
int num_elements);
PVMFStatus GetConfigParameter(PvmiKvp*& aParameters, int& aNumParamElements,
int32 aIndex, PvmiKvpAttr reqattr);
PVMFStatus VerifyAndSetConfigParameter(int index, PvmiKvp& aParameter, bool set);
// From PVInterface
void addRef();
void removeRef();
bool queryInterface(const PVUuid& uuid, PVInterface*& iface);
// From PVMFDataSourceInitializationExtensionInterface
PVMFStatus SetSourceInitializationData(OSCL_wString& aSourceURL, PVMFFormatType& aSourceFormat, OsclAny* aSourceData);
PVMFStatus SetClientPlayBackClock(PVMFMediaClock* aClientClock);
PVMFStatus SetEstimatedServerClock(PVMFMediaClock* aClientClock);
// From PVMFTrackSelectionExtensionInterface
PVMFStatus GetMediaPresentationInfo(PVMFMediaPresentationInfo& aInfo);
PVMFStatus SelectTracks(PVMFMediaPresentationInfo& aInfo);
// From PVMFMetadataExtensionInterface
uint32 GetNumMetadataKeys(char* aQueryKeyString = NULL);
uint32 GetNumMetadataValues(PVMFMetadataList& aKeyList);
uint32 GetNumImotionMetadataValues(PVMFMetadataList& aKeyList);
PVMFCommandId GetNodeMetadataKeys(PVMFSessionId aSessionId, PVMFMetadataList& aKeyList, uint32 aStartingKeyIndex, int32 aMaxKeyEntries,
char* aQueryKeyString = NULL, const OsclAny* aContextData = NULL);
PVMFCommandId GetNodeMetadataValues(PVMFSessionId aSessionId, PVMFMetadataList& aKeyList,
Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 aStartingValueIndex, int32 aMaxValueEntries, const OsclAny* aContextData = NULL);
PVMFStatus ReleaseNodeMetadataKeys(PVMFMetadataList& aKeyList, uint32 aStartingKeyIndex, uint32 aEndKeyIndex);
PVMFStatus ReleaseNodeMetadataValues(Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 aStartingValueIndex, uint32 aEndValueIndex);
// From PvmfDataSourcePlaybackControlInterface
PVMFCommandId SetDataSourcePosition(PVMFSessionId aSessionId, PVMFTimestamp aTargetNPT, PVMFTimestamp& aActualNPT,
PVMFTimestamp& aActualMediaDataTS, bool aSeekToSyncPoint = true, uint32 aStreamID = 0, OsclAny* aContext = NULL);
PVMFCommandId QueryDataSourcePosition(PVMFSessionId aSessionId, PVMFTimestamp aTargetNPT, PVMFTimestamp& aActualNPT,
bool aSeekToSyncPoint = true, OsclAny* aContext = NULL);
PVMFCommandId QueryDataSourcePosition(PVMFSessionId aSessionId, PVMFTimestamp aTargetNPT,
PVMFTimestamp& aSeekPointBeforeTargetNPT, PVMFTimestamp& aSeekPointAfterTargetNPT, OsclAny* aContext = NULL, bool aSeekToSyncPoint = true);
PVMFCommandId SetDataSourceRate(PVMFSessionId aSession, int32 aRate, PVMFTimebase* aTimebase = NULL, OsclAny* aContext = NULL);
PVMFCommandId SetDataSourceDirection(PVMFSessionId aSessionId, int32 aDirection, PVMFTimestamp& aActualNPT,
PVMFTimestamp& aActualMediaDataTS, PVMFTimebase* aTimebase, OsclAny* aContext);
// From PVMFTrackLevelInfoExtensionInterface
PVMFStatus GetAvailableTracks(Oscl_Vector<PVMFTrackInfo, OsclMemAllocator>& aTracks);
PVMFStatus GetTimestampForSampleNumber(PVMFTrackInfo& aTrackInfo, uint32 aSampleNum, PVMFTimestamp& aTimestamp);
PVMFStatus GetSampleNumberForTimestamp(PVMFTrackInfo& aTrackInfo, PVMFTimestamp aTimestamp, uint32& aSampleNum);
PVMFStatus GetNumberOfSyncSamples(PVMFTrackInfo& aTrackInfo, int32& aNumSyncSamples);
PVMFStatus GetSyncSampleInfo(PVMFTrackInfo& aTrackInfo, PVMFSampleNumTSList& aList, uint32 aStartIndex = 0, int32 aMaxEntries = -1);
PVMFStatus GetSyncSampleInfo(PVMFSampleNumTSList& aList, PVMFTrackInfo& aTrackInfo, int32 aTargetTimeInMS, uint32 aHowManySamples = 1);
PVMFStatus GetTimestampForDataPosition(PVMFTrackInfo& aTrackInfo, uint32 aDataPosition, PVMFTimestamp& aTimestamp);
PVMFStatus GetDataPositionForTimestamp(PVMFTrackInfo& aTrackInfo, PVMFTimestamp aTimestamp, uint32& aDataPosition);
// From PVMFPortActivityHandler
void HandlePortActivity(const PVMFPortActivity& aActivity);
// From PVMFCPMStatusObserver
void CPMCommandCompleted(const PVMFCmdResp& aResponse);
/* From PVMIDatastreamuserInterface */
void PassDatastreamFactory(PVMFDataStreamFactory& aFactory,
int32 aFactoryTag,
const PvmfMimeString* aFactoryConfig = NULL);
void PassDatastreamReadCapacityObserver(PVMFDataStreamReadCapacityObserver* aObserver);
/* From PVMFFormatProgDownloadSupportInterface */
int32 convertSizeToTime(uint32 fileSize, uint32& aNPTInMS);
void setFileSize(const uint32 aFileSize);
void setDownloadProgressInterface(PVMFDownloadProgressInterface*);
void playResumeNotification(bool aDownloadComplete);
void notifyDownloadComplete();
// From OsclTimer
void TimeoutOccurred(int32 timerID, int32 timeoutInfo);
/* From PVMFCPMPluginLicenseInterface */
PVMFStatus GetLicenseURL(PVMFSessionId aSessionId,
OSCL_wString& aContentName,
OSCL_wString& aLicenseURL)
{
OSCL_UNUSED_ARG(aSessionId);
OSCL_UNUSED_ARG(aContentName);
OSCL_UNUSED_ARG(aLicenseURL);
//must use Async method.
return PVMFErrNotSupported;
}
PVMFStatus GetLicenseURL(PVMFSessionId aSessionId,
OSCL_String& aContentName,
OSCL_String& aLicenseURL)
{
OSCL_UNUSED_ARG(aSessionId);
OSCL_UNUSED_ARG(aContentName);
OSCL_UNUSED_ARG(aLicenseURL);
//must use Async method.
return PVMFErrNotSupported;
}
PVMFCommandId GetLicense(PVMFSessionId aSessionId,
OSCL_wString& aContentName,
OsclAny* aData,
uint32 aDataSize,
int32 aTimeoutMsec,
OsclAny* aContextData) ;
PVMFCommandId GetLicense(PVMFSessionId aSessionId,
OSCL_String& aContentName,
OsclAny* aData,
uint32 aDataSize,
int32 aTimeoutMsec,
OsclAny* aContextData);
PVMFCommandId CancelGetLicense(PVMFSessionId aSessionId
, PVMFCommandId aCmdId
, OsclAny* aContextData);
PVMFStatus GetLicenseStatus(
PVMFCPMLicenseStatus& aStatus) ;
//from PVMFMediaClockStateObserver
void ClockStateUpdated();
void NotificationsInterfaceDestroyed();
private:
// from OsclTimerObject
void Run();
//Command processing
PVMFCommandId QueueCommandL(PVMFMP4FFParserNodeCommand& aCmd);
void MoveCmdToCurrentQueue(PVMFMP4FFParserNodeCommand& aCmd);
void MoveCmdToCancelQueue(PVMFMP4FFParserNodeCommand& aCmd);
void ProcessCommand();
void CommandComplete(PVMFMP4FFParserNodeCmdQueue& aCmdQueue, PVMFMP4FFParserNodeCommand& aCmd, PVMFStatus aStatus, OsclAny* aData = NULL, PVUuid* aEventUUID = NULL, int32* aEventCode = NULL);
bool FlushPending();
PVMFMP4FFParserNodeCmdQueue iInputCommands;
PVMFMP4FFParserNodeCmdQueue iCurrentCommand;
PVMFMP4FFParserNodeCmdQueue iCancelCommand;
// Event reporting
void ReportMP4FFParserErrorEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL, PVUuid* aEventUUID = NULL, int32* aEventCode = NULL);
void ReportMP4FFParserInfoEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL, PVUuid* aEventUUID = NULL, int32* aEventCode = NULL);
void ChangeNodeState(TPVMFNodeInterfaceState aNewState);
// Node command handlers
PVMFStatus DoQueryUuid(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoQueryInterface(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoRequestPort(PVMFMP4FFParserNodeCommand& aCmd, PVMFPortInterface*&);
void GetTrackMaxParameters(PVMFFormatType aFormatType, uint32& aMaxDataSize, uint32& aMaxQueueDepth);
PVMFStatus DoReleasePort(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoInit(PVMFMP4FFParserNodeCommand& aCmd);
bool ParseMP4File(PVMFMP4FFParserNodeCmdQueue& aCmdQ,
PVMFMP4FFParserNodeCommand& aCmd);
void PushToAvailableMetadataKeysList(const char* aKeystr, char* aOptionalParam = NULL);
PVMFStatus InitMetaData();
PVMFStatus InitImotionMetaData();
uint32 CountImotionMetaDataKeys();
int32 CountMetaDataKeys();
void CompleteInit(PVMFMP4FFParserNodeCmdQueue& aCmdQ,
PVMFMP4FFParserNodeCommand& aCmd);
void CompleteCancelAfterInit();
PVMFStatus DoPrepare(PVMFMP4FFParserNodeCommand& aCmd);
void CompletePrepare(PVMFStatus aStatus);
PVMFStatus DoStart(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoStop(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoFlush(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoPause(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoReset(PVMFMP4FFParserNodeCommand& aCmd);
void CompleteReset(PVMFMP4FFParserNodeCmdQueue& aCmdQ, PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoCancelAllCommands(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoCancelCommand(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoCancelCurrentCommand(PVMFMP4FFParserNodeCommand& aCmd);
// For metadata extention interface
PVMFStatus DoGetMetadataKeys(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus CompleteGetMetadataKeys(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoGetImotionMetadataValues(PVMFMP4FFParserNodeCommand& aCmd, int32 &numentriesadded);
PVMFStatus DoGetMetadataValues(PVMFMP4FFParserNodeCommand& aCmd);
void CompleteGetMetaDataValues();
int32 AddToValueList(Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, PvmiKvp& aNewValue);
PVMFStatus GetIndexParamValues(const char* aString, uint32& aStartIndex, uint32& aEndIndex);
void DeleteAPICStruct(PvmfApicStruct*& aAPICStruct);
PVMFStatus GetVideoFrameWidth(uint32 aId, int32& aWidth, int32& aDisplayWidth);
PVMFStatus GetVideoFrameHeight(uint32 aId, int32& aHeight, int32& aDisplayHeight);
int32 FindVideoWidth(uint32 aId);
int32 FindVideoHeight(uint32 aId);
int32 FindVideoDisplayWidth(uint32 aId);
int32 FindVideoDisplayHeight(uint32 aId);
PVMFStatus PopulateVideoDimensions(uint32 aId);
uint32 GetNumAudioChannels(uint32 aId);
uint32 GetAudioSampleRate(uint32 aId);
uint32 GetAudioBitsPerSample(uint32 aId);
PVMFStatus FindBestThumbnailKeyFrame(uint32 aId, uint32& aKeyFrameNum);
// For data source position extension interface
PVMFStatus DoSetDataSourcePosition(PVMFMP4FFParserNodeCommand& aCmd, PVMFStatus &aEventCode, PVUuid &aEventUuid);
PVMFStatus DoQueryDataSourcePosition(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoSetDataSourceRate(PVMFMP4FFParserNodeCommand& aCmd);
PVMFStatus DoSetDataSourceDirection(PVMFMP4FFParserNodeCommand& aCmd);
void HandleTrackState();
bool RetrieveTrackConfigInfo(uint32 aTrackId,
PVMFFormatType aFormatType,
OsclRefCounterMemFrag &aConfig);
bool RetrieveTrackConfigInfoAndFirstSample(uint32 aTrackId,
PVMFFormatType aFormatType,
OsclRefCounterMemFrag &aConfig);
bool RetrieveTrackData(PVMP4FFNodeTrackPortInfo& aTrackPortInfo);
bool SendTrackData(PVMP4FFNodeTrackPortInfo& aTrackPortInfo);
bool GenerateAVCNALGroup(PVMP4FFNodeTrackPortInfo& aTrackPortInfo, OsclSharedPtr<PVMFMediaDataImpl>& aMediaFragGroup);
bool GenerateAACFrameFrags(PVMP4FFNodeTrackPortInfo& aTrackPortInfo, OsclSharedPtr<PVMFMediaDataImpl>& aMediaFragGroup);
bool GetAVCNALLength(OsclBinIStreamBigEndian& stream, uint32& lengthSize, int32& len);
bool UpdateTextSampleEntry(PVMP4FFNodeTrackPortInfo& aTrackPortInfo, uint32 aEntryIndex, PVMFTimedTextMediaData& aTextMediaData);
bool SendEndOfTrackCommand(PVMP4FFNodeTrackPortInfo& aTrackPortInfo);
bool SendBeginOfMediaStreamCommand(PVMP4FFNodeTrackPortInfo& aTrackPortInfo);
// Port processing
void ProcessPortActivity();
void QueuePortActivity(const PVMFPortActivity& aActivity);
PVMFStatus ProcessIncomingMsg(PVMFPortInterface* aPort);
PVMFStatus ProcessOutgoingMsg(PVMFPortInterface* aPort);
Oscl_Vector<PVMFPortActivity, OsclMemAllocator> iPortActivityQueue;
friend class PVMFMP4FFParserOutPort;
PVMFFormatType GetFormatTypeFromMIMEType(PvmfMimeString* aMIMEString);
void ResetAllTracks();
bool ReleaseAllPorts();
void RemoveAllCommands();
void CleanupFileSource();
// For comparison with download progress clock
bool checkTrackPosition(PVMP4FFNodeTrackPortInfo& aTrackPortInfo, uint32 numsamples);
bool GetTrackPortInfoForTrackID(PVMP4FFNodeTrackPortInfo*& aInfo,
uint32 aTrackID);
bool GetTrackPortInfoForPort(PVMP4FFNodeTrackPortInfo*& aInfo,
PVMFPortInterface* aPort);
OSCL_wHeapString<OsclMemAllocator> iFilename;
PVMFFormatType iSourceFormat;
PVMFMediaClock* iClientPlayBackClock;
PVMFMediaClockNotificationsInterface *iClockNotificationsInf;
bool iUseCPMPluginRegistry;
PVMFLocalDataSource iCPMSourceData;
PVMFSourceContextData iSourceContextData;
OsclFileHandle* iFileHandle;
Oscl_FileServer iFileServer;
uint32 iParsingMode;
bool iProtectedFile;
IMpeg4File* iMP4FileHandle;
Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> iAvailableMetadataKeys;
uint32 iMP4ParserNodeMetadataValueCount;
Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> iCPMMetadataKeys;
Oscl_Vector<PVMP4FFNodeTrackPortInfo, OsclMemAllocator> iNodeTrackPortList;
Oscl_Vector<PVMFTrackInfo, OsclMemAllocator> iSelectedTrackInfoList;
Oscl_Vector<VideoTrackDimensionInfo, OsclMemAllocator> iVideoDimensionInfoVec;
PVMFMP4FFPortIter* iPortIter;
// stream id
uint32 iStreamID;
PVMFNodeCapability iCapability;
PVLogger* iLogger;
PVLogger* iDataPathLogger;
PVLogger* iAVCDataPathLogger;
PVLogger* iClockLogger;
PVLogger* iDiagnosticsLogger;
// Reference counter for extension
uint32 iExtensionRefCount;
// variables to support download autopause
OsclSharedPtr<PVMFMediaClock> download_progress_clock;
PVMFDownloadProgressInterface* download_progress_interface;
uint32 iDownloadFileSize;
bool autopaused;
void DataStreamCommandCompleted(const PVMFCmdResp& aResponse);
void DataStreamInformationalEvent(const PVMFAsyncEvent& aEvent);
void DataStreamErrorEvent(const PVMFAsyncEvent& aEvent);
bool MapMP4ErrorCodeToEventCode(int32 aMP4ErrCode, PVUuid& aEventUUID, int32& aEventCode);
GAU iGau;
bool iThumbNailMode;
// Content Policy Manager related
bool iSourceContextDataValid;
bool iPreviewMode;
PVMFCPM* iCPM;
PVMFSessionId iCPMSessionID;
PVMFCPMContentType iCPMContentType;
PVMFCPMPluginAccessInterfaceFactory* iCPMContentAccessFactory;
PVMFMetadataExtensionInterface* iCPMMetaDataExtensionInterface;
PVMFCPMPluginLicenseInterface* iCPMLicenseInterface;
PVInterface* iCPMLicenseInterfacePVI;
PVMFCPMPluginAccessUnitDecryptionInterface* iDecryptionInterface;
PvmiKvp iRequestedUsage;
PvmiKvp iApprovedUsage;
PvmiKvp iAuthorizationDataKvp;
PVMFCPMUsageID iUsageID;
bool oWaitingOnLicense;
bool iPoorlyInterleavedContentEventSent;
PVMFCommandId iCPMInitCmdId;
PVMFCommandId iCPMOpenSessionCmdId;
PVMFCommandId iCPMRegisterContentCmdId;
PVMFCommandId iCPMRequestUsageId;
PVMFCommandId iCPMUsageCompleteCmdId;
PVMFCommandId iCPMCloseSessionCmdId;
PVMFCommandId iCPMResetCmdId;
PVMFCommandId iCPMGetMetaDataKeysCmdId;
PVMFCommandId iCPMGetMetaDataValuesCmdId;
PVMFCommandId iCPMGetLicenseInterfaceCmdId;
PVMFCommandId iCPMGetLicenseCmdId;
PVMFCommandId iCPMCancelGetLicenseCmdId;
void InitCPM();
void OpenCPMSession();
void CPMRegisterContent();
bool GetCPMContentAccessFactory();
void GetCPMContentType();
bool GetCPMMetaDataExtensionInterface();
void GetCPMLicenseInterface();
void RequestUsage(PVMP4FFNodeTrackOMA2DRMInfo* aInfo);
void SendUsageComplete();
void CloseCPMSession();
void ResetCPM();
void GetCPMMetaDataKeys();
PVMFStatus CheckCPMCommandCompleteStatus(PVMFCommandId, PVMFStatus);
PVMFStatus iCPMRequestUsageCommandStatus;
PVMFStatus DoGetLicense(PVMFMP4FFParserNodeCommand& aCmd,
bool aWideCharVersion = false);
PVMFStatus DoCancelGetLicense(PVMFMP4FFParserNodeCommand& aCmd);
void CompleteGetLicense();
void PopulateOMA1DRMInfo();
/*
* OMA2 DRM Related Methods
*/
Oscl_Vector<PVMP4FFNodeTrackOMA2DRMInfo, OsclMemAllocator> iOMA2DRMInfoVec;
PVMP4FFNodeTrackOMA2DRMInfo* LookUpOMA2TrackInfoForTrack(uint32 aTrackID);
PVMFStatus InitOMA2DRMInfo();
void PopulateOMA2DRMInfo(PVMP4FFNodeTrackOMA2DRMInfo* aInfo);
PVMFStatus CheckForOMA2AuthorizationComplete(PVMP4FFNodeTrackOMA2DRMInfo*& aInfo);
void OMA2TrackAuthorizationComplete();
bool CheckForOMA2UsageApproval();
void ResetOMA2Flags();
uint8* iOMA2DecryptionBuffer;
PVMFStatus GetFileOffsetForAutoResume(uint32& aOffset, bool aPortsAvailable = true);
PVMFStatus GetFileOffsetForAutoResume(uint32& aOffset, PVMP4FFNodeTrackPortInfo* aInfo);
PVMFStatus CheckForUnderFlow(PVMP4FFNodeTrackPortInfo* aInfo);
void getLanguageCode(uint16 langcode, int8 *LangCode);
void getBrand(uint32 langcode, char *LangCode);
PVMFStatus CheckForMP4HeaderAvailability();
int32 CreateErrorInfoMsg(PVMFBasicErrorInfoMessage** aErrorMsg, PVUuid aEventUUID, int32 aEventCode);
void CreateDurationInfoMsg(uint32 adurationms);
PVMFStatus PushKVPToMetadataValueList(Oscl_Vector<PvmiKvp, OsclMemAllocator>* aVecPtr, PvmiKvp& aKvpVal);
PVMFStatus CreateNewArray(uint32** aTrackidList, uint32 aNumTracks);
PVMFStatus PushValueToList(Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> &aRefMetadataKeys,
PVMFMetadataList *&aKeyListPtr,
uint32 aLcv);
PVMIDataStreamSyncInterface* iDataStreamInterface;
PVMFDataStreamFactory* iDataStreamFactory;
PVMFDataStreamReadCapacityObserver* iDataStreamReadCapacityObserver;
PvmiDataStreamSession iDataStreamSessionID;
PvmiDataStreamCommandId iRequestReadCapacityNotificationID;
uint32 iMP4HeaderSize;
bool iDownloadComplete;
bool iProgressivelyDownlodable;
uint32 iLastNPTCalcInConvertSizeToTime;
uint32 iFileSizeLastConvertedToTime;
bool iFastTrackSession;
/* External PseudoStreaming related */
bool iExternalDownload;
bool iUnderFlowEventReported;
PVMFStatus ReportUnderFlow();
OsclTimer<OsclMemAllocator> *iUnderFlowCheckTimer;
/* bitstream logging */
void LogMediaData(PVMFSharedMediaDataPtr data,
PVMFPortInterface* aPort);
bool iPortDataLog;
char iLogFileIndex;
OSCL_HeapString<OsclMemAllocator> portLogPath;
uint32 minTime;
uint32 avgTime;
uint32 maxTime;
uint32 sumTime;
bool iDiagnosticsLogged;
void LogDiagnostics();
uint32 iTimeTakenInReadMP4File;
bool iBackwardReposFlag; /* To avoid backwardlooping :: A flag to remember backward repositioning */
bool iForwardReposFlag;
uint32 iCurPos;
bool iEOTForTextSentToMIO;
bool iSetTextSampleDurationZero;
/* To take into account if we get negative TS for text track after repositionings*/
bool iTextInvalidTSAfterReposition;
uint32 iDelayAddToNextTextSample;
uint32 iCacheSize;
uint32 iAsyncReadBuffSize;
bool iPVLoggerEnableFlag;
bool iPVLoggerStateEnableFlag;
uint32 iNativeAccessMode;
BaseKeys_SelectionType iBaseKey;
uint32 iJitterBufferDurationInMs;
bool iDataStreamRequestPending;
bool iCPMSequenceInProgress;
bool oIsAACFramesFragmented;
int32 iPlayBackDirection;
int32 iStartForNextTSSearch;
int32 iPrevSampleTS;
bool iParseAudioDuringFF;
bool iParseAudioDuringREW;
bool iParseVideoOnly;
int32 iDataRate;
int32 minFileOffsetTrackID;
};
class PVMFMP4FFPortIter : public PVMFPortIter
{
public:
PVMFMP4FFPortIter(Oscl_Vector<PVMP4FFNodeTrackPortInfo, OsclMemAllocator>& aTrackList)
{
iIndex = 0;
iTrackList = &aTrackList;
};
virtual ~PVMFMP4FFPortIter() {};
uint16 NumPorts()
{
if (iTrackList->size() < 0xFFFF)
{
return (uint16)(iTrackList->size());
}
else
{
return 0xFFFF;
}
};
PVMFPortInterface* GetNext()
{
if (iIndex < iTrackList->size())
{
PVMFPortInterface* portiface = (*iTrackList)[iIndex].iPortInterface;
++iIndex;
return portiface;
}
else
{
return NULL;
}
};
void Reset()
{
iIndex = 0;
};
private:
Oscl_Vector<PVMP4FFNodeTrackPortInfo, OsclMemAllocator>* iTrackList;
uint32 iIndex;
};
#endif // PVMF_MP4FFPARSER_NODE_H_INCLUDED