From f595d9bdfff179e32bbbfdb1727d89b9c6192311 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Tue, 10 Dec 2019 10:35:12 -0600 Subject: [PATCH] strmbase: Pass an AM_MEDIA_TYPE pointer to CompleteConnect(). Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/quartz/dsoundrender.c | 13 +++----- dlls/quartz/vmr9.c | 67 +++++++++++++++++++------------------- dlls/strmbase/renderer.c | 4 +-- include/wine/strmbase.h | 3 +- 4 files changed, 40 insertions(+), 47 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; - - 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; - - 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)); + if (!IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo) + && !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo2)) return S_FALSE; - } - if (This->bmiheader.biCompression != BI_RGB) + + vih = (VIDEOINFOHEADER *)mt->pbFormat; + + 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; - if (pVMR9->mode || - SUCCEEDED(hr = IVMRFilterConfig9_SetRenderingMode(&pVMR9->IVMRFilterConfig9_iface, VMR9Mode_Windowed))) - hr = VMR9_maybe_init(pVMR9, FALSE); + 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 (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;