From: Rémi Bernon rbernon@codeweavers.com
Native seems to also treat some frame rate specially, matching a wide range of time per frame into the same predefined frame rates. --- dlls/mfplat/mediatype.c | 24 ++++++++++++++++++++++++ dlls/mfplat/tests/mfplat.c | 4 ---- 2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 6ed23c0ef6a..181c96b81bd 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -3808,6 +3808,30 @@ HRESULT WINAPI MFInitMediaTypeFromVideoInfoHeader2(IMFMediaType *media_type, con mediatype_set_blob(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, (BYTE *)&aperture, sizeof(aperture), &hr); }
+ if (vih->AvgTimePerFrame) + { + static const double frame_rates[] = {60.0, 30.0, 25.0, 24.0}; + double fps = 10000000.0 / vih->AvgTimePerFrame; + UINT i; + + mediatype_set_uint64(media_type, &MF_MT_FRAME_RATE, 10000000, vih->AvgTimePerFrame, &hr); + + for (i = 0; i < ARRAY_SIZE(frame_rates); i++) + { + if (fabs(fps - frame_rates[i]) <= 0.01) + { + mediatype_set_uint64(media_type, &MF_MT_FRAME_RATE, frame_rates[i], 1, &hr); + break; + } + + if (fabs(fps - 1000 * frame_rates[i] / 1001.0) <= 0.01) + { + mediatype_set_uint64(media_type, &MF_MT_FRAME_RATE, frame_rates[i] * 1000, 1001, &hr); + break; + } + } + } + return hr; }
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 7277346ebfe..a5b10c33ad7 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -10035,9 +10035,7 @@ static void test_MFInitMediaTypeFromVideoInfoHeader(void) hr = MFInitMediaTypeFromVideoInfoHeader(media_type, &vih, sizeof(vih), &GUID_NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_RATE, &value64); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(value64 == ((UINT64)10000000 << 32 | 1151617), "Unexpected value %#I64x.\n", value64);
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_FIXED_SIZE_SAMPLES, &value32); @@ -10288,9 +10286,7 @@ static void test_MFInitMediaTypeFromVideoInfoHeader2(void) hr = MFInitMediaTypeFromVideoInfoHeader2(media_type, &vih, sizeof(vih), &GUID_NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_RATE, &value64); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(value64 == ((UINT64)10000000 << 32 | 1151617), "Unexpected value %#I64x.\n", value64);
value32 = 0xdeadbeef;