Trying to create export audio encoders with between 9 and 15 channels
[dcpomatic.git] / src / lib / ffmpeg_encoder.cc
index ee49a06461133e8d57dece989e5afb4572cdbc7a..a3d2ff86f3446d2429bc2ccb979a8d57cbbd7635 100644 (file)
@@ -61,38 +61,6 @@ FFmpegEncoder::FFmpegEncoder (
        : Encoder (film, job)
        , _history (200)
 {
-       int const files = split_reels ? film->reels().size() : 1;
-       for (int i = 0; i < files; ++i) {
-
-               boost::filesystem::path filename = output;
-               string extension = boost::filesystem::extension (filename);
-               filename = boost::filesystem::change_extension (filename, "");
-
-               if (files > 1) {
-                       /// TRANSLATORS: _reel%1 here is to be added to an export filename to indicate
-                       /// which reel it is.  Preserve the %1; it will be replaced with the reel number.
-                       filename = filename.string() + String::compose(_("_reel%1"), i + 1);
-               }
-
-               _file_encoders.push_back (
-                       FileEncoderSet (
-                               _film->frame_size(),
-                               _film->video_frame_rate(),
-                               _film->audio_frame_rate(),
-                               mixdown_to_stereo ? 2 : film->audio_channels(),
-                               format,
-                               x264_crf,
-                               _film->three_d(),
-                               filename,
-                               extension
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-                               , key
-                               , id
-#endif
-                               )
-                       );
-       }
-
        _player->set_always_burn_open_subtitles ();
        _player->set_play_referenced ();
 
@@ -123,16 +91,52 @@ FFmpegEncoder::FFmpegEncoder (
                }
                /* XXX: maybe we should do something better for >6 channel DCPs */
        } else {
-               _output_audio_channels = ch;
-               map = AudioMapping (ch, ch);
+               /* Our encoders don't really want to encode any channel count between 9 and 15 inclusive,
+                * so let's just use 16 channel exports for any project with more than 8 channels.
+                */
+               _output_audio_channels = ch > 8 ? 16 : ch;
+               map = AudioMapping (ch, _output_audio_channels);
                for (int i = 0; i < ch; ++i) {
                        map.set (i, i, 1);
                }
        }
 
        _butler.reset (new Butler(_player, map, _output_audio_channels, bind(&PlayerVideo::force, _1, FFmpegFileEncoder::pixel_format(format)), true, false));
+
+       int const files = split_reels ? film->reels().size() : 1;
+       for (int i = 0; i < files; ++i) {
+
+               boost::filesystem::path filename = output;
+               string extension = boost::filesystem::extension (filename);
+               filename = boost::filesystem::change_extension (filename, "");
+
+               if (files > 1) {
+                       /// TRANSLATORS: _reel%1 here is to be added to an export filename to indicate
+                       /// which reel it is.  Preserve the %1; it will be replaced with the reel number.
+                       filename = filename.string() + String::compose(_("_reel%1"), i + 1);
+               }
+
+               _file_encoders.push_back (
+                       FileEncoderSet (
+                               _film->frame_size(),
+                               _film->video_frame_rate(),
+                               _film->audio_frame_rate(),
+                               _output_audio_channels,
+                               format,
+                               x264_crf,
+                               _film->three_d(),
+                               filename,
+                               extension
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+                               , key
+                               , id
+#endif
+                               )
+                       );
+       }
 }
 
+
 void
 FFmpegEncoder::go ()
 {
@@ -166,6 +170,7 @@ FFmpegEncoder::go ()
                for (int j = 0; j < gets_per_frame; ++j) {
                        Butler::Error e;
                        pair<shared_ptr<PlayerVideo>, DCPTime> v = _butler->get_video (true, &e);
+                       _butler->rethrow ();
                        if (!v.first) {
                                throw ProgrammingError(__FILE__, __LINE__, String::compose("butler returned no video; error was %1", static_cast<int>(e)));
                        }