summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-06-14 15:51:03 +0100
committerCarl Hetherington <cth@carlh.net>2016-06-14 15:51:03 +0100
commita2111c9816c9597e6f121010e6f4f34797abb0c7 (patch)
tree0dc35eb4805e17d09583d65bfd00292968633d6a /src
parent0b6f2d7b04819711228ed5fbc5d299b58cef997e (diff)
Basic guessing of audio channels from filenames (#393).
Diffstat (limited to 'src')
-rw-r--r--src/lib/ffmpeg_content.cc4
-rw-r--r--src/lib/film.cc35
-rw-r--r--src/lib/film.h6
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);