From: Brendan McGrath <bmcgrath@codeweavers.com> --- dlls/amstream/ddrawstream.c | 43 ++++++++++++++++++++++++---------- dlls/amstream/tests/amstream.c | 7 +----- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c index 49257554d90..4887927315e 100644 --- a/dlls/amstream/ddrawstream.c +++ b/dlls/amstream/ddrawstream.c @@ -97,6 +97,8 @@ struct ddraw_sample static HRESULT ddrawstreamsample_create(struct ddraw_stream *parent, IDirectDrawSurface *surface, const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample); +static HRESULT WINAPI ddrawstream_check_pixel_format(const DDSURFACEDESC *format); + static void remove_queued_update(struct ddraw_sample *sample) { sample->pending = false; @@ -326,6 +328,7 @@ static HRESULT WINAPI ddraw_IAMMediaStream_Initialize(IAMMediaStream *iface, IUn REFMSPID purpose_id, const STREAM_TYPE stream_type) { struct ddraw_stream *stream = impl_from_IAMMediaStream(iface); + DDSURFACEDESC desc = { .dwSize = sizeof(desc) }; HRESULT hr; TRACE("stream %p, source_object %p, flags %lx, purpose_id %s, stream_type %u.\n", stream, source_object, flags, @@ -348,6 +351,14 @@ static HRESULT WINAPI ddraw_IAMMediaStream_Initialize(IAMMediaStream *iface, IUn && FAILED(hr = IUnknown_QueryInterface(source_object, &IID_IDirectDraw, (void **)&stream->ddraw))) FIXME("Stream object doesn't implement IDirectDraw interface, hr %#lx.\n", hr); + if (stream->ddraw + && SUCCEEDED(IDirectDraw_GetDisplayMode(stream->ddraw, &desc)) + && SUCCEEDED(ddrawstream_check_pixel_format(&desc))) + { + stream->format.flags |= DDSD_PIXELFORMAT; + stream->format.pf = desc.ddpfPixelFormat; + } + if (!source_object) { if (FAILED(hr = DirectDrawCreate(NULL, &stream->ddraw, NULL))) @@ -609,19 +620,8 @@ static void set_mt_from_desc(AM_MEDIA_TYPE *mt, const DDSURFACEDESC *format, uns } } -static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStream *iface, - const DDSURFACEDESC *format, IDirectDrawPalette *palette) +static HRESULT WINAPI ddrawstream_check_pixel_format(const DDSURFACEDESC *format) { - struct ddraw_stream *stream = impl_from_IDirectDrawMediaStream(iface); - struct format old_format; - IPin *old_peer; - HRESULT hr; - - TRACE("stream %p, format %p, palette %p.\n", stream, format, palette); - - if (palette) - FIXME("Setting palette is not yet supported.\n"); - if (!format) return E_POINTER; @@ -717,6 +717,25 @@ static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStr } } + return S_OK; +} + +static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStream *iface, + const DDSURFACEDESC *format, IDirectDrawPalette *palette) +{ + struct ddraw_stream *stream = impl_from_IDirectDrawMediaStream(iface); + struct format old_format; + IPin *old_peer; + HRESULT hr; + + TRACE("stream %p, format %p, palette %p.\n", stream, format, palette); + + if (palette) + FIXME("Setting palette is not yet supported.\n"); + + if (FAILED(hr = ddrawstream_check_pixel_format(format))) + return hr; + EnterCriticalSection(&stream->cs); old_format = stream->format; diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index ef482f6cd0a..41168352d84 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -3246,7 +3246,7 @@ static void test_media_types(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); hr = IDirectDrawMediaStream_GetFormat(ddraw_stream, ¤t, &palette, &desired, &flags); - ok(hr == 0x80040403, "Got hr %#lx.\n", hr); + ok(hr == MS_E_NOSTREAM, "Got hr %#lx.\n", hr); memset(&mt, 0, sizeof(mt)); mt.majortype = MEDIATYPE_Video; @@ -3258,17 +3258,14 @@ static void test_media_types(void) mt.pbFormat = (BYTE*) &req_vih; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); mt.subtype = MEDIASUBTYPE_RGB8; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); mt.subtype = MEDIASUBTYPE_RGB32; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); testfilter_init(&source); @@ -3281,14 +3278,12 @@ static void test_media_types(void) mt.subtype = MEDIASUBTYPE_RGB8; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); hr = IPin_Disconnect(pin); ok(hr == S_OK, "Got hr %#lx.\n", hr); hr = IPin_ReceiveConnection(pin, &source.source.pin.IPin_iface, &mt); - todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); IPin_Release(pin); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10643