From: Conor McCarthy <cmccarthy@codeweavers.com> The decoded type is inconsistent across Windows versions. --- dlls/mf/tests/topology.c | 11 +++-------- dlls/mf/tests/transform.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/dlls/mf/tests/topology.c b/dlls/mf/tests/topology.c index ad89dd3269e..521f49671cf 100644 --- a/dlls/mf/tests/topology.c +++ b/dlls/mf/tests/topology.c @@ -2268,16 +2268,11 @@ static void test_topology_loader(void) ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), }; - static const media_type_desc audio_float_44100_stereo = + static const media_type_desc audio_float_44100_no_ch = { ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_Float), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 2 * 4), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 2 * 4 * 44100), ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 4 * 8), - ATTR_UINT32(MF_MT_AUDIO_CHANNEL_MASK, 3, .todo = TRUE), ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1), }; static const media_type_desc video_i420_1280 = @@ -2468,9 +2463,9 @@ static void test_topology_loader(void) .expected_result = S_OK, .decoder_class = CLSID_CMP3DecMediaObject, }, { - /* MP3 -> PCM, need both decoder and converter */ + /* MP3 -> float, need both decoder and converter */ .input_type = &audio_mp3_44100, .output_type = &audio_float_48000, .sink_method = MF_CONNECT_ALLOW_DECODER, .source_method = -1, - .current_input = &audio_mp3_44100, .decoded_type = &audio_float_44100_stereo, + .current_input = &audio_mp3_44100, .decoded_type = &audio_float_44100_no_ch, .expected_result = S_OK, .decoder_class = CLSID_CMP3DecMediaObject, .converter_class = CLSID_CResamplerMediaObject, }, diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 4dd9ff7a93e..de085d9926e 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -317,6 +317,9 @@ const char *debugstr_propvariant(const PROPVARIANT *propvar, BOOL ratio) void check_attributes_(const char *file, int line, IMFAttributes *attributes, const struct attribute_desc *desc, ULONG limit) { + UINT32 ch, sample_size, alignment, samples_per_sec, bytes_per_sec; + IMFMediaType *media_type; + GUID major, subtype; PROPVARIANT value; int i, ret; HRESULT hr; @@ -334,6 +337,32 @@ void check_attributes_(const char *file, int line, IMFAttributes *attributes, debugstr_a(desc[i].name), value.vt, debugstr_propvariant(&value, desc[i].ratio)); PropVariantClear(&value); } + + if (FAILED(IMFAttributes_QueryInterface(attributes, &IID_IMFMediaType, (void **)&media_type))) + return; + + /* Check consistency of some float/PCM media type attributes */ + + hr = IMFMediaType_GetMajorType(media_type, &major); + ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &subtype); + ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + if (IsEqualGUID(&major, &MFMediaType_Audio) + && (IsEqualGUID(&subtype, &MFAudioFormat_Float) || IsEqualGUID(&subtype, &MFAudioFormat_PCM)) + && SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AUDIO_NUM_CHANNELS, &ch)) + && SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &sample_size))) + { + UINT bytes_per_sample = ch * sample_size / CHAR_BIT; + + if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &alignment))) + ok_(__FILE__, line)(alignment == bytes_per_sample, "Unexpected alignment %u\n", alignment); + if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &samples_per_sec)) + && SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &bytes_per_sec))) + ok_(__FILE__, line)(bytes_per_sec == bytes_per_sample * samples_per_sec, "Unexpected bytes_per_sec %u\n", bytes_per_sec); + } + + IMFMediaType_Release(media_type); } struct transform_info -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9947