2 * Copyright 2019 Nikolay Sivov for CodeWeavers
3 * Copyright 2020 Zebediah Figura for CodeWeavers
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include "gst_private.h"
24 #include "wmcodecdsp.h"
25 #include "d3d9types.h"
29 #include "wine/debug.h"
30 #include "wine/list.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(mfplat
);
36 DEFINE_GUID(DMOVideoFormat_RGB32
,D3DFMT_X8R8G8B8
,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
37 DEFINE_GUID(DMOVideoFormat_RGB24
,D3DFMT_R8G8B8
,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
38 DEFINE_GUID(DMOVideoFormat_RGB565
,D3DFMT_R5G6B5
,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
39 DEFINE_GUID(DMOVideoFormat_RGB555
,D3DFMT_X1R5G5B5
,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
40 DEFINE_GUID(DMOVideoFormat_RGB8
,D3DFMT_P8
,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
41 DEFINE_MEDIATYPE_GUID(MFAudioFormat_RAW_AAC
,WAVE_FORMAT_RAW_AAC1
);
42 DEFINE_MEDIATYPE_GUID(MFVideoFormat_VC1S
,MAKEFOURCC('V','C','1','S'));
43 DEFINE_MEDIATYPE_GUID(MFVideoFormat_IV50
,MAKEFOURCC('I','V','5','0'));
44 DEFINE_MEDIATYPE_GUID(MFVideoFormat_ABGR32
,D3DFMT_A8B8G8R8
);
45 DEFINE_GUID(MEDIASUBTYPE_WMV_Unknown
, 0x7ce12ca9,0xbfbf,0x43d9,0x9d,0x00,0x82,0xb8,0xed,0x54,0x31,0x6b);
49 IClassFactory IClassFactory_iface
;
51 HRESULT (*create_instance
)(REFIID riid
, void **obj
);
54 static struct class_factory
*impl_from_IClassFactory(IClassFactory
*iface
)
56 return CONTAINING_RECORD(iface
, struct class_factory
, IClassFactory_iface
);
59 static HRESULT WINAPI
class_factory_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **obj
)
61 TRACE("%p, %s, %p.\n", iface
, debugstr_guid(riid
), obj
);
63 if (IsEqualGUID(riid
, &IID_IClassFactory
) ||
64 IsEqualGUID(riid
, &IID_IUnknown
))
67 IClassFactory_AddRef(iface
);
71 WARN("%s is not supported.\n", debugstr_guid(riid
));
76 static ULONG WINAPI
class_factory_AddRef(IClassFactory
*iface
)
78 struct class_factory
*factory
= impl_from_IClassFactory(iface
);
79 return InterlockedIncrement(&factory
->refcount
);
82 static ULONG WINAPI
class_factory_Release(IClassFactory
*iface
)
84 struct class_factory
*factory
= impl_from_IClassFactory(iface
);
85 ULONG refcount
= InterlockedDecrement(&factory
->refcount
);
93 static HRESULT WINAPI
class_factory_CreateInstance(IClassFactory
*iface
, IUnknown
*outer
, REFIID riid
, void **obj
)
95 struct class_factory
*factory
= impl_from_IClassFactory(iface
);
97 TRACE("%p, %p, %s, %p.\n", iface
, outer
, debugstr_guid(riid
), obj
);
102 return CLASS_E_NOAGGREGATION
;
105 return factory
->create_instance(riid
, obj
);
108 static HRESULT WINAPI
class_factory_LockServer(IClassFactory
*iface
, BOOL dolock
)
110 TRACE("%p, %d.\n", iface
, dolock
);
114 static const IClassFactoryVtbl class_factory_vtbl
=
116 class_factory_QueryInterface
,
117 class_factory_AddRef
,
118 class_factory_Release
,
119 class_factory_CreateInstance
,
120 class_factory_LockServer
,
123 static const GUID CLSID_GStreamerByteStreamHandler
= {0x317df618, 0x5e5a, 0x468a, {0x9f, 0x15, 0xd8, 0x27, 0xa9, 0xa0, 0x81, 0x62}};
125 static const struct class_object
128 HRESULT (*create_instance
)(REFIID riid
, void **obj
);
132 { &CLSID_VideoProcessorMFT
, &video_processor_create
},
133 { &CLSID_GStreamerByteStreamHandler
, &gstreamer_byte_stream_handler_create
},
134 { &CLSID_MSAACDecMFT
, &aac_decoder_create
},
135 { &CLSID_MSH264DecoderMFT
, &h264_decoder_create
},
136 { &CLSID_MSH264EncoderMFT
, &h264_encoder_create
},
139 HRESULT
mfplat_get_class_object(REFCLSID rclsid
, REFIID riid
, void **obj
)
141 struct class_factory
*factory
;
145 for (i
= 0; i
< ARRAY_SIZE(class_objects
); ++i
)
147 if (IsEqualGUID(class_objects
[i
].clsid
, rclsid
))
149 if (!(factory
= malloc(sizeof(*factory
))))
150 return E_OUTOFMEMORY
;
152 factory
->IClassFactory_iface
.lpVtbl
= &class_factory_vtbl
;
153 factory
->refcount
= 1;
154 factory
->create_instance
= class_objects
[i
].create_instance
;
156 hr
= IClassFactory_QueryInterface(&factory
->IClassFactory_iface
, riid
, obj
);
157 IClassFactory_Release(&factory
->IClassFactory_iface
);
162 return CLASS_E_CLASSNOTAVAILABLE
;
165 HRESULT
mfplat_DllRegisterServer(void)
167 MFT_REGISTER_TYPE_INFO resampler_types
[] =
169 {MFMediaType_Audio
, MFAudioFormat_PCM
},
170 {MFMediaType_Audio
, MFAudioFormat_Float
},
173 MFT_REGISTER_TYPE_INFO aac_decoder_input_types
[] =
175 {MFMediaType_Audio
, MFAudioFormat_AAC
},
176 {MFMediaType_Audio
, MFAudioFormat_RAW_AAC
},
177 {MFMediaType_Audio
, MFAudioFormat_ADTS
},
179 MFT_REGISTER_TYPE_INFO aac_decoder_output_types
[] =
181 {MFMediaType_Audio
, MFAudioFormat_Float
},
182 {MFMediaType_Audio
, MFAudioFormat_PCM
},
185 MFT_REGISTER_TYPE_INFO wma_decoder_input_types
[] =
187 {MFMediaType_Audio
, MEDIASUBTYPE_MSAUDIO1
},
188 {MFMediaType_Audio
, MFAudioFormat_WMAudioV8
},
189 {MFMediaType_Audio
, MFAudioFormat_WMAudioV9
},
190 {MFMediaType_Audio
, MFAudioFormat_WMAudio_Lossless
},
192 MFT_REGISTER_TYPE_INFO wma_decoder_output_types
[] =
194 {MFMediaType_Audio
, MFAudioFormat_PCM
},
195 {MFMediaType_Audio
, MFAudioFormat_Float
},
198 MFT_REGISTER_TYPE_INFO h264_decoder_input_types
[] =
200 {MFMediaType_Video
, MFVideoFormat_H264
},
201 {MFMediaType_Video
, MFVideoFormat_H264_ES
},
203 MFT_REGISTER_TYPE_INFO h264_decoder_output_types
[] =
205 {MFMediaType_Video
, MFVideoFormat_NV12
},
206 {MFMediaType_Video
, MFVideoFormat_YV12
},
207 {MFMediaType_Video
, MFVideoFormat_IYUV
},
208 {MFMediaType_Video
, MFVideoFormat_I420
},
209 {MFMediaType_Video
, MFVideoFormat_YUY2
},
212 MFT_REGISTER_TYPE_INFO h264_encoder_input_types
[] =
214 {MFMediaType_Video
, MFVideoFormat_IYUV
},
215 {MFMediaType_Video
, MFVideoFormat_YV12
},
216 {MFMediaType_Video
, MFVideoFormat_NV12
},
217 {MFMediaType_Video
, MFVideoFormat_YUY2
},
219 MFT_REGISTER_TYPE_INFO h264_encoder_output_types
[] =
221 {MFMediaType_Video
, MFVideoFormat_H264
},
224 MFT_REGISTER_TYPE_INFO video_processor_input_types
[] =
226 {MFMediaType_Video
, MFVideoFormat_IYUV
},
227 {MFMediaType_Video
, MFVideoFormat_YV12
},
228 {MFMediaType_Video
, MFVideoFormat_NV12
},
229 {MFMediaType_Video
, MFVideoFormat_YUY2
},
230 {MFMediaType_Video
, MFVideoFormat_ARGB32
},
231 {MFMediaType_Video
, MFVideoFormat_RGB32
},
232 {MFMediaType_Video
, MFVideoFormat_NV11
},
233 {MFMediaType_Video
, MFVideoFormat_AYUV
},
234 {MFMediaType_Video
, MFVideoFormat_UYVY
},
235 {MFMediaType_Video
, MEDIASUBTYPE_P208
},
236 {MFMediaType_Video
, MFVideoFormat_RGB24
},
237 {MFMediaType_Video
, MFVideoFormat_RGB555
},
238 {MFMediaType_Video
, MFVideoFormat_RGB565
},
239 {MFMediaType_Video
, MFVideoFormat_RGB8
},
240 {MFMediaType_Video
, MFVideoFormat_I420
},
241 {MFMediaType_Video
, MFVideoFormat_Y216
},
242 {MFMediaType_Video
, MFVideoFormat_v410
},
243 {MFMediaType_Video
, MFVideoFormat_Y41P
},
244 {MFMediaType_Video
, MFVideoFormat_Y41T
},
245 {MFMediaType_Video
, MFVideoFormat_Y42T
},
246 {MFMediaType_Video
, MFVideoFormat_YVYU
},
247 {MFMediaType_Video
, MFVideoFormat_420O
},
249 MFT_REGISTER_TYPE_INFO video_processor_output_types
[] =
251 {MFMediaType_Video
, MFVideoFormat_IYUV
},
252 {MFMediaType_Video
, MFVideoFormat_YV12
},
253 {MFMediaType_Video
, MFVideoFormat_NV12
},
254 {MFMediaType_Video
, MFVideoFormat_YUY2
},
255 {MFMediaType_Video
, MFVideoFormat_ARGB32
},
256 {MFMediaType_Video
, MFVideoFormat_RGB32
},
257 {MFMediaType_Video
, MFVideoFormat_NV11
},
258 {MFMediaType_Video
, MFVideoFormat_AYUV
},
259 {MFMediaType_Video
, MFVideoFormat_UYVY
},
260 {MFMediaType_Video
, MEDIASUBTYPE_P208
},
261 {MFMediaType_Video
, MFVideoFormat_RGB24
},
262 {MFMediaType_Video
, MFVideoFormat_RGB555
},
263 {MFMediaType_Video
, MFVideoFormat_RGB565
},
264 {MFMediaType_Video
, MFVideoFormat_RGB8
},
265 {MFMediaType_Video
, MFVideoFormat_I420
},
266 {MFMediaType_Video
, MFVideoFormat_Y216
},
267 {MFMediaType_Video
, MFVideoFormat_v410
},
268 {MFMediaType_Video
, MFVideoFormat_Y41P
},
269 {MFMediaType_Video
, MFVideoFormat_Y41T
},
270 {MFMediaType_Video
, MFVideoFormat_Y42T
},
271 {MFMediaType_Video
, MFVideoFormat_YVYU
},
274 MFT_REGISTER_TYPE_INFO wmv_decoder_input_types
[] =
276 {MFMediaType_Video
, MFVideoFormat_WMV1
},
277 {MFMediaType_Video
, MFVideoFormat_WMV2
},
278 {MFMediaType_Video
, MFVideoFormat_WMV3
},
279 {MFMediaType_Video
, MEDIASUBTYPE_WMVP
},
280 {MFMediaType_Video
, MEDIASUBTYPE_WVP2
},
281 {MFMediaType_Video
, MEDIASUBTYPE_WMVR
},
282 {MFMediaType_Video
, MEDIASUBTYPE_WMVA
},
283 {MFMediaType_Video
, MFVideoFormat_WVC1
},
284 {MFMediaType_Video
, MFVideoFormat_VC1S
},
286 MFT_REGISTER_TYPE_INFO wmv_decoder_output_types
[] =
288 {MFMediaType_Video
, MFVideoFormat_YV12
},
289 {MFMediaType_Video
, MFVideoFormat_YUY2
},
290 {MFMediaType_Video
, MFVideoFormat_UYVY
},
291 {MFMediaType_Video
, MFVideoFormat_YVYU
},
292 {MFMediaType_Video
, MFVideoFormat_NV11
},
293 {MFMediaType_Video
, MFVideoFormat_NV12
},
294 {MFMediaType_Video
, DMOVideoFormat_RGB32
},
295 {MFMediaType_Video
, DMOVideoFormat_RGB24
},
296 {MFMediaType_Video
, DMOVideoFormat_RGB565
},
297 {MFMediaType_Video
, DMOVideoFormat_RGB555
},
298 {MFMediaType_Video
, DMOVideoFormat_RGB8
},
301 MFT_REGISTER_TYPE_INFO color_convert_input_types
[] =
303 {MFMediaType_Video
, MFVideoFormat_YV12
},
304 {MFMediaType_Video
, MFVideoFormat_YUY2
},
305 {MFMediaType_Video
, MFVideoFormat_UYVY
},
306 {MFMediaType_Video
, MFVideoFormat_AYUV
},
307 {MFMediaType_Video
, MFVideoFormat_NV12
},
308 {MFMediaType_Video
, DMOVideoFormat_RGB32
},
309 {MFMediaType_Video
, DMOVideoFormat_RGB565
},
310 {MFMediaType_Video
, MFVideoFormat_I420
},
311 {MFMediaType_Video
, MFVideoFormat_IYUV
},
312 {MFMediaType_Video
, MFVideoFormat_YVYU
},
313 {MFMediaType_Video
, DMOVideoFormat_RGB24
},
314 {MFMediaType_Video
, DMOVideoFormat_RGB555
},
315 {MFMediaType_Video
, DMOVideoFormat_RGB8
},
316 {MFMediaType_Video
, MEDIASUBTYPE_V216
},
317 {MFMediaType_Video
, MEDIASUBTYPE_V410
},
318 {MFMediaType_Video
, MFVideoFormat_NV11
},
319 {MFMediaType_Video
, MFVideoFormat_Y41P
},
320 {MFMediaType_Video
, MFVideoFormat_Y41T
},
321 {MFMediaType_Video
, MFVideoFormat_Y42T
},
322 {MFMediaType_Video
, MFVideoFormat_YVU9
},
324 MFT_REGISTER_TYPE_INFO color_convert_output_types
[] =
326 {MFMediaType_Video
, MFVideoFormat_YV12
},
327 {MFMediaType_Video
, MFVideoFormat_YUY2
},
328 {MFMediaType_Video
, MFVideoFormat_UYVY
},
329 {MFMediaType_Video
, MFVideoFormat_AYUV
},
330 {MFMediaType_Video
, MFVideoFormat_NV12
},
331 {MFMediaType_Video
, DMOVideoFormat_RGB32
},
332 {MFMediaType_Video
, DMOVideoFormat_RGB565
},
333 {MFMediaType_Video
, MFVideoFormat_I420
},
334 {MFMediaType_Video
, MFVideoFormat_IYUV
},
335 {MFMediaType_Video
, MFVideoFormat_YVYU
},
336 {MFMediaType_Video
, DMOVideoFormat_RGB24
},
337 {MFMediaType_Video
, DMOVideoFormat_RGB555
},
338 {MFMediaType_Video
, DMOVideoFormat_RGB8
},
339 {MFMediaType_Video
, MEDIASUBTYPE_V216
},
340 {MFMediaType_Video
, MEDIASUBTYPE_V410
},
341 {MFMediaType_Video
, MFVideoFormat_NV11
},
348 WCHAR name
[MAX_PATH
];
350 UINT32 input_types_count
;
351 MFT_REGISTER_TYPE_INFO
*input_types
;
352 UINT32 output_types_count
;
353 MFT_REGISTER_TYPE_INFO
*output_types
;
359 MFT_CATEGORY_AUDIO_DECODER
,
360 L
"Microsoft AAC Audio Decoder MFT",
361 MFT_ENUM_FLAG_SYNCMFT
,
362 ARRAY_SIZE(aac_decoder_input_types
),
363 aac_decoder_input_types
,
364 ARRAY_SIZE(aac_decoder_output_types
),
365 aac_decoder_output_types
,
368 CLSID_WMADecMediaObject
,
369 MFT_CATEGORY_AUDIO_DECODER
,
370 L
"WMAudio Decoder MFT",
371 MFT_ENUM_FLAG_SYNCMFT
,
372 ARRAY_SIZE(wma_decoder_input_types
),
373 wma_decoder_input_types
,
374 ARRAY_SIZE(wma_decoder_output_types
),
375 wma_decoder_output_types
,
378 CLSID_MSH264DecoderMFT
,
379 MFT_CATEGORY_VIDEO_DECODER
,
380 L
"Microsoft H264 Video Decoder MFT",
381 MFT_ENUM_FLAG_SYNCMFT
,
382 ARRAY_SIZE(h264_decoder_input_types
),
383 h264_decoder_input_types
,
384 ARRAY_SIZE(h264_decoder_output_types
),
385 h264_decoder_output_types
,
388 CLSID_MSH264EncoderMFT
,
389 MFT_CATEGORY_VIDEO_ENCODER
,
391 MFT_ENUM_FLAG_SYNCMFT
,
392 ARRAY_SIZE(h264_encoder_input_types
),
393 h264_encoder_input_types
,
394 ARRAY_SIZE(h264_encoder_output_types
),
395 h264_encoder_output_types
,
399 MFT_CATEGORY_VIDEO_DECODER
,
400 L
"WMVideo Decoder MFT",
401 MFT_ENUM_FLAG_SYNCMFT
,
402 ARRAY_SIZE(wmv_decoder_input_types
),
403 wmv_decoder_input_types
,
404 ARRAY_SIZE(wmv_decoder_output_types
),
405 wmv_decoder_output_types
,
408 CLSID_VideoProcessorMFT
,
409 MFT_CATEGORY_VIDEO_PROCESSOR
,
410 L
"Microsoft Video Processor MFT",
411 MFT_ENUM_FLAG_SYNCMFT
,
412 ARRAY_SIZE(video_processor_input_types
),
413 video_processor_input_types
,
414 ARRAY_SIZE(video_processor_output_types
),
415 video_processor_output_types
,
418 CLSID_CResamplerMediaObject
,
419 MFT_CATEGORY_AUDIO_EFFECT
,
421 MFT_ENUM_FLAG_SYNCMFT
,
422 ARRAY_SIZE(resampler_types
),
424 ARRAY_SIZE(resampler_types
),
428 CLSID_CColorConvertDMO
,
429 MFT_CATEGORY_VIDEO_EFFECT
,
430 L
"Color Converter MFT",
431 MFT_ENUM_FLAG_SYNCMFT
,
432 ARRAY_SIZE(color_convert_input_types
),
433 color_convert_input_types
,
434 ARRAY_SIZE(color_convert_output_types
),
435 color_convert_output_types
,
442 for (i
= 0; i
< ARRAY_SIZE(mfts
); i
++)
444 hr
= MFTRegister(mfts
[i
].clsid
, mfts
[i
].category
, mfts
[i
].name
, mfts
[i
].flags
, mfts
[i
].input_types_count
,
445 mfts
[i
].input_types
, mfts
[i
].output_types_count
, mfts
[i
].output_types
, NULL
);
449 FIXME("Failed to register MFT, hr %#lx.\n", hr
);
460 enum wg_video_format format
;
464 {&MFVideoFormat_ARGB32
, WG_VIDEO_FORMAT_BGRA
},
465 {&MFVideoFormat_RGB32
, WG_VIDEO_FORMAT_BGRx
},
466 {&MFVideoFormat_RGB24
, WG_VIDEO_FORMAT_BGR
},
467 {&MFVideoFormat_RGB555
, WG_VIDEO_FORMAT_RGB15
},
468 {&MFVideoFormat_RGB565
, WG_VIDEO_FORMAT_RGB16
},
469 {&MFVideoFormat_ABGR32
, WG_VIDEO_FORMAT_RGBA
},
470 {&MFVideoFormat_AYUV
, WG_VIDEO_FORMAT_AYUV
},
471 {&MFVideoFormat_I420
, WG_VIDEO_FORMAT_I420
},
472 {&MFVideoFormat_IYUV
, WG_VIDEO_FORMAT_I420
},
473 {&MFVideoFormat_NV12
, WG_VIDEO_FORMAT_NV12
},
474 {&MFVideoFormat_UYVY
, WG_VIDEO_FORMAT_UYVY
},
475 {&MFVideoFormat_YUY2
, WG_VIDEO_FORMAT_YUY2
},
476 {&MFVideoFormat_YV12
, WG_VIDEO_FORMAT_YV12
},
477 {&MFVideoFormat_YVYU
, WG_VIDEO_FORMAT_YVYU
},
484 enum wg_audio_format format
;
488 {&MFAudioFormat_PCM
, 8, WG_AUDIO_FORMAT_U8
},
489 {&MFAudioFormat_PCM
, 16, WG_AUDIO_FORMAT_S16LE
},
490 {&MFAudioFormat_PCM
, 24, WG_AUDIO_FORMAT_S24LE
},
491 {&MFAudioFormat_PCM
, 32, WG_AUDIO_FORMAT_S32LE
},
492 {&MFAudioFormat_Float
, 32, WG_AUDIO_FORMAT_F32LE
},
493 {&MFAudioFormat_Float
, 64, WG_AUDIO_FORMAT_F64LE
},
496 static inline UINT64
make_uint64(UINT32 high
, UINT32 low
)
498 return ((UINT64
)high
<< 32) | low
;
501 static IMFMediaType
*mf_media_type_from_wg_format_audio(const struct wg_format
*format
)
503 unsigned int i
, block_align
;
506 for (i
= 0; i
< ARRAY_SIZE(audio_formats
); ++i
)
508 if (format
->u
.audio
.format
== audio_formats
[i
].format
)
510 if (FAILED(MFCreateMediaType(&type
)))
513 IMFMediaType_SetGUID(type
, &MF_MT_MAJOR_TYPE
, &MFMediaType_Audio
);
514 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, audio_formats
[i
].subtype
);
515 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_BITS_PER_SAMPLE
, audio_formats
[i
].depth
);
516 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_SAMPLES_PER_SECOND
, format
->u
.audio
.rate
);
517 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_NUM_CHANNELS
, format
->u
.audio
.channels
);
518 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_CHANNEL_MASK
, format
->u
.audio
.channel_mask
);
519 IMFMediaType_SetUINT32(type
, &MF_MT_ALL_SAMPLES_INDEPENDENT
, TRUE
);
521 block_align
= format
->u
.audio
.channels
* audio_formats
[i
].depth
/ 8;
522 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_BLOCK_ALIGNMENT
, block_align
);
523 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND
, block_align
* format
->u
.audio
.rate
);
529 FIXME("Unknown audio format %#x.\n", format
->u
.audio
.format
);
533 static IMFMediaType
*mf_media_type_from_wg_format_video(const struct wg_format
*format
)
538 for (i
= 0; i
< ARRAY_SIZE(video_formats
); ++i
)
540 if (format
->u
.video
.format
== video_formats
[i
].format
)
542 unsigned int stride
= wg_format_get_stride(format
);
543 int32_t height
= abs(format
->u
.video
.height
);
544 int32_t width
= format
->u
.video
.width
;
546 if (FAILED(MFCreateMediaType(&type
)))
549 IMFMediaType_SetGUID(type
, &MF_MT_MAJOR_TYPE
, &MFMediaType_Video
);
550 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, video_formats
[i
].subtype
);
551 IMFMediaType_SetUINT64(type
, &MF_MT_FRAME_SIZE
, make_uint64(width
, height
));
552 IMFMediaType_SetUINT64(type
, &MF_MT_FRAME_RATE
,
553 make_uint64(format
->u
.video
.fps_n
, format
->u
.video
.fps_d
));
554 IMFMediaType_SetUINT32(type
, &MF_MT_COMPRESSED
, FALSE
);
555 IMFMediaType_SetUINT32(type
, &MF_MT_ALL_SAMPLES_INDEPENDENT
, TRUE
);
556 IMFMediaType_SetUINT32(type
, &MF_MT_VIDEO_ROTATION
, MFVideoRotationFormat_0
);
558 if (format
->u
.video
.height
< 0)
560 IMFMediaType_SetUINT32(type
, &MF_MT_DEFAULT_STRIDE
, stride
);
562 if (format
->u
.video
.padding
.left
|| format
->u
.video
.padding
.right
563 || format
->u
.video
.padding
.top
|| format
->u
.video
.padding
.bottom
)
565 MFVideoArea aperture
=
567 .OffsetX
= {.value
= format
->u
.video
.padding
.left
},
568 .OffsetY
= {.value
= format
->u
.video
.padding
.top
},
569 .Area
.cx
= width
- format
->u
.video
.padding
.right
- format
->u
.video
.padding
.left
,
570 .Area
.cy
= height
- format
->u
.video
.padding
.bottom
- format
->u
.video
.padding
.top
,
573 IMFMediaType_SetBlob(type
, &MF_MT_MINIMUM_DISPLAY_APERTURE
,
574 (BYTE
*)&aperture
, sizeof(aperture
));
575 IMFMediaType_SetBlob(type
, &MF_MT_GEOMETRIC_APERTURE
,
576 (BYTE
*)&aperture
, sizeof(aperture
));
577 IMFMediaType_SetBlob(type
, &MF_MT_PAN_SCAN_APERTURE
,
578 (BYTE
*)&aperture
, sizeof(aperture
));
585 FIXME("Unknown video format %#x.\n", format
->u
.video
.format
);
589 static IMFMediaType
*mf_media_type_from_wg_format_audio_mpeg1(const struct wg_format
*format
)
593 if (FAILED(MFCreateMediaType(&type
)))
596 if (format
->u
.audio
.layer
!= 3)
597 FIXME("Unhandled layer %#x.\n", format
->u
.audio
.layer
);
599 IMFMediaType_SetGUID(type
, &MF_MT_MAJOR_TYPE
, &MFMediaType_Audio
);
600 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MFAudioFormat_MP3
);
601 IMFMediaType_SetGUID(type
, &MF_MT_AM_FORMAT_TYPE
, &FORMAT_WaveFormatEx
);
602 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_NUM_CHANNELS
, format
->u
.audio
.channels
);
603 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_CHANNEL_MASK
, format
->u
.audio
.channel_mask
);
604 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_PREFER_WAVEFORMATEX
, TRUE
);
605 IMFMediaType_SetUINT32(type
, &MF_MT_FIXED_SIZE_SAMPLES
, TRUE
);
606 IMFMediaType_SetUINT32(type
, &MF_MT_ALL_SAMPLES_INDEPENDENT
, TRUE
);
611 static IMFMediaType
*mf_media_type_from_wg_format_audio_mpeg4(const struct wg_format
*format
)
615 if (FAILED(MFCreateMediaType(&type
)))
618 IMFMediaType_SetGUID(type
, &MF_MT_MAJOR_TYPE
, &MFMediaType_Audio
);
619 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MFAudioFormat_AAC
);
620 IMFMediaType_SetGUID(type
, &MF_MT_AM_FORMAT_TYPE
, &FORMAT_WaveFormatEx
);
621 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_BITS_PER_SAMPLE
, 16);
622 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_SAMPLES_PER_SECOND
, format
->u
.audio
.rate
);
623 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_NUM_CHANNELS
, format
->u
.audio
.channels
);
624 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_CHANNEL_MASK
, format
->u
.audio
.channel_mask
);
625 IMFMediaType_SetUINT32(type
, &MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION
, 0); /* unknown */
626 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_PREFER_WAVEFORMATEX
, TRUE
);
627 IMFMediaType_SetUINT32(type
, &MF_MT_FIXED_SIZE_SAMPLES
, TRUE
);
628 IMFMediaType_SetUINT32(type
, &MF_MT_ALL_SAMPLES_INDEPENDENT
, TRUE
);
629 IMFMediaType_SetBlob(type
, &MF_MT_USER_DATA
, format
->u
.audio
.codec_data
, format
->u
.audio
.codec_data_len
);
634 static IMFMediaType
*mf_media_type_from_wg_format_h264(const struct wg_format
*format
)
638 if (FAILED(MFCreateMediaType(&type
)))
641 IMFMediaType_SetGUID(type
, &MF_MT_MAJOR_TYPE
, &MFMediaType_Video
);
642 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MFVideoFormat_H264
);
643 IMFMediaType_SetGUID(type
, &MF_MT_AM_FORMAT_TYPE
, &FORMAT_MPEG2Video
);
644 IMFMediaType_SetUINT64(type
, &MF_MT_FRAME_SIZE
,
645 make_uint64(format
->u
.video
.width
, format
->u
.video
.height
));
646 IMFMediaType_SetUINT64(type
, &MF_MT_FRAME_RATE
,
647 make_uint64(format
->u
.video
.fps_n
, format
->u
.video
.fps_d
));
648 IMFMediaType_SetUINT32(type
, &MF_MT_VIDEO_ROTATION
, MFVideoRotationFormat_0
);
649 IMFMediaType_SetUINT32(type
, &MF_MT_MPEG2_PROFILE
, format
->u
.video
.profile
);
650 IMFMediaType_SetUINT32(type
, &MF_MT_MPEG2_LEVEL
, format
->u
.video
.level
);
655 static IMFMediaType
*mf_media_type_from_wg_format_wmv(const struct wg_format
*format
)
659 if (FAILED(MFCreateMediaType(&type
)))
662 IMFMediaType_SetGUID(type
, &MF_MT_MAJOR_TYPE
, &MFMediaType_Video
);
664 if (format
->u
.video
.format
== WG_VIDEO_FORMAT_WMV1
)
665 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MEDIASUBTYPE_WMV1
);
666 else if (format
->u
.video
.format
== WG_VIDEO_FORMAT_WMV2
)
667 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MEDIASUBTYPE_WMV2
);
668 else if (format
->u
.video
.format
== WG_VIDEO_FORMAT_WMV3
)
669 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MEDIASUBTYPE_WMV3
);
670 else if (format
->u
.video
.format
== WG_VIDEO_FORMAT_WMVA
)
671 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MEDIASUBTYPE_WMVA
);
672 else if (format
->u
.video
.format
== WG_VIDEO_FORMAT_WVC1
)
673 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MEDIASUBTYPE_WVC1
);
675 FIXME("Unhandled format %#x.\n", format
->u
.video
.format
);
677 IMFMediaType_SetUINT64(type
, &MF_MT_FRAME_SIZE
,
678 make_uint64(format
->u
.video
.width
, format
->u
.video
.height
));
679 IMFMediaType_SetUINT32(type
, &MF_MT_VIDEO_ROTATION
, MFVideoRotationFormat_0
);
681 if (format
->u
.video
.codec_data_len
)
682 IMFMediaType_SetBlob(type
, &MF_MT_USER_DATA
, format
->u
.video
.codec_data
, format
->u
.video
.codec_data_len
);
687 static IMFMediaType
*mf_media_type_from_wg_format_wma(const struct wg_format
*format
)
691 if (FAILED(MFCreateMediaType(&type
)))
694 IMFMediaType_SetGUID(type
, &MF_MT_MAJOR_TYPE
, &MFMediaType_Audio
);
696 if (format
->u
.audio
.version
== 1)
697 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MEDIASUBTYPE_MSAUDIO1
);
698 else if (format
->u
.audio
.version
== 2)
699 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MFAudioFormat_WMAudioV8
);
700 else if (format
->u
.audio
.version
== 3)
701 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MFAudioFormat_WMAudioV9
);
702 else if (format
->u
.audio
.version
== 4)
703 IMFMediaType_SetGUID(type
, &MF_MT_SUBTYPE
, &MFAudioFormat_WMAudio_Lossless
);
705 FIXME("Unhandled version %#x.\n", format
->u
.audio
.version
);
707 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_SAMPLES_PER_SECOND
, format
->u
.audio
.rate
);
708 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_NUM_CHANNELS
, format
->u
.audio
.channels
);
709 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_CHANNEL_MASK
, format
->u
.audio
.channel_mask
);
710 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND
, format
->u
.audio
.bitrate
/ 8);
711 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_PREFER_WAVEFORMATEX
, TRUE
);
712 IMFMediaType_SetUINT32(type
, &MF_MT_AUDIO_BLOCK_ALIGNMENT
, format
->u
.audio
.block_align
);
713 IMFMediaType_SetBlob(type
, &MF_MT_USER_DATA
, format
->u
.audio
.codec_data
, format
->u
.audio
.codec_data_len
);
718 IMFMediaType
*mf_media_type_from_wg_format(const struct wg_format
*format
)
720 switch (format
->major_type
)
722 case WG_MAJOR_TYPE_VIDEO_CINEPAK
:
723 case WG_MAJOR_TYPE_VIDEO_INDEO
:
724 case WG_MAJOR_TYPE_VIDEO_MPEG1
:
725 FIXME("Format %u not implemented!\n", format
->major_type
);
727 case WG_MAJOR_TYPE_UNKNOWN
:
730 case WG_MAJOR_TYPE_AUDIO
:
731 return mf_media_type_from_wg_format_audio(format
);
733 case WG_MAJOR_TYPE_VIDEO
:
734 return mf_media_type_from_wg_format_video(format
);
736 case WG_MAJOR_TYPE_VIDEO_H264
:
737 return mf_media_type_from_wg_format_h264(format
);
739 case WG_MAJOR_TYPE_AUDIO_MPEG1
:
740 return mf_media_type_from_wg_format_audio_mpeg1(format
);
742 case WG_MAJOR_TYPE_AUDIO_MPEG4
:
743 return mf_media_type_from_wg_format_audio_mpeg4(format
);
745 case WG_MAJOR_TYPE_VIDEO_WMV
:
746 return mf_media_type_from_wg_format_wmv(format
);
748 case WG_MAJOR_TYPE_AUDIO_WMA
:
749 return mf_media_type_from_wg_format_wma(format
);
756 static void mf_media_type_to_wg_format_audio(IMFMediaType
*type
, const GUID
*subtype
, struct wg_format
*format
)
758 UINT32 rate
, channels
, channel_mask
, depth
;
761 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_SAMPLES_PER_SECOND
, &rate
)))
763 FIXME("Sample rate is not set.\n");
766 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_NUM_CHANNELS
, &channels
)))
768 FIXME("Channel count is not set.\n");
771 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_BITS_PER_SAMPLE
, &depth
)))
773 FIXME("Depth is not set.\n");
776 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_CHANNEL_MASK
, &channel_mask
)))
779 channel_mask
= KSAUDIO_SPEAKER_MONO
;
780 else if (channels
== 2)
781 channel_mask
= KSAUDIO_SPEAKER_STEREO
;
784 FIXME("Channel mask is not set.\n");
789 format
->major_type
= WG_MAJOR_TYPE_AUDIO
;
790 format
->u
.audio
.channels
= channels
;
791 format
->u
.audio
.channel_mask
= channel_mask
;
792 format
->u
.audio
.rate
= rate
;
794 for (i
= 0; i
< ARRAY_SIZE(audio_formats
); ++i
)
796 if (IsEqualGUID(subtype
, audio_formats
[i
].subtype
) && depth
== audio_formats
[i
].depth
)
798 format
->u
.audio
.format
= audio_formats
[i
].format
;
802 FIXME("Unrecognized audio subtype %s, depth %u.\n", debugstr_guid(subtype
), depth
);
805 static void mf_media_type_to_wg_format_audio_mpeg(IMFMediaType
*type
, const GUID
*subtype
, struct wg_format
*format
)
807 MPEG1WAVEFORMAT wfx
= {0};
808 UINT32 codec_data_size
;
809 UINT32 rate
, channels
;
811 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_SAMPLES_PER_SECOND
, &rate
)))
813 FIXME("Sample rate is not set.\n");
816 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_NUM_CHANNELS
, &channels
)))
818 FIXME("Channel count is not set.\n");
821 if (FAILED(IMFMediaType_GetBlob(type
, &MF_MT_USER_DATA
, (UINT8
*)(&wfx
.wfx
+ 1),
822 sizeof(wfx
) - sizeof(WAVEFORMATEX
), &codec_data_size
)))
824 FIXME("Codec data is not set.\n");
827 if (codec_data_size
< sizeof(wfx
) - sizeof(WAVEFORMATEX
))
829 FIXME("Codec data is incomplete.\n");
833 format
->major_type
= WG_MAJOR_TYPE_AUDIO_MPEG1
;
834 format
->u
.audio
.channels
= channels
;
835 format
->u
.audio
.rate
= rate
;
836 format
->u
.audio
.layer
= wfx
.fwHeadLayer
;
839 static void mf_media_type_to_wg_format_audio_mpeg_layer3(IMFMediaType
*type
, const GUID
*subtype
, struct wg_format
*format
)
841 UINT32 rate
, channels
;
843 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_SAMPLES_PER_SECOND
, &rate
)))
845 FIXME("Sample rate is not set.\n");
848 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_NUM_CHANNELS
, &channels
)))
850 FIXME("Channel count is not set.\n");
854 format
->major_type
= WG_MAJOR_TYPE_AUDIO_MPEG1
;
855 format
->u
.audio
.channels
= channels
;
856 format
->u
.audio
.rate
= rate
;
857 format
->u
.audio
.layer
= 3;
860 static void mf_media_type_to_wg_format_audio_mpeg4(IMFMediaType
*type
, const GUID
*subtype
, struct wg_format
*format
)
862 BYTE buffer
[sizeof(HEAACWAVEFORMAT
) + 64];
863 HEAACWAVEFORMAT
*wfx
= (HEAACWAVEFORMAT
*)buffer
;
864 UINT32 codec_data_size
;
867 wfx
->wfInfo
.wfx
.cbSize
= sizeof(buffer
) - sizeof(wfx
->wfInfo
.wfx
);
868 if (FAILED(IMFMediaType_GetBlob(type
, &MF_MT_USER_DATA
, (BYTE
*)(&wfx
->wfInfo
.wfx
+ 1),
869 wfx
->wfInfo
.wfx
.cbSize
, &codec_data_size
)))
871 FIXME("Codec data is not set.\n");
875 raw_aac
= IsEqualGUID(subtype
, &MFAudioFormat_RAW_AAC
);
877 codec_data_size
-= min(codec_data_size
, sizeof(HEAACWAVEINFO
) - sizeof(WAVEFORMATEX
));
878 if (codec_data_size
> sizeof(format
->u
.audio
.codec_data
))
880 FIXME("Codec data needs %u bytes.\n", codec_data_size
);
884 memcpy(format
->u
.audio
.codec_data
, (BYTE
*)(&wfx
->wfInfo
.wfx
+ 1), codec_data_size
);
886 memcpy(format
->u
.audio
.codec_data
, wfx
->pbAudioSpecificConfig
, codec_data_size
);
888 format
->major_type
= WG_MAJOR_TYPE_AUDIO_MPEG4
;
890 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AAC_PAYLOAD_TYPE
, &format
->u
.audio
.payload_type
)))
891 format
->u
.audio
.payload_type
= 0;
893 format
->u
.audio
.codec_data_len
= codec_data_size
;
896 static enum wg_video_format
mf_video_format_to_wg(const GUID
*subtype
)
900 for (i
= 0; i
< ARRAY_SIZE(video_formats
); ++i
)
902 if (IsEqualGUID(subtype
, video_formats
[i
].subtype
))
903 return video_formats
[i
].format
;
905 FIXME("Unrecognized video subtype %s.\n", debugstr_guid(subtype
));
906 return WG_VIDEO_FORMAT_UNKNOWN
;
909 static void mf_media_type_to_wg_format_video(IMFMediaType
*type
, const GUID
*subtype
, struct wg_format
*format
)
911 UINT64 frame_rate
, frame_size
;
912 MFVideoArea aperture
;
915 if (FAILED(IMFMediaType_GetUINT64(type
, &MF_MT_FRAME_SIZE
, &frame_size
)))
917 FIXME("Frame size is not set.\n");
921 format
->major_type
= WG_MAJOR_TYPE_VIDEO
;
922 format
->u
.video
.width
= (UINT32
)(frame_size
>> 32);
923 format
->u
.video
.height
= (UINT32
)frame_size
;
924 format
->u
.video
.fps_n
= 1;
925 format
->u
.video
.fps_d
= 1;
927 if (SUCCEEDED(IMFMediaType_GetBlob(type
, &MF_MT_MINIMUM_DISPLAY_APERTURE
, (BYTE
*)&aperture
,
928 sizeof(aperture
), &size
)) && size
== sizeof(aperture
))
930 format
->u
.video
.padding
.left
= aperture
.OffsetX
.value
;
931 format
->u
.video
.padding
.top
= aperture
.OffsetY
.value
;
932 format
->u
.video
.padding
.right
= format
->u
.video
.width
- aperture
.Area
.cx
- aperture
.OffsetX
.value
;
933 format
->u
.video
.padding
.bottom
= format
->u
.video
.height
- aperture
.Area
.cy
- aperture
.OffsetY
.value
;
936 if (SUCCEEDED(IMFMediaType_GetUINT64(type
, &MF_MT_FRAME_RATE
, &frame_rate
)) && (UINT32
)frame_rate
)
938 format
->u
.video
.fps_n
= (UINT32
)(frame_rate
>> 32);
939 format
->u
.video
.fps_d
= (UINT32
)frame_rate
;
942 format
->u
.video
.format
= mf_video_format_to_wg(subtype
);
944 if (SUCCEEDED(IMFMediaType_GetUINT32(type
, &MF_MT_DEFAULT_STRIDE
, &stride
)))
947 format
->u
.video
.height
= -format
->u
.video
.height
;
949 else if (wg_video_format_is_rgb(format
->u
.video
.format
))
951 format
->u
.video
.height
= -format
->u
.video
.height
;
955 static void mf_media_type_to_wg_format_audio_wma(IMFMediaType
*type
, const GUID
*subtype
, struct wg_format
*format
)
957 UINT32 rate
, depth
, channels
, block_align
, bytes_per_second
, codec_data_len
;
961 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_SAMPLES_PER_SECOND
, &rate
)))
963 FIXME("Sample rate is not set.\n");
966 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_NUM_CHANNELS
, &channels
)))
968 FIXME("Channel count is not set.\n");
971 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_BLOCK_ALIGNMENT
, &block_align
)))
973 FIXME("Block alignment is not set.\n");
976 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_BITS_PER_SAMPLE
, &depth
)))
978 FIXME("Depth is not set.\n");
981 if (FAILED(IMFMediaType_GetBlob(type
, &MF_MT_USER_DATA
, codec_data
, sizeof(codec_data
), &codec_data_len
)))
983 FIXME("Codec data is not set.\n");
986 if (FAILED(IMFMediaType_GetUINT32(type
, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND
, &bytes_per_second
)))
988 FIXME("Bitrate is not set.\n");
989 bytes_per_second
= 0;
992 if (IsEqualGUID(subtype
, &MEDIASUBTYPE_MSAUDIO1
))
994 else if (IsEqualGUID(subtype
, &MFAudioFormat_WMAudioV8
))
996 else if (IsEqualGUID(subtype
, &MFAudioFormat_WMAudioV9
))
998 else if (IsEqualGUID(subtype
, &MFAudioFormat_WMAudio_Lossless
))
1006 format
->major_type
= WG_MAJOR_TYPE_AUDIO_WMA
;
1007 format
->u
.audio
.version
= version
;
1008 format
->u
.audio
.bitrate
= bytes_per_second
* 8;
1009 format
->u
.audio
.rate
= rate
;
1010 format
->u
.audio
.depth
= depth
;
1011 format
->u
.audio
.channels
= channels
;
1012 format
->u
.audio
.block_align
= block_align
;
1013 format
->u
.audio
.codec_data_len
= codec_data_len
;
1014 memcpy(format
->u
.audio
.codec_data
, codec_data
, codec_data_len
);
1017 static void mf_media_type_to_wg_format_video_h264(IMFMediaType
*type
, struct wg_format
*format
)
1019 UINT32 profile
, level
, codec_data_len
;
1020 UINT64 frame_rate
, frame_size
;
1023 memset(format
, 0, sizeof(*format
));
1024 format
->major_type
= WG_MAJOR_TYPE_VIDEO_H264
;
1026 if (SUCCEEDED(IMFMediaType_GetUINT64(type
, &MF_MT_FRAME_SIZE
, &frame_size
)))
1028 format
->u
.video
.width
= frame_size
>> 32;
1029 format
->u
.video
.height
= (UINT32
)frame_size
;
1032 if (SUCCEEDED(IMFMediaType_GetUINT64(type
, &MF_MT_FRAME_RATE
, &frame_rate
)) && (UINT32
)frame_rate
)
1034 format
->u
.video
.fps_n
= frame_rate
>> 32;
1035 format
->u
.video
.fps_d
= (UINT32
)frame_rate
;
1039 format
->u
.video
.fps_n
= 1;
1040 format
->u
.video
.fps_d
= 1;
1043 if (SUCCEEDED(IMFMediaType_GetUINT32(type
, &MF_MT_MPEG2_PROFILE
, &profile
)))
1044 format
->u
.video
.profile
= profile
;
1046 if (SUCCEEDED(IMFMediaType_GetUINT32(type
, &MF_MT_MPEG2_LEVEL
, &level
)))
1047 format
->u
.video
.level
= level
;
1049 if (SUCCEEDED(IMFMediaType_GetAllocatedBlob(type
, &MF_MT_MPEG_SEQUENCE_HEADER
, &codec_data
, &codec_data_len
)))
1051 if (codec_data_len
<= sizeof(format
->u
.video
.codec_data
))
1053 format
->u
.video
.codec_data_len
= codec_data_len
;
1054 memcpy(format
->u
.video
.codec_data
, codec_data
, codec_data_len
);
1058 WARN("Codec data buffer too small, codec data size %u.\n", codec_data_len
);
1060 CoTaskMemFree(codec_data
);
1064 static void mf_media_type_to_wg_format_video_indeo(IMFMediaType
*type
, uint32_t version
, struct wg_format
*format
)
1066 UINT64 frame_rate
, frame_size
;
1068 memset(format
, 0, sizeof(*format
));
1069 format
->major_type
= WG_MAJOR_TYPE_VIDEO_INDEO
;
1071 if (SUCCEEDED(IMFMediaType_GetUINT64(type
, &MF_MT_FRAME_SIZE
, &frame_size
)))
1073 format
->u
.video
.width
= frame_size
>> 32;
1074 format
->u
.video
.height
= (UINT32
)frame_size
;
1077 if (SUCCEEDED(IMFMediaType_GetUINT64(type
, &MF_MT_FRAME_RATE
, &frame_rate
)) && (UINT32
)frame_rate
)
1079 format
->u
.video
.fps_n
= frame_rate
>> 32;
1080 format
->u
.video
.fps_d
= (UINT32
)frame_rate
;
1084 format
->u
.video
.fps_n
= 1;
1085 format
->u
.video
.fps_d
= 1;
1088 format
->u
.video
.version
= version
;
1091 static void mf_media_type_to_wg_format_video_wmv(IMFMediaType
*type
, const GUID
*subtype
, struct wg_format
*format
)
1093 UINT64 frame_rate
, frame_size
;
1094 UINT32 codec_data_len
;
1097 memset(format
, 0, sizeof(*format
));
1098 format
->major_type
= WG_MAJOR_TYPE_VIDEO_WMV
;
1100 if (SUCCEEDED(IMFMediaType_GetUINT64(type
, &MF_MT_FRAME_SIZE
, &frame_size
)))
1102 format
->u
.video
.width
= frame_size
>> 32;
1103 format
->u
.video
.height
= (UINT32
)frame_size
;
1106 if (SUCCEEDED(IMFMediaType_GetUINT64(type
, &MF_MT_FRAME_RATE
, &frame_rate
)) && (UINT32
)frame_rate
)
1108 format
->u
.video
.fps_n
= frame_rate
>> 32;
1109 format
->u
.video
.fps_d
= (UINT32
)frame_rate
;
1113 format
->u
.video
.fps_n
= 1;
1114 format
->u
.video
.fps_d
= 1;
1117 if (IsEqualGUID(subtype
, &MEDIASUBTYPE_WMV1
))
1118 format
->u
.video
.format
= WG_VIDEO_FORMAT_WMV1
;
1119 else if (IsEqualGUID(subtype
, &MEDIASUBTYPE_WMV2
))
1120 format
->u
.video
.format
= WG_VIDEO_FORMAT_WMV2
;
1121 else if (IsEqualGUID(subtype
, &MEDIASUBTYPE_WMV3
))
1122 format
->u
.video
.format
= WG_VIDEO_FORMAT_WMV3
;
1123 else if (IsEqualGUID(subtype
, &MEDIASUBTYPE_WMVA
))
1124 format
->u
.video
.format
= WG_VIDEO_FORMAT_WMVA
;
1125 else if (IsEqualGUID(subtype
, &MEDIASUBTYPE_WVC1
))
1126 format
->u
.video
.format
= WG_VIDEO_FORMAT_WVC1
;
1128 format
->u
.video
.format
= WG_VIDEO_FORMAT_UNKNOWN
;
1130 if (SUCCEEDED(IMFMediaType_GetAllocatedBlob(type
, &MF_MT_USER_DATA
, &codec_data
, &codec_data_len
)))
1132 if (codec_data_len
<= sizeof(format
->u
.video
.codec_data
))
1134 format
->u
.video
.codec_data_len
= codec_data_len
;
1135 memcpy(format
->u
.video
.codec_data
, codec_data
, codec_data_len
);
1139 WARN("Codec data buffer too small, codec data size %u.\n", codec_data_len
);
1141 CoTaskMemFree(codec_data
);
1145 void mf_media_type_to_wg_format(IMFMediaType
*type
, struct wg_format
*format
)
1147 GUID major_type
, subtype
;
1149 memset(format
, 0, sizeof(*format
));
1151 if (FAILED(IMFMediaType_GetMajorType(type
, &major_type
)))
1153 FIXME("Major type is not set.\n");
1156 if (FAILED(IMFMediaType_GetGUID(type
, &MF_MT_SUBTYPE
, &subtype
)))
1158 FIXME("Subtype is not set.\n");
1162 if (IsEqualGUID(&major_type
, &MFMediaType_Audio
))
1164 if (IsEqualGUID(&subtype
, &MFAudioFormat_MPEG
))
1165 mf_media_type_to_wg_format_audio_mpeg(type
, &subtype
, format
);
1166 else if (IsEqualGUID(&subtype
, &MFAudioFormat_MP3
))
1167 mf_media_type_to_wg_format_audio_mpeg_layer3(type
, &subtype
, format
);
1168 else if (IsEqualGUID(&subtype
, &MEDIASUBTYPE_MSAUDIO1
) ||
1169 IsEqualGUID(&subtype
, &MFAudioFormat_WMAudioV8
) ||
1170 IsEqualGUID(&subtype
, &MFAudioFormat_WMAudioV9
) ||
1171 IsEqualGUID(&subtype
, &MFAudioFormat_WMAudio_Lossless
))
1172 mf_media_type_to_wg_format_audio_wma(type
, &subtype
, format
);
1173 else if (IsEqualGUID(&subtype
, &MFAudioFormat_AAC
) || IsEqualGUID(&subtype
, &MFAudioFormat_RAW_AAC
))
1174 mf_media_type_to_wg_format_audio_mpeg4(type
, &subtype
, format
);
1176 mf_media_type_to_wg_format_audio(type
, &subtype
, format
);
1178 else if (IsEqualGUID(&major_type
, &MFMediaType_Video
))
1180 if (IsEqualGUID(&subtype
, &MFVideoFormat_H264
))
1181 mf_media_type_to_wg_format_video_h264(type
, format
);
1182 else if (IsEqualGUID(&subtype
, &MFVideoFormat_IV50
))
1183 mf_media_type_to_wg_format_video_indeo(type
, 5, format
);
1184 else if (IsEqualGUID(&subtype
, &MEDIASUBTYPE_WMV1
)
1185 || IsEqualGUID(&subtype
, &MEDIASUBTYPE_WMV2
)
1186 || IsEqualGUID(&subtype
, &MEDIASUBTYPE_WMVA
)
1187 || IsEqualGUID(&subtype
, &MEDIASUBTYPE_WMVP
)
1188 || IsEqualGUID(&subtype
, &MEDIASUBTYPE_WVP2
)
1189 || IsEqualGUID(&subtype
, &MEDIASUBTYPE_WMV_Unknown
)
1190 || IsEqualGUID(&subtype
, &MEDIASUBTYPE_WVC1
)
1191 || IsEqualGUID(&subtype
, &MEDIASUBTYPE_WMV3
)
1192 || IsEqualGUID(&subtype
, &MFVideoFormat_VC1S
))
1193 mf_media_type_to_wg_format_video_wmv(type
, &subtype
, format
);
1195 mf_media_type_to_wg_format_video(type
, &subtype
, format
);
1198 FIXME("Unrecognized major type %s.\n", debugstr_guid(&major_type
));