Always block waiting for audio when exporting.
[dcpomatic.git] / src / lib / ffmpeg_encoder.cc
index dd773168aab2620a14a89e692d12610b552afb22..6dc3a83d40bfda813b0e1546649bcd831f27048c 100644 (file)
@@ -161,7 +161,7 @@ FFmpegEncoder::go ()
 
        auto const video_frame = DCPTime::from_frames (1, _film->video_frame_rate ());
        int const audio_frames = video_frame.frames_round(_film->audio_frame_rate());
-       float* interleaved = new float[_output_audio_channels * audio_frames];
+       std::vector<float> interleaved(_output_audio_channels * audio_frames);
        auto deinterleaved = make_shared<AudioBuffers>(_output_audio_channels, audio_frames);
        int const gets_per_frame = _film->three_d() ? 2 : 1;
        for (DCPTime i; i < _film->length(); i += video_frame) {
@@ -176,14 +176,17 @@ FFmpegEncoder::go ()
 
                for (int j = 0; j < gets_per_frame; ++j) {
                        Butler::Error e;
-                       auto v = _butler->get_video (true, &e);
+                       auto v = _butler->get_video (Butler::Behaviour::BLOCKING, &e);
                        _butler->rethrow ();
-                       if (!v.first) {
-                               throw DecodeError(String::compose("Error during decoding: %1", e.summary()));
-                       }
-                       auto fe = encoder->get (v.first->eyes());
-                       if (fe) {
-                               fe->video(v.first, v.second - reel->from);
+                       if (v.first) {
+                               auto fe = encoder->get (v.first->eyes());
+                               if (fe) {
+                                       fe->video(v.first, v.second - reel->from);
+                               }
+                       } else {
+                               if (e.code != Butler::Error::Code::FINISHED) {
+                                       throw DecodeError(String::compose("Error during decoding: %1", e.summary()));
+                               }
                        }
                }
 
@@ -201,9 +204,9 @@ FFmpegEncoder::go ()
 
                waker.nudge ();
 
-               _butler->get_audio (interleaved, audio_frames);
+               _butler->get_audio (Butler::Behaviour::BLOCKING, interleaved.data(), audio_frames);
                /* XXX: inefficient; butler interleaves and we deinterleave again */
-               float* p = interleaved;
+               float* p = interleaved.data();
                for (int j = 0; j < audio_frames; ++j) {
                        for (int k = 0; k < _output_audio_channels; ++k) {
                                deinterleaved->data(k)[j] = *p++;
@@ -211,7 +214,6 @@ FFmpegEncoder::go ()
                }
                encoder->audio (deinterleaved);
        }
-       delete[] interleaved;
 
        for (auto i: file_encoders) {
                i.flush ();