Merge branch 'master' into plot-audio
[dcpomatic.git] / src / lib / ffmpeg_decoder.cc
index d4ed76e371ec414109bd36bc17a487ea6b9c8940..148764162c20fe70bfdd9d4be2e7ed96faaf8d57 100644 (file)
@@ -197,7 +197,7 @@ FFmpegDecoder::setup_audio ()
 void
 FFmpegDecoder::setup_subtitle ()
 {
-       if (!_subtitle_stream) {
+       if (!_subtitle_stream || _subtitle_stream->id() >= _format_context->nb_streams) {
                return;
        }
 
@@ -236,8 +236,10 @@ FFmpegDecoder::pass ()
 
                int frame_finished;
 
-               while (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
-                       filter_and_emit_video (_frame);
+               if (_opt.decode_video) {
+                       while (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
+                               filter_and_emit_video (_frame);
+                       }
                }
 
                if (_audio_stream && _opt.decode_audio) {
@@ -258,7 +260,7 @@ FFmpegDecoder::pass ()
 
        shared_ptr<FFmpegAudioStream> ffa = dynamic_pointer_cast<FFmpegAudioStream> (_audio_stream);
 
-       if (_packet.stream_index == _video_stream) {
+       if (_packet.stream_index == _video_stream && _opt.decode_video) {
 
                int frame_finished;
                int const r = avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet);
@@ -288,9 +290,9 @@ FFmpegDecoder::pass ()
                           was before this packet.  Until then audio is thrown away.
                        */
                                
-                       if (_first_video && _first_video.get() <= source_pts_seconds) {
+                       if ((_first_video && _first_video.get() <= source_pts_seconds) || !_opt.decode_video) {
 
-                               if (!_first_audio) {
+                               if (!_first_audio && _opt.decode_video) {
                                        _first_audio = source_pts_seconds;
                                        
                                        /* This is our first audio frame, and if we've arrived here we must have had our