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

List:       helix-datatype-cvs
Subject:    [Datatype-cvs] tools/dtdriver/engine csrcsplt.cpp, 1.6.10.6,
From:       ehyche () helixcommunity ! org
Date:       2009-05-26 1:41:54
Message-ID: 200905260246.n4Q2kWX1011225 () mailer ! progressive-comp ! com
[Download RAW message or body]

Update of /cvsroot/datatype/tools/dtdriver/engine
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv8621/engine

Modified Files:
      Tag: hxclient_3_1_0_atlas
	csrcsplt.cpp 
Log Message:
Merge to 310Atlas.

Description
----------------------------------------------
This change fixes various issues found with transcoding
H.264 in FLV files and thumbnail generation using the Flash-player-based FLV renderer. Changes include:

- Fix problem in FLV file format where we fail to issue
  a StreamDone() on the audio stream when fetching packets
  during thumbnail generation. This was causing a dtdrplin hang.
- Call IHXUntimedRenderer::SetUntimedRendering twice when initializing
  the renderer in the video decoder in the dtdrive. The reason is that
  some renderers need to know whether or not they will be doing
  untimed rendering BEFORE receiving the OnHeader() (such as renderers
  that can use either software or hardware decoders). However, some
  renderers need to receive OnHeader() before knowing how to properly
  return the call to SetUntimedRendering (such as the FLV renderer). We
  solve this conflict by calling SetUntimedRendering twice - once before
  OnHeader() and once after.
- Since we are calling it twice, we move the call to SetUntimedRendering()
  and related logic to a common method.
- When we compute the minimum output timestamp in the source splitter
  we need to take into account the StartTime.
- In the source splitter, we should allow streams that are blocked to
  always send their packets through to the processor. That's because
  they are only going to get thrown away anyway, so there's no need
  to queue them up at all.

Files Modified
----------------------------------------------
datatype/flash/flv/fileformat/flv_file_format.cpp
datatype/tools/dtdriver/decoder/video/vdecoder.cpp
datatype/tools/dtdriver/decoder/video/pub/vdecoder.h
datatype/tools/dtdriver/engine/csrcsplt.cpp
datatype/tools/dtdriver/engine/pub/csrcsplt.h

Branches
----------------------------------------------
HEAD, 310Atlas, and 204Cay



Index: csrcsplt.cpp
===================================================================
RCS file: /cvsroot/datatype/tools/dtdriver/engine/csrcsplt.cpp,v
retrieving revision 1.6.10.6
retrieving revision 1.6.10.7
diff -u -d -r1.6.10.6 -r1.6.10.7
--- csrcsplt.cpp	1 Apr 2009 03:20:45 -0000	1.6.10.6
+++ csrcsplt.cpp	26 May 2009 01:41:52 -0000	1.6.10.7
@@ -101,6 +101,7 @@
     , m_ulNumFileHeadersProcessed(0)
     , m_ulNumStreamHeadersProcessed(0)
     , m_ulNumTerminationsProcessed(0)
+    , m_ulStartTime(0)
     , m_statusTermination(HXR_OK)
     , m_pProcessorResponseList(NULL)
     , m_ulProcessorResponseListCount(0)
@@ -141,6 +142,15 @@
     if (SUCCEEDED(retVal))
     {
 	retVal = CSourceHandler::InitSourceHandler(pSourceSink, pOptions);
+        if (SUCCEEDED(retVal))
+        {
+            // Get the start time from the options
+            UINT32 ulTmp = 0;
+            if (SUCCEEDED(pOptions->GetPropertyULONG32("StartTime", ulTmp)))
+            {
+                m_ulStartTime = ulTmp;
+            }
+        }
     }
 
     if (SUCCEEDED(retVal))
@@ -248,10 +258,12 @@
         // Sanity check
         if (ulStreamNum < m_ulNumStreams)
         {
-            // Has OnStreamDone() been called for this stream?
-            if (!m_pStreamStatusArray[ulStreamNum].m_bOnStreamDonePending)
+            // Is this stream being blocked?
+            if (m_pStreamStatusArray[ulStreamNum].m_eFilterType != CStreamStatus::SFT_BLOCK)
             {
-                // OnStreamDone() has NOT been called for this stream
+                // This stream is either being passed through or decoded,
+                // so we need to do further checking to see if we should
+                // push this packet through to the processor.
                 //
             // Has this stream given us any output yet?
             if (!m_pStreamStatusArray[ulStreamNum].m_bFirstOutputPacket)
@@ -263,8 +275,9 @@
                     // Get the last output time for this stream. If this
                     // stream has not produced any output yet, then we 
                     // will use 0 for the last output timestamp.
-                    UINT32 ulLastOutputTimeStamp = 0;
-                    if (!m_pStreamStatusArray[i].m_bFirstOutputPacket)
+                        UINT32 ulLastOutputTimeStamp = m_ulStartTime;
+                        if (!m_pStreamStatusArray[i].m_bFirstOutputPacket &&
+                            m_pStreamStatusArray[i].m_ulLastOutputTimeStamp >= m_ulStartTime)
                     {
                         ulLastOutputTimeStamp = m_pStreamStatusArray[i].m_ulLastOutputTimeStamp;
                     }
@@ -311,8 +324,8 @@
         }
             else
             {
-                // OnStreamDone() has been called for this stream, so
-                // we will process this packet.
+                // This stream is being blocked on output, so we can
+                // pass this stream through.
                 bRet = TRUE;
             }
         }
@@ -1435,6 +1448,8 @@
 					    HX_RESULT status,
 					    UINT16 unStreamNumber)
 {
+    HXLOGL4(HXLOG_DTDR, "CSourceSplitter[%p]::OnStreamDoneResp(procNum=%lu,status=0x%08x,strm=%u)",
+            this, ulProcessorNumber, status, unStreamNumber);
     HX_RESULT retVal = HXR_OK;
 
     if ((!m_pStreamStatusArray) ||


_______________________________________________
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