[prev in list] [next in list] [prev in thread] [next in thread]
List: helix-datatype-cvs
Subject: [Datatype-cvs] mp4/fileformat/pub atomizer.h, 1.9.10.1.32.2, 1.9.10.1.32.2.2.1 fswtchr.h, 1.8.8.1.32
From: xzhao () helixcommunity ! org
Date: 2013-02-18 8:01:12
[Download RAW message or body]
Update of /cvsroot/datatype/mp4/fileformat/pub
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv26551/pub
Modified Files:
Tag: hxclient_5_0_1_hebe
atomizer.h fswtchr.h fswtchr_passthrough.h hxfswch.h
iqttrack.h qtatmmgs.h qtatoms.h qtatoms_inline.h qtbatom.h
qtffplin.h qtpacketizerfct.h qtswtrack.h qttrack.h qttrkmgr.h
Log Message:
Merge MP4 fileformat to support fragment, which is needed by DASh streaming playback.
Index: qtswtrack.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qtswtrack.h,v
retrieving revision 1.3.94.2
retrieving revision 1.3.94.2.2.1
diff -u -d -r1.3.94.2 -r1.3.94.2.2.1
--- qtswtrack.h 13 Oct 2012 02:32:24 -0000 1.3.94.2
+++ qtswtrack.h 18 Feb 2013 08:00:59 -0000 1.3.94.2.2.1
@@ -107,14 +107,22 @@
virtual ULONG32 GetTrackWidth(void);
virtual ULONG32 GetTrackHeight(void);
+ virtual UINT32 GetMediaTimeScale(void);
virtual ULONG32 GetSDPLength(void);
virtual const UINT8* GetSDP(void);
+ virtual void GetTrackHeader(IHXValues*& pHeader);
virtual HX_RESULT ObtainTrackBitrate(ULONG32& ulAvgBitrateOut);
virtual CQT_ChunkToOffset_Manager* GetChunkToOffsetMgr(void);
+ virtual HX_RESULT AddFragment(UINT32 ulSeq, CQTAtom* pTraf,
+ HX_OFF_T nMoofFileOffset)
+ { return HXR_NOTIMPL; }
+
+ virtual void EndOfFragments(void) {};
+
/*
* IQTTrackResponse Interface
*/
@@ -122,6 +130,8 @@
HX_RESULT status,
IHXPacket* pPacket);
+ virtual HX_RESULT Atomize(HXBOOL) { return HXR_NOTIMPL; }
+
/*
* IHXCallback methods
*/
Index: qtatoms_inline.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qtatoms_inline.h,v
retrieving revision 1.3.92.1
retrieving revision 1.3.92.1.36.1
diff -u -d -r1.3.92.1 -r1.3.92.1.36.1
--- qtatoms_inline.h 29 Dec 2010 03:59:11 -0000 1.3.92.1
+++ qtatoms_inline.h 18 Feb 2013 08:00:59 -0000 1.3.92.1.36.1
@@ -263,5 +263,174 @@
return 0;
}
+#ifdef QTCONFIG_FRAGMENTS
+
+void
+CQT_tfhd_Atom::ParseOptionalData()
+{
+ if (m_nSize < 8 || (((Data*)m_pData)->pVersion)[0] > 0)
+ {
+ return;
+ }
+
+ m_ulFlags = GetFlags(((Data*)m_pData)->pFlags);
+
+ UINT8* pOpt = ((Data*)m_pData)->pOptionalData;
+ UINT32 ulLen = (UINT32)(m_nSize - 8);
+ UINT32 ulOffset = 0;
+
+ // Parse the optional values (and make sure it really is big enough)
+
+ if ((m_ulFlags & TF_DataOffsetPresent) && 8 <= ulLen)
+ {
+ m_ullBaseDataOffset = GetUL64(pOpt);
+ ulOffset += 8;
+ }
+ if ((m_ulFlags & TF_SampleDescriptionIndexPresent) && ulOffset + 4 <= ulLen)
+ {
+ m_ulSampleDescIndex = GetUL32(pOpt + ulOffset);
+ ulOffset += 4;
+ }
+ if ((m_ulFlags & TF_DefaultSampleDurationPresent) && ulOffset + 4 <= ulLen)
+ {
+ m_ulDefaultSampleDuration = GetUL32(pOpt + ulOffset);
+ ulOffset += 4;
+ }
+ if ((m_ulFlags & TF_DefaultSampleSizePresent) && ulOffset + 4 <= ulLen)
+ {
+ m_ulDefaultSampleSize = GetUL32(pOpt + ulOffset);
+ ulOffset += 4;
+ }
+ if ((m_ulFlags & TF_DefaultSampleFlagsPresent) && ulOffset + 4 <= ulLen)
+ {
+ m_ulDefaultSampleFlags = GetUL32(pOpt + ulOffset);
+ ulOffset += 4;
+ }
+}
+
+void
+CQT_trun_Atom::ParseOptionalData()
+{
+ m_bParsed = TRUE;
+
+ if (m_nSize < 8 || (((Data*)m_pData)->pVersion)[0] > 0)
+ {
+ return;
+ }
+
+ m_ulFlags = GetFlags(((Data*)m_pData)->pFlags);
+ UINT8* pOpt = ((Data*)m_pData)->pOptionalData;
+ UINT32 ulLen = (UINT32)(m_nSize - 8);
+ UINT32 ulOffset = 0;
+ UINT32 ulSampleCount = GetUL32(((Data*) m_pData)->pSampleCount);
+
+ // Parse the optional values (and make sure it really is big enough)
+ if ((m_ulFlags & TF_DataOffsetPresent) && 4 <= ulLen)
+ {
+ m_lDataOffset = GetL32(pOpt);
+ ulOffset += 4;
+ }
+ if ((m_ulFlags & TF_FirstSampleFlagsPresent) && ulOffset + 4 <= ulLen)
+ {
+ m_ulFirstSampleFlags = GetUL32(pOpt + ulOffset);
+ ulOffset += 4;
+ }
+
+ m_pSampleEntries = pOpt + ulOffset;
+ ulLen -= ulOffset;
+ ulOffset = 0;
+
+ m_ulNumEntries = 0;
+ m_ulEntrySize = 0;
+
+ m_ulSampleDurOffset = 0;
+ m_ulSampleSizeOffset = 0;
+ m_ulSampleFlagsOffset = 0;
+ m_ulCompTimeOffset = 0;
+
+ if (m_ulFlags & TF_SampleDurationPresent)
+ {
+ m_ulEntrySize += 4;
+ }
+ if (m_ulFlags & TF_SampleSizePresent)
+ {
+ m_ulSampleSizeOffset = m_ulEntrySize;
+ m_ulEntrySize += 4;
+ }
+ if (m_ulFlags & TF_SampleFlagsPresent)
+ {
+ m_ulSampleFlagsOffset = m_ulEntrySize;
+ m_ulEntrySize += 4;
+ }
+ if (m_ulFlags & TF_SampleCompositionTimeOffsetsPresent)
+ {
+ m_ulCompTimeOffset = m_ulEntrySize;
+ m_ulEntrySize += 4;
+ }
+
+ if ((m_ulEntrySize * ulSampleCount) + ulOffset <= ulLen)
+ {
+ m_ulNumEntries = ulSampleCount;
+ }
+}
+
+UINT8* CQT_trun_Atom::GetSampleEntry(UINT32 ulEntryIdx)
+{
+ UINT8* pData = m_pSampleEntries + (ulEntryIdx*m_ulEntrySize);
+
+#if !defined(QTCONFIG_NO_PAGING)
+ if (m_pMemPager)
+ {
+ m_lastStatus = m_pMemPager->PageIn(
+ m_pSampleEntries + (ulEntryIdx*m_ulEntrySize),
+ m_ulEntrySize, pData);
+ }
+#endif /* #if !defined(QTCONFIG_NO_PAGING) */
+
+ if (m_lastStatus == HXR_OK)
+ {
+ return pData;
+ }
+
+ return 0;
+}
+
+void
+CQT_sidx_Atom::ParseOptionalData()
+{
+ if (m_bParsed)
+ {
+ return;
+ }
+ m_bParsed = TRUE;
+ if ((*(((Data*) m_pData)->pVersion)) == 0)
+ {
+ m_ulTimeScale = GetUL32(((Data*)m_pData)->pTimeScale);
+ m_ulReferenceCount = GetUI16(((Data*)m_pData)->pReference_Count);
+ m_pReferenceEntries = ((Data*) m_pData)->pOptionalData;
+ }
+ else
+ {
+ m_ulTimeScale = GetUL32(((Data64*)m_pData)->pTimeScale);
+ m_ulReferenceCount = GetUI16(((Data64*)m_pData)->pReference_Count);
+ m_pReferenceEntries = ((Data64*) m_pData)->pOptionalData;
+ }
+#if 0
+ // List all fields for debug
+ UINT32 ulTypeSize, ulSubSegDuration, ulSAPInfo;
+ UINT8* pOptEntry = m_pReferenceEntries;
+ for (int i = 0; i < m_ulReferenceCount; i++)
+ {
+ ulTypeSize = GetUL32(pOptEntry);
+ ulSubSegDuration = GetUL32(pOptEntry + 4);
+ ulSAPInfo = GetUL32(pOptEntry + 8);
+ pOptEntry += 12;
+ printf("Entry %u: type %u ref-size %lu sub-segment-duration %lu/%lu=%fsec \
start-with-SAP %u SAP_type %u SAL_Delta_time %lu\n", i+1, (ulTypeSize & 0x80000000) \
>> 31, ulTypeSize & 0x7FFFFFFF, ulSubSegDuration, m_ulTimeScale, \
> > ulSubSegDuration*1.0f/m_ulTimeScale, (ulSAPInfo & 0x80000000) >> 31, (ulSAPInfo & \
> > 0x70000000) >> 28, ulSAPInfo & 0xFFFFFFF);
+ }
+#endif
+}
+
+#endif /* QTCONFIG_FRAGMENTS */
+
#endif // QTATOMS_INLINE_H
Index: qtffplin.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qtffplin.h,v
retrieving revision 1.17.8.4.2.1
retrieving revision 1.17.8.4.2.1.2.1
diff -u -d -r1.17.8.4.2.1 -r1.17.8.4.2.1.2.1
--- qtffplin.h 3 May 2012 03:17:21 -0000 1.17.8.4.2.1
+++ qtffplin.h 18 Feb 2013 08:00:59 -0000 1.17.8.4.2.1.2.1
@@ -39,8 +39,8 @@
/****************************************************************************
* Defines
*/
-#define QTFF_RDT_FORMAT 0
-#define QTFF_RTP_FORMAT 1
+#define QTFF_RTP_FORMAT 0
+#define QTFF_RDT_FORMAT 1
#define MAX_QTFORMAT_FLAVOR 0x07
#define MAX_QTFLAVORS (MAX_QTFORMAT_FLAVOR + 1)
@@ -69,10 +69,11 @@
#endif // QTCONFIG_BFRAG_FACTORY
#include "qtffrefcounter.h"
#include "hxprdnld.h"
+#include "tsconvrt.h"
class CQTOffsetToTimeMapper;
-
+class CTSConverter;
/****************************************************************************
*
@@ -92,6 +93,7 @@
public IHXPacketFormat,
public IQTTrackResponse,
public IHXMediaBytesToMediaDur,
+ public IHXFileFormatTranslator,
public IHXFileStatResponse
{
public:
@@ -268,12 +270,28 @@
REF(UINT32) /*OUT*/ ulREFDur);
/*
+ * IHXFileFormatTranslator methods
+ */
+ STDMETHOD(TranslateTimeToPosition) (THIS_
+ UINT32 /*IN*/ ulSeekTimeIn,
+ REF(UINT32) /*OUT*/ ulSeekTimeOut,
+ REF(UINT32) /*OUT*/ ulPosition);
+
+ /*
* Public Accessors
*/
IUnknown* GetContext(void) { return m_pContext; }
ULONG32 GetPacketFormat(void) { return m_ulPacketFormat; }
+ inline void ChunkDone(void)
+ {
+ if (m_pFileRange)
+ {
+ UpdateAccessRange();
+ }
+ }
+
/*
* Public Managers
*/
@@ -290,19 +308,38 @@
virtual HX_RESULT GetSessionIdentity(IHXValues* pHeader,
CQT_MovieInfo_Manager* pMovieInfo);
- virtual ~CQTFileFormat();
+ virtual ~CQTFileFormat();
-#if defined(HELIX_FEATURE_3GPP_METAINFO) || defined(HELIX_FEATURE_SERVER)
- HX_RESULT SetPropertyOnHeader(HX_RESULT status, IHXValues* pHeader,
- const char* key, const char* value,
- ULONG32 valueLength);
+ virtual HX_RESULT InitTracks(CQTPacketizerFactory* pPacketizerFactory);
+ virtual HXBOOL IgnoreHintTracks() {return FALSE;}
+ /*
+ * Meta-info extractors
+ */
+ typedef HX_RESULT (CQTFileFormat::*PFNExtractAssetInfoToHeader)(HX_RESULT \
status, IHXValues* pHeader);
- HX_RESULT Set3GPPAssetInfoOnHeader(HX_RESULT status, IHXValues* pHeader);
-#endif // HELIX_FEATURE_3GPP_METAINFO || HELIX_FEATURE_SERVER
+#if defined(QTCONFIG_3GPP_TAC) || defined(QTCONFIG_3GPP_METAINFO)
+ HX_RESULT Extract3GPPAssetInfoToHeader(HX_RESULT status, IHXValues* pHeader);
+#endif //defined(QTCONFIG_3GPP_TAC) || defined(QTCONFIG_3GPP_METAINFO)
+
+#ifdef QTCONFIG_ITUNES_METAINFO
+ HX_RESULT ExtractiTunesAssetInfoToHeader(HX_RESULT status, IHXValues* pHeader);
+#endif //QTCONFIG_ITUNES_METAINFO
+
+#if defined(QTCONFIG_3GPP_TAC) || defined(QTCONFIG_3GPP_METAINFO) || \
defined(QTCONFIG_ITUNES_METAINFO) + HX_RESULT UpdateHeaderProperty(HX_RESULT \
status, IHXValues* pHeader, + const char* key,
+ const char* value, ULONG32 valueLength,
+ HX_TEXT_ENCODING_TYPE encoding = \
HX_TEXT_ENCODING_TYPE_UNKNOWN); +#endif //defined(QTCONFIG_3GPP_TAC) || \
defined(QTCONFIG_3GPP_METAINFO) || defined(QTCONFIG_ITUNES_METAINFO)
+ /*
+ * Other public members
+ */
IUnknown* m_pContext;
IHXCommonClassFactory* m_pClassFactory;
IHXFormatResponse* m_pFFResponse;
+ ULONG32 m_ulPacketFormat;
+ CQTPacketAssembler* m_pPacketAssembler;
protected:
virtual HX_RESULT CreateFileSwitcher(IHXFileSwitcher** pISwitcher);
@@ -324,26 +361,35 @@
class CPacketCache
{
- public:
- CPacketCache(void)
- : pPacket(NULL)
- , bPending(FALSE)
- , bStreamDone(FALSE) {;}
+ public:
+ CPacketCache(void)
+ : pPacket(NULL)
+ , bPending(FALSE)
+ , bStreamDone(FALSE)
+ , bActive(FALSE)
+ , pTSConverter(NULL) {;}
- ~CPacketCache() { HX_RELEASE(pPacket); }
+ ~CPacketCache() { HX_RELEASE(pPacket); HX_DELETE(pTSConverter); }
- IHXPacket* pPacket;
- HXBOOL bPending;
- HXBOOL bStreamDone;
+ IHXPacket* pPacket;
+ HXBOOL bPending;
+ HXBOOL bStreamDone;
+ CTSConverter* pTSConverter;
+ HXBOOL bActive;
};
inline UINT16 GetNextPacketStreamNum(void);
+ inline HX_RESULT TryGetPacket(UINT16 unStreamNumber);
+ inline HX_RESULT SendStreamDone(UINT16 unStreamNumber);
+
HX_RESULT MakeFileHeader(HX_RESULT status);
HX_RESULT MakeASMUberRuleBook(IHXValues* pHeader,
IHXValues* pParsedSDP);
HX_RESULT ObtainStreamHeader(UINT16 unStreamNumber,
IHXValues* &pHeader);
HX_RESULT AddMetaInfo(IHXValues* pHeader);
+ void MakeISMAHeader(IHXValues* pHeader);
+
HX_RESULT ExtractAcceptMetaInfo(IHXBuffer* pRequestedInfoBuffer);
HX_RESULT HandleFailure(HX_RESULT status);
@@ -354,18 +400,30 @@
void WarnIfNotHinted(HX_RESULT status, HXBOOL bIgnoreHintTracks);
HX_RESULT CreateNewFileFormatObject(const char* purl);
HX_RESULT _InternalInitDone(HX_RESULT status);
- IHXScheduler* m_pScheduler;
- IHXErrorMessages* m_pErrorMessages;
- HXBOOL m_bQTLicensed;
- HXBOOL m_bMP4Licensed;
- HXBOOL m_b3GPPRel6Licensed;
+ HX_RESULT InitAtom(HX_RESULT status, CQTAtom* pAtom);
+ HX_RESULT InitISOTracks(CQT_moov_Atom* pMoovAtom);
+ HX_RESULT InitRMRA(CQT_moov_Atom* pMoovAtom);
+ HX_RESULT AddAtom(HX_RESULT status, CQTAtom* pAtom);
+
+ void UpdateAccessRange(void);
+
+ inline void CloseAtomizer(void);
- HXBOOL m_bViewSourceRequest;
+ IHXScheduler* m_pScheduler;
- UINT8 m_uFormatFlavor;
+ IHXErrorMessages* m_pErrorMessages;
+ HXBOOL m_bQTLicensed;
+ HXBOOL m_bMP4Licensed;
+ HXBOOL m_b3GPPRel6Licensed;
+ HXBOOL m_bF4VLicensed;
+
+ HXBOOL m_bViewSourceRequest;
+ HXBOOL m_bSendStreamDonePacket;
- IHXRequest* m_pRequest;
+ UINT8 m_uFormatFlavor;
+
+ IHXRequest* m_pRequest;
static const char* const zm_pDescription;
static const char* const zm_pCopyright;
@@ -375,11 +433,17 @@
static const char* const zm_pFileExtensions[];
static const char* const zm_pFileOpenNames[];
static const char* const zm_pPacketFormats[];
+ static const ULONG32 m_ulMp4PosixTimeDiffSec;
IHXFileSwitcher* m_pFileSwitcher;
+ IHXFileSwitcherAccessRange* m_pFileRange;
+ CAtomizerCallback* m_pAtomizerCB;
CAtomizer* m_pAtomizer;
- CQTPacketAssembler* m_pPacketAssembler;
+ HXBOOL m_bLinearAccess;
+ HXBOOL m_bProgressiveAtomize;
+ HXBOOL m_bHaveMoov;
+
ULONG32 m_ulPendingSeekTime;
CPacketCache* m_pPacketCache;
@@ -388,8 +452,6 @@
HXBOOL m_bUnregulatedStreamDataFlow;
- ULONG32 m_ulPacketFormat;
-
LONG32 m_lRefCount;
HX_OFF_T m_FileSize;
@@ -397,10 +459,10 @@
// Values for mask
typedef enum
{
- META_INFO_NONE = 0,
- META_INFO_ALL = 1,
- META_INFO_WIDTH = 2,
- META_INFO_HEIGHT = 4
+ META_INFO_NONE = 0,
+ META_INFO_ALL = 1,
+ META_INFO_WIDTH = 2,
+ META_INFO_HEIGHT = 4
} eMetaInfoRequest;
UINT32 m_ulStreamMetaInfoMask;
@@ -412,6 +474,11 @@
IHXFileObject* m_pFileObject;
UINT32 m_ulNextPacketTime; // in milliseconds
IHXFileFormatObject* m_pRedirectFFObject;
+ HXBOOL m_bInitialPrimingDone;
+#ifdef QTCONFIG_FRAGMENTS
+ CQT_sidx_Atom* m_pSegmentIndexAtom;
+ UINT32 m_ulSegmentIndexCount;
+#endif
};
Index: qtatmmgs.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qtatmmgs.h,v
retrieving revision 1.19.8.9.8.12
retrieving revision 1.19.8.9.8.12.2.1
diff -u -d -r1.19.8.9.8.12 -r1.19.8.9.8.12.2.1
--- qtatmmgs.h 3 May 2012 03:17:21 -0000 1.19.8.9.8.12
+++ qtatmmgs.h 18 Feb 2013 08:00:59 -0000 1.19.8.9.8.12.2.1
@@ -47,8 +47,10 @@
// Enable identification of SYNC packets with ASM_SWITCH_ON/OFF flags
#define _STSS_TRACK_SYNC
-#define QT_BAD_IDX 0xFFFFFFFF
-#define QT_BAD_PAYLOAD 0xFFFFFFFF
+#define QT_BAD_IDX 0xFFFFFFFF
+#define QT_BAD_PAYLOAD 0xFFFFFFFF
+#define QT_INVALID_OFFSET HX_MAX_OFFSET
+#define QT_INVALID_MEDIA_TIME MAX_UINT64
#ifdef QTCONFIG_SPEED_OVER_SIZE
[...1064 lines suppressed...]
+ CQT_iTunes_data_Atom* m_piTunesDataAtomA9too;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomA9enc;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomA9grp;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomgrup;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomaART;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomcprt;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomA9st3;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomA9lyr;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomtmpo;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomcpil;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomrtng;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomtrkn;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomdisk;
+ CQT_iTunes_data_Atom* m_piTunesDataAtomgnre;
+ CQT_iTunes_covr_Atom* m_piTunesItemAtomcovr;
+#endif //QTCONFIG_ITUNES_METAINFO
+
CQT_rtp_Atom* m_pRTPSDPAtom;
};
Index: atomizer.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/atomizer.h,v
retrieving revision 1.9.10.1.32.2
retrieving revision 1.9.10.1.32.2.2.1
diff -u -d -r1.9.10.1.32.2 -r1.9.10.1.32.2.2.1
--- atomizer.h 3 May 2012 03:17:20 -0000 1.9.10.1.32.2
+++ atomizer.h 18 Feb 2013 08:00:59 -0000 1.9.10.1.32.2.2.1
@@ -51,6 +51,7 @@
* Includes
*/
#include "hxatmzr.h"
+#include "qtatoms.h"
#include "hxfiles.h"
#include "hxengin.h"
#include "fswtchr.h"
@@ -79,13 +80,18 @@
* Main Interface
*/
HX_RESULT Init(IUnknown* pSource,
- IUnknown* pResponse,
- IUnknown* pCommander = NULL);
+ IUnknown* pResponse,
+ IUnknown* pCommander = NULL,
+ HXBOOL bLinearAccess = FALSE);
+ HX_RESULT SetOffset(HX_OFF_T offset, HX_OFF_T size);
+ HX_OFF_T GetOffset(void);
+
void Close(void);
HX_RESULT Atomize( HX_OFF_T nOffset = 0,
HX_OFF_T nSize = ATOMIZE_ALL);
+ HX_RESULT Resume(void);
const CQTAtom* GetRootAtom() {return (const CQTAtom*)m_pRoot;}
@@ -201,7 +207,7 @@
QTAtomType AtomType,
CQTAtom *pParent)
{
- return ATMZR_CMD_LOAD;
+ return AtomType == QT_mdat ? ATMZR_CMD_OUTLINE : ATMZR_CMD_LOAD;
}
///////////////////////////////////////////////////////////////////////////
@@ -216,28 +222,31 @@
private:
typedef enum
{
- ATMZR_Offline,
- ATMZR_Ready,
- ATMZR_ProcHeader,
- ATMZR_ProcNewHeader,
- ATMZR_ProcExtendedSize,
- ATMZR_MakeAtom,
- ATMZR_ProcBody,
- ATMZR_ProcNonLeafBody,
- ATMZR_ProcCompressedHeader
-
+ ATMZR_Offline,
+ ATMZR_Ready,
+ ATMZR_Done,
+ ATMZR_Paused,
+ ATMZR_ProcHeader,
+ ATMZR_ProcNewHeader,
+ ATMZR_ProcExtendedSize,
+ ATMZR_MakeAtom,
+ ATMZR_ProcBody,
+ ATMZR_ProcNonLeafBody,
+ ATMZR_ProcCompressedHeader
} AtomizerState;
typedef enum
{
- ATMZR_CBSTEP_Read,
- ATMZR_CBSTEP_Seek
+ ATMZR_CBSTEP_Read,
+ ATMZR_CBSTEP_Seek,
+ ATMZR_CBSTEP_None
} CallbackStep;
typedef enum
{
eTypeReadInHeaderBuffer,
- eTypeSeekInHeaderBuffer
+ eTypeSeekInHeaderBuffer,
+ eTypeNoCallback
} eCallbackType;
class CRecursionCallback : public IHXCallback
@@ -269,14 +278,21 @@
inline HX_RESULT ReadDataCB(ULONG32 ulSize);
inline HX_RESULT SeekDataCB(HX_OFF_T nOffset, HXBOOL bRelative = FALSE);
- HXBOOL IsOffsetInRange(HX_OFF_T nOffset)
+ HX_RESULT IsOffsetInRange(HX_OFF_T ulOffset)
{
- return (m_FinalOffset == ATOMIZE_ALL) ||
- (nOffset < m_FinalOffset);
+ return ((m_nFinalOffset == ATOMIZE_ALL || ulOffset < m_nFinalOffset) ?
+ HXR_OK : ulOffset == m_nFinalOffset ? HXR_AT_END :
+ HXR_CORRUPT_FILE);
}
QTATOMIZER_INLINE HX_RESULT AdjustCurrentRoot(void);
- void CompleteAtomization(HX_RESULT status);
+ HX_RESULT CloseAtom(HX_RESULT status);
+ HX_RESULT AtomReady(HX_RESULT status);
+ HX_RESULT CompleteAtomization(HX_RESULT status);
+ HX_RESULT DoResume(void);
+ void CancelCallbacks(void);
+ void HandleError(HX_RESULT status);
+
AtomizerState m_State;
IHXFileSwitcher *m_pFileSwitcher;
@@ -292,19 +308,20 @@
CQTAtom *m_pCurrentRoot;
CQTAtom *m_pNewAtom;
- HX_OFF_T m_StartOffset;
- HX_OFF_T m_FinalOffset;
+ HX_OFF_T m_nStartOffset;
+ HX_OFF_T m_nFinalOffset;
HX_OFF_T m_CurrentOffset;
- HX_OFF_T m_NewAtomOffset;
- HX_OFF_T m_NewAtomDataSize;
+ HX_OFF_T m_nNewAtomOffset;
+ HX_OFF_T m_nNewAtomDataSize;
QTAtomType m_AtomType;
- HX_OFF_T m_TotalSize;
+ HX_OFF_T m_nTotalSize;
CRecursionCallback *m_pRecursionCallback;
eCallbackType m_eCallbackType;
ULONG32 m_ulRecursionCount;
CallbackStep m_CallbackStep;
- HX_OFF_T m_Size;
+ CallbackHandle m_hRCBHandle;
+ HX_OFF_T m_nSize;
HXBOOL m_bRelative;
LONG32 m_lRefCount;
HXBOOL m_bReadFromUnzippedHeader;
@@ -323,4 +340,86 @@
};
+class CAtomizerCallback : public IHXCallback
+{
+public:
+ CAtomizerCallback(IHXScheduler* pScheduler = NULL,
+ CAtomizer* pAtomizer = NULL);
+ ~CAtomizerCallback();
+
+ /* IUnknown */
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj);
+ STDMETHOD_(ULONG32,AddRef) (THIS);
+ STDMETHOD_(ULONG32,Release) (THIS);
+
+ /* IHXCallback */
+ STDMETHOD(Func) (THIS);
+
+ enum ECBState
+ {
+ /* Atomizer commands */
+ ATMZR_Begin,
+ ATMZR_Resume,
+ ATMZR_Close,
+
+ /* internal states */
+ CB_Init,
+ CB_Ready,
+ CB_Closed
+ };
+
+ HX_RESULT Init(IUnknown* pSource,
+ IUnknown* pResponse,
+ IUnknown* pCommander = NULL,
+ HXBOOL bLinearAccess = FALSE);
+
+ // For stateless calls only
+ CAtomizer* GetAtomizer(void) { return m_pAtomizer; }
+
+ // Atomizer commands
+ HX_RESULT Atomize(void);
+ HX_RESULT Close(void);
+
+ // Cancel currently scheduled callback
+ HX_RESULT Cancel(void);
+
+private:
+ INT32 m_lRefCount;
+ ECBState m_State;
+ CAtomizer* m_pAtomizer;
+
+ IHXScheduler* m_pScheduler;
+ CallbackHandle m_hCBHandle;
+};
+
+class CAtomizerResponseCallback : public IHXCallback,
+ public IHXAtomizerResponse
+{
+public:
+ CAtomizerResponseCallback(IHXScheduler* pScheduler,
+ IHXAtomizerResponse* pResponse);
+ ~CAtomizerResponseCallback();
+
+ /* IUnknown */
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj);
+ STDMETHOD_(ULONG32,AddRef) (THIS);
+ STDMETHOD_(ULONG32,Release) (THIS);
+
+ /* IHXCallback */
+ STDMETHOD(Func) (THIS);
+
+ /* IHXAtomizerResponse */
+ STDMETHOD(AtomReady) (THIS_ HX_RESULT status, CQTAtom* pAtom);
+
+private:
+ INT32 m_lRefCount;
+
+ IHXAtomizerResponse* m_pResponse;
+ IHXScheduler* m_pScheduler;
+ CallbackHandle m_hCBHandle;
+
+ CQTAtom* m_pPendingAtom;
+ HX_RESULT m_pendingStatus;
+};
+
#endif // _ATOMIZER_H_
Index: iqttrack.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/iqttrack.h,v
retrieving revision 1.3.94.2
retrieving revision 1.3.94.2.2.1
diff -u -d -r1.3.94.2 -r1.3.94.2.2.1
--- iqttrack.h 3 May 2012 03:17:20 -0000 1.3.94.2
+++ iqttrack.h 18 Feb 2013 08:00:59 -0000 1.3.94.2.2.1
@@ -59,6 +59,7 @@
class CQTTrackManager;
class CQT_MovieInfo_Manager;
class CQT_ChunkToOffset_Manager;
+class CQTAtom;
/****************************************************************************
*
@@ -138,11 +139,17 @@
virtual HX_RESULT SubscribeDefault(void) = 0;
virtual HXBOOL IsSubscribed(void) = 0;
+ virtual HX_RESULT AddFragment(UINT32 ulSeq, CQTAtom* pTraf,
+ HX_OFF_T nMoofFileOffset) = 0;
+ virtual void EndOfFragments(void) = 0;
+
virtual HX_RESULT ComputeTrackSize(HX_OFF_T& nTrackSizeOut) = 0;
virtual ULONG32 GetID(void) = 0;
+ virtual void GetTrackHeader(IHXValues*& pHeader) = 0;
virtual ULONG32 GetTrackWidth(void) = 0;
virtual ULONG32 GetTrackHeight(void) = 0;
+ virtual UINT32 GetMediaTimeScale(void) = 0;
virtual ULONG32 GetSDPLength(void) = 0;
virtual const UINT8* GetSDP(void) = 0;
@@ -151,6 +158,8 @@
virtual CQT_ChunkToOffset_Manager* GetChunkToOffsetMgr(void) = 0;
virtual HX_RESULT SetStreamHeader(IHXValues* pHeader) = 0;
+
+ virtual HX_OFF_T GetMinDataRange(const char* pFileName) = 0;
};
#endif // _IQTTRACK_H_
Index: qtatoms.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qtatoms.h,v
retrieving revision 1.20.8.12.2.11
retrieving revision 1.20.8.12.2.11.2.1
diff -u -d -r1.20.8.12.2.11 -r1.20.8.12.2.11.2.1
--- qtatoms.h 3 May 2012 03:17:21 -0000 1.20.8.12.2.11
+++ qtatoms.h 18 Feb 2013 08:00:59 -0000 1.20.8.12.2.11.2.1
@@ -43,7 +43,14 @@
#define QTATOMS_INLINE inline
#else // QTCONFIG_SPEED_OVER_SIZE
#define QTATOMS_INLINE /**/
-#endif // QTCONFIG_SPEED_OVER_SIZE
+#endif // QTCONFIG_SPEED_OVER_SIZE
+
+
+#ifdef QTCONFIG_LARGE_FILE_SUPPORT
+#define GetOffTFrom64(pData) ((HX_OFF_T)GetUL64(pData))
+#else
+#define GetOffTFrom64(pData) ((HX_OFF_T)GetUL32((pData) + 4))
[...2088 lines suppressed...]
+private:
+ HXBOOL m_bParsed;
+ UINT32 m_ulReferenceCount;
+ UINT32 m_ulTimeScale;
+ UINT8* m_pReferenceEntries;
+};
+#endif // QTCONFIG_FRAGMENTS
+
+
class CQT_tapt_Atom : public CQTAtom
{
public:
@@ -4122,6 +5696,7 @@
virtual QTAtomType GetType(void) { return QT_smhd; }
};
+
#ifdef QTCONFIG_SPEED_OVER_SIZE
#include "qtatoms_inline.h"
#endif // QTCONFIG_SPEED_OVER_SIZE
Index: qtpacketizerfct.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qtpacketizerfct.h,v
retrieving revision 1.2
retrieving revision 1.2.540.1
diff -u -d -r1.2 -r1.2.540.1
--- qtpacketizerfct.h 13 May 2003 18:46:45 -0000 1.2
+++ qtpacketizerfct.h 18 Feb 2013 08:00:59 -0000 1.2.540.1
@@ -83,6 +83,24 @@
CQTTrackManager* pTrackManager,
CQTTrack* pTrack,
IUnknown* pContext);
+protected:
+#ifdef QTCONFIG_SERVER
+ virtual HX_RESULT ConstructStream (IHXPayloadFormatObject* &pPacketizer,
+ const char* pProtocol,
+ CQT_TrackInfo_Manager* pTrackInfo,
+ CQT_MovieInfo_Manager* pMovieInfo,
+ CQTTrackManager* pTrackManager,
+ CQTTrack* pTrack,
+ IUnknown* pContext);
+#endif /* QTCONFIG_SERVER */
+
+ virtual HX_RESULT ConstructLocal (IHXPayloadFormatObject* &pPacketizer,
+ const char* pProtocol,
+ CQT_TrackInfo_Manager* pTrackInfo,
+ CQT_MovieInfo_Manager* pMovieInfo,
+ CQTTrackManager* pTrackManager,
+ CQTTrack* pTrack,
+ IUnknown* pContext);
};
#endif // _QTPACKETIZERFCT_H_
Index: hxfswch.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/hxfswch.h,v
retrieving revision 1.2.94.1
retrieving revision 1.2.94.1.2.1
diff -u -d -r1.2.94.1 -r1.2.94.1.2.1
--- hxfswch.h 3 May 2012 03:17:20 -0000 1.2.94.1
+++ hxfswch.h 18 Feb 2013 08:00:59 -0000 1.2.94.1.2.1
@@ -117,5 +117,45 @@
ULONG32 ulInfo,
const char* pFileName = NULL) PURE;
};
+/****************************************************************************
+ *
+ * Interface:
+ *
+ * IHXFileSwitcherAccessRange
+ *
+ * Purpose:
+ *
+ * Expose IHXFileObjectAccessRange range management for files managed
+ * by IHXFileSwitcher
+ *
+ * IID_IHXFileSwitcherAccessRange
+ *
+ * {9cf40043-78df-4aa6-8e34-9d2d614084f0}
+ *
+ */
+
+DEFINE_GUID(IID_IHXFileSwitcherAccessRange,
+ 0x9cf40043, 0x78df, 0x4aa6, 0x8e, 0x34,
+ 0x9d, 0x2d, 0x61, 0x40, 0x84, 0xf0);
+#undef INTERFACE
+#define INTERFACE IHXFileSwitcherAccessRange
+
+DECLARE_INTERFACE_(IHXFileSwitcherAccessRange, IUnknown)
+{
+ /* IUnknown */
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj) PURE;
+
+ STDMETHOD_(ULONG32,AddRef) (THIS) PURE;
+
+ STDMETHOD_(ULONG32,Release) (THIS) PURE;
+
+
+ /* IHXFileSwitcherAccessRange */
+ STDMETHOD_(HXBOOL, HasAccessRange) (THIS_ const char* pFileName = NULL) PURE;
+ STDMETHOD(EnableAccessRange) (THIS) PURE; // Enable for all files
+ STDMETHOD(EnableFileAccessRange) (THIS_ const char* pFileName = NULL) PURE;
+ STDMETHOD(SetAccessRange) (THIS_ HX_OFF_T ulLow, HX_OFF_T ulHigh,
+ const char* pFileName = NULL) PURE;
+};
#endif // _HXFSWCH_H_
Index: fswtchr_passthrough.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/fswtchr_passthrough.h,v
retrieving revision 1.5
retrieving revision 1.5.158.1
diff -u -d -r1.5 -r1.5.158.1
--- fswtchr_passthrough.h 14 Mar 2005 19:17:44 -0000 1.5
+++ fswtchr_passthrough.h 18 Feb 2013 08:00:59 -0000 1.5.158.1
@@ -53,6 +53,7 @@
*
*/
class CFileSwitcherPassthrough : public IHXFileSwitcher,
+ public IHXFileSwitcherAccessRange,
public IHXFileResponse,
public IHXThreadSafeMethods
{
@@ -107,6 +108,15 @@
ULONG32 ulInfo,
const char* pFileName = NULL);
+ /* IHXFileSwitcherAccessRange */
+ STDMETHOD_(HXBOOL, HasAccessRange) (THIS_ const char* pFileName = NULL);
+
+ STDMETHOD(EnableAccessRange) (THIS);
+
+ STDMETHOD(EnableFileAccessRange) (THIS_ const char* pFileName = NULL);
+
+ STDMETHOD(SetAccessRange) (THIS_ HX_OFF_T ulLow, HX_OFF_T ulHigh,
+ const char* pFileName = NULL);
/*
* IHXFileResponse methods
*/
@@ -150,6 +160,8 @@
FileSwitcherState m_State;
IHXFileObject* m_pFileObject;
+ IHXFileObjectAccessRange* m_pAccessRange;
+
IHXFileResponse* m_pResponse;
LONG32 m_lRefCount;
Index: qttrkmgr.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qttrkmgr.h,v
retrieving revision 1.12.90.1
retrieving revision 1.12.90.1.2.1
diff -u -d -r1.12.90.1 -r1.12.90.1.2.1
--- qttrkmgr.h 13 Jul 2012 09:00:31 -0000 1.12.90.1
+++ qttrkmgr.h 18 Feb 2013 08:00:59 -0000 1.12.90.1.2.1
@@ -42,12 +42,14 @@
#include "iqttrack.h"
#include "qtatoms.h"
#include "qttrack.h"
+#include <hlxclib/windows.h>
class CQTFileFormat;
class CQTPacketAssembler;
class CQTTrack;
class CQTSwitchTrack;
class CQTPacketizerFactory;
+class CHXMapLongToObj;
/****************************************************************************
* Globals
@@ -58,13 +60,17 @@
QT_FTYPE_QT,
QT_FTYPE_MP4,
QT_FTYPE_EMC
+#if defined(HELIX_FEATURE_RMFF_ISO_BASED)
+ ,QT_FTYPE_RMNG
+#endif
} QT_FTYPE;
typedef enum
{
QT_ETYPE_UNKNOWN,
QT_ETYPE_SERVER,
- QT_ETYPE_CLIENT
+ QT_ETYPE_CLIENT,
+ QT_ETYPE_BCAST
} QT_ETYPE;
typedef enum
@@ -101,6 +107,7 @@
HX_RESULT OnlyUseOneTrackInMultiVideoTracks(void);
#endif
HX_RESULT ManageTracks(CQTAtom *pRootAtom);
+ HX_RESULT AddAtom(CQTAtom* pAtom);
HX_RESULT ReadyTracks(HXBOOL bIgnoreHintTracks = FALSE,
HXBOOL bFallbackToTracks = FALSE);
HX_RESULT InitTracks(CQTFileFormat *pFileFormat,
@@ -118,6 +125,7 @@
HX_RESULT Unsubscribe(UINT16 uStreamNum, UINT16 uRuleNumber);
HX_RESULT RemoveInactiveStreams(HXBOOL bLeaveReferences = FALSE);
+ void AtomizeComplete(void);
void CloseTracks(void);
void ResetTracks(void);
@@ -134,12 +142,19 @@
{
return m_pStreamToTrackMap[uStreamNumber].m_pIQTTrack;
}
+
+ UINT16 GetTrackIndexById(UINT32 ulTrackID);
CQTTrack* GetTrackById(ULONG32 ulTrackID);
CQTAtom* GetTrackAtomById(ULONG32 ulTrackID);
HXBOOL IsStreamTrack(IQTTrack* pTrack);
UINT16 GetStreamNumberByTrackId(ULONG32 ulTrackId);
+ HXBOOL IsStreamGroupSubscribed(UINT16 uStreamNumber)
+ {
+ return m_pStreamGroupSubcribed[m_pStreamToTrackMap[uStreamNumber].m_uStreamGroupNumber];
+ }
+
HXBOOL IsStreamTrackActive(UINT16 uStreamNumber)
{
return m_pStreamToTrackMap[uStreamNumber].m_bActive;
@@ -155,12 +170,19 @@
return m_pStreamToTrackMap[uStreamNumber].m_bDefaultAlternate;
}
- QT_FTYPE GetFType(void) { return m_FType; }
+ HXBOOL IsBaseTimeReady(void) { return (m_pTrackStartTimes == NULL); }
+ double GetContentBaseTime(void) { return m_dContentBaseTime; }
+
+ QT_FTYPE GetFType(void) { return m_FType; }
HX_RESULT GetMajorBrand(UINT32* pulMajorBrand);
- QT_ETYPE GetEType(void) { return m_EType; }
+ HX_RESULT GetCompatibleBrand(UINT32* pulBrand);
+
+ QT_ETYPE GetEType(void) { return m_EType; }
void SetEType(QT_ETYPE eEType) { m_EType = eEType; }
- HXBOOL IsHintsEnabled(void) { return m_bHintTracksActive; }
- HXBOOL IsHinted(void) { return m_bHinted; }
+ HXBOOL IsHintsEnabled(void) { return m_bHintTracksActive; }
+ HXBOOL IsHinted(void) { return m_bHinted; }
+
+ void DisableHintTrack() { m_bHinted = FALSE; }
static CQT_hdlr_Atom* GetTrackAtomHdlr(CQT_trak_Atom* pTrakAtom);
static CQT_stbl_Atom* GetTrackAtomStbl(CQT_trak_Atom* pTrakAtom);
@@ -232,9 +254,10 @@
HX_RESULT SequentializeStreamGroupNumbers(void);
void ReleaseStreamTrack(IQTTrack* pQTTrack);
- void AddTracks(CQTAtom* pRootAtom);
+ HX_RESULT AddTracks(CQTAtom* pRootAtom);
+ void HandleFType(void);
void DeleteTrackAtomList(void);
- void Clear(void);
+ void Clear(void);
UINT16 GetTrackStreamNum(IQTTrack* pIQTTrack);
@@ -246,9 +269,10 @@
HXBOOL m_bHintTracksActive;
QT_FTYPE m_FType;
QT_ETYPE m_EType;
+ UINT32 m_ulCompatibleBrand;
- HXBOOL m_bInitialSubscriptionWindowClosed;
-
+ HXBOOL m_bInitialSubscriptionWindowClosed;
+ HXBOOL* m_pStreamGroupSubcribed;
CQTTrackTable* m_pTrackTable;
CQTStream* m_pStreamToTrackMap;
@@ -257,6 +281,22 @@
CQT_iods_Atom* m_pIodsAtom;
CQT_ftyp_Atom* m_pFtypAtom;
+
+ HXBOOL m_bFragmented;
+ double m_dContentBaseTime;
+ UINT64* m_pTrackStartTimes;
+
+#ifdef QTCONFIG_FRAGMENTS
+ HX_RESULT ParseMovieExtends(CQTAtom* pMvexAtom);
+ HX_RESULT AddMovieFragment(CQT_moof_Atom* pMoofAtom);
+ void DeleteFragmentLists(void);
+ void CalculateBaseMediaTime(void);
+
+ CHXMapLongToObj* m_pTrackExtMap;
+ HXBOOL m_bDefaultBaseAlwaysMoof;
+ UINT32 m_ulMoofCount;
+#endif /* QTCONFIG_FRAGMENTS */
+
};
#endif // _QTTRKMGR_H_
Index: qtbatom.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qtbatom.h,v
retrieving revision 1.5.16.4.20.4
retrieving revision 1.5.16.4.20.4.2.1
diff -u -d -r1.5.16.4.20.4 -r1.5.16.4.20.4.2.1
--- qtbatom.h 3 May 2012 03:17:21 -0000 1.5.16.4.20.4
+++ qtbatom.h 18 Feb 2013 08:00:59 -0000 1.5.16.4.20.4.2.1
@@ -67,6 +67,7 @@
*/
typedef LONG32 QTAtomType;
+const static QTAtomType QT_UNKNOWN_ATOM = 0xFFFFFFFF;
/****************************************************************************
* Abstract Atom Class
@@ -74,6 +75,12 @@
class CQTAtom : public IUnknown
{
public:
+ CQTAtom(HX_OFF_T nOffset,
+ HX_OFF_T ulSize,
+ CQTAtom *pParent,
+ QTAtomType type,
+ HXBOOL bLeaf);
+
/*
* IUnknown methods
*/
@@ -141,14 +148,14 @@
/*
* Main Interface
*/
- virtual HXBOOL IsLeafType(void) = 0;
- virtual QTAtomType GetType(void) = 0;
- virtual ULONG32 GetNonLeafTypeBodySize(void) { return 0; }
- virtual HXBOOL IsNewQTAtom(void) { return FALSE; }
- virtual HXBOOL IsPagingAtom(void) { return FALSE; }
- virtual HXBOOL IsPagingEnabled(void) { return FALSE; }
- virtual void SetMemPager(CMemPager* pMemPager) { ; }
- virtual HXBOOL IsFaulted(void) { return FALSE; }
+ virtual HXBOOL IsLeafType(void) { return m_bLeaf; }
+ virtual QTAtomType GetType(void) { return m_Type; }
+ virtual UINT32 GetNonLeafTypeBodySize(void){ return 0; }
+ virtual HXBOOL IsNewQTAtom(void) { return FALSE; }
+ virtual HXBOOL IsPagingAtom(void) { return FALSE; }
+ virtual HXBOOL IsPagingEnabled(void) { return FALSE; }
+ virtual void SetMemPager(CMemPager* pMemPager) { ; }
+ virtual HXBOOL IsFaulted(void) { return FALSE; }
UINT16 GetPresentChildCount(void)
{
@@ -159,14 +166,14 @@
CQTAtom* FindPresentChild(QTAtomType AtomType);
CQTAtom* GetParent(void) { return m_pParent; }
- HX_OFF_T GetOffset(void) { return m_Offset; }
- HX_OFF_T GetSize(void) { return m_Size; }
+ HX_OFF_T GetOffset(void) { return m_nOffset; }
+ HX_OFF_T GetSize(void) { return m_nSize; }
IHXBuffer* GetBuffer(void) { return m_pBuffer; }
UINT8* GetData(void) { return m_pData; }
ULONG32 GetDataSize(void) { return m_pBuffer ? m_pBuffer->GetSize() : 0; }
- void SetOffset(HX_OFF_T nOffset) { m_Offset = nOffset; }
- void SetSize(HX_OFF_T nSize) { m_Size = nSize; }
+ void SetOffset(HX_OFF_T nOffset) { m_nOffset = nOffset; }
+ void SetSize(HX_OFF_T nSize) { m_nSize = nSize; }
virtual void SetBuffer(IHXBuffer *pBuffer);
/*
@@ -256,9 +263,10 @@
CQTAtom* m_pParent;
CHXSimpleList* m_pChildList;
- HX_OFF_T m_Offset;
-
- HX_OFF_T m_Size;
+ HX_OFF_T m_nOffset;
+ QTAtomType m_Type;
+ HXBOOL m_bLeaf;
+ HX_OFF_T m_nSize;
IHXBuffer* m_pBuffer;
UINT8* m_pData;
Index: fswtchr.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/fswtchr.h,v
retrieving revision 1.8.8.1.32.1
retrieving revision 1.8.8.1.32.1.2.1
diff -u -d -r1.8.8.1.32.1 -r1.8.8.1.32.1.2.1
--- fswtchr.h 3 May 2012 03:17:20 -0000 1.8.8.1.32.1
+++ fswtchr.h 18 Feb 2013 08:00:59 -0000 1.8.8.1.32.1.2.1
@@ -41,6 +41,8 @@
* Defines
*/
#define FSWTCHR_READ_ALL 0xFFFFFFFF
+#define FSWTCHR_MAX_CHUNK_SIZE 0x0000FFFF // 64K
+
#ifdef QTCONFIG_FSWITCHER
@@ -62,6 +64,7 @@
*
*/
class CFileSwitcher : public IHXFileSwitcher,
+ public IHXFileSwitcherAccessRange,
public IHXFileResponse,
public IHXThreadSafeMethods,
public IHXGetFileFromSamePoolResponse,
@@ -118,6 +121,16 @@
ULONG32 ulInfo,
const char* pFileName = NULL);
+ /* IHXFileSwitcherAccessRange */
+ STDMETHOD_(HXBOOL, HasAccessRange) (THIS_ const char* pFileName = NULL);
+
+ STDMETHOD(EnableAccessRange) (THIS);
+
+ STDMETHOD(EnableFileAccessRange) (THIS_ const char* pFileName = NULL);
+
+ STDMETHOD(SetAccessRange) (THIS_ HX_OFF_T nLow, HX_OFF_T nHigh,
+ const char* pFileName = NULL);
+
/*
* IHXFileResponse methods
*/
@@ -154,9 +167,6 @@
*/
STDMETHOD(Func) (THIS);
-protected:
- IHXCommonClassFactory* m_pClassFactory;
-
private:
typedef enum
{
@@ -173,47 +183,52 @@
class FileHandle
{
public:
- FileHandle(void)
- : m_pFileName(NULL)
- , m_pFileObject(NULL) {;}
-
- char* m_pFileName;
- IHXFileObject *m_pFileObject;
+ FileHandle(void)
+ : m_pFileName(NULL)
+ , m_pFileObject(NULL)
+ , m_pAccessRange(NULL) {;}
- void Clear(void)
- {
- HX_VECTOR_DELETE(m_pFileName);
- HX_RELEASE(m_pFileObject);
- }
+ char* m_pFileName;
+ IHXFileObject *m_pFileObject;
+ IHXFileObjectAccessRange* m_pAccessRange;
+
+ void Clear(void)
+ {
+ HX_VECTOR_DELETE(m_pFileName);
+ HX_RELEASE(m_pAccessRange);
+ HX_RELEASE(m_pFileObject);
+ }
- const char* SetName(const char* pFileName)
- {
- ULONG32 ulNameSize;
+ const char* SetName(const char* pFileName)
+ {
+ ULONG32 ulNameSize;
- HX_VECTOR_DELETE(m_pFileName);
+ HX_VECTOR_DELETE(m_pFileName);
- if (pFileName)
- {
- ulNameSize = (ULONG32) (strlen(pFileName) + 1);
+ if (pFileName)
+ {
+ ulNameSize = (ULONG32) (strlen(pFileName) + 1);
- m_pFileName = new char [ulNameSize];
- if (m_pFileName)
- {
- memcpy(m_pFileName, pFileName, ulNameSize); /* Flawfinder: ignore */
- }
- }
+ m_pFileName = new char [ulNameSize];
+ if (m_pFileName)
+ {
+ memcpy(m_pFileName, pFileName, ulNameSize); /* Flawfinder: \
ignore */ + }
+ }
- return m_pFileName;
- }
+ return m_pFileName;
+ }
- ~FileHandle()
- {
- HX_VECTOR_DELETE(m_pFileName);
- HX_RELEASE(m_pFileObject);
- }
+ ~FileHandle()
+ {
+ HX_VECTOR_DELETE(m_pFileName);
+ HX_RELEASE(m_pAccessRange);
+ HX_RELEASE(m_pFileObject);
+ }
};
inline void Reset(void);
+ HX_RESULT EnableAccessRange(FileHandle* pFileHandle);
HX_RESULT HandleFailureAsync(HX_RESULT status);
HX_RESULT HandleFailureSync(HX_RESULT status);
HX_RESULT FileHandleReady(void);
@@ -225,7 +240,8 @@
inline HX_RESULT ReadNextFragment(void);
HXBOOL m_bSyncMode;
-
+ HXBOOL m_bEnableAccessRange;
+
UINT16 m_uMaxChildCount;
UINT16 m_uCurrentChildCount;
UINT16 m_uLastDisownedChild;
@@ -242,6 +258,7 @@
FileHandle* m_pCurrentHandle;
IHXFileResponse* m_pResponse;
+ IHXCommonClassFactory* m_pClassFactory;
IHXScheduler* m_pScheduler;
FileSwitcherState m_State;
Index: qttrack.h
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/pub/qttrack.h,v
retrieving revision 1.15.10.1.6.3.2.1
retrieving revision 1.15.10.1.6.3.2.2
diff -u -d -r1.15.10.1.6.3.2.1 -r1.15.10.1.6.3.2.2
--- qttrack.h 8 Nov 2012 09:28:25 -0000 1.15.10.1.6.3.2.1
+++ qttrack.h 18 Feb 2013 08:00:59 -0000 1.15.10.1.6.3.2.2
@@ -84,7 +84,7 @@
/*
* Constructor/Destructor
*/
- CQTTrack(CQTAtom* pTrackAtom);
+ CQTTrack(CQTAtom* pTrackAtom, CQTAtom* pTrackExtendsAtom = NULL);
virtual ~CQTTrack();
@@ -114,36 +114,57 @@
virtual HX_RESULT SubscribeDefault(void);
virtual HXBOOL IsSubscribed(void);
- virtual HX_RESULT ComputeTrackSize(HX_OFF_T& nTrackSizeOut);
+ virtual HX_RESULT ComputeTrackSize(HX_OFF_T& ulTrackSizeOut);
+ virtual UINT32 EstimateTrackBitrate(UINT32 ulMinKeyFrames,
+ UINT32 ulMinTime, UINT32 ulMaxTime);
virtual HX_RESULT ObtainTrackBandwidth(ULONG32& ulBandwidthOut);
virtual HX_RESULT ObtainTrackBitrate(ULONG32& ulAvgBitrateOut);
+ virtual HX_RESULT AddFragment(UINT32 ulSeq, CQTAtom* pTraf,
+ HX_OFF_T nDefaultOffset);
+ virtual void EndOfFragments(void);
+
virtual ULONG32 GetID(void) { return m_ulTrackID; }
- virtual ULONG32 GetTrackWidth(void)
- {
- return m_TrackInfo.GetTrackWidth();
+ virtual void GetTrackHeader(IHXValues*& pHeader)
+ {
+ m_TrackInfo.GetHeader(pHeader);
+ }
+ virtual ULONG32 GetTrackWidth(void)
+ {
+ return m_TrackInfo.GetTrackWidth();
}
virtual ULONG32 GetTrackHeight(void)
{
- return m_TrackInfo.GetTrackHeight();
+ return m_TrackInfo.GetTrackHeight();
+ }
+ virtual UINT32 GetMediaTimeScale(void)
+ {
+ return m_TrackInfo.GetMediaTimeScale();
}
virtual ULONG32 GetSDPLength(void)
{
- return m_TrackInfo.GetSDPLength();
+ return m_TrackInfo.GetSDPLength();
}
virtual const UINT8* GetSDP(void)
{
- return m_TrackInfo.GetSDP();
+ return m_TrackInfo.GetSDP();
}
virtual HX_RESULT SetStreamHeader(IHXValues* pHeader);
virtual CQT_ChunkToOffset_Manager* GetChunkToOffsetMgr(void)
{
- return &m_ChunkToOffset;
+ return m_SampleManager.GetChunkToOffsetMgr();
}
+ virtual HX_OFF_T GetMinDataRange(const char* pFileName)
+ {
+ // only supported for single-file content
+ HX_ASSERT(pFileName == NULL && m_DataRef.GetDataRefName() == NULL);
+ return m_SampleManager.GetFileOffset();
+ }
+
virtual ULONG32 GetBitsPerSample( ULONG32 ulCodecID );
/*
@@ -168,9 +189,13 @@
ULONG32 GetLastSampleDescIdx(void) {return m_ulLastSampleDescIdx;}
UINT16 GetBaseRuleNumber(void) {return m_uBaseRuleNumber;}
- void SetBaseRuleNumber(UINT16 uRuleNumber)
+ void SetBaseRuleNumber(UINT16 uRuleNumber);
+ void SetTimeStampOffset(double dFileBaseTime, UINT64 ullTrackBaseTime);
+
+ // convert timestamp from media track units to milliseconds
+ double ConvertMediaTimeToMilSec(UINT64 ullMediaTime)
{
- m_uBaseRuleNumber = uRuleNumber;
+ return m_TrackEdit.ConvertMediaToRealTime(ullMediaTime);
}
/*
@@ -248,15 +273,12 @@
IHXBuffer *pBuffer);
HXBOOL SequenceToTime(CQT_TrackEdit_Manager &TrackEdit,
- CQT_TimeToSample_Manager &TimeToSample,
- CQT_SampleToChunk_Manager &SampleToChunk,
- HXBOOL bUseNonKeyFrames,
- HXBOOL bUseBestPickHeuristic = FALSE);
+ CQT_Sample_Manager &SampleToChunk,
+ HXBOOL bUseNonKeyFrames,
+ HXBOOL bUseBestPickHeuristic = FALSE);
HXBOOL AdvanceSample(CQT_TrackEdit_Manager &TrackEdit,
- CQT_TimeToSample_Manager &TimeToSample,
- CQT_SampleToChunk_Manager &SampleToChunk,
- UINT16 nSampleCount = 1);
+ CQT_Sample_Manager &SampleToChunk);
HX_RESULT ReturnPacket(HX_RESULT status,
IHXBuffer* pBuffer);
@@ -272,9 +294,10 @@
* Protected Atom Managers
*/
CQT_DataReference_Manager m_DataRef;
- CQT_SampleSize_Manager m_SampleSize;
-
+ CQT_Sample_Manager m_SampleManager;
+
CQT_trak_Atom* m_pTrackAtom;
+ CQTAtom* m_pTrackExtendsAtom;
IQTTrackResponse* m_pResponse;
CQTFileFormat* m_pFileFormat;
CQTPacketAssembler* m_pPacketAssembler;
@@ -282,6 +305,9 @@
IHXCommonClassFactory* m_pClassFactory;
ULONG32 m_ulTrackID;
+ UINT32 m_ulDataFormat0;
+ UINT32 m_ulRTPTimeOffset;
+ UINT32 m_dMilliSecOffset;
ULONG32 m_ulReadSize;
ULONG32 m_ulReadPageSize;
@@ -318,23 +344,33 @@
#endif // HELIX_FEATURE_MP4_FILEFORMAT_ALL || QTCONFIG_TRACK_CACHE
private:
+
+ // QTT_SampleRead: Read pending (of a sample)
+ // QTT_SegmentRead: Read pending (of a packet segment)
+ // QTT_NoData: Need more fragments to get the next sample.
+ // QTT_Init: Need fragments to get initialized to the first sample.
+ // QTT_TrackDone: No more samples to read.
typedef enum
{
- QTT_SampleRead,
- QTT_SegmentRead,
- QTT_Offline
+ QTT_Offline,
+ QTT_Ready,
+ QTT_SampleRead,
+ QTT_SegmentRead,
+ QTT_NoData,
+ QTT_Init,
+ QTT_TrackDone
} QTTPendingState;
QTTPendingState m_PendingState;
+ HXBOOL m_bPendingFragments;
+ HXBOOL m_bHaveFileAccessRange;
+
HXBOOL m_bTrackDone;
/*
* Private Atom Managers
*/
CQT_TrackEdit_Manager m_TrackEdit;
- CQT_TimeToSample_Manager m_TimeToSample;
- CQT_SampleToChunk_Manager m_SampleToChunk;
- CQT_ChunkToOffset_Manager m_ChunkToOffset;
UINT16 m_uBytesPerCBlock;
UINT16 m_uSamplesPerCBlock;
_______________________________________________
Datatype-cvs mailing list
Datatype-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/datatype-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic