[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