[PATCH v4 1/5] strmbase: Combine the SetMediaType() and CompleteConnect() callbacks.

Zebediah Figura z.figura12 at gmail.com
Tue Dec 10 10:35:11 CST 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/acmwrapper.c         | 115 +++++++-----------------
 dlls/quartz/avidec.c             |  37 ++------
 dlls/strmbase/transform.c        |   7 +-
 dlls/winegstreamer/gsttffilter.c | 146 +++++++++++--------------------
 dlls/wineqtdecoder/qtvdecoder.c  |  25 ++----
 include/wine/strmbase.h          |   5 +-
 6 files changed, 103 insertions(+), 232 deletions(-)

diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c
index 8eea6ab147..33d9debe5c 100644
--- a/dlls/quartz/acmwrapper.c
+++ b/dlls/quartz/acmwrapper.c
@@ -40,7 +40,6 @@ typedef struct ACMWrapperImpl
     TransformFilter tf;
 
     HACMSTREAM has;
-    LPWAVEFORMATEX pWfIn;
     LPWAVEFORMATEX pWfOut;
 
     LONGLONG lasttime_real;
@@ -224,85 +223,43 @@ error:
     return hr;
 }
 
-static HRESULT WINAPI ACMWrapper_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static BOOL is_audio_subtype(const GUID *guid)
 {
-    ACMWrapperImpl* This = impl_from_TransformFilter(tf);
-    MMRESULT res;
-
-    TRACE("(%p)->(%i %p)\n", This, dir, pmt);
-
-    if (dir != PINDIR_INPUT)
-        return S_OK;
-
-    /* Check root (GUID w/o FOURCC) */
-    if ((IsEqualIID(&pmt->majortype, &MEDIATYPE_Audio)) &&
-        (!memcmp(((const char *)&pmt->subtype)+4, ((const char *)&MEDIATYPE_Audio)+4, sizeof(GUID)-4)) &&
-        (IsEqualIID(&pmt->formattype, &FORMAT_WaveFormatEx)))
-    {
-        HACMSTREAM drv;
-        WAVEFORMATEX *wfx = (WAVEFORMATEX*)pmt->pbFormat;
-        AM_MEDIA_TYPE* outpmt = &This->tf.pmt;
-
-        if (!wfx || wfx->wFormatTag == WAVE_FORMAT_PCM || wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
-            return VFW_E_TYPE_NOT_ACCEPTED;
-        FreeMediaType(outpmt);
-
-        This->pWfIn = (LPWAVEFORMATEX)pmt->pbFormat;
-
-	/* HACK */
-	/* TRACE("ALIGN = %d\n", pACMWrapper->pWfIn->nBlockAlign); */
-	/* pACMWrapper->pWfIn->nBlockAlign = 1; */
-
-	/* Set output audio data to PCM */
-        CopyMediaType(outpmt, pmt);
-        outpmt->subtype.Data1 = WAVE_FORMAT_PCM;
-	This->pWfOut = (WAVEFORMATEX*)outpmt->pbFormat;
-	This->pWfOut->wFormatTag = WAVE_FORMAT_PCM;
-	This->pWfOut->wBitsPerSample = 16;
-	This->pWfOut->nBlockAlign = This->pWfOut->wBitsPerSample * This->pWfOut->nChannels / 8;
-	This->pWfOut->cbSize = 0;
-	This->pWfOut->nAvgBytesPerSec = This->pWfOut->nChannels * This->pWfOut->nSamplesPerSec
-						* (This->pWfOut->wBitsPerSample/8);
-
-        if (!(res = acmStreamOpen(&drv, NULL, This->pWfIn, This->pWfOut, NULL, 0, 0, 0)))
-        {
-            This->has = drv;
-
-            TRACE("Connection accepted\n");
-            return S_OK;
-        }
-	else
-	    FIXME("acmStreamOpen returned %d\n", res);
-        FreeMediaType(outpmt);
-        TRACE("Unable to find a suitable ACM decompressor\n");
-    }
-
-    TRACE("Connection refused\n");
-    return VFW_E_TYPE_NOT_ACCEPTED;
+    return !memcmp(&guid->Data2, &MEDIATYPE_Audio.Data2, sizeof(GUID) - sizeof(int));
 }
 
-static HRESULT WINAPI ACMWrapper_CompleteConnect(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
+static HRESULT acm_wrapper_connect_sink(TransformFilter *iface, const AM_MEDIA_TYPE *mt)
 {
-    ACMWrapperImpl* This = impl_from_TransformFilter(tf);
-    MMRESULT res;
+    ACMWrapperImpl *filter = impl_from_TransformFilter(iface);
+    const WAVEFORMATEX *wfx = (WAVEFORMATEX *)mt->pbFormat;
     HACMSTREAM drv;
+    MMRESULT res;
 
-    TRACE("(%p)\n", This);
-
-    if (dir != PINDIR_INPUT)
-        return S_OK;
-
-    if (!(res = acmStreamOpen(&drv, NULL, This->pWfIn, This->pWfOut, NULL, 0, 0, 0)))
+    if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Audio) || !is_audio_subtype(&mt->subtype)
+            || !IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx) || !wfx
+            || wfx->wFormatTag == WAVE_FORMAT_PCM || wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
+        return VFW_E_TYPE_NOT_ACCEPTED;
+
+    CopyMediaType(&filter->tf.pmt, mt);
+    filter->tf.pmt.subtype.Data1 = WAVE_FORMAT_PCM;
+    filter->pWfOut = (WAVEFORMATEX *)filter->tf.pmt.pbFormat;
+    filter->pWfOut->wFormatTag = WAVE_FORMAT_PCM;
+    filter->pWfOut->wBitsPerSample = 16;
+    filter->pWfOut->nBlockAlign = filter->pWfOut->wBitsPerSample * filter->pWfOut->nChannels / 8;
+    filter->pWfOut->cbSize = 0;
+    filter->pWfOut->nAvgBytesPerSec = filter->pWfOut->nChannels * filter->pWfOut->nSamplesPerSec
+            * (filter->pWfOut->wBitsPerSample / 8);
+
+    if ((res = acmStreamOpen(&drv, NULL, (WAVEFORMATEX *)wfx, filter->pWfOut, NULL, 0, 0, 0)))
     {
-        This->has = drv;
-
-        TRACE("Connection accepted\n");
-        return S_OK;
+        ERR("Failed to open stream, error %u.\n", res);
+        FreeMediaType(&filter->tf.pmt);
+        return VFW_E_TYPE_NOT_ACCEPTED;
     }
 
-    FIXME("acmStreamOpen returned %d\n", res);
-    TRACE("Unable to find a suitable ACM decompressor\n");
-    return VFW_E_TYPE_NOT_ACCEPTED;
+    filter->has = drv;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI ACMWrapper_BreakConnect(TransformFilter *tf, PIN_DIRECTION dir)
@@ -341,18 +298,10 @@ static HRESULT WINAPI ACMWrapper_DecideBufferSize(TransformFilter *tf, IMemAlloc
 }
 
 static const TransformFilterFuncTable ACMWrapper_FuncsTable = {
-    ACMWrapper_DecideBufferSize,
-    NULL,
-    ACMWrapper_Receive,
-    NULL,
-    NULL,
-    ACMWrapper_SetMediaType,
-    ACMWrapper_CompleteConnect,
-    ACMWrapper_BreakConnect,
-    NULL,
-    NULL,
-    NULL,
-    NULL
+    .pfnDecideBufferSize = ACMWrapper_DecideBufferSize,
+    .pfnReceive = ACMWrapper_Receive,
+    .transform_connect_sink = acm_wrapper_connect_sink,
+    .pfnBreakConnect = ACMWrapper_BreakConnect,
 };
 
 HRESULT ACMWrapper_create(IUnknown *outer, void **out)
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c
index 32969a3473..abed957fa6 100644
--- a/dlls/quartz/avidec.c
+++ b/dlls/quartz/avidec.c
@@ -210,16 +210,11 @@ static HRESULT WINAPI AVIDec_StopStreaming(TransformFilter* pTransformFilter)
     return S_OK;
 }
 
-static HRESULT WINAPI AVIDec_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static HRESULT avi_dec_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *pmt)
 {
     AVIDecImpl* This = impl_from_TransformFilter(tf);
     HRESULT hr = VFW_E_TYPE_NOT_ACCEPTED;
 
-    TRACE("(%p)->(%p)\n", This, pmt);
-
-    if (dir != PINDIR_INPUT)
-        return S_OK;
-
     /* Check root (GUID w/o FOURCC) */
     if ((IsEqualIID(&pmt->majortype, &MEDIATYPE_Video)) &&
         (!memcmp(((const char *)&pmt->subtype)+4, ((const char *)&MEDIATYPE_Video)+4, sizeof(GUID)-4)))
@@ -310,15 +305,6 @@ failed:
     return hr;
 }
 
-static HRESULT WINAPI AVIDec_CompleteConnect(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
-    AVIDecImpl* This = impl_from_TransformFilter(tf);
-
-    TRACE("(%p)\n", This);
-
-    return S_OK;
-}
-
 static HRESULT WINAPI AVIDec_BreakConnect(TransformFilter *tf, PIN_DIRECTION dir)
 {
     AVIDecImpl *This = impl_from_TransformFilter(tf);
@@ -357,19 +343,14 @@ static HRESULT WINAPI AVIDec_DecideBufferSize(TransformFilter *tf, IMemAllocator
 }
 
 static const TransformFilterFuncTable AVIDec_FuncsTable = {
-    AVIDec_DecideBufferSize,
-    AVIDec_StartStreaming,
-    AVIDec_Receive,
-    AVIDec_StopStreaming,
-    NULL,
-    AVIDec_SetMediaType,
-    AVIDec_CompleteConnect,
-    AVIDec_BreakConnect,
-    NULL,
-    NULL,
-    AVIDec_EndFlush,
-    NULL,
-    AVIDec_NotifyDrop
+    .pfnDecideBufferSize = AVIDec_DecideBufferSize,
+    .pfnStartStreaming = AVIDec_StartStreaming,
+    .pfnReceive = AVIDec_Receive,
+    .pfnStopStreaming = AVIDec_StopStreaming,
+    .transform_connect_sink = avi_dec_connect_sink,
+    .pfnBreakConnect = AVIDec_BreakConnect,
+    .pfnEndFlush = AVIDec_EndFlush,
+    .pfnNotify = AVIDec_NotifyDrop,
 };
 
 HRESULT AVIDec_create(IUnknown *outer, void **out)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 7a79f70905..30ed0006cb 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -405,11 +405,8 @@ static HRESULT WINAPI TransformFilter_InputPin_ReceiveConnection(IPin * iface, I
     TRACE("(%p)->(%p, %p)\n", iface, pReceivePin, pmt);
     strmbase_dump_media_type(pmt);
 
-    if (pTransform->pFuncsTable->pfnSetMediaType)
-        hr = pTransform->pFuncsTable->pfnSetMediaType(pTransform, PINDIR_INPUT, pmt);
-
-    if (SUCCEEDED(hr) && pTransform->pFuncsTable->pfnCompleteConnect)
-        hr = pTransform->pFuncsTable->pfnCompleteConnect(pTransform, PINDIR_INPUT, pReceivePin);
+    if (pTransform->pFuncsTable->transform_connect_sink)
+        hr = pTransform->pFuncsTable->transform_connect_sink(pTransform, pmt);
 
     if (SUCCEEDED(hr))
     {
diff --git a/dlls/winegstreamer/gsttffilter.c b/dlls/winegstreamer/gsttffilter.c
index ee1851dfdc..d44a6ae33a 100644
--- a/dlls/winegstreamer/gsttffilter.c
+++ b/dlls/winegstreamer/gsttffilter.c
@@ -516,7 +516,7 @@ static HRESULT WINAPI Gstreamer_Mp3_QueryConnect(TransformFilter *iface, const A
     return S_OK;
 }
 
-static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT mp3_decoder_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
 {
     GstTfImpl *This = (GstTfImpl*)tf;
     GstCaps *capsin, *capsout;
@@ -525,13 +525,8 @@ static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECT
     HRESULT hr;
     int layer;
 
-    TRACE("%p 0x%x %p\n", This, dir, amt);
-
     mark_wine_thread();
 
-    if (dir != PINDIR_INPUT)
-        return S_OK;
-
     if (Gstreamer_Mp3_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
         return VFW_E_TYPE_NOT_ACCEPTED;
 
@@ -588,26 +583,19 @@ static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECT
     return hr;
 }
 
-static HRESULT WINAPI Gstreamer_Mp3_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
-    TRACE("%p 0x%x %p\n", tf, dir, pin);
-    return S_OK;
-}
-
 static const TransformFilterFuncTable Gstreamer_Mp3_vtbl = {
-    Gstreamer_transform_DecideBufferSize,
-    Gstreamer_transform_ProcessBegin,
-    Gstreamer_transform_ProcessData,
-    Gstreamer_transform_ProcessEnd,
-    Gstreamer_Mp3_QueryConnect,
-    Gstreamer_Mp3_SetMediaType,
-    Gstreamer_Mp3_ConnectInput,
-    Gstreamer_transform_Cleanup,
-    Gstreamer_transform_EndOfStream,
-    Gstreamer_transform_BeginFlush,
-    Gstreamer_transform_EndFlush,
-    Gstreamer_transform_NewSegment,
-    Gstreamer_transform_QOS
+    .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+    .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+    .pfnReceive = Gstreamer_transform_ProcessData,
+    .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+    .pfnCheckInputType = Gstreamer_Mp3_QueryConnect,
+    .transform_connect_sink = mp3_decoder_connect_sink,
+    .pfnBreakConnect = Gstreamer_transform_Cleanup,
+    .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+    .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+    .pfnEndFlush = Gstreamer_transform_EndFlush,
+    .pfnNewSegment = Gstreamer_transform_NewSegment,
+    .pfnNotify = Gstreamer_transform_QOS,
 };
 
 IUnknown * CALLBACK Gstreamer_Mp3_create(IUnknown *punkouter, HRESULT *phr)
@@ -664,13 +652,7 @@ static HRESULT WINAPI Gstreamer_YUV_QueryConnect(TransformFilter *iface, const A
     }
 }
 
-static HRESULT WINAPI Gstreamer_YUV_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
-    TRACE("%p 0x%x %p\n", tf, dir, pin);
-    return S_OK;
-}
-
-static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir,  const AM_MEDIA_TYPE *amt)
+static HRESULT yuv_to_rgb_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
 {
     GstTfImpl *This = (GstTfImpl*)tf;
     GstCaps *capsin, *capsout;
@@ -679,13 +661,8 @@ static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DI
     int avgtime;
     LONG width, height;
 
-    TRACE("%p 0x%x %p\n", This, dir, amt);
-
     mark_wine_thread();
 
-    if (dir != PINDIR_INPUT)
-        return S_OK;
-
     if (Gstreamer_YUV_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
         return E_FAIL;
 
@@ -738,19 +715,18 @@ static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DI
 }
 
 static const TransformFilterFuncTable Gstreamer_YUV2RGB_vtbl = {
-    Gstreamer_transform_DecideBufferSize,
-    Gstreamer_transform_ProcessBegin,
-    Gstreamer_transform_ProcessData,
-    Gstreamer_transform_ProcessEnd,
-    Gstreamer_YUV_QueryConnect,
-    Gstreamer_YUV2RGB_SetMediaType,
-    Gstreamer_YUV_ConnectInput,
-    Gstreamer_transform_Cleanup,
-    Gstreamer_transform_EndOfStream,
-    Gstreamer_transform_BeginFlush,
-    Gstreamer_transform_EndFlush,
-    Gstreamer_transform_NewSegment,
-    Gstreamer_transform_QOS
+    .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+    .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+    .pfnReceive = Gstreamer_transform_ProcessData,
+    .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+    .pfnCheckInputType = Gstreamer_YUV_QueryConnect,
+    .transform_connect_sink = yuv_to_rgb_connect_sink,
+    .pfnBreakConnect = Gstreamer_transform_Cleanup,
+    .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+    .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+    .pfnEndFlush = Gstreamer_transform_EndFlush,
+    .pfnNewSegment = Gstreamer_transform_NewSegment,
+    .pfnNotify = Gstreamer_transform_QOS,
 };
 
 IUnknown * CALLBACK Gstreamer_YUV2RGB_create(IUnknown *punkouter, HRESULT *phr)
@@ -772,7 +748,7 @@ IUnknown * CALLBACK Gstreamer_YUV2RGB_create(IUnknown *punkouter, HRESULT *phr)
     return obj;
 }
 
-static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir,  const AM_MEDIA_TYPE *amt)
+static HRESULT yuv_to_argb_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
 {
     GstTfImpl *This = (GstTfImpl*)tf;
     GstCaps *capsin, *capsout;
@@ -781,13 +757,8 @@ static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_D
     int avgtime;
     LONG width, height;
 
-    TRACE("%p 0x%x %p\n", This, dir, amt);
-
     mark_wine_thread();
 
-    if (dir != PINDIR_INPUT)
-        return S_OK;
-
     if (Gstreamer_YUV_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
         return E_FAIL;
 
@@ -840,19 +811,18 @@ static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_D
 }
 
 static const TransformFilterFuncTable Gstreamer_YUV2ARGB_vtbl = {
-    Gstreamer_transform_DecideBufferSize,
-    Gstreamer_transform_ProcessBegin,
-    Gstreamer_transform_ProcessData,
-    Gstreamer_transform_ProcessEnd,
-    Gstreamer_YUV_QueryConnect,
-    Gstreamer_YUV2ARGB_SetMediaType,
-    Gstreamer_YUV_ConnectInput,
-    Gstreamer_transform_Cleanup,
-    Gstreamer_transform_EndOfStream,
-    Gstreamer_transform_BeginFlush,
-    Gstreamer_transform_EndFlush,
-    Gstreamer_transform_NewSegment,
-    Gstreamer_transform_QOS
+    .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+    .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+    .pfnReceive = Gstreamer_transform_ProcessData,
+    .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+    .pfnCheckInputType = Gstreamer_YUV_QueryConnect,
+    .transform_connect_sink = yuv_to_argb_connect_sink,
+    .pfnBreakConnect = Gstreamer_transform_Cleanup,
+    .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+    .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+    .pfnEndFlush = Gstreamer_transform_EndFlush,
+    .pfnNewSegment = Gstreamer_transform_NewSegment,
+    .pfnNotify = Gstreamer_transform_QOS,
 };
 
 IUnknown * CALLBACK Gstreamer_YUV2ARGB_create(IUnknown *punkouter, HRESULT *phr)
@@ -886,13 +856,7 @@ static HRESULT WINAPI Gstreamer_AudioConvert_QueryConnect(TransformFilter *iface
     return S_OK;
 }
 
-static HRESULT WINAPI Gstreamer_AudioConvert_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
-    TRACE("%p 0x%x %p\n", tf, dir, pin);
-    return S_OK;
-}
-
-static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT audio_converter_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
 {
     GstTfImpl *This = (GstTfImpl*)tf;
     GstCaps *capsin, *capsout;
@@ -905,13 +869,8 @@ static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, P
     BOOL inisfloat = FALSE;
     int indepth;
 
-    TRACE("%p 0x%x %p\n", This, dir, amt);
-
     mark_wine_thread();
 
-    if (dir != PINDIR_INPUT)
-        return S_OK;
-
     if (Gstreamer_AudioConvert_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
         return E_FAIL;
 
@@ -972,19 +931,18 @@ static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, P
 }
 
 static const TransformFilterFuncTable Gstreamer_AudioConvert_vtbl = {
-    Gstreamer_transform_DecideBufferSize,
-    Gstreamer_transform_ProcessBegin,
-    Gstreamer_transform_ProcessData,
-    Gstreamer_transform_ProcessEnd,
-    Gstreamer_AudioConvert_QueryConnect,
-    Gstreamer_AudioConvert_SetMediaType,
-    Gstreamer_AudioConvert_ConnectInput,
-    Gstreamer_transform_Cleanup,
-    Gstreamer_transform_EndOfStream,
-    Gstreamer_transform_BeginFlush,
-    Gstreamer_transform_EndFlush,
-    Gstreamer_transform_NewSegment,
-    Gstreamer_transform_QOS
+    .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+    .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+    .pfnReceive = Gstreamer_transform_ProcessData,
+    .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+    .pfnCheckInputType = Gstreamer_AudioConvert_QueryConnect,
+    .transform_connect_sink = audio_converter_connect_sink,
+    .pfnBreakConnect = Gstreamer_transform_Cleanup,
+    .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+    .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+    .pfnEndFlush = Gstreamer_transform_EndFlush,
+    .pfnNewSegment = Gstreamer_transform_NewSegment,
+    .pfnNotify = Gstreamer_transform_QOS,
 };
 
 IUnknown * CALLBACK Gstreamer_AudioConvert_create(IUnknown *punkouter, HRESULT *phr)
diff --git a/dlls/wineqtdecoder/qtvdecoder.c b/dlls/wineqtdecoder/qtvdecoder.c
index 3da0738aec..4be654e5a1 100644
--- a/dlls/wineqtdecoder/qtvdecoder.c
+++ b/dlls/wineqtdecoder/qtvdecoder.c
@@ -336,7 +336,7 @@ static HRESULT WINAPI QTVDecoder_StopStreaming(TransformFilter* pTransformFilter
     return S_OK;
 }
 
-static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static HRESULT video_decoder_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *pmt)
 {
     QTVDecoderImpl* This = impl_from_TransformFilter(tf);
     HRESULT hr = VFW_E_TYPE_NOT_ACCEPTED;
@@ -344,11 +344,6 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION
     AM_MEDIA_TYPE *outpmt = &This->tf.pmt;
     CFNumberRef n = NULL;
 
-    TRACE("(%p)->(%p)\n", This, pmt);
-
-    if (dir != PINDIR_INPUT)
-        return S_OK;
-
     FreeMediaType(outpmt);
     CopyMediaType(outpmt, pmt);
 
@@ -502,18 +497,12 @@ static HRESULT WINAPI QTVDecoder_DecideBufferSize(TransformFilter *tf, IMemAlloc
 }
 
 static const TransformFilterFuncTable QTVDecoder_FuncsTable = {
-    QTVDecoder_DecideBufferSize,
-    QTVDecoder_StartStreaming,
-    QTVDecoder_Receive,
-    QTVDecoder_StopStreaming,
-    NULL,
-    QTVDecoder_SetMediaType,
-    NULL,
-    QTVDecoder_BreakConnect,
-    NULL,
-    NULL,
-    NULL,
-    NULL
+    .pfnDecideBufferSize = QTVDecoder_DecideBufferSize,
+    .pfnStartStreaming = QTVDecoder_StartStreaming,
+    .pfnReceive = QTVDecoder_Receive,
+    .pfnStopStreaming = QTVDecoder_StopStreaming,
+    .transform_connect_sink = video_decoder_connect_sink,
+    .pfnBreakConnect = QTVDecoder_BreakConnect,
 };
 
 IUnknown * CALLBACK QTVDecoder_create(IUnknown *outer, HRESULT* phr)
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index c3699f1925..7e3b38b49d 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -197,9 +197,7 @@ typedef HRESULT (WINAPI *TransformFilter_DecideBufferSize) (TransformFilter *ifa
 typedef HRESULT (WINAPI *TransformFilter_StartStreaming) (TransformFilter *iface);
 typedef HRESULT (WINAPI *TransformFilter_StopStreaming) (TransformFilter *iface);
 typedef HRESULT (WINAPI *TransformFilter_Receive) (TransformFilter* iface, IMediaSample* pIn);
-typedef HRESULT (WINAPI *TransformFilter_CompleteConnect) (TransformFilter *iface, PIN_DIRECTION dir, IPin *pPin);
 typedef HRESULT (WINAPI *TransformFilter_BreakConnect) (TransformFilter *iface, PIN_DIRECTION dir);
-typedef HRESULT (WINAPI *TransformFilter_SetMediaType) (TransformFilter *iface, PIN_DIRECTION dir, const AM_MEDIA_TYPE *pMediaType);
 typedef HRESULT (WINAPI *TransformFilter_CheckInputType) (TransformFilter *iface, const AM_MEDIA_TYPE *pMediaType);
 typedef HRESULT (WINAPI *TransformFilter_EndOfStream) (TransformFilter *iface);
 typedef HRESULT (WINAPI *TransformFilter_BeginFlush) (TransformFilter *iface);
@@ -216,8 +214,7 @@ typedef struct TransformFilterFuncTable {
 	TransformFilter_Receive pfnReceive;
 	TransformFilter_StopStreaming pfnStopStreaming;
 	TransformFilter_CheckInputType pfnCheckInputType;
-	TransformFilter_SetMediaType pfnSetMediaType;
-	TransformFilter_CompleteConnect pfnCompleteConnect;
+        HRESULT (*transform_connect_sink)(TransformFilter *filter, const AM_MEDIA_TYPE *mt);
 	TransformFilter_BreakConnect pfnBreakConnect;
 	TransformFilter_EndOfStream pfnEndOfStream;
 	TransformFilter_BeginFlush pfnBeginFlush;
-- 
2.24.0




More information about the wine-devel mailing list