Signed-off-by: Zebediah Figura z.figura12@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;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/dsoundrender.c | 13 +++----- dlls/quartz/vmr9.c | 65 +++++++++++++++++++------------------- dlls/strmbase/renderer.c | 4 +-- include/wine/strmbase.h | 3 +- 4 files changed, 39 insertions(+), 46 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index cad210a876..6fd49dac9b 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -413,18 +413,13 @@ static void dsound_render_start_stream(struct strmbase_renderer *iface) } }
-static HRESULT WINAPI DSoundRender_CompleteConnect(struct strmbase_renderer *iface, IPin *pReceivePin) +static HRESULT dsound_render_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt) { DSoundRenderImpl *This = impl_from_strmbase_renderer(iface); - const AM_MEDIA_TYPE *pmt = &This->renderer.sink.pin.mt; + const WAVEFORMATEX *format = (WAVEFORMATEX *)mt->pbFormat; HRESULT hr = S_OK; - WAVEFORMATEX *format; DSBUFFERDESC buf_desc;
- TRACE("(%p)->(%p)\n", This, pReceivePin); - - format = (WAVEFORMATEX*)pmt->pbFormat; - This->buf_size = format->nAvgBytesPerSec;
memset(&buf_desc,0,sizeof(DSBUFFERDESC)); @@ -433,7 +428,7 @@ static HRESULT WINAPI DSoundRender_CompleteConnect(struct strmbase_renderer *ifa DSBCAPS_CTRLFREQUENCY | DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2; buf_desc.dwBufferBytes = This->buf_size; - buf_desc.lpwfxFormat = format; + buf_desc.lpwfxFormat = (WAVEFORMATEX *)format; hr = IDirectSound8_CreateSoundBuffer(This->dsound, &buf_desc, &This->dsbuffer, NULL); This->writepos = This->buf_size; if (FAILED(hr)) @@ -539,7 +534,7 @@ static const struct strmbase_renderer_ops renderer_ops = .renderer_stop_stream = dsound_render_stop_stream, .pfnShouldDrawSampleNow = DSoundRender_ShouldDrawSampleNow, .pfnPrepareReceive = DSoundRender_PrepareReceive, - .pfnCompleteConnect = DSoundRender_CompleteConnect, + .renderer_connect = dsound_render_connect, .pfnBreakConnect = DSoundRender_BreakConnect, .pfnEndOfStream = DSoundRender_EndOfStream, .pfnEndFlush = DSoundRender_EndFlush, diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 60c19e0019..a9b90b322d 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -331,38 +331,20 @@ static HRESULT WINAPI VMR9_DoRenderSample(struct strmbase_renderer *iface, IMedi return hr; }
-static HRESULT WINAPI VMR9_CheckMediaType(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *pmt) +static HRESULT WINAPI VMR9_CheckMediaType(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt) { - struct quartz_vmr *This = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface); + const VIDEOINFOHEADER *vih;
- if (!IsEqualIID(&pmt->majortype, &MEDIATYPE_Video) || !pmt->pbFormat) + if (!IsEqualIID(&mt->majortype, &MEDIATYPE_Video) || !mt->pbFormat) return S_FALSE;
- /* Ignore subtype, test for bicompression instead */ - if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) - { - VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)pmt->pbFormat; + if (!IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo) + && !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo2)) + return S_FALSE;
- This->bmiheader = format->bmiHeader; - This->VideoWidth = format->bmiHeader.biWidth; - This->VideoHeight = format->bmiHeader.biHeight; - SetRect(&This->source_rect, 0, 0, This->VideoWidth, This->VideoHeight); - } - else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2)) - { - VIDEOINFOHEADER2 *format = (VIDEOINFOHEADER2 *)pmt->pbFormat; + vih = (VIDEOINFOHEADER *)mt->pbFormat;
- This->bmiheader = format->bmiHeader; - This->VideoWidth = format->bmiHeader.biWidth; - This->VideoHeight = format->bmiHeader.biHeight; - SetRect(&This->source_rect, 0, 0, This->VideoWidth, This->VideoHeight); - } - else - { - ERR("Format type %s not supported\n", debugstr_guid(&pmt->formattype)); - return S_FALSE; - } - if (This->bmiheader.biCompression != BI_RGB) + if (vih->bmiHeader.biCompression != BI_RGB) return S_FALSE; return S_OK; } @@ -461,16 +443,33 @@ static HRESULT WINAPI VMR9_ShouldDrawSampleNow(struct strmbase_renderer *iface, return S_FALSE; }
-static HRESULT WINAPI VMR9_CompleteConnect(struct strmbase_renderer *This, IPin *pReceivePin) +static HRESULT vmr_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt) { - struct quartz_vmr *pVMR9 = impl_from_IBaseFilter(&This->filter.IBaseFilter_iface); + struct quartz_vmr *filter = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface); HRESULT hr;
- TRACE("(%p)\n", This); + if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo)) + { + VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)mt->pbFormat; + + filter->bmiheader = format->bmiHeader; + filter->VideoWidth = format->bmiHeader.biWidth; + filter->VideoHeight = format->bmiHeader.biHeight; + SetRect(&filter->source_rect, 0, 0, filter->VideoWidth, filter->VideoHeight); + } + else if (IsEqualIID(&mt->formattype, &FORMAT_VideoInfo2)) + { + VIDEOINFOHEADER2 *format = (VIDEOINFOHEADER2 *)mt->pbFormat; + + filter->bmiheader = format->bmiHeader; + filter->VideoWidth = format->bmiHeader.biWidth; + filter->VideoHeight = format->bmiHeader.biHeight; + SetRect(&filter->source_rect, 0, 0, filter->VideoWidth, filter->VideoHeight); + }
- if (pVMR9->mode || - SUCCEEDED(hr = IVMRFilterConfig9_SetRenderingMode(&pVMR9->IVMRFilterConfig9_iface, VMR9Mode_Windowed))) - hr = VMR9_maybe_init(pVMR9, FALSE); + if (filter->mode + || SUCCEEDED(hr = IVMRFilterConfig9_SetRenderingMode(&filter->IVMRFilterConfig9_iface, VMR9Mode_Windowed))) + hr = VMR9_maybe_init(filter, FALSE);
return hr; } @@ -576,7 +575,7 @@ static const struct strmbase_renderer_ops renderer_ops = .renderer_start_stream = vmr_start_stream, .renderer_stop_stream = vmr_stop_stream, .pfnShouldDrawSampleNow = VMR9_ShouldDrawSampleNow, - .pfnCompleteConnect = VMR9_CompleteConnect, + .renderer_connect = vmr_connect, .pfnBreakConnect = VMR9_BreakConnect, .renderer_destroy = vmr_destroy, .renderer_query_interface = vmr_query_interface, diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index d592ab034e..cedcd9a62a 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -52,8 +52,8 @@ static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt); if (SUCCEEDED(hr)) { - if (filter->pFuncsTable->pfnCompleteConnect) - hr = filter->pFuncsTable->pfnCompleteConnect(filter, peer); + if (filter->pFuncsTable->renderer_connect) + hr = filter->pFuncsTable->renderer_connect(filter, mt); } LeaveCriticalSection(&filter->filter.csFilter);
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 7e3b38b49d..461214cf08 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -523,7 +523,6 @@ typedef HRESULT (WINAPI *BaseRenderer_EndOfStream)(struct strmbase_renderer *ifa typedef HRESULT (WINAPI *BaseRenderer_BeginFlush) (struct strmbase_renderer *iface); typedef HRESULT (WINAPI *BaseRenderer_EndFlush) (struct strmbase_renderer *iface); typedef HRESULT (WINAPI *BaseRenderer_BreakConnect) (struct strmbase_renderer *iface); -typedef HRESULT (WINAPI *BaseRenderer_CompleteConnect) (struct strmbase_renderer *iface, IPin *peer);
struct strmbase_renderer_ops { @@ -534,7 +533,7 @@ struct strmbase_renderer_ops void (*renderer_stop_stream)(struct strmbase_renderer *iface); BaseRenderer_ShouldDrawSampleNow pfnShouldDrawSampleNow; BaseRenderer_PrepareReceive pfnPrepareReceive; - BaseRenderer_CompleteConnect pfnCompleteConnect; + HRESULT (*renderer_connect)(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt); BaseRenderer_BreakConnect pfnBreakConnect; BaseRenderer_EndOfStream pfnEndOfStream; BaseRenderer_EndFlush pfnEndFlush;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/avico.c | 4 +-- dlls/qcap/avimux.c | 4 +-- dlls/qcap/smartteefilter.c | 2 +- dlls/qedit/samplegrabber.c | 2 +- dlls/strmbase/pin.c | 56 +++++++++++++++++++++----------------- dlls/strmbase/renderer.c | 2 +- dlls/strmbase/transform.c | 2 +- include/wine/strmbase.h | 9 +++--- 8 files changed, 44 insertions(+), 37 deletions(-)
diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c index debe6bca38..f822d4e461 100644 --- a/dlls/qcap/avico.c +++ b/dlls/qcap/avico.c @@ -291,7 +291,7 @@ static HRESULT WINAPI AVICompressorIn_ReceiveConnection(IPin *iface,
hres = fill_format_info(This, (VIDEOINFOHEADER*)pmt->pbFormat); if(FAILED(hres)) - BasePinImpl_Disconnect(iface); + BaseInputPinImpl_Disconnect(iface); return hres; }
@@ -302,7 +302,7 @@ static HRESULT WINAPI AVICompressorIn_Disconnect(IPin *iface)
TRACE("(%p)\n", This);
- hres = BasePinImpl_Disconnect(iface); + hres = BaseInputPinImpl_Disconnect(iface); if(FAILED(hres)) return hres;
diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c index c344ab4726..63e98e8877 100644 --- a/dlls/qcap/avimux.c +++ b/dlls/qcap/avimux.c @@ -1469,7 +1469,7 @@ static HRESULT WINAPI AviMuxIn_ReceiveConnection(IPin *iface, if(SUCCEEDED(hr)) hr = IMemAllocator_Commit(avimuxin->samples_allocator); if(FAILED(hr)) { - BasePinImpl_Disconnect(iface); + BaseInputPinImpl_Disconnect(iface); return hr; }
@@ -1497,7 +1497,7 @@ static HRESULT WINAPI AviMuxIn_Disconnect(IPin *iface)
TRACE("pin %p.\n", avimuxin);
- hr = BasePinImpl_Disconnect(iface); + hr = BaseInputPinImpl_Disconnect(iface); if(FAILED(hr)) return hr;
diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c index 929929632f..e1fcea55f9 100644 --- a/dlls/qcap/smartteefilter.c +++ b/dlls/qcap/smartteefilter.c @@ -87,7 +87,7 @@ static const IPinVtbl SmartTeeFilterInputVtbl = { BasePinImpl_Release, BaseInputPinImpl_Connect, BaseInputPinImpl_ReceiveConnection, - BasePinImpl_Disconnect, + BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, BasePinImpl_QueryPinInfo, diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c index f8d90a5c0d..c65ab9caa7 100644 --- a/dlls/qedit/samplegrabber.c +++ b/dlls/qedit/samplegrabber.c @@ -523,7 +523,7 @@ static const IPinVtbl sink_vtbl = BasePinImpl_Release, BaseInputPinImpl_Connect, SampleGrabber_In_IPin_ReceiveConnection, - BasePinImpl_Disconnect, + BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, BasePinImpl_QueryPinInfo, diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c index bcac22eb3c..5255a6c7b0 100644 --- a/dlls/strmbase/pin.c +++ b/dlls/strmbase/pin.c @@ -119,31 +119,6 @@ ULONG WINAPI BasePinImpl_Release(IPin *iface) return IBaseFilter_Release(&pin->filter->IBaseFilter_iface); }
-HRESULT WINAPI BasePinImpl_Disconnect(IPin * iface) -{ - struct strmbase_pin *This = impl_from_IPin(iface); - HRESULT hr; - - TRACE("(%p)->()\n", This); - - EnterCriticalSection(&This->filter->csFilter); - { - if (This->peer) - { - IPin_Release(This->peer); - This->peer = NULL; - FreeMediaType(&This->mt); - ZeroMemory(&This->mt, sizeof(This->mt)); - hr = S_OK; - } - else - hr = S_FALSE; - } - LeaveCriticalSection(&This->filter->csFilter); - - return hr; -} - HRESULT WINAPI BasePinImpl_ConnectedTo(IPin * iface, IPin ** ppPin) { struct strmbase_pin *This = impl_from_IPin(iface); @@ -685,6 +660,9 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP } }
+ if (SUCCEEDED(hr) && This->pFuncsTable->sink_connect) + hr = This->pFuncsTable->sink_connect(This, pReceivePin, pmt); + if (SUCCEEDED(hr)) { CopyMediaType(&This->pin.mt, pmt); @@ -697,6 +675,34 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP return hr; }
+HRESULT WINAPI BaseInputPinImpl_Disconnect(IPin *iface) +{ + struct strmbase_sink *pin = impl_sink_from_IPin(iface); + HRESULT hr; + + TRACE("pin %p.\n", pin); + + EnterCriticalSection(&pin->pin.filter->csFilter); + + if (pin->pin.peer) + { + if (pin->pFuncsTable->sink_disconnect) + pin->pFuncsTable->sink_disconnect(pin); + + IPin_Release(pin->pin.peer); + pin->pin.peer = NULL; + FreeMediaType(&pin->pin.mt); + memset(&pin->pin.mt, 0, sizeof(AM_MEDIA_TYPE)); + hr = S_OK; + } + else + hr = S_FALSE; + + LeaveCriticalSection(&pin->pin.filter->csFilter); + + return hr; +} + static HRESULT deliver_endofstream(IPin* pin, LPVOID unused) { return IPin_EndOfStream( pin ); diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index cedcd9a62a..7d8dbdfa93 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -68,7 +68,7 @@ static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface) TRACE("iface %p.\n", iface);
EnterCriticalSection(&filter->filter.csFilter); - hr = BasePinImpl_Disconnect(iface); + hr = BaseInputPinImpl_Disconnect(iface); if (SUCCEEDED(hr)) { if (filter->pFuncsTable->pfnBreakConnect) diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index 30ed0006cb..bf74ad0f49 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -427,7 +427,7 @@ static HRESULT WINAPI TransformFilter_InputPin_Disconnect(IPin * iface) if (pTransform->pFuncsTable->pfnBreakConnect) pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
- return BasePinImpl_Disconnect(iface); + return BaseInputPinImpl_Disconnect(iface); }
static HRESULT WINAPI TransformFilter_InputPin_BeginFlush(IPin * iface) diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 461214cf08..83ad2e0bd6 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -91,9 +91,10 @@ typedef HRESULT (WINAPI *BaseInputPin_Receive)(struct strmbase_sink *This, IMedi
struct strmbase_sink_ops { - BasePinFuncTable base; - /* Optional */ - BaseInputPin_Receive pfnReceive; + BasePinFuncTable base; + BaseInputPin_Receive pfnReceive; + HRESULT (*sink_connect)(struct strmbase_sink *pin, IPin *peer, const AM_MEDIA_TYPE *mt); + void (*sink_disconnect)(struct strmbase_sink *pin); };
/* Base Pin */ @@ -102,7 +103,7 @@ LONG WINAPI BasePinImpl_GetMediaTypeVersion(struct strmbase_pin *pin); HRESULT WINAPI BasePinImpl_QueryInterface(IPin *iface, REFIID iid, void **out); ULONG WINAPI BasePinImpl_AddRef(IPin *iface); ULONG WINAPI BasePinImpl_Release(IPin *iface); -HRESULT WINAPI BasePinImpl_Disconnect(IPin * iface); +HRESULT WINAPI BaseInputPinImpl_Disconnect(IPin * iface); HRESULT WINAPI BasePinImpl_ConnectedTo(IPin * iface, IPin ** ppPin); HRESULT WINAPI BasePinImpl_ConnectionMediaType(IPin * iface, AM_MEDIA_TYPE * pmt); HRESULT WINAPI BasePinImpl_QueryPinInfo(IPin * iface, PIN_INFO * pInfo);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/transform.c | 56 +++++++++++++++------------------------ 1 file changed, 21 insertions(+), 35 deletions(-)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index bf74ad0f49..993e30202b 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -212,12 +212,31 @@ static HRESULT sink_query_interface(struct strmbase_pin *iface, REFIID iid, void return S_OK; }
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt) +{ + TransformFilter *filter = impl_from_sink_IPin(&iface->pin.IPin_iface); + + if (filter->pFuncsTable->transform_connect_sink) + return filter->pFuncsTable->transform_connect_sink(filter, mt); + return S_OK; +} + +static void sink_disconnect(struct strmbase_sink *iface) +{ + TransformFilter *filter = impl_from_sink_IPin(&iface->pin.IPin_iface); + + if (filter->pFuncsTable->pfnBreakConnect) + filter->pFuncsTable->pfnBreakConnect(filter, PINDIR_INPUT); +} + static const struct strmbase_sink_ops sink_ops = { .base.pin_query_accept = sink_query_accept, .base.pin_get_media_type = strmbase_pin_get_media_type, .base.pin_query_interface = sink_query_interface, .pfnReceive = TransformFilter_Input_Receive, + .sink_connect = sink_connect, + .sink_disconnect = sink_disconnect, };
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out) @@ -397,39 +416,6 @@ static HRESULT WINAPI TransformFilter_InputPin_EndOfStream(IPin * iface) return VFW_E_NOT_CONNECTED; }
-static HRESULT WINAPI TransformFilter_InputPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt) -{ - TransformFilter *pTransform = impl_from_sink_IPin(iface); - HRESULT hr = S_OK; - - TRACE("(%p)->(%p, %p)\n", iface, pReceivePin, pmt); - strmbase_dump_media_type(pmt); - - if (pTransform->pFuncsTable->transform_connect_sink) - hr = pTransform->pFuncsTable->transform_connect_sink(pTransform, pmt); - - if (SUCCEEDED(hr)) - { - hr = BaseInputPinImpl_ReceiveConnection(iface, pReceivePin, pmt); - if (FAILED(hr) && pTransform->pFuncsTable->pfnBreakConnect) - pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT); - } - - return hr; -} - -static HRESULT WINAPI TransformFilter_InputPin_Disconnect(IPin * iface) -{ - TransformFilter *pTransform = impl_from_sink_IPin(iface); - - TRACE("(%p)->()\n", iface); - - if (pTransform->pFuncsTable->pfnBreakConnect) - pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT); - - return BaseInputPinImpl_Disconnect(iface); -} - static HRESULT WINAPI TransformFilter_InputPin_BeginFlush(IPin * iface) { TransformFilter *pTransform = impl_from_sink_IPin(iface); @@ -483,8 +469,8 @@ static const IPinVtbl TransformFilter_InputPin_Vtbl = BasePinImpl_AddRef, BasePinImpl_Release, BaseInputPinImpl_Connect, - TransformFilter_InputPin_ReceiveConnection, - TransformFilter_InputPin_Disconnect, + BaseInputPinImpl_ReceiveConnection, + BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, BasePinImpl_QueryPinInfo,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- v4: fix test failures.
As regards the todo_wine introduced by this patch, the bug is legitimate (native can handle 24 bpp) and was previously masked by the fact that we did not reinitialize the VMR9 on every connection.
dlls/quartz/tests/vmr7.c | 2 +- dlls/quartz/tests/vmr9.c | 21 +++++++++----- dlls/quartz/vmr9.c | 8 +++-- dlls/strmbase/renderer.c | 63 ++++++++++++++-------------------------- 4 files changed, 40 insertions(+), 54 deletions(-)
diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c index dae86bd3fa..4a971dcdc1 100644 --- a/dlls/quartz/tests/vmr7.c +++ b/dlls/quartz/tests/vmr7.c @@ -1392,7 +1392,7 @@ static void test_connect_pin(void) hr = IFilterGraph2_Disconnect(graph, pin); ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source.source.pin.peer == pin, "Got peer %p.\n", peer); IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c index 5ece5c6f7b..241394277b 100644 --- a/dlls/quartz/tests/vmr9.c +++ b/dlls/quartz/tests/vmr9.c @@ -901,7 +901,8 @@ static HRESULT WINAPI testsource_AttemptConnection(struct strmbase_source *iface
if (FAILED(hr = IPin_ReceiveConnection(peer, &iface->pin.IPin_iface, mt))) { - ok(hr == VFW_E_TYPE_NOT_ACCEPTED || hr == E_FAIL, "Got hr %#x.\n", hr); + todo_wine_if (((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader.biBitCount == 24) + ok(hr == VFW_E_TYPE_NOT_ACCEPTED || hr == E_FAIL, "Got hr %#x.\n", hr); IPin_Release(peer); iface->pin.peer = NULL; FreeMediaType(&iface->pin.mt); @@ -1315,13 +1316,17 @@ static void test_connect_pin(void) skip("Got E_FAIL when connecting.\n"); goto out; } - ok(hr == S_OK, "Got hr %#x for subtype %s and bpp %u.\n", hr, - wine_dbgstr_guid(subtype_tests[i]), bpp_tests[j]); + todo_wine_if (bpp_tests[j] == 24) + ok(hr == S_OK, "Got hr %#x for subtype %s and bpp %u.\n", hr, + wine_dbgstr_guid(subtype_tests[i]), bpp_tests[j]);
- hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#x.\n", hr); - hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#x.\n", hr); + if (hr == S_OK) + { + hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IFilterGraph2_Disconnect(graph, pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + } } }
@@ -1391,7 +1396,7 @@ static void test_connect_pin(void) hr = IFilterGraph2_Disconnect(graph, pin); ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source.source.pin.peer == pin, "Got peer %p.\n", source.source.pin.peer); IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index a9b90b322d..a3391870a7 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -356,7 +356,7 @@ static HRESULT VMR9_maybe_init(struct quartz_vmr *This, BOOL force) HRESULT hr;
TRACE("my mode: %u, my window: %p, my last window: %p\n", This->mode, This->baseControlWindow.baseWindow.hWnd, This->hWndClippingWindow); - if (This->num_surfaces || !This->renderer.sink.pin.peer) + if (This->num_surfaces) return S_OK;
if (This->mode == VMR9Mode_Windowless && !This->hWndClippingWindow) @@ -410,7 +410,8 @@ static void vmr_start_stream(struct strmbase_renderer *iface)
TRACE("(%p)\n", This);
- VMR9_maybe_init(This, TRUE); + if (This->renderer.sink.pin.peer) + VMR9_maybe_init(This, TRUE); IVMRImagePresenter9_StartPresenting(This->presenter, This->cookie); SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL, This->source_rect.left, @@ -1760,7 +1761,8 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoClippingWindow(IVMRWindowles
EnterCriticalSection(&This->renderer.filter.csFilter); This->hWndClippingWindow = hwnd; - VMR9_maybe_init(This, FALSE); + if (This->renderer.sink.pin.peer) + VMR9_maybe_init(This, FALSE); if (!hwnd) IVMRSurfaceAllocatorEx9_TerminateDevice(This->allocator, This->cookie); LeaveCriticalSection(&This->renderer.filter.csFilter); diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index 7d8dbdfa93..7b9736ccfb 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -40,46 +40,6 @@ static inline struct strmbase_renderer *impl_from_IPin(IPin *iface) return CONTAINING_RECORD(iface, struct strmbase_renderer, sink.pin.IPin_iface); }
-static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt) -{ - struct strmbase_renderer *filter = impl_from_IPin(iface); - HRESULT hr; - - TRACE("iface %p, peer %p, mt %p.\n", iface, peer, mt); - strmbase_dump_media_type(mt); - - EnterCriticalSection(&filter->filter.csFilter); - hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt); - if (SUCCEEDED(hr)) - { - if (filter->pFuncsTable->renderer_connect) - hr = filter->pFuncsTable->renderer_connect(filter, mt); - } - LeaveCriticalSection(&filter->filter.csFilter); - - return hr; -} - -static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface) -{ - struct strmbase_renderer *filter = impl_from_IPin(iface); - HRESULT hr; - - TRACE("iface %p.\n", iface); - - EnterCriticalSection(&filter->filter.csFilter); - hr = BaseInputPinImpl_Disconnect(iface); - if (SUCCEEDED(hr)) - { - if (filter->pFuncsTable->pfnBreakConnect) - hr = filter->pFuncsTable->pfnBreakConnect(filter); - } - BaseRendererImpl_ClearPendingSample(filter); - LeaveCriticalSection(&filter->filter.csFilter); - - return hr; -} - static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface) { struct strmbase_renderer *filter = impl_from_IPin(iface); @@ -157,8 +117,8 @@ static const IPinVtbl BaseRenderer_InputPin_Vtbl = BasePinImpl_AddRef, BasePinImpl_Release, BaseInputPinImpl_Connect, - BaseRenderer_InputPin_ReceiveConnection, - BaseRenderer_InputPin_Disconnect, + BaseInputPinImpl_ReceiveConnection, + BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, BasePinImpl_QueryPinInfo, @@ -312,12 +272,31 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp return BaseRendererImpl_Receive(filter, sample); }
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt) +{ + struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface); + + if (filter->pFuncsTable->renderer_connect) + return filter->pFuncsTable->renderer_connect(filter, mt); + return S_OK; +} + +static void sink_disconnect(struct strmbase_sink *iface) +{ + struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface); + + if (filter->pFuncsTable->pfnBreakConnect) + filter->pFuncsTable->pfnBreakConnect(filter); +} + static const struct strmbase_sink_ops sink_ops = { .base.pin_query_accept = sink_query_accept, .base.pin_query_interface = sink_query_interface, .base.pin_get_media_type = strmbase_pin_get_media_type, .pfnReceive = BaseRenderer_Receive, + .sink_connect = sink_connect, + .sink_disconnect = sink_disconnect, };
void strmbase_renderer_cleanup(struct strmbase_renderer *filter)