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 8eea6ab147d..33d9debe5cd 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 32969a34730..abed957fa6d 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 7a79f709055..30ed0006cb1 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 ee1851dfdc6..d44a6ae33a6 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 3da0738aecb..4be654e5a10 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 c3699f19253..7e3b38b49d5 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 cad210a8762..6fd49dac9b5 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 60c19e00191..a9b90b322dd 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 d592ab034e6..cedcd9a62a0 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 7e3b38b49d5..461214cf082 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 debe6bca386..f822d4e4616 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 c344ab47266..63e98e8877b 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 929929632f1..e1fcea55f91 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 f8d90a5c0df..c65ab9caa70 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 bcac22eb3c4..5255a6c7b0b 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 cedcd9a62a0..7d8dbdfa936 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 30ed0006cb1..bf74ad0f491 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 461214cf082..83ad2e0bd6e 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 bf74ad0f491..993e30202bc 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 --- dlls/quartz/vmr9.c | 8 +++-- dlls/strmbase/renderer.c | 63 ++++++++++++++-------------------------- 2 files changed, 26 insertions(+), 45 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index a9b90b322dd..a3391870a76 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 7d8dbdfa936..7b9736ccfb2 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)
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=61758
Your paranoid android.
=== debian10 (32 bit report) ===
quartz: vmr7.c:1395: Test succeeded inside todo block: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7c-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7b-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7d-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7e-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:1394: Test succeeded inside todo block: Got hr 0x1.
=== debian10 (32 bit Chinese:China report) ===
quartz: vmr7.c:1395: Test succeeded inside todo block: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7c-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7b-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7d-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7e-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:1394: Test succeeded inside todo block: Got hr 0x1.
=== debian10 (32 bit WoW report) ===
quartz: vmr7.c:1395: Test succeeded inside todo block: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7c-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7b-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7d-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7e-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:1394: Test succeeded inside todo block: Got hr 0x1.
=== debian10 (64 bit WoW report) ===
quartz: vmr7.c:1395: Test succeeded inside todo block: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7c-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7b-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7d-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:904: Test failed: Got hr 0x80040227. vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7e-524f-11ce-9f53-0020af0ba770} and bpp 24. vmr9.c:1322: Test failed: Got hr 0x1. vmr9.c:1324: Test failed: Got hr 0x1. vmr9.c:1394: Test succeeded inside todo block: Got hr 0x1.