[Helix-client-dev] CR/CN: Cayenne to Atlas merge in SourceSplitter

[Helix-client-dev] CR/CN: Cayenne to Atlas merge in SourceSplitter

Tad Yeager tyeager at real.com
Thu Apr 2 18:13:52 PDT 2009


-------------- next part --------------
Modified by: tyeager at real.com
Date: 04:02:2009
Project: Atlas_3_1_0
Bug Number: N/A
Bug URL: N/A

Synopsis: Merge from Cayenne to Atlas of CSourceSplitter processing OnStreamDone

Overview: Cayenne based clients use DataTypeDriver for validation of files prior to conversion, invoking Drive twice.  When invoking Dtdr for file validation, clients need to get OnStreamDone notification before packets arrive because packets aren't coming, causing deadlock.  

Files Modified: datatype\tools\dtdriver\engine\csrccsplt.cpp 
Image Size and Heap Use impact (Client -Only): minimal.
Platforms and Profiles Affected: All
Distribution Libraries Affected: hxtdtriver.dll,.so dtdr3260.dll,.so and binaries dependent dtdr_platform_lib.lib, dtdr_stdalone_lib.lib
Platforms and Profiles Build Verified: Win32 
Platforms and Profiles Functionality verified: Win32

Branch: Atlas_3_1_0, HEAD
Copyright assignment: I am a RealNetworks employee or contractor
QA Instructions:


Index: csrcsplt.cpp
===================================================================
RCS file: /cvsroot/datatype/tools/dtdriver/engine/csrcsplt.cpp,v
retrieving revision 1.6.10.4
diff -u -4 -0 -r1.6.10.4 csrcsplt.cpp
--- csrcsplt.cpp	20 Feb 2009 22:24:12 -0000	1.6.10.4
+++ csrcsplt.cpp	3 Apr 2009 00:01:03 -0000
@@ -771,83 +771,96 @@
  *	Method:
  *	    IHXSourceInput:OnStreamDone
  *	Purpose:
  *	    Called to signal the end of particular stream from the source.
  */
 STDMETHODIMP CSourceSplitter::OnStreamDone(HX_RESULT status,
 					   UINT16    unStreamNumber)
 {
     HXLOGL4(HXLOG_DTDR, "CSourceSplitter[%p]::OnStreamDone(status=0x%08x,streamNum=%u)", this, status, unStreamNumber);
     HX_RESULT retVal = HXR_OK;
 
     if (!m_pStreamStatusArray)
     {
 	retVal = HXR_UNEXPECTED;
     }
 
     if (SUCCEEDED(retVal))
     {
 	retVal = HXR_FAIL;
 	if (unStreamNumber < m_ulNumStreams)
 	{
 	    retVal = HXR_OK;
 	}
     }
 
     if (SUCCEEDED(retVal))
     {
 	retVal = HXR_UNEXPECTED;
 	if (m_pStreamStatusArray[unStreamNumber].m_pProcessorInput)
 	{
 	    retVal = HXR_OK;
 	}
     }
 
     if (SUCCEEDED(retVal))
     {
         // Set the flag saying we have a pending OnStreamDone() call for this processor
         m_pStreamStatusArray[unStreamNumber].m_bOnStreamDonePending = TRUE;
         // Save the status
         m_pStreamStatusArray[unStreamNumber].m_statusOnStreamDone = status;
-        // Check to see if there are any queued packets which 
-        // must be sent to the procesor.
-        CheckInputPacketQueue((UINT32) unStreamNumber);
+        // Have we received any packets on this stream?
+        if (m_pStreamStatusArray[unStreamNumber].m_bFirstInputPacket)
+        {
+            // We have not received any packets on this stream, so
+            // we sould just pass the OnStreamDone() through to the processor
+            CallOnStreamDone(unStreamNumber);
+        }
+        else
+        {
+            // We have received packets on this stream, so we should
+            // check the input queue to see if and when we
+            // need to call OnStreamDone()  on the processor.
+            // Check to see if there are any queued packets which 
+            // must be sent to the procesor.
+            CheckInputPacketQueue((UINT32) unStreamNumber);
+        }
     }
 
     return retVal;
 }
 
 /************************************************************************
  *	Method:
  *	    IHXSourceInput:OnPacket
  *	Purpose:
  *	    Called to send packet information.
  *
  */
 STDMETHODIMP CSourceSplitter::OnPacket(HX_RESULT status, IHXPacket* pPacket)
 {
     HXLOGPKTL4(HXLOG_DTDR, "CSourceSplitter::OnPacket", pPacket);
     HX_RESULT retVal = HXR_FAIL;
 
     UINT32 ulStreamNumber = 0;
     if (pPacket)
     {
 	ulStreamNumber = (UINT32) pPacket->GetStreamNumber();
     }
 
     if (m_pStreamStatusArray &&
 	(ulStreamNumber < m_ulNumStreams) &&
 	m_pStreamStatusArray[ulStreamNumber].m_pProcessorInput)
     {
 	if (m_pStreamStatusArray[ulStreamNumber].m_bFirstInputPacket &&
 	    pPacket)
 	{
 	    IHXRTPPacket* pRTPPacket = NULL;
 
 	    m_pStreamStatusArray[ulStreamNumber].m_bFirstInputPacket = FALSE;
 	    
 	    m_pStreamStatusArray[ulStreamNumber].m_bUsesRTPPacketsOnInput = 
 		(pPacket->QueryInterface(IID_IHXRTPPacket, 
 					 (void**) &pRTPPacket) == HXR_OK);
 
 	    HX_RELEASE(pRTPPacket);
 	}
-------------- next part --------------



More information about the Helix-client-dev mailing list
 

Site Map   |   Terms of Use   |   Privacy Policy   |   Contact Us

Copyright © 1995-2007 RealNetworks, Inc. All rights reserved. RealNetworks and Helix are trademarks of RealNetworks.
All other trademarks or registered trademarks are the property of their respective holders.