Fix mp3 and video-export (ffmpeg/ffprobe detection)

A call to `transcoder_exe (unused, unused)` passes the same
string reference for `ffmpeg` and `ffprobe`. If this happens
during the first call of this function, the path for the latter
is cached for both external tools.
This commit is contained in:
Robin Gareus 2021-01-18 17:19:32 +01:00
parent 528cf92ed5
commit 9c06f693e9
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04

View File

@ -159,62 +159,67 @@ ArdourVideoToolPaths::transcoder_exe (std::string &ffmpeg_exe, std::string &ffpr
std::string program_files = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES); std::string program_files = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES);
#endif #endif
/* note: some callers pass the same reference "unused" to both &ffmpeg_exe, and &ffprobe_exe) */
ffmpeg_exe = X_(""); ffmpeg_exe = X_("");
ffprobe_exe = X_(""); ffprobe_exe = X_("");
_ffmpeg_exe = X_("");
_ffprobe_exe = X_("");
std::string ff_file_path; std::string ff_file_path;
if (find_file (Searchpath(Glib::getenv("PATH")), X_("ffmpeg_harvid"), ff_file_path)) { if (find_file (Searchpath(Glib::getenv("PATH")), X_("ffmpeg_harvid"), ff_file_path)) {
ffmpeg_exe = ff_file_path; _ffmpeg_exe = ff_file_path;
} }
#ifdef PLATFORM_WINDOWS #ifdef PLATFORM_WINDOWS
else if (PBD::windows_query_registry ("Software\\" PROGRAM_NAME "\\v" PROGRAM_VERSION "\\video", "Install_Dir", reg)) else if (PBD::windows_query_registry ("Software\\" PROGRAM_NAME "\\v" PROGRAM_VERSION "\\video", "Install_Dir", reg))
{ {
ffmpeg_exe = g_build_filename(reg.c_str(), X_("harvid"), X_("ffmpeg.exe"), NULL); _ffmpeg_exe = g_build_filename(reg.c_str(), X_("harvid"), X_("ffmpeg.exe"), NULL);
ffprobe_exe = g_build_filename(reg.c_str(), X_("harvid"), X_("ffprobe.exe"), NULL); _ffprobe_exe = g_build_filename(reg.c_str(), X_("harvid"), X_("ffprobe.exe"), NULL);
} }
else if (PBD::windows_query_registry ("Software\\RSS\\harvid", "Install_Dir", reg)) else if (PBD::windows_query_registry ("Software\\RSS\\harvid", "Install_Dir", reg))
{ {
ffmpeg_exe = g_build_filename(reg.c_str(), X_("ffmpeg.exe"), NULL); _ffmpeg_exe = g_build_filename(reg.c_str(), X_("ffmpeg.exe"), NULL);
ffprobe_exe = g_build_filename(reg.c_str(), X_("ffprobe.exe"), NULL); _ffprobe_exe = g_build_filename(reg.c_str(), X_("ffprobe.exe"), NULL);
} }
if (Glib::file_test(ffmpeg_exe, Glib::FILE_TEST_EXISTS)) { if (Glib::file_test(_ffmpeg_exe, Glib::FILE_TEST_EXISTS)) {
; ;
} }
else if (!program_files.empty() && Glib::file_test(g_build_filename(program_files.c_str(), "harvid", "ffmpeg.exe", NULL), Glib::FILE_TEST_EXISTS)) { else if (!program_files.empty() && Glib::file_test(g_build_filename(program_files.c_str(), "harvid", "ffmpeg.exe", NULL), Glib::FILE_TEST_EXISTS)) {
ffmpeg_exe = g_build_filename(program_files.c_str(), "harvid", "ffmpeg.exe", NULL); _ffmpeg_exe = g_build_filename(program_files.c_str(), "harvid", "ffmpeg.exe", NULL);
} }
else if (Glib::file_test(X_("C:\\Program Files\\ffmpeg\\ffmpeg.exe"), Glib::FILE_TEST_EXISTS)) { else if (Glib::file_test(X_("C:\\Program Files\\ffmpeg\\ffmpeg.exe"), Glib::FILE_TEST_EXISTS)) {
ffmpeg_exe = X_("C:\\Program Files\\ffmpeg\\ffmpeg.exe"); _ffmpeg_exe = X_("C:\\Program Files\\ffmpeg\\ffmpeg.exe");
} else { } else {
ffmpeg_exe = X_(""); _ffmpeg_exe = X_("");
} }
#endif #endif
if (find_file (Searchpath(Glib::getenv("PATH")), X_("ffprobe_harvid"), ff_file_path)) { if (find_file (Searchpath(Glib::getenv("PATH")), X_("ffprobe_harvid"), ff_file_path)) {
ffprobe_exe = ff_file_path; _ffprobe_exe = ff_file_path;
} }
#ifdef PLATFORM_WINDOWS #ifdef PLATFORM_WINDOWS
if (Glib::file_test(ffprobe_exe, Glib::FILE_TEST_EXISTS)) { if (Glib::file_test(_ffprobe_exe, Glib::FILE_TEST_EXISTS)) {
; ;
} }
else if (!program_files.empty() && Glib::file_test(g_build_filename(program_files.c_str(), "harvid", "ffprobe.exe", NULL), Glib::FILE_TEST_EXISTS)) { else if (!program_files.empty() && Glib::file_test(g_build_filename(program_files.c_str(), "harvid", "ffprobe.exe", NULL), Glib::FILE_TEST_EXISTS)) {
ffprobe_exe = g_build_filename(program_files.c_str(), "harvid", "ffprobe.exe", NULL); _ffprobe_exe = g_build_filename(program_files.c_str(), "harvid", "ffprobe.exe", NULL);
} }
else if (Glib::file_test(X_("C:\\Program Files\\ffmpeg\\ffprobe.exe"), Glib::FILE_TEST_EXISTS)) { else if (Glib::file_test(X_("C:\\Program Files\\ffmpeg\\ffprobe.exe"), Glib::FILE_TEST_EXISTS)) {
ffprobe_exe = X_("C:\\Program Files\\ffmpeg\\ffprobe.exe"); _ffprobe_exe = X_("C:\\Program Files\\ffmpeg\\ffprobe.exe");
} else { } else {
ffprobe_exe = X_(""); _ffprobe_exe = X_("");
} }
#endif #endif
if (ffmpeg_exe.empty() || ffprobe_exe.empty()) { if (_ffmpeg_exe.empty() || _ffprobe_exe.empty()) {
return false; return false;
} }
_cached = true; _cached = true;
_ffmpeg_exe = ffmpeg_exe; ffmpeg_exe = _ffmpeg_exe;
_ffprobe_exe = ffprobe_exe; ffprobe_exe = _ffprobe_exe;
return true; return true;
} }