diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-06-14 15:51:03 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-06-14 15:51:03 +0100 |
| commit | a2111c9816c9597e6f121010e6f4f34797abb0c7 (patch) | |
| tree | 0dc35eb4805e17d09583d65bfd00292968633d6a /src | |
| parent | 0b6f2d7b04819711228ed5fbc5d299b58cef997e (diff) | |
Basic guessing of audio channels from filenames (#393).
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/ffmpeg_content.cc | 4 | ||||
| -rw-r--r-- | src/lib/film.cc | 35 | ||||
| -rw-r--r-- | src/lib/film.h | 6 |
3 files changed, 39 insertions, 6 deletions
diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index b2b67e565..b34fdf6aa 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -218,6 +218,8 @@ FFmpegContent::examine (shared_ptr<Job> job) set_default_colour_conversion (); } + boost::filesystem::path first_path = path (0); + { boost::mutex::scoped_lock lm (_mutex); @@ -239,7 +241,7 @@ FFmpegContent::examine (shared_ptr<Job> job) AudioStreamPtr as = audio->streams().front(); AudioMapping m = as->mapping (); - film()->make_audio_mapping_default (m); + film()->make_audio_mapping_default (m, first_path); as->set_mapping (m); } diff --git a/src/lib/film.cc b/src/lib/film.cc index ff5cba000..64550556b 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -62,6 +62,7 @@ #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> #include <boost/foreach.hpp> +#include <boost/regex.hpp> #include <unistd.h> #include <stdexcept> #include <iostream> @@ -1292,18 +1293,44 @@ Film::subtitle_language () const /** Change the gains of the supplied AudioMapping to make it a default * for this film. The defaults are guessed based on what processor (if any) - * is in use and the number of input channels. + * is in use, the number of input channels and any filename supplied. */ void -Film::make_audio_mapping_default (AudioMapping& mapping) const +Film::make_audio_mapping_default (AudioMapping& mapping, optional<boost::filesystem::path> filename) const { + static string const regex[] = { + ".*[\\._-]L[\\._-].*", + ".*[\\._-]R[\\._-].*", + ".*[\\._-]C[\\._-].*", + ".*[\\._-]Lfe[\\._-].*", + ".*[\\._-]Ls[\\._-].*", + ".*[\\._-]Rs[\\._-].*" + }; + + static int const regexes = sizeof(regex) / sizeof(*regex); + if (audio_processor ()) { audio_processor()->make_audio_mapping_default (mapping); } else { mapping.make_zero (); if (mapping.input_channels() == 1) { - /* Mono -> Centre */ - mapping.set (0, static_cast<int> (dcp::CENTRE), 1); + bool guessed = false; + + /* See if we can guess where this stream should go */ + if (filename) { + for (int i = 0; i < regexes; ++i) { + boost::regex e (regex[i], boost::regex::icase); + if (boost::regex_match (filename->string(), e) && i < mapping.output_channels()) { + mapping.set (0, i, 1); + guessed = true; + } + } + } + + if (!guessed) { + /* If we have no idea, just put it on centre */ + mapping.set (0, static_cast<int> (dcp::CENTRE), 1); + } } else { /* 1:1 mapping */ for (int i = 0; i < min (mapping.input_channels(), mapping.output_channels()); ++i) { diff --git a/src/lib/film.h b/src/lib/film.h index 3b33aa305..ca0855b5c 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -144,7 +144,11 @@ public: std::string subtitle_language () const; - void make_audio_mapping_default (AudioMapping & mapping) const; + void make_audio_mapping_default ( + AudioMapping & mapping, + boost::optional<boost::filesystem::path> filename = boost::optional<boost::filesystem::path> () + ) const; + std::vector<std::string> audio_output_names () const; void repeat_content (ContentList, int); |
