From ba5e16301cb80a5251eca10ce437d7d450ece054 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Tue, 1 Apr 2008 14:49:54 -0700 Subject: [PATCH] quartz: Make acmwrapper respond to a sample discontinuities --- dlls/quartz/acmwrapper.c | 27 ++++++++++++++++++++------- 1 files changed, 20 insertions(+), 7 deletions(-) diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c index ffe14c9..35e154c 100644 --- a/dlls/quartz/acmwrapper.c +++ b/dlls/quartz/acmwrapper.c @@ -47,7 +47,6 @@ typedef struct ACMWrapperImpl HACMSTREAM has; LPWAVEFORMATEX pWfIn; LPWAVEFORMATEX pWfOut; - BOOL reinit_codec; /* FIXME: Should use sync points instead */ } ACMWrapperImpl; static HRESULT ACMWrapper_ProcessSampleData(TransformFilterImpl* pTransformFilter, IMediaSample *pSample) @@ -115,19 +114,31 @@ static HRESULT ACMWrapper_ProcessSampleData(TransformFilterImpl* pTransformFilte } unprepare_header = TRUE; - if ((res = acmStreamConvert(This->has, &ash, This->reinit_codec ? ACM_STREAMCONVERTF_START : 0))) { + if (IMediaSample_IsDiscontinuity(pSample) == S_OK) + res = acmStreamConvert(This->has, &ash, ACM_STREAMCONVERTF_START); + else + res = acmStreamConvert(This->has, &ash, 0); + + + if (res) + { if(res != MMSYSERR_MOREDATA) ERR("Cannot convert data header %d\n", res); goto error; } - This->reinit_codec = FALSE; 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); - assert(ash.cbSrcLengthUsed); + if (!ash.cbSrcLengthUsed) + { + WARN("Sample was skipped\n"); + ash.cbSrcLength = 0; + goto error; + } + TRACE("Sample start time: %u.%03u\n", (DWORD)(tStart/10000000), (DWORD)((tStart/10000)%1000)); if (ash.cbSrcLengthUsed == cbSrcStream) { @@ -148,7 +159,11 @@ static HRESULT ACMWrapper_ProcessSampleData(TransformFilterImpl* pTransformFilte } TRACE("Sample stop time: %u.%03u\n", (DWORD)(tStart/10000000), (DWORD)((tStart/10000)%1000)); - hr = OutputPin_SendSample((OutputPin*)This->tf.ppPins[1], pOutSample); + if (IMediaSample_IsDiscontinuity(pSample) == S_FALSE) + hr = OutputPin_SendSample((OutputPin*)This->tf.ppPins[1], pOutSample); + else + TRACE("Skipping first sample: Discontinuity\n"); + if (hr != S_OK && hr != VFW_E_NOT_CONNECTED) { if (FAILED(hr)) ERR("Error sending sample (%x)\n", hr); @@ -259,8 +274,6 @@ HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv) This = CoTaskMemAlloc(sizeof(ACMWrapperImpl)); ZeroMemory(This, sizeof(ACMWrapperImpl)); - This->reinit_codec = TRUE; - hr = TransformFilter_Create(&(This->tf), &CLSID_ACMWrapper, &ACMWrapper_FuncsTable, NULL, NULL, NULL); if (FAILED(hr)) -- 1.5.4.1