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
1 changed files with 22 additions and 17 deletions

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);
#endif
/* note: some callers pass the same reference "unused" to both &ffmpeg_exe, and &ffprobe_exe) */
ffmpeg_exe = X_("");
ffprobe_exe = X_("");
_ffmpeg_exe = X_("");
_ffprobe_exe = X_("");
std::string 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
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);
ffprobe_exe = g_build_filename(reg.c_str(), X_("harvid"), X_("ffprobe.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);
}
else if (PBD::windows_query_registry ("Software\\RSS\\harvid", "Install_Dir", reg))
{
ffmpeg_exe = g_build_filename(reg.c_str(), X_("ffmpeg.exe"), NULL);
ffprobe_exe = g_build_filename(reg.c_str(), X_("ffprobe.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);
}
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)) {
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)) {
ffmpeg_exe = X_("C:\\Program Files\\ffmpeg\\ffmpeg.exe");
_ffmpeg_exe = X_("C:\\Program Files\\ffmpeg\\ffmpeg.exe");
} else {
ffmpeg_exe = X_("");
_ffmpeg_exe = X_("");
}
#endif
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
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)) {
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)) {
ffprobe_exe = X_("C:\\Program Files\\ffmpeg\\ffprobe.exe");
_ffprobe_exe = X_("C:\\Program Files\\ffmpeg\\ffprobe.exe");
} else {
ffprobe_exe = X_("");
_ffprobe_exe = X_("");
}
#endif
if (ffmpeg_exe.empty() || ffprobe_exe.empty()) {
if (_ffmpeg_exe.empty() || _ffprobe_exe.empty()) {
return false;
}
_cached = true;
_ffmpeg_exe = ffmpeg_exe;
_ffprobe_exe = ffprobe_exe;
ffmpeg_exe = _ffmpeg_exe;
ffprobe_exe = _ffprobe_exe;
return true;
}