Module: wine Branch: master Commit: aa385765a1229c4dd6c15d45cb1883ce93bbc30b URL: https://gitlab.winehq.org/wine/wine/-/commit/aa385765a1229c4dd6c15d45cb1883c...
Author: Rémi Bernon rbernon@codeweavers.com Date: Mon Mar 18 13:41:28 2024 +0100
mfplat: Support flexible frame time in MFAverageTimePerFrameToFrameRate.
---
dlls/mfplat/mediatype.c | 82 +++++++++++++++++++++++----------------------- dlls/mfplat/tests/mfplat.c | 34 +++++++++---------- 2 files changed, 57 insertions(+), 59 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 6ed23c0ef6a..0fd8402d4d2 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -3353,15 +3353,45 @@ HRESULT WINAPI MFConvertColorInfoToDXVA(DWORD *dxva_info, const MFVIDEOFORMAT *f
struct frame_rate { - UINT64 key; - UINT64 value; + UINT64 time; + UINT64 rate; +}; + +static const struct frame_rate known_rates[] = +{ +#define KNOWN_RATE(ft,n,d) { ft, ((UINT64)n << 32) | d } + KNOWN_RATE(417188, 24000, 1001), + KNOWN_RATE(416667, 24, 1), + KNOWN_RATE(400000, 25, 1), + KNOWN_RATE(333667, 30000, 1001), + KNOWN_RATE(333333, 30, 1), + KNOWN_RATE(200000, 50, 1), + KNOWN_RATE(166833, 60000, 1001), + KNOWN_RATE(166667, 60, 1), +#undef KNOWN_RATE };
-static int __cdecl frame_rate_compare(const void *a, const void *b) +static const struct frame_rate *known_rate_from_rate(UINT64 rate) +{ + UINT i; + for (i = 0; i < ARRAY_SIZE(known_rates); i++) + { + if (rate == known_rates[i].rate) + return known_rates + i; + } + return NULL; +} + +static const struct frame_rate *known_rate_from_time(UINT64 time) { - const UINT64 *key = a; - const struct frame_rate *known_rate = b; - return *key == known_rate->key ? 0 : ( *key < known_rate->key ? 1 : -1 ); + UINT i; + for (i = 0; i < ARRAY_SIZE(known_rates); i++) + { + if (time >= known_rates[i].time - 30 + && time <= known_rates[i].time + 30) + return known_rates + i; + } + return NULL; }
/*********************************************************************** @@ -3369,29 +3399,13 @@ static int __cdecl frame_rate_compare(const void *a, const void *b) */ HRESULT WINAPI MFFrameRateToAverageTimePerFrame(UINT32 numerator, UINT32 denominator, UINT64 *avgframetime) { - static const struct frame_rate known_rates[] = - { -#define KNOWN_RATE(n,d,ft) { ((UINT64)n << 32) | d, ft } - KNOWN_RATE(60000, 1001, 166833), - KNOWN_RATE(30000, 1001, 333667), - KNOWN_RATE(24000, 1001, 417188), - KNOWN_RATE(60, 1, 166667), - KNOWN_RATE(50, 1, 200000), - KNOWN_RATE(30, 1, 333333), - KNOWN_RATE(25, 1, 400000), - KNOWN_RATE(24, 1, 416667), -#undef KNOWN_RATE - }; UINT64 rate = ((UINT64)numerator << 32) | denominator; const struct frame_rate *entry;
TRACE("%u, %u, %p.\n", numerator, denominator, avgframetime);
- if ((entry = bsearch(&rate, known_rates, ARRAY_SIZE(known_rates), sizeof(*known_rates), - frame_rate_compare))) - { - *avgframetime = entry->value; - } + if ((entry = known_rate_from_rate(rate))) + *avgframetime = entry->time; else *avgframetime = numerator ? denominator * (UINT64)10000000 / numerator : 0;
@@ -3417,29 +3431,15 @@ static unsigned int get_gcd(unsigned int a, unsigned int b) */ HRESULT WINAPI MFAverageTimePerFrameToFrameRate(UINT64 avgtime, UINT32 *numerator, UINT32 *denominator) { - static const struct frame_rate known_rates[] = - { -#define KNOWN_RATE(ft,n,d) { ft, ((UINT64)n << 32) | d } - KNOWN_RATE(417188, 24000, 1001), - KNOWN_RATE(416667, 24, 1), - KNOWN_RATE(400000, 25, 1), - KNOWN_RATE(333667, 30000, 1001), - KNOWN_RATE(333333, 30, 1), - KNOWN_RATE(200000, 50, 1), - KNOWN_RATE(166833, 60000, 1001), - KNOWN_RATE(166667, 60, 1), -#undef KNOWN_RATE - }; const struct frame_rate *entry; unsigned int gcd;
TRACE("%s, %p, %p.\n", wine_dbgstr_longlong(avgtime), numerator, denominator);
- if ((entry = bsearch(&avgtime, known_rates, ARRAY_SIZE(known_rates), sizeof(*known_rates), - frame_rate_compare))) + if ((entry = known_rate_from_time(avgtime))) { - *numerator = entry->value >> 32; - *denominator = entry->value; + *numerator = entry->rate >> 32; + *denominator = entry->rate; } else if (avgtime) { diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index e6ed89225d5..b6d63f42d1c 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -8206,40 +8206,39 @@ static void test_MFAverageTimePerFrameToFrameRate(void) unsigned int numerator; unsigned int denominator; UINT64 avgtime; - BOOL todo; } frame_rate_tests[] = { - { 60000, 1001, 166863, TRUE }, + { 60000, 1001, 166863 }, { 60000, 1001, 166833 }, - { 60000, 1001, 166803, TRUE }, + { 60000, 1001, 166803 },
- { 30000, 1001, 333697, TRUE }, + { 30000, 1001, 333697 }, { 30000, 1001, 333667 }, - { 30000, 1001, 333637, TRUE }, + { 30000, 1001, 333637 },
- { 24000, 1001, 417218, TRUE }, + { 24000, 1001, 417218 }, { 24000, 1001, 417188 }, - { 24000, 1001, 417158, TRUE }, + { 24000, 1001, 417158 },
- { 60, 1, 166697, TRUE }, + { 60, 1, 166697 }, { 60, 1, 166667 }, - { 60, 1, 166637, TRUE }, + { 60, 1, 166637 },
- { 30, 1, 333363, TRUE }, + { 30, 1, 333363 }, { 30, 1, 333333 }, - { 30, 1, 333303, TRUE }, + { 30, 1, 333303 },
- { 50, 1, 200030, TRUE }, + { 50, 1, 200030 }, { 50, 1, 200000 }, - { 50, 1, 199970, TRUE }, + { 50, 1, 199970 },
- { 25, 1, 400030, TRUE }, + { 25, 1, 400030 }, { 25, 1, 400000 }, - { 25, 1, 399970, TRUE }, + { 25, 1, 399970 },
- { 24, 1, 416697, TRUE }, + { 24, 1, 416697 }, { 24, 1, 416667 }, - { 24, 1, 416637, TRUE }, + { 24, 1, 416637 },
{ 1000000, 25641, 256410 }, { 10000000, 83333, 83333 }, @@ -8264,7 +8263,6 @@ static void test_MFAverageTimePerFrameToFrameRate(void) numerator = denominator = 12345; hr = MFAverageTimePerFrameToFrameRate(frame_rate_tests[i].avgtime, &numerator, &denominator); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine_if(frame_rate_tests[i].todo) ok(numerator == frame_rate_tests[i].numerator && denominator == frame_rate_tests[i].denominator, "%u: unexpected %u/%u, expected %u/%u.\n", i, numerator, denominator, frame_rate_tests[i].numerator, frame_rate_tests[i].denominator);