[datatype-dev] CN-Client: fix initial seeking in WM local fileformat
Eric Hyche ehyche at real.comThis is now checked into HEAD. ============================================= Eric Hyche (ehyche at real.com) Technical Lead RealNetworks, Inc. > -----Original Message----- > From: Milko Boic [mailto:milko at real.com] > Sent: Wednesday, November 08, 2006 11:49 AM > To: ehyche at real.com; datatype-dev at lists.helixcommunity.org > Subject: Re: [datatype-dev] CR-Client: fix initial seeking in > WM local fileformat > > > Looks good. > > At 07:48 AM 11/8/2006, Eric Hyche wrote: > > >Description > >--------------------------------------- > >When the ASF fileformat was called with Seek() before being > >called with GetPacket(), an error occurred. This situation > >can happen when called by dtdrive as in: > > > >dtdrive -J 8000 somefile.asf > > > >The problem was that the CHXASFIndex object was only getting set up > >when we received a packet, and it was assumed that by the > >time we read the ASF Index at the end of the file that we > >had already set up the CHXASFIndex object. The fix was simply > >to move the code which creates and initializes the CHXASFIndex > >object into common code and call this code from both the > >packet reading location and the index reading location. > > > >Files Modified > >--------------------------------------- > >datatype/wm/fileformat/asf_file_format_file.cpp > >datatype/wm/fileformat/pub/asf_file_format_file.h > > > >Branches > >--------------------------------------- > >HEAD and 150Cay > > > >Testing > >--------------------------------------- > >The command "dtdrive -J 8000 thefullmonty.wmv" was > successfully run after > >this change. > > > >Index: asf_file_format_file.cpp > >=================================================================== > >RCS file: /cvsroot/datatype/wm/fileformat/asf_file_format_file.cpp,v > >retrieving revision 1.6 > >diff -u -w -r1.6 asf_file_format_file.cpp > >--- asf_file_format_file.cpp 30 Oct 2006 15:55:32 -0000 1.6 > >+++ asf_file_format_file.cpp 8 Nov 2006 15:41:05 -0000 > >@@ -1080,6 +1080,10 @@ > > retVal = pASFObj->Unpack(pBuffer->GetBuffer(), > > pBuffer->GetSize()); > > if (SUCCEEDED(retVal)) > > { > >+ // Make sure the ASF index is set up > >+ retVal = SetupASFIndex(); > >+ if (SUCCEEDED(retVal)) > >+ { > > // Is this a Index Object or a Simple > Index Object? > > if (pASFObj->m_eASFObjectType == > HX_ASF_Index_Object) > > { > >@@ -1088,11 +1092,8 @@ > > // simply copy all the information > from this > > Index Object > > // and put it in our on-the-fly > Index Object. > > That way, we should > > // never have to seek to the end > of the file > > again from now on. > >- if (m_pASFIndex) > >- { > > > >m_pASFIndex->ImportIndexObject((CHXASFTopLevelIndexObject*) pASFObj); > > } > >- } > > else > > { > > // Get the WM stream number of > this simple index > > object > >@@ -1100,11 +1101,8 @@ > > // This is a simple index object. > Our on-the-fly > > index object > > // contains similar information so > we will first > > import > > // this information into our > on-the-fly object > >- if (m_pASFIndex) > >- { > > > >m_pASFIndex->ImportSimpleIndexObject((CHXASFTopLevelSimpleInd > exObject*) > >pASFObj, > >usWMStreamNum, > > > >m_pFilePropertiesObject->m_ulMaxDataPacketSize); > >- } > > // Increment the index of the simple index > > object we have seen so far > > m_ulSimpleIndexOrderIndex++; > > } > >@@ -1146,6 +1144,7 @@ > > } > > } > > } > >+ } > > HX_RELEASE(pASFObj); > > } > > else > >@@ -3382,42 +3381,10 @@ > > > > if (pPacket && m_pFilePropertiesObject) > > { > >- // Clear the return value > >- retVal = HXR_OK; > >- // Do we already have an index? > >- if (!m_pASFIndex) > >- { > >- // Set the return value > >- retVal = HXR_OUTOFMEMORY; > >- // Create the CHXASFIndex object > >- m_pASFIndex = new CHXASFIndex(); > >- if (m_pASFIndex) > >- { > >- // Compute the play duration in ms > >- UINT64 ullPlayDurationInMs = > >m_pFilePropertiesObject->m_ullPlayDuration / ((UINT64) 10000); > >- // Initialize the index object > >- retVal = m_pASFIndex->Init(m_ulNumWMStreams, > >- > m_pusWMIndex2StreamNumber, > >- > >INT64_TO_UINT32(ullPlayDurationInMs), > >- > >INT64_TO_UINT32(m_pFilePropertiesObject->m_ullPreroll), > >- > m_ulFirstASFPacketFileOffset, > >- > m_pIndexParametersObject); > >+ // Make sure the ASF index is set up > >+ retVal = SetupASFIndex(); > > if (SUCCEEDED(retVal)) > > { > >- // We need to inform the index object about the > >stream types > >- // of each of the WM streams > >- for (UINT32 i = 0; i < m_ulNumWMStreams && > >SUCCEEDED(retVal); i++) > >- { > >- // Get the WM stream number > >- UINT16 usWMStreamNum = GetWMStreamNumber(i); > >- // Set the stream type into the index > >- retVal = > >m_pASFIndex->SetWMStreamType(usWMStreamNum, > GetStreamType(usWMStreamNum)); > >- } > >- } > >- } > >- } > >- if (m_pASFIndex && SUCCEEDED(retVal)) > >- { > > // Add the ASF packet to the index > > retVal = m_pASFIndex->AddASFPacketToIndex(pPacket); > > } > >@@ -3726,3 +3693,49 @@ > > > > return ulRet; > > } > >+ > >+HX_RESULT CASFFileFormatFile::SetupASFIndex() > >+{ > >+ HX_RESULT retVal = HXR_OK; > >+ > >+ // Do we already have an index? > >+ if (!m_pASFIndex) > >+ { > >+ // Set the return value > >+ retVal = HXR_UNEXPECTED; > >+ // Make sure we've received the headers > >+ if (m_pFilePropertiesObject && m_ulNumWMStreams) > >+ { > >+ // Set the return value > >+ retVal = HXR_OUTOFMEMORY; > >+ // Create the CHXASFIndex object > >+ m_pASFIndex = new CHXASFIndex(); > >+ if (m_pASFIndex) > >+ { > >+ // Compute the play duration in ms > >+ UINT64 ullPlayDurationInMs = > >m_pFilePropertiesObject->m_ullPlayDuration / ((UINT64) 10000); > >+ // Initialize the index object > >+ retVal = m_pASFIndex->Init(m_ulNumWMStreams, > >+ > m_pusWMIndex2StreamNumber, > >+ > >INT64_TO_UINT32(ullPlayDurationInMs), > >+ > >INT64_TO_UINT32(m_pFilePropertiesObject->m_ullPreroll), > >+ > m_ulFirstASFPacketFileOffset, > >+ > m_pIndexParametersObject); > >+ if (SUCCEEDED(retVal)) > >+ { > >+ // We need to inform the index object about the > >stream types > >+ // of each of the WM streams > >+ for (UINT32 i = 0; i < m_ulNumWMStreams && > >SUCCEEDED(retVal); i++) > >+ { > >+ // Get the WM stream number > >+ UINT16 usWMStreamNum = GetWMStreamNumber(i); > >+ // Set the stream type into the index > >+ retVal = > >m_pASFIndex->SetWMStreamType(usWMStreamNum, > GetStreamType(usWMStreamNum)); > >+ } > >+ } > >+ } > >+ } > >+ } > >+ > >+ return retVal; > >+} > > > >Index: pub/asf_file_format_file.h > >=================================================================== > >RCS file: > /cvsroot/datatype/wm/fileformat/pub/asf_file_format_file.h,v > >retrieving revision 1.4 > >diff -u -w -r1.4 asf_file_format_file.h > >--- pub/asf_file_format_file.h 30 Oct 2006 15:55:32 -0000 1.4 > >+++ pub/asf_file_format_file.h 8 Nov 2006 15:41:06 -0000 > >@@ -241,6 +241,7 @@ > > HX_RESULT EstimateSeekTime(UINT32 > > ulDesiredSeekTime, REF(UINT32) rulSeekOffset); > > UINT16 > GetSimpleIndexObjectStreamNumber(UINT32 > > ulSimpleIndexOrderIndex); > > UINT32 > GetPacketBufferSize(IHXPacket* pPacket); > >+ HX_RESULT SetupASFIndex(); > > > > static const char* const m_pszDescription; > > static const char* const m_pszCopyright; > > > > > >===================================== > >Eric Hyche, Technical Lead > >RealNetworks, Inc. > >ehyche at real.com > > > > > >_______________________________________________ > >Datatype-dev mailing list > >Datatype-dev at helixcommunity.org > >http://lists.helixcommunity.org/mailman/listinfo/datatype-dev > >