Skip to content

Commit f0c8b97

Browse files
author
Brendan McGrath
committed
amstream: Return current format in media type enum.
(cherry picked from commit 14dc856a6db30fa63384c80111f4641cf555fff3) CW-Bug-Id: #26731
1 parent cf5d4d4 commit f0c8b97

2 files changed

Lines changed: 32 additions & 5 deletions

File tree

dlls/amstream/ddrawstream.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,8 @@ struct enum_media_types
922922
IEnumMediaTypes IEnumMediaTypes_iface;
923923
LONG refcount;
924924
unsigned int index;
925+
926+
struct ddraw_stream *stream;
925927
};
926928

927929
static const IEnumMediaTypesVtbl enum_media_types_vtbl;
@@ -961,13 +963,19 @@ static ULONG WINAPI enum_media_types_Release(IEnumMediaTypes *iface)
961963
ULONG refcount = InterlockedDecrement(&enum_media_types->refcount);
962964
TRACE("%p decreasing refcount to %lu.\n", enum_media_types, refcount);
963965
if (!refcount)
966+
{
967+
IAMMediaStream_Release(&enum_media_types->stream->IAMMediaStream_iface);
964968
free(enum_media_types);
969+
}
965970
return refcount;
966971
}
967972

968973
static HRESULT WINAPI enum_media_types_Next(IEnumMediaTypes *iface, ULONG count, AM_MEDIA_TYPE **mts, ULONG *ret_count)
969974
{
970975
struct enum_media_types *enum_media_types = impl_from_IEnumMediaTypes(iface);
976+
struct format *format;
977+
DWORD bytes_per_pixel;
978+
GUID *subtype;
971979

972980
TRACE("iface %p, count %lu, mts %p, ret_count %p.\n", iface, count, mts, ret_count);
973981

@@ -976,12 +984,29 @@ static HRESULT WINAPI enum_media_types_Next(IEnumMediaTypes *iface, ULONG count,
976984

977985
if (count && !enum_media_types->index)
978986
{
987+
format = &enum_media_types->stream->format;
979988
mts[0] = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
980989
memset(mts[0], 0, sizeof(AM_MEDIA_TYPE));
981990
mts[0]->majortype = MEDIATYPE_Video;
982-
mts[0]->subtype = MEDIASUBTYPE_RGB8;
991+
if (enum_media_types->stream->format.flags & DDSD_PIXELFORMAT)
992+
subtype_from_pf(&mts[0]->subtype, &format->pf);
993+
else
994+
mts[0]->subtype = MEDIASUBTYPE_RGB8;
995+
983996
mts[0]->bFixedSizeSamples = TRUE;
984-
mts[0]->lSampleSize = 10000;
997+
998+
subtype = &mts[0]->subtype;
999+
if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB8))
1000+
bytes_per_pixel = 1;
1001+
if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB555)
1002+
|| IsEqualGUID(subtype, &MEDIASUBTYPE_RGB565))
1003+
bytes_per_pixel = 2;
1004+
else if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB24))
1005+
bytes_per_pixel = 3;
1006+
else if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB32))
1007+
bytes_per_pixel = 4;
1008+
1009+
mts[0]->lSampleSize = format->width * format->height * bytes_per_pixel;
9851010
++enum_media_types->index;
9861011
*ret_count = 1;
9871012
return count == 1 ? S_OK : S_FALSE;
@@ -1025,6 +1050,8 @@ static HRESULT WINAPI enum_media_types_Clone(IEnumMediaTypes *iface, IEnumMediaT
10251050
object->IEnumMediaTypes_iface.lpVtbl = &enum_media_types_vtbl;
10261051
object->refcount = 1;
10271052
object->index = enum_media_types->index;
1053+
object->stream = enum_media_types->stream;
1054+
IAMMediaStream_AddRef(&object->stream->IAMMediaStream_iface);
10281055

10291056
*out = &object->IEnumMediaTypes_iface;
10301057
return S_OK;
@@ -1328,6 +1355,7 @@ static HRESULT WINAPI ddraw_sink_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *m
13281355

13291356
static HRESULT WINAPI ddraw_sink_EnumMediaTypes(IPin *iface, IEnumMediaTypes **enum_media_types)
13301357
{
1358+
struct ddraw_stream *stream = impl_from_IPin(iface);
13311359
struct enum_media_types *object;
13321360

13331361
TRACE("iface %p, enum_media_types %p.\n", iface, enum_media_types);
@@ -1341,6 +1369,8 @@ static HRESULT WINAPI ddraw_sink_EnumMediaTypes(IPin *iface, IEnumMediaTypes **e
13411369
object->IEnumMediaTypes_iface.lpVtbl = &enum_media_types_vtbl;
13421370
object->refcount = 1;
13431371
object->index = 0;
1372+
object->stream = stream;
1373+
IAMMediaStream_AddRef(&stream->IAMMediaStream_iface);
13441374

13451375
*enum_media_types = &object->IEnumMediaTypes_iface;
13461376
return S_OK;

dlls/amstream/tests/amstream.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3203,7 +3203,6 @@ static void test_media_types(void)
32033203
ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Video), "Unexpected media type %s.\n", wine_dbgstr_guid(&pmt->majortype));
32043204
ok(IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB8), "Unexpected media subtype %s.\n", wine_dbgstr_guid(&pmt->subtype));
32053205
ok(IsEqualGUID(&pmt->formattype, &GUID_NULL), "Unexpected media formattype %s.\n", wine_dbgstr_guid(&pmt->formattype));
3206-
todo_wine
32073206
ok(pmt->lSampleSize == 40000, "Unexpected sample size %lu.\n", pmt->lSampleSize);
32083207
DeleteMediaType(pmt);
32093208
}
@@ -3287,12 +3286,10 @@ static void test_media_types(void)
32873286
ok(count == 1, "Got count %lu.\n", count);
32883287
ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Video), "Got major type %s\n",
32893288
wine_dbgstr_guid(&pmt->majortype));
3290-
todo_wine
32913289
ok(IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB32), "Got subtype %s\n",
32923290
wine_dbgstr_guid(&pmt->subtype));
32933291
ok(pmt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", pmt->bFixedSizeSamples);
32943292
ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression);
3295-
todo_wine
32963293
ok(pmt->lSampleSize == 40000, "Got sample size %lu.\n", pmt->lSampleSize);
32973294
ok(IsEqualGUID(&pmt->formattype, &GUID_NULL), "Got format type %s.\n",
32983295
wine_dbgstr_guid(&pmt->formattype));

0 commit comments

Comments
 (0)