From 4258ccd54dc1816aad4ee12de3ee0ad5addaf10f Mon Sep 17 00:00:00 2001 From: Joshua Minor Date: Sat, 5 Nov 2022 23:58:27 -0700 Subject: [PATCH] Deal with "close" timecode rates via a heuristic, instead of misleading entries in valid_timecode_rates table. Signed-off-by: Joshua Minor --- src/opentime/rationalTime.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/opentime/rationalTime.cpp b/src/opentime/rationalTime.cpp index de7ead556..bc4b40409 100644 --- a/src/opentime/rationalTime.cpp +++ b/src/opentime/rationalTime.cpp @@ -13,14 +13,8 @@ namespace opentime { namespace OPENTIME_VERSION { RationalTime RationalTime::_invalid_time{ 0, RationalTime::_invalid_rate }; -static constexpr std::array dropframe_timecode_rates{ { - // 23.976, - // 23.98, - // 23.97, - // 24000.0/1001.0, - 29.97, +static constexpr std::array dropframe_timecode_rates{ { 30000.0 / 1001.0, - 59.94, 60000.0 / 1001.0, } }; @@ -38,12 +32,9 @@ static constexpr std::array smpte_timecode_rates{ 60.0 } }; -static constexpr std::array valid_timecode_rates{ +static constexpr std::array valid_timecode_rates{ { 1.0, 12.0, - 23.97, - 23.976, - 23.98, 24000.0 / 1001.0, 24.0, 25.0, @@ -52,7 +43,6 @@ static constexpr std::array valid_timecode_rates{ 30.0, 48.0, 50.0, - 59.94, 60000.0 / 1001.0, 60.0 } }; @@ -460,7 +450,8 @@ RationalTime::to_timecode( return std::string(); } - if (!is_valid_timecode_rate(rate)) + double nearest_valid_rate = nearest_valid_timecode_rate(rate); + if (abs(nearest_valid_rate - rate) > 0.1) { if (error_status) { @@ -469,6 +460,9 @@ RationalTime::to_timecode( return std::string(); } + // Let's assume this is the rate instead of the given rate. + rate = nearest_valid_rate; + bool rate_is_dropframe = is_dropframe_rate(rate); if (drop_frame == IsDropFrameRate::ForceYes and not rate_is_dropframe) { @@ -504,11 +498,11 @@ RationalTime::to_timecode( } else { - if ((rate == 29.97) or (rate == 30000 / 1001.0)) + if (rate == 30000 / 1001.0) { dropframes = 2; } - else if (rate == 59.94) + else if (rate == 60000 / 1001.0) { dropframes = 4; }