Maarten Lankhorst : quartz: Fix time discontinuities in the acm wrapper.

Alexandre Julliard julliard at winehq.org
Mon Apr 28 08:01:22 CDT 2008


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

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Fri Apr 25 14:15:42 2008 -0700

quartz: Fix time discontinuities in the acm wrapper.

---

 dlls/quartz/acmwrapper.c |   42 ++++++++++++++++++++++++++++++++++--------
 1 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c
index 11b07f1..65f196a 100644
--- a/dlls/quartz/acmwrapper.c
+++ b/dlls/quartz/acmwrapper.c
@@ -47,6 +47,9 @@ typedef struct ACMWrapperImpl
     HACMSTREAM has;
     LPWAVEFORMATEX pWfIn;
     LPWAVEFORMATEX pWfOut;
+
+    LONGLONG lasttime_real;
+    LONGLONG lasttime_sent;
 } ACMWrapperImpl;
 
 static HRESULT ACMWrapper_ProcessSampleData(TransformFilterImpl* pTransformFilter, IMediaSample *pSample)
@@ -75,6 +78,19 @@ static HRESULT ACMWrapper_ProcessSampleData(TransformFilterImpl* pTransformFilte
     IMediaSample_GetTime(pSample, &tStart, &tStop);
     cbSrcStream = IMediaSample_GetActualDataLength(pSample);
 
+    /* Prevent discontinuities when codecs 'absorb' data but not give anything back in return */
+    if (IMediaSample_IsDiscontinuity(pSample) == S_OK)
+    {
+        This->lasttime_real = tStart;
+        This->lasttime_sent = tStart;
+    }
+    else if (This->lasttime_real == tStart)
+        tStart = This->lasttime_sent;
+    else
+        WARN("Discontinuity\n");
+
+    tMed = tStart;
+
     TRACE("Sample data ptr = %p, size = %ld\n", pbSrcStream, (long)cbSrcStream);
 
     hr = IPin_ConnectionMediaType(This->tf.ppPins[0], &amt);
@@ -132,19 +148,20 @@ static HRESULT ACMWrapper_ProcessSampleData(TransformFilterImpl* pTransformFilte
 
         if (res)
         {
-	    if(res != MMSYSERR_MOREDATA)
-	        ERR("Cannot convert data header %d\n", res);
-	    goto error;
-	}
+            if(res != MMSYSERR_MOREDATA)
+                ERR("Cannot convert data header %d\n", res);
+            goto error;
+        }
 
-	TRACE("used in %u/%u, used out %u/%u\n", ash.cbSrcLengthUsed, ash.cbSrcLength, ash.cbDstLengthUsed, ash.cbDstLength);
+        TRACE("used in %u/%u, used out %u/%u\n", ash.cbSrcLengthUsed, ash.cbSrcLength, ash.cbDstLengthUsed, ash.cbDstLength);
 
-	hr = IMediaSample_SetActualDataLength(pOutSample, ash.cbDstLengthUsed);
-	assert(hr == S_OK);
+        hr = IMediaSample_SetActualDataLength(pOutSample, ash.cbDstLengthUsed);
+        assert(hr == S_OK);
 
+        /* Bug in acm codecs? It apparantly uses the input, but doesn't necessarily output immediately kl*/
         if (!ash.cbSrcLengthUsed)
         {
-            WARN("Sample was skipped\n");
+            WARN("Sample was skipped? Outputted: %u\n", ash.cbDstLengthUsed);
             ash.cbSrcLength = 0;
             goto error;
         }
@@ -187,8 +204,15 @@ error:
         if (pOutSample)
             IMediaSample_Release(pOutSample);
         pOutSample = NULL;
+
     }
 
+    This->lasttime_real = tStop;
+    This->lasttime_sent = tMed;
+
+    if (hr != S_OK)
+        FIXME("FATALITY: %08x\n", hr);
+
     return hr;
 }
 
@@ -252,6 +276,7 @@ static HRESULT ACMWrapper_Cleanup(TransformFilterImpl* pTransformFilter)
 	acmStreamClose(This->has, 0);
 
     This->has = 0;
+    This->lasttime_real = This->lasttime_sent = -1;
     
     return S_OK;
 }
@@ -287,6 +312,7 @@ HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv)
         return hr;
 
     *ppv = (LPVOID)This;
+    This->lasttime_real = This->lasttime_sent = -1;
 
     return hr;
 }




More information about the wine-cvs mailing list