From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/amstream/ddrawstream.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c index 927014efc04..6020cae9fef 100644 --- a/dlls/amstream/ddrawstream.c +++ b/dlls/amstream/ddrawstream.c @@ -2237,8 +2237,9 @@ static HRESULT WINAPI media_sample_GetMediaType(IMediaSample *iface, AM_MEDIA_TY
TRACE("sample %p, ret_mt %p.\n", sample, ret_mt);
- if (!(*ret_mt = CreateMediaType(&sample->parent->mt))) + if (!(*ret_mt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)))) return E_OUTOFMEMORY; + set_mt_from_desc(*ret_mt, &sample->surface_desc); return S_OK; }
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/amstream/ddrawstream.c | 20 ++++++++++++-------- dlls/amstream/tests/amstream.c | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c index 6020cae9fef..bc9431c37a8 100644 --- a/dlls/amstream/ddrawstream.c +++ b/dlls/amstream/ddrawstream.c @@ -614,7 +614,6 @@ static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStr const DDSURFACEDESC *format, IDirectDrawPalette *palette) { struct ddraw_stream *stream = impl_from_IDirectDrawMediaStream(iface); - AM_MEDIA_TYPE old_media_type; struct format old_format; IPin *old_peer; HRESULT hr; @@ -699,6 +698,8 @@ static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStr
if (stream->peer && !is_format_compatible(stream, old_format.width, old_format.height, &old_format.pf)) { + AM_MEDIA_TYPE new_mt; + if (stream->sample_refs > 0) { stream->format = old_format; @@ -706,31 +707,34 @@ static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStr return MS_E_SAMPLEALLOC; }
- old_media_type = stream->mt; - - set_mt_from_desc(&stream->mt, format); + set_mt_from_desc(&new_mt, format);
- if (!stream->using_private_allocator || IPin_QueryAccept(stream->peer, &stream->mt) != S_OK) + if (!stream->using_private_allocator || IPin_QueryAccept(stream->peer, &new_mt) != S_OK) { + AM_MEDIA_TYPE old_mt; + /* Reconnect. */ old_peer = stream->peer; IPin_AddRef(old_peer); + CopyMediaType(&old_mt, &stream->mt);
IFilterGraph_Disconnect(stream->graph, stream->peer); IFilterGraph_Disconnect(stream->graph, &stream->IPin_iface); if (FAILED(hr = IFilterGraph_ConnectDirect(stream->graph, old_peer, &stream->IPin_iface, NULL))) { stream->format = old_format; - IFilterGraph_ConnectDirect(stream->graph, old_peer, &stream->IPin_iface, &old_media_type); + IFilterGraph_ConnectDirect(stream->graph, old_peer, &stream->IPin_iface, &old_mt); IPin_Release(old_peer); - FreeMediaType(&old_media_type); + FreeMediaType(&old_mt); + FreeMediaType(&new_mt); LeaveCriticalSection(&stream->cs); return DDERR_INVALIDSURFACETYPE; } + FreeMediaType(&old_mt); IPin_Release(old_peer); }
- FreeMediaType(&old_media_type); + FreeMediaType(&new_mt); }
LeaveCriticalSection(&stream->cs); diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index e4a55475005..96e7fabe22f 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -9197,7 +9197,7 @@ static void test_ddrawstream_set_format_dynamic(void) "Got subtype %s.\n", wine_dbgstr_guid(&source.source.pin.mt.subtype)); hr = IPin_ConnectionMediaType(pin, &mt); ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(IsEqualGUID(&mt.subtype, &MEDIASUBTYPE_RGB8), + ok(IsEqualGUID(&mt.subtype, &MEDIASUBTYPE_RGB8), "Got subtype %s.\n", wine_dbgstr_guid(&mt.subtype)); CoTaskMemFree(mt.pbFormat); hr = IDirectDrawMediaStream_GetFormat(ddraw_stream, ¤t_format, NULL, &desired_format, NULL);
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/amstream/ddrawstream.c | 11 +++++------ dlls/amstream/tests/amstream.c | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c index bc9431c37a8..2c68be7a945 100644 --- a/dlls/amstream/ddrawstream.c +++ b/dlls/amstream/ddrawstream.c @@ -553,7 +553,7 @@ static unsigned int align(unsigned int n, unsigned int alignment) return (n + alignment - 1) & ~(alignment - 1); }
-static void set_mt_from_desc(AM_MEDIA_TYPE *mt, const DDSURFACEDESC *format) +static void set_mt_from_desc(AM_MEDIA_TYPE *mt, const DDSURFACEDESC *format, unsigned int pitch) { VIDEOINFO *videoinfo = CoTaskMemAlloc(sizeof(VIDEOINFO));
@@ -565,13 +565,12 @@ static void set_mt_from_desc(AM_MEDIA_TYPE *mt, const DDSURFACEDESC *format)
memset(videoinfo, 0, sizeof(*videoinfo)); videoinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - videoinfo->bmiHeader.biWidth = format->dwWidth; + videoinfo->bmiHeader.biWidth = pitch * 8 / format->ddpfPixelFormat.dwRGBBitCount; videoinfo->bmiHeader.biHeight = format->dwHeight; videoinfo->bmiHeader.biBitCount = format->ddpfPixelFormat.dwRGBBitCount; videoinfo->bmiHeader.biCompression = BI_RGB; videoinfo->bmiHeader.biPlanes = 1; - videoinfo->bmiHeader.biSizeImage = - align(format->dwWidth * format->dwHeight * format->ddpfPixelFormat.dwRGBBitCount / 8, 4); + videoinfo->bmiHeader.biSizeImage = align(pitch * format->dwHeight, 4);
mt->lSampleSize = videoinfo->bmiHeader.biSizeImage; mt->bFixedSizeSamples = TRUE; @@ -707,7 +706,7 @@ static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStr return MS_E_SAMPLEALLOC; }
- set_mt_from_desc(&new_mt, format); + set_mt_from_desc(&new_mt, format, format->dwWidth * format->ddpfPixelFormat.dwRGBBitCount / 8);
if (!stream->using_private_allocator || IPin_QueryAccept(stream->peer, &new_mt) != S_OK) { @@ -2243,7 +2242,7 @@ static HRESULT WINAPI media_sample_GetMediaType(IMediaSample *iface, AM_MEDIA_TY
if (!(*ret_mt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)))) return E_OUTOFMEMORY; - set_mt_from_desc(*ret_mt, &sample->surface_desc); + set_mt_from_desc(*ret_mt, &sample->surface_desc, sample->surface_desc.lPitch); return S_OK; }
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index 96e7fabe22f..06f2e43f7f7 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -8857,7 +8857,7 @@ static void test_ddrawstream_mem_allocator(void) "Got subtype %s.\n", debugstr_guid(&sample_mt->subtype)); ok(sample_mt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", sample_mt->bFixedSizeSamples); ok(!sample_mt->bTemporalCompression, "Got temporal compression %d.\n", sample_mt->bTemporalCompression); - todo_wine ok(sample_mt->lSampleSize == expect_pitch * 444, + ok(sample_mt->lSampleSize == expect_pitch * 444, "Expected sample size %u, got %lu.\n", expect_pitch * 444, sample_mt->lSampleSize); ok(IsEqualGUID(&sample_mt->formattype, &FORMAT_VideoInfo), "Got format type %s.\n", debugstr_guid(&sample_mt->formattype)); @@ -8873,7 +8873,7 @@ static void test_ddrawstream_mem_allocator(void)
hr = IMediaSample_GetMediaType(media_sample1, &sample_mt); ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(sample_mt->lSampleSize == expect_pitch * 444, + ok(sample_mt->lSampleSize == expect_pitch * 444, "Expected sample size %u, got %lu.\n", expect_pitch * 444, sample_mt->lSampleSize);
video_info = (VIDEOINFOHEADER *)sample_mt->pbFormat;
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/amstream/ddrawstream.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c index 2c68be7a945..e47c23749f0 100644 --- a/dlls/amstream/ddrawstream.c +++ b/dlls/amstream/ddrawstream.c @@ -564,6 +564,8 @@ static void set_mt_from_desc(AM_MEDIA_TYPE *mt, const DDSURFACEDESC *format, uns mt->pbFormat = (BYTE *)videoinfo;
memset(videoinfo, 0, sizeof(*videoinfo)); + SetRect(&videoinfo->rcSource, 0, 0, format->dwWidth, format->dwHeight); + SetRect(&videoinfo->rcTarget, 0, 0, format->dwWidth, format->dwHeight); videoinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); videoinfo->bmiHeader.biWidth = pitch * 8 / format->ddpfPixelFormat.dwRGBBitCount; videoinfo->bmiHeader.biHeight = format->dwHeight;
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/amstream/ddrawstream.c | 2 +- dlls/amstream/tests/amstream.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c index e47c23749f0..9df61bfe885 100644 --- a/dlls/amstream/ddrawstream.c +++ b/dlls/amstream/ddrawstream.c @@ -568,7 +568,7 @@ static void set_mt_from_desc(AM_MEDIA_TYPE *mt, const DDSURFACEDESC *format, uns SetRect(&videoinfo->rcTarget, 0, 0, format->dwWidth, format->dwHeight); videoinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); videoinfo->bmiHeader.biWidth = pitch * 8 / format->ddpfPixelFormat.dwRGBBitCount; - videoinfo->bmiHeader.biHeight = format->dwHeight; + videoinfo->bmiHeader.biHeight = -format->dwHeight; videoinfo->bmiHeader.biBitCount = format->ddpfPixelFormat.dwRGBBitCount; videoinfo->bmiHeader.biCompression = BI_RGB; videoinfo->bmiHeader.biPlanes = 1; diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index 06f2e43f7f7..1f0cf7f7017 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -1212,7 +1212,7 @@ static HRESULT testsource_query_accept(struct strmbase_pin *iface, const AM_MEDI "Got format type %s.\n", debugstr_guid(&mt->formattype)); ok(!mt->pUnk, "Got pUnk %p.\n", mt->pUnk); ok(mt->cbFormat == sizeof(VIDEOINFO), "Got format size %lu.\n", mt->cbFormat); - todo_wine_if (expect_video_info.bmiHeader.biSizeImage || filter->query_accept_rgb8_palette) + todo_wine_if (filter->query_accept_rgb8_palette) ok(!memcmp(mt->pbFormat, &expect_video_info, mt->cbFormat), "Format blocks didn't match.\n"); }
@@ -8863,7 +8863,7 @@ static void test_ddrawstream_mem_allocator(void) "Got format type %s.\n", debugstr_guid(&sample_mt->formattype)); ok(!sample_mt->pUnk, "Got pUnk %p.\n", sample_mt->pUnk); ok(sample_mt->cbFormat == sizeof(VIDEOINFO), "Got format size %lu.\n", sample_mt->cbFormat); - todo_wine ok(!memcmp(sample_mt->pbFormat, &expect_video_info, sizeof(VIDEOINFO)), "Format blocks didn't match.\n"); + ok(!memcmp(sample_mt->pbFormat, &expect_video_info, sizeof(VIDEOINFO)), "Format blocks didn't match.\n");
sample_mt->lSampleSize = 123; hr = IMediaSample_SetMediaType(media_sample1, sample_mt); @@ -9114,7 +9114,7 @@ static void test_ddrawstream_mem_allocator(void) "Got format type %s.\n", debugstr_guid(&sample_mt->formattype)); ok(!sample_mt->pUnk, "Got pUnk %p.\n", sample_mt->pUnk); ok(sample_mt->cbFormat == sizeof(VIDEOINFO), "Got format size %lu.\n", sample_mt->cbFormat); - todo_wine ok(!memcmp(sample_mt->pbFormat, &expect_video_info, sizeof(VIDEOINFO)), "Format blocks didn't match.\n"); + ok(!memcmp(sample_mt->pbFormat, &expect_video_info, sizeof(VIDEOINFO)), "Format blocks didn't match.\n");
ref = IMediaSample_Release(media_sample1); ok(!ref, "Got refcount %ld.\n", ref);