@@ -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
927929static 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
968973static 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
13291356static 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 ;
0 commit comments