Maarten Lankhorst : quartz: Fix time on MPEG splitter.

Alexandre Julliard julliard at winehq.org
Mon Nov 8 11:46:21 CST 2010


Module: wine
Branch: master
Commit: 8c42595c34cbefef84f95a6671349410f3929d22
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8c42595c34cbefef84f95a6671349410f3929d22

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Sun Nov  7 15:02:49 2010 +0100

quartz: Fix time on MPEG splitter.

---

 dlls/quartz/mpegsplit.c |   34 ++++++++++++++++++++++++----------
 1 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c
index 8321131..c556b78 100644
--- a/dlls/quartz/mpegsplit.c
+++ b/dlls/quartz/mpegsplit.c
@@ -171,7 +171,7 @@ static HRESULT FillBuffer(MPEGSplitterImpl *This, IMediaSample *pCurrentSample)
     Parser_OutputPin * pOutputPin = (Parser_OutputPin*)This->Parser.ppPins[1];
     LONGLONG length = 0;
     LONGLONG pos = BYTES_FROM_MEDIATIME(This->Parser.pInputPin->rtNext);
-    LONGLONG time = This->position;
+    LONGLONG time = This->position, rtstop, rtstart;
     HRESULT hr;
     BYTE *fbuf = NULL;
     DWORD len = IMediaSample_GetActualDataLength(pCurrentSample);
@@ -229,7 +229,28 @@ static HRESULT FillBuffer(MPEGSplitterImpl *This, IMediaSample *pCurrentSample)
 
     TRACE("Media time : %u.%03u\n", (DWORD)(This->position/10000000), (DWORD)((This->position/10000)%1000));
 
-    IMediaSample_SetTime(pCurrentSample, &time, &This->position);
+    if (IMediaSample_IsDiscontinuity(pCurrentSample) == S_OK) {
+        IPin *victim;
+        EnterCriticalSection(&This->Parser.filter.csFilter);
+        pOutputPin->pin.pin.tStart = time;
+        pOutputPin->pin.pin.dRate = This->Parser.sourceSeeking.dRate;
+        hr = IPin_ConnectedTo((IPin *)pOutputPin, &victim);
+        if (hr == S_OK)
+        {
+            hr = IPin_NewSegment(victim, time, This->Parser.sourceSeeking.llStop,
+                                 This->Parser.sourceSeeking.dRate);
+            if (hr != S_OK)
+                FIXME("NewSegment returns %08x\n", hr);
+            IPin_Release(victim);
+        }
+        LeaveCriticalSection(&This->Parser.filter.csFilter);
+        if (hr != S_OK)
+            return hr;
+    }
+    rtstart = (double)(time - pOutputPin->pin.pin.tStart) / pOutputPin->pin.pin.dRate;
+    rtstop = (double)(This->position - pOutputPin->pin.pin.tStart) / pOutputPin->pin.pin.dRate;
+    IMediaSample_SetTime(pCurrentSample, &rtstart, &rtstop);
+    IMediaSample_SetMediaTime(pCurrentSample, &time, &This->position);
 
     hr = BaseOutputPinImpl_Deliver((BaseOutputPin*)&pOutputPin->pin, pCurrentSample);
 
@@ -672,7 +693,6 @@ static HRESULT WINAPI MPEGSplitter_seek(IMediaSeeking *iface)
     if (SUCCEEDED(hr))
     {
         PullPin *pin = This->Parser.pInputPin;
-        IPin *victim = NULL;
 
         TRACE("Moving sound to %08u bytes!\n", (DWORD)bytepos);
 
@@ -682,12 +702,6 @@ static HRESULT WINAPI MPEGSplitter_seek(IMediaSeeking *iface)
         /* Make sure this is done while stopped, BeginFlush takes care of this */
         EnterCriticalSection(&This->Parser.filter.csFilter);
         memcpy(This->header, header, 4);
-        IPin_ConnectedTo(This->Parser.ppPins[1], &victim);
-        if (victim)
-        {
-            IPin_NewSegment(victim, newpos, This->duration, pin->dRate);
-            IPin_Release(victim);
-        }
 
         pin->rtStart = pin->rtCurrent = MEDIATIME_FROM_BYTES(bytepos);
         pin->rtStop = MEDIATIME_FROM_BYTES((REFERENCE_TIME)This->EndOfFile);
@@ -744,7 +758,7 @@ static HRESULT MPEGSplitter_first_request(LPVOID iface)
         pin->rtNext = rtSampleStop;
 
         IMediaSample_SetPreroll(sample, FALSE);
-        IMediaSample_SetDiscontinuity(sample, This->seek);
+        IMediaSample_SetDiscontinuity(sample, TRUE);
         IMediaSample_SetSyncPoint(sample, 1);
         This->seek = 0;
 




More information about the wine-cvs mailing list