[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