@@ -70,6 +70,66 @@ bool array_reserve(void **elements, size_t *capacity, size_t count, size_t size)
70
70
return TRUE;
71
71
}
72
72
73
+ static HRESULT video_format_from_media_type (IMFMediaType * media_type , MFVIDEOFORMAT * * format , UINT32 * format_size )
74
+ {
75
+ GUID subtype ;
76
+ HRESULT hr ;
77
+
78
+ if (FAILED (hr = IMFMediaType_GetGUID (media_type , & MF_MT_SUBTYPE , & subtype )))
79
+ return hr ;
80
+ if (FAILED (hr = MFCreateMFVideoFormatFromMFMediaType (media_type , format , format_size )))
81
+ return hr ;
82
+
83
+ /* fixup MPEG video formats here, so we can consistently use MFVIDEOFORMAT internally */
84
+ if (IsEqualGUID (& subtype , & MEDIASUBTYPE_MPEG1Payload )
85
+ || IsEqualGUID (& subtype , & MEDIASUBTYPE_MPEG1Packet )
86
+ || IsEqualGUID (& subtype , & MEDIASUBTYPE_MPEG2_VIDEO ))
87
+ {
88
+ struct mpeg_video_format * mpeg ;
89
+ UINT32 mpeg_size , len ;
90
+
91
+ if (FAILED (IMFMediaType_GetBlobSize (media_type , & MF_MT_MPEG_SEQUENCE_HEADER , & len )))
92
+ len = 0 ;
93
+ mpeg_size = offsetof(struct mpeg_video_format , sequence_header [len ]);
94
+
95
+ if ((mpeg = CoTaskMemAlloc (mpeg_size )))
96
+ {
97
+ memset (mpeg , 0 , mpeg_size );
98
+ mpeg -> hdr = * * format ;
99
+
100
+ IMFMediaType_GetBlob (media_type , & MF_MT_MPEG_SEQUENCE_HEADER , mpeg -> sequence_header , len , NULL );
101
+ IMFMediaType_GetUINT32 (media_type , & MF_MT_MPEG_START_TIME_CODE , (UINT32 * )& mpeg -> start_time_code );
102
+ IMFMediaType_GetUINT32 (media_type , & MF_MT_MPEG2_PROFILE , & mpeg -> profile );
103
+ IMFMediaType_GetUINT32 (media_type , & MF_MT_MPEG2_LEVEL , & mpeg -> level );
104
+ IMFMediaType_GetUINT32 (media_type , & MF_MT_MPEG2_FLAGS , & mpeg -> flags );
105
+
106
+ CoTaskMemFree (* format );
107
+ * format = & mpeg -> hdr ;
108
+ * format_size = mpeg_size ;
109
+ }
110
+ }
111
+
112
+ return hr ;
113
+ }
114
+
115
+ static HRESULT wg_media_type_from_mf (IMFMediaType * media_type , struct wg_media_type * wg_media_type )
116
+ {
117
+ HRESULT hr ;
118
+
119
+ if (FAILED (hr = IMFMediaType_GetMajorType (media_type , & wg_media_type -> major )))
120
+ return hr ;
121
+
122
+ if (IsEqualGUID (& wg_media_type -> major , & MFMediaType_Video ))
123
+ return video_format_from_media_type (media_type , & wg_media_type -> u .video ,
124
+ & wg_media_type -> format_size );
125
+ if (IsEqualGUID (& wg_media_type -> major , & MFMediaType_Audio ))
126
+ return MFCreateWaveFormatExFromMFMediaType (media_type , & wg_media_type -> u .audio ,
127
+ & wg_media_type -> format_size , 0 );
128
+
129
+ FIXME ("Unsupported major type %s\n" , debugstr_guid (& wg_media_type -> major ));
130
+ return E_NOTIMPL ;
131
+ }
132
+
73
133
static HRESULT media_type_from_video_format (const MFVIDEOFORMAT * format , IMFMediaType * * media_type )
74
134
{
75
135
HRESULT hr ;
@@ -514,17 +574,30 @@ HRESULT wg_transform_get_output_type(wg_transform_t transform, IMFMediaType **me
514
574
return hr ;
515
575
}
516
576
517
- bool wg_transform_set_output_format (wg_transform_t transform , struct wg_format * format )
577
+ HRESULT wg_transform_set_output_type (wg_transform_t transform , IMFMediaType * media_type )
518
578
{
519
- struct wg_transform_set_output_format_params params =
579
+ struct wg_transform_set_output_type_params params =
520
580
{
521
581
.transform = transform ,
522
- .format = format ,
523
582
};
583
+ NTSTATUS status ;
584
+ HRESULT hr ;
524
585
525
- TRACE ("transform %#I64x, format %p.\n" , transform , format );
586
+ TRACE ("transform %#I64x, media_type %p.\n" , transform , media_type );
526
587
527
- return !WINE_UNIX_CALL (unix_wg_transform_set_output_format , & params );
588
+ if (FAILED (hr = wg_media_type_from_mf (media_type , & params .media_type )))
589
+ {
590
+ WARN ("Failed to initialize media type, hr %#lx\n" , hr );
591
+ return hr ;
592
+ }
593
+ if ((status = WINE_UNIX_CALL (unix_wg_transform_set_output_type , & params )))
594
+ {
595
+ WARN ("Failed to set transform output type, status %#lx\n" , status );
596
+ hr = HRESULT_FROM_NT (status );
597
+ }
598
+
599
+ CoTaskMemFree (params .media_type .u .format );
600
+ return hr ;
528
601
}
529
602
530
603
HRESULT wg_transform_drain (wg_transform_t transform )
0 commit comments