From 1434c624ffac87a67ff3c0c1f5227879110bc895 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 13 Dec 2023 06:41:33 +0100 Subject: [PATCH] Fix ffmpeg-5+ encoding drop-frame framerates --- gtk2_ardour/transcode_ffmpeg.cc | 12 +++++++----- gtk2_ardour/transcode_ffmpeg.h | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc index ca0a1db3d9..e5db3127e9 100644 --- a/gtk2_ardour/transcode_ffmpeg.cc +++ b/gtk2_ardour/transcode_ffmpeg.cc @@ -183,8 +183,10 @@ TranscodeFfmpeg::probe () } m_codec += "(" + value + ")"; } else if (key == X_("r_frame_rate")) { + m_fps_str = value; PARSE_FRACTIONAL_FPS (m_fps) } else if (key == X_("avg_frame_rate") && m_fps == 0) { + m_fps_str = value; PARSE_FRACTIONAL_FPS (m_fps) } else if (key == X_("time_base")) { PARSE_FRACTIONAL_FPS (timebase) @@ -338,7 +340,7 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf argp[a++] = SystemExec::format_key_value_parameter (it->first.c_str (), it->second.c_str ()); } - if (m_fps > 0) { + if (m_fps > 0 && !m_fps_str.empty ()) { m_lead_in = rint (m_lead_in * m_fps) / m_fps; m_lead_out = rint (m_lead_out * m_fps) / m_fps; } @@ -346,12 +348,12 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf if (m_lead_in != 0 && m_lead_out != 0) { std::ostringstream osstream; argp[a++] = strdup ("-vf"); - osstream << "color=c=black:s=" << m_width << "x" << m_height << ":r=" << m_fps << ":d=" << m_lead_in; + osstream << "color=c=black:s=" << m_width << "x" << m_height << ":r=" << m_fps_str << ":d=" << m_lead_in; if (!m_sar.empty ()) { osstream << ":sar=" << m_sar; } osstream << " [pre]; "; - osstream << "color=c=black:s=" << m_width << "x" << m_height << ":r=" << m_fps << ":d=" << m_lead_out; + osstream << "color=c=black:s=" << m_width << "x" << m_height << ":r=" << m_fps_str << ":d=" << m_lead_out; if (!m_sar.empty ()) { osstream << ":sar=" << m_sar; } @@ -361,7 +363,7 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf } else if (m_lead_in != 0) { std::ostringstream osstream; argp[a++] = strdup ("-vf"); - osstream << "color=c=black:s=" << m_width << "x" << m_height << ":r=" << m_fps << ":d=" << m_lead_in; + osstream << "color=c=black:s=" << m_width << "x" << m_height << ":r=" << m_fps_str << ":d=" << m_lead_in; if (!m_sar.empty ()) { osstream << ":sar=" << m_sar; } @@ -371,7 +373,7 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf } else if (m_lead_out != 0) { std::ostringstream osstream; argp[a++] = strdup ("-vf"); - osstream << "color=c=black:s=" << m_width << "x" << m_height << ":r=" << m_fps << ":d=" << m_lead_out; + osstream << "color=c=black:s=" << m_width << "x" << m_height << ":r=" << m_fps_str << ":d=" << m_lead_out; if (!m_sar.empty ()) { osstream << ":sar=" << m_sar; } diff --git a/gtk2_ardour/transcode_ffmpeg.h b/gtk2_ardour/transcode_ffmpeg.h index 0a443a186d..372d722c3d 100644 --- a/gtk2_ardour/transcode_ffmpeg.h +++ b/gtk2_ardour/transcode_ffmpeg.h @@ -183,6 +183,7 @@ protected: std::string infile; ARDOUR::SystemExec* ffcmd; double m_fps; + std::string m_fps_str; double m_aspect; std::string m_sar; ARDOUR::samplecnt_t m_duration;