[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-datatype-cvs
Subject:    [Datatype-cvs] mp4/fileformat qtatmmgs.cpp, 1.33.2.16,
From:       vkathuria () helixcommunity ! org
Date:       2009-03-30 5:05:30
Message-ID: 200903300607.n2U67OPd017494 () mailer ! progressive-comp ! com
[Download RAW message or body]

Update of /cvsroot/datatype/mp4/fileformat
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv16766

Modified Files:
      Tag: hxclient_3_4_7_atlas
	qtatmmgs.cpp qtatoms.cpp qtffplin.cpp 
Log Message:
Changes to support rmra,rmda,rdrf atoms in mov file format

Index: qtffplin.cpp
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/qtffplin.cpp,v
retrieving revision 1.60.2.5
retrieving revision 1.60.2.5.2.1
diff -u -d -r1.60.2.5 -r1.60.2.5.2.1
--- qtffplin.cpp	31 Dec 2008 11:22:02 -0000	1.60.2.5
+++ qtffplin.cpp	30 Mar 2009 05:05:28 -0000	1.60.2.5.2.1
@@ -89,6 +89,7 @@
 #include "qtoffsetmpr.h"
 
 #include "metainfokeys.h"
+#include "hxurl.h"
 
 /****************************************************************************
  * Constants
@@ -185,6 +186,7 @@
     , m_pOffsetToTimeMapper(NULL)
     , m_pFileObject(NULL)
     , m_ulNextPacketTime(0)
+    , m_pRedirectFFObject(NULL)
 {
     g_nRefCount_qtff++;
 }
@@ -1651,6 +1653,12 @@
  */
 STDMETHODIMP CQTFileFormat::GetPacket(UINT16 unStreamNumber)
 {
+    if(m_pRedirectFFObject)
+    {
+        m_State = QTFF_GetPacket;
+        return m_pRedirectFFObject->GetPacket(unStreamNumber);
+    }
+
     HX_RESULT retVal;
 
     if (unStreamNumber < m_TrackManager.GetNumStreams())
@@ -1783,6 +1791,12 @@
  */
 STDMETHODIMP CQTFileFormat::Seek(ULONG32 ulOffset)
 {
+    if(m_pRedirectFFObject && m_State == QTFF_Ready)
+    {
+        m_State = QTFF_SeekPending;
+        return m_pRedirectFFObject->Seek(ulOffset);
+    }
+
     UINT16 uStreamNum;
     HX_RESULT retVal = HXR_OK;
 
@@ -1841,6 +1855,11 @@
  */
 STDMETHODIMP CQTFileFormat::SeekDone(HX_RESULT status)
 {
+    if(m_pRedirectFFObject && m_State == QTFF_SeekPending)
+    {
+        m_State = QTFF_Ready;
+        return m_pFFResponse->SeekDone(status);
+    }
     return HXR_UNEXPECTED;
 }
 
@@ -1885,7 +1904,11 @@
 	m_pFileObject->Close();
 	HX_RELEASE(m_pFileObject);
     }
-
+    if(m_pRedirectFFObject)
+    {
+        m_pRedirectFFObject->Close();
+        HX_RELEASE(m_pRedirectFFObject);
+    }
     m_TrackManager.CloseTracks();
 
     return HXR_OK;
@@ -1910,6 +1933,12 @@
 {
     HX_RESULT retVal = HXR_OK;
 
+    if(m_pRedirectFFObject && m_State == QTFF_Init)
+    {	
+        m_State = QTFF_Atomize;
+        return m_pRedirectFFObject->GetFileHeader();
+    }
+
     switch (m_State)
     {
     case QTFF_Init:
@@ -2060,6 +2089,53 @@
 	
 	if (SUCCEEDED(status))
 	{
+        CQT_moov_Atom *pMoovAtom = NULL;
+        pMoovAtom = (CQT_moov_Atom *)pRootAtom->FindPresentChild(QT_moov);
+        if(pMoovAtom)
+        {
+            HX_RESULT retVal = HXR_OK;
+            CQT_mvhd_Atom *pMovieHeaderAtom = NULL;
+            pMovieHeaderAtom = (CQT_mvhd_Atom*)pMoovAtom->FindPresentChild(QT_mvhd);
+            CQT_rmra_Atom *pRmraHeaderAtom = NULL;
+            pRmraHeaderAtom = (CQT_rmra_Atom*)pMoovAtom->FindPresentChild(QT_rmra);
+            if(!pMovieHeaderAtom && pRmraHeaderAtom)
+            {
+                status = m_MovieInfo.Init(pMoovAtom, &m_TrackManager);
+                if (SUCCEEDED(status))
+                {
+                    status = HXR_FAIL;
+                    // Get the Reference Url
+                    const char* pszReferenceURL = NULL;
+                    pszReferenceURL = m_MovieInfo.GetRefURL();
+                    if(pszReferenceURL)
+                    {
+                        CHXString szURL="";
+                        CHXURL purl(pszReferenceURL,m_pContext);
+                        if(purl.IsRelativeURL())
+                        {
+                            //If the URL is relative, then this code changes it to \
absolute URL. +                            const char *poriginal_url = NULL;
+                            m_pRequest->GetURL(poriginal_url);
+                            const char *prel = strrchr(poriginal_url,'/');
+                            szURL = poriginal_url;
+                            szURL = szURL.Left(prel-poriginal_url+1);
+                            szURL += pszReferenceURL;
+                        }
+                        else
+                        {
+                            szURL = pszReferenceURL;
+                        }
+                        status = CreateNewFileFormatObject((const char*)szURL);
+                    }
+                }
+                if(FAILED(status))
+                {						
+                    status = MakeFileHeader(status);
+                }
+                return status;
+                
+            }
+        }
 	    HXBOOL bIgnoreHintTracks = FALSE;
 	    do
 	    {
@@ -2169,6 +2245,17 @@
 STDMETHODIMP CQTFileFormat::Subscribe(UINT16 uStreamNum,
 				      UINT16 uRuleNumber)
 {
+    if(m_pRedirectFFObject)
+    {
+        IHXASMSource* pASMSource=NULL;
+        HX_RESULT retVal = HXR_FAIL;
+        if(SUCCEEDED(m_pRedirectFFObject->QueryInterface(IID_IHXASMSource,(void \
**)&pASMSource))) +        {	
+            retVal = pASMSource->Subscribe(uStreamNum,uRuleNumber);
+            HX_RELEASE(pASMSource);
+        }
+        return retVal;
+    }
     return m_TrackManager.Subscribe(uStreamNum, uRuleNumber);
 }
 
@@ -2178,6 +2265,17 @@
 STDMETHODIMP CQTFileFormat::Unsubscribe(UINT16 uStreamNum,
 					UINT16 uRuleNumber)
 {
+    if(m_pRedirectFFObject)
+    {
+        IHXASMSource* pASMSource=NULL;
+        HX_RESULT retVal = HXR_FAIL;
+        if(SUCCEEDED(m_pRedirectFFObject->QueryInterface(IID_IHXASMSource,(void \
**)&pASMSource))) +        {	
+            retVal = pASMSource->Unsubscribe(uStreamNum,uRuleNumber);
+            HX_RELEASE(pASMSource);
+        }
+        return retVal;
+    }
     return m_TrackManager.Unsubscribe(uStreamNum, uRuleNumber);
 }
 
@@ -2193,6 +2291,17 @@
     REF(const char**) /*OUT*/ pPacketFormats
 )
 {
+    if(m_pRedirectFFObject)
+    {					
+        HX_RESULT retVal = HXR_FAIL;
+        IHXPacketFormat* pPacketFormat = 0;
+        if(SUCCEEDED(m_pRedirectFFObject->QueryInterface \
(IID_IHXPacketFormat,(void**)&pPacketFormat))) +        {
+            retVal = pPacketFormat->GetSupportedPacketFormats(pPacketFormats);
+            HX_RELEASE(pPacketFormat);
+        }
+        return retVal;
+    }
     pPacketFormats = (const char**) zm_pPacketFormats;
     return HXR_OK;
 }
@@ -2208,6 +2317,17 @@
     const char* pPacketFormat
 )
 {
+    if(m_pRedirectFFObject)
+    {					
+        HX_RESULT retVal = HXR_FAIL;
+        IHXPacketFormat* pPktFormat = 0;
+        if(SUCCEEDED(m_pRedirectFFObject->QueryInterface(IID_IHXPacketFormat,(void**)&pPktFormat)))
 +        {
+            retVal = pPktFormat->SetPacketFormat(pPacketFormat);
+            HX_RELEASE(pPktFormat);
+        }
+        return retVal;
+    }
     if (strcasecmp(pPacketFormat, "rtp") == 0)
     {
         m_ulPacketFormat = QTFF_RTP_FORMAT;
@@ -2256,6 +2376,17 @@
                                       UINT32 /*IN*/ ulCompleteFileSize,
                                       REF(UINT32) /*OUT*/ ulREFDur)
 {
+    if(m_pRedirectFFObject)
+    {					
+        HX_RESULT retVal = HXR_FAIL;
+        IHXMediaBytesToMediaDur* pMediaBytesToMediaDur = 0;
+        if(SUCCEEDED(m_pRedirectFFObject->QueryInterface \
(IID_IHXMediaBytesToMediaDur,(void**)&pMediaBytesToMediaDur))) +        {
+            retVal = \
pMediaBytesToMediaDur->ConvertFileOffsetToDur(ulLastReadOffset,ulCompleteFileSize,ulREFDur);
 +            HX_RELEASE(pMediaBytesToMediaDur);
+        }
+        return retVal;
+    }
     HX_RESULT retVal = HXR_OK;
     UINT32 ulDurOut = HX_PROGDOWNLD_UNKNOWN_DURATION;
 
@@ -2339,6 +2470,17 @@
 CQTFileFormat::GetFileDuration(UINT32 /*IN*/ ulCompleteFileSize,
                                REF(UINT32) /*OUT*/ ulREFDur)
 {
+    if(m_pRedirectFFObject)
+    {					
+        HX_RESULT retVal = HXR_FAIL;
+        IHXMediaBytesToMediaDur* pMediaBytesToMediaDur = 0;
+        if(SUCCEEDED(m_pRedirectFFObject->QueryInterface \
(IID_IHXMediaBytesToMediaDur,(void**)&pMediaBytesToMediaDur))) +        {
+            retVal = \
pMediaBytesToMediaDur->GetFileDuration(ulCompleteFileSize,ulREFDur); +            \
HX_RELEASE(pMediaBytesToMediaDur); +        }
+        return retVal;
+    }
     HX_RESULT retVal = HXR_OK;
     UINT32 ulDuration = HX_PROGDOWNLD_UNKNOWN_DURATION;
 
@@ -2905,6 +3047,7 @@
     {
 	{ GET_IIDHANDLE(IID_IUnknown), (IUnknown*) (IHXPlugin*) this},
 	{ GET_IIDHANDLE(IID_IHXPlugin), (IHXPlugin*) this},
+	{ GET_IIDHANDLE(IID_IHXFormatResponse), (IHXFormatResponse*) this},
 	{ GET_IIDHANDLE(IID_IHXFileFormatObject), (IHXFileFormatObject*) this},
 	{ GET_IIDHANDLE(IID_IHXAtomizerResponse), (IHXAtomizerResponse*) this},
 	{ GET_IIDHANDLE(IID_IHXAtomizationCommander), (IHXAtomizationCommander*) this},
@@ -3003,6 +3146,11 @@
  */
 STDMETHODIMP CQTFileFormat::GetStreamHeader(UINT16 unStreamNumber)
 {
+    if(m_pRedirectFFObject && m_State == QTFF_Ready)
+    {
+        return m_pRedirectFFObject->GetStreamHeader(unStreamNumber);
+    }
+
     HX_RESULT retVal;
     IHXValues* pHeader;
 
@@ -3015,3 +3163,186 @@
     return retVal;
 }
 
+HX_RESULT CQTFileFormat::CreateNewFileFormatObject(const char* purl)
+{
+    HX_RESULT theErr = HXR_FAIL;
+    char*   pExtension = "mov"; //rmra can only contain QuickTime movie reference
+    IHXPluginHandler3* pPlugin2Handler3 = NULL;
+    IHXPlugin*  pPlugin      = NULL;
+    IUnknown* pCurrentFileFormatUnk = NULL;
+    IHXPluginSearchEnumerator* pFileFormatEnumerator = NULL;
+    IHXFileObject* pFileObject = NULL;
+    IHXRequest* pRequest = NULL;
+    IUnknown*	    pUnknown = NULL;
+    IUnknown*	    pObject = NULL;
+    IHXFileSystemObject* pFSObject = NULL;
+    IHXPlugin2Handler* pPlugin2Handler = NULL;
+    IHXPlugin *pHXPlugin = NULL;
+    IHXRequestHandler* pRequestHandler=NULL;
+
+    const char* pProtocolEnd = HXFindChar(purl,':');
+    if (!pProtocolEnd)
+    {
+        return HXR_UNEXPECTED;
+    }
+
+    int nLength = pProtocolEnd - purl;
+    CHXString strProtocol(purl,nLength);
+
+    if (FAILED(m_pContext->QueryInterface(IID_IHXPlugin2Handler, \
(void**)&pPlugin2Handler))) +    {
+        goto exit;
+    }
+
+    if (FAILED( pPlugin2Handler->FindPluginUsingStrings(PLUGIN_CLASS, \
PLUGIN_FILESYSTEM_TYPE,  +        PLUGIN_FILESYSTEMPROTOCOL, (char*)(const \
char*)strProtocol, NULL, NULL, pUnknown))) +    {
+        goto exit;
+    }
+
+    if(FAILED(pUnknown->QueryInterface(IID_IHXFileSystemObject, (void**) \
&pFSObject))) +    {
+        goto exit;
+    }
+
+    if (FAILED (pFSObject->QueryInterface(IID_IHXPlugin,(void**)&pHXPlugin)))
+    {
+        goto exit;
+    }
+
+    if (FAILED(pHXPlugin->InitPlugin(m_pContext)))
+    {
+        goto exit;
+    }
+
+    if (FAILED(pFSObject->CreateFile(&pObject)))
+    {
+        goto exit;
+    }
+
+    if (FAILED(pObject->QueryInterface(IID_IHXFileObject, (void**)&pFileObject)))
+    {
+        goto exit;
+    }
+
+    if (FAILED(pObject->QueryInterface(IID_IHXRequestHandler, \
(void**)&pRequestHandler))) +    {
+        goto exit;
+    }
+
+    if(m_pClassFactory && (HXR_OK \
!=m_pClassFactory->CreateInstance(CLSID_IHXRequest, (void**) &pRequest))) +    {
+        goto exit;
+    }
+
+    if (pRequest)
+    {
+        IHXValues* pRequestHeaders = NULL;
+        pRequest->SetURL((const char*)purl); // Set the reference URL
+        if (SUCCEEDED(m_pRequest->GetRequestHeaders(pRequestHeaders)) && \
pRequestHeaders) +        {
+            pRequest->SetRequestHeaders(pRequestHeaders);
+            pRequestHeaders->Release();
+        }
+        pRequestHandler->SetRequest(pRequest);
+    }
+	
+    if(m_pContext && (HXR_OK != m_pContext->QueryInterface(IID_IHXPluginHandler3, \
(void**) &pPlugin2Handler3))) +    {
+        goto exit;
+    }
+
+    if (FAILED(pPlugin2Handler3->FindGroupOfPluginsUsingStrings(PLUGIN_CLASS, \
PLUGIN_FILEFORMAT_TYPE,  +            PLUGIN_FILEEXTENSIONS, pExtension, 0 ,0, \
pFileFormatEnumerator))) +    {
+        goto exit;
+    }
+
+    if (pFileFormatEnumerator)
+    {
+        pFileFormatEnumerator->GetNextPlugin(pCurrentFileFormatUnk, NULL);
+        HX_ASSERT(pCurrentFileFormatUnk != NULL);
+    }
+
+    if (FAILED( pCurrentFileFormatUnk->QueryInterface(IID_IHXFileFormatObject, \
(void**) &m_pRedirectFFObject))) +    {
+        goto exit;
+    }
+    m_State = QTFF_Offline; 
+    if (FAILED(m_pRedirectFFObject->QueryInterface(IID_IHXPlugin,(void**)&pPlugin)))
+    {
+        goto exit;
+    }
+
+    if (FAILED(pPlugin->InitPlugin(m_pContext)))
+    {
+        goto exit;
+    }
+    m_State = QTFF_Init;
+    theErr = m_pRedirectFFObject->InitFileFormat(pRequest,(IHXFormatResponse*)this,pFileObject);
 +
+exit:
+    HX_RELEASE(pPlugin2Handler);
+    HX_RELEASE(pUnknown);
+    HX_RELEASE(pFSObject);
+    HX_RELEASE(pHXPlugin);
+    HX_RELEASE(pObject);
+    HX_RELEASE(pFileObject);
+    HX_RELEASE(pRequestHandler);
+    HX_RELEASE(pRequest);
+    HX_RELEASE(pPlugin2Handler3);
+    HX_RELEASE(pFileFormatEnumerator);
+    HX_RELEASE(pCurrentFileFormatUnk);
+    HX_RELEASE(pPlugin);
+    return theErr;
+}
+
+STDMETHODIMP CQTFileFormat::PacketReady(THIS_
+				HX_RESULT	status,
+				IHXPacket*	pPacket)
+{
+    HX_RESULT retVal = HXR_FAIL;
+    if(m_pRedirectFFObject)
+    {
+        m_State = QTFF_Ready;		
+        retVal = m_pFFResponse->PacketReady(status,pPacket);
+    }
+    return retVal;
+}
+
+STDMETHODIMP CQTFileFormat::FileHeaderReady	(THIS_
+				HX_RESULT	status,
+				IHXValues*	pHeader) 
+{
+    HX_RESULT retVal = HXR_FAIL;
+    if(m_pRedirectFFObject && m_State==QTFF_Atomize)
+    {
+        m_State = QTFF_Ready;
+        retVal = m_pFFResponse->FileHeaderReady(status,pHeader);
+    }
+    return retVal;
+}
+
+STDMETHODIMP CQTFileFormat::StreamHeaderReady	(THIS_
+				HX_RESULT	status,
+				IHXValues*	pHeader) 
+{
+    HX_RESULT retVal = HXR_FAIL;
+    if(m_pRedirectFFObject && m_State == QTFF_Ready)
+    {
+        retVal = m_pFFResponse->StreamHeaderReady(status,pHeader);
+    }
+    return retVal;
+}
+
+STDMETHODIMP CQTFileFormat::StreamDone(THIS_
+				UINT16		unStreamNumber)
+{
+    HX_RESULT retVal = HXR_FAIL;
+    if(m_pRedirectFFObject)
+    {
+        retVal = m_pFFResponse->StreamDone(unStreamNumber);
+    }
+    return retVal;
+}
+

Index: qtatoms.cpp
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/qtatoms.cpp,v
retrieving revision 1.10.8.2
retrieving revision 1.10.8.2.16.1
diff -u -d -r1.10.8.2 -r1.10.8.2.16.1
--- qtatoms.cpp	28 Apr 2008 02:09:58 -0000	1.10.8.2
+++ qtatoms.cpp	30 Mar 2009 05:05:28 -0000	1.10.8.2.16.1
@@ -165,6 +165,14 @@
 	return new CQT_rtp_Atom(ulOffset, ulSize, pParent);
     case QT_iods:
 	return new CQT_iods_Atom(ulOffset, ulSize, pParent);
+    case QT_rmra:
+	return new CQT_rmra_Atom(ulOffset, ulSize, pParent);
+    case QT_rmda:
+	return new CQT_rmda_Atom(ulOffset, ulSize, pParent);
+    case QT_rdrf:
+	return new CQT_rdrf_Atom(ulOffset, ulSize, pParent);
+    case QT_rmdr:
+	return new CQT_rmdr_Atom(ulOffset, ulSize, pParent);
 #endif	// QTCONFIG_3GPPCLIENT_ATOMSET_ONLY
 
     /***

Index: qtatmmgs.cpp
===================================================================
RCS file: /cvsroot/datatype/mp4/fileformat/qtatmmgs.cpp,v
retrieving revision 1.33.2.16
retrieving revision 1.33.2.16.2.1
diff -u -d -r1.33.2.16 -r1.33.2.16.2.1
--- qtatmmgs.cpp	12 Dec 2008 05:17:20 -0000	1.33.2.16
+++ qtatmmgs.cpp	30 Mar 2009 05:05:28 -0000	1.33.2.16.2.1
@@ -2652,6 +2652,7 @@
 #endif // HELIX_FEATURE_3GPP_METAINFO || HELIX_FEATURE_SERVER
 
     , m_pRTPSDPAtom(NULL)
+    , m_pRefURL(NULL)
 {
     ;
 }
@@ -2682,7 +2683,7 @@
     HX_RELEASE(m_pID32Atom);
 #endif // HELIX_FEATURE_3GPP_METAINFO
 #endif // HELIX_FEATURE_3GPP_METAINFO || HELIX_FEATURE_SERVER
-
+    HX_VECTOR_DELETE(m_pRefURL);
     HX_RELEASE(m_pRTPSDPAtom);
 }
 
@@ -2738,11 +2739,49 @@
 	pMovieHeaderAtom = (CQT_mvhd_Atom*)
 			   pAtom->FindPresentChild(QT_mvhd);
 
+	CQT_rmra_Atom *pRmraHeaderAtom = NULL;
+	pRmraHeaderAtom = (CQT_rmra_Atom*)
+			   pAtom->FindPresentChild(QT_rmra);
 	if (pMovieHeaderAtom)
 	{
 	    m_ulMovieTimeScale = pMovieHeaderAtom->Get_TimeScale();
 	    m_ulMovieDuration = pMovieHeaderAtom->Get_Duration();
 	}
+	else if(pRmraHeaderAtom)
+	{
+            HX_RESULT retVal = HXR_FAIL;
+            CQT_rmda_Atom *pRmdaAtom = NULL;
+            pRmdaAtom =	(CQT_rmda_Atom*)pRmraHeaderAtom->FindPresentChild(QT_rmda);
+            if(pRmdaAtom)
+            {
+                CQT_rdrf_Atom *pRdrfAtom = NULL;
+                pRdrfAtom =	(CQT_rdrf_Atom*)pRmdaAtom->FindPresentChild(QT_rdrf);
+                if(pRdrfAtom)
+                {
+                    UINT8* data = pRdrfAtom->GetData();
+                    // Skipping Past Flags
+                    data += 4;
+                    ULONG32 RefType = CQTAtom::GetUL32(data);
+                    //For now we are supporting only Data Reference type 'url '
+                    if(RefType == QT_url)
+                    {
+                        retVal = HXR_OK;
+                        // Skip to Data Reference Size
+                        data += 4;
+                        ULONG32 Refurlsize = CQTAtom::GetUL32(data);
+                        // Skip to Reference URL
+                        data += 4;
+                        m_pRefURL = new char[Refurlsize+1];
+                        if(m_pRefURL)
+                        {
+                            memcpy(m_pRefURL,(const char *)data,Refurlsize);
+                            m_pRefURL[Refurlsize] = '\0';
+                        }
+                    }
+                }
+            }
+            return retVal;
+        }
 	else
 	{
 	    pAtom = NULL;


_______________________________________________
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