const fix; header guard.
[dcpomatic.git] / src / lib / ffmpeg_examiner.cc
index f4b650eee8e0ca9a9f17bf0a424733d86604e4ae..576782d0bd0d290b447a2e7b000d95d0559ea77d 100644 (file)
@@ -30,6 +30,7 @@ extern "C" {
 #include "ffmpeg_subtitle_stream.h"
 #include "util.h"
 #include "safe_stringstream.h"
+#include <iostream>
 
 #include "i18n.h"
 
@@ -92,6 +93,7 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
         * where we should look for subtitles (video and audio are always present,
         * so they are ok).
         */
+
        while (true) {
                int r = av_read_frame (_format_context, &_packet);
                if (r < 0) {
@@ -108,10 +110,15 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
                        video_packet (context);
                }
 
+               bool got_all_audio = true;
+
                for (size_t i = 0; i < _audio_streams.size(); ++i) {
                        if (_audio_streams[i]->uses_index (_format_context, _packet.stream_index)) {
                                audio_packet (context, _audio_streams[i]);
                        }
+                       if (!_audio_streams[i]->first_audio) {
+                               got_all_audio = false;
+                       }
                }
 
                for (size_t i = 0; i < _subtitle_streams.size(); ++i) {
@@ -121,6 +128,11 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
                }
 
                av_free_packet (&_packet);
+
+               if (_first_video && got_all_audio && _subtitle_streams.empty ()) {
+                       /* All done */
+                       break;
+               }
        }
 }
 
@@ -139,7 +151,7 @@ FFmpegExaminer::video_packet (AVCodecContext* context)
                if (_need_video_length) {
                        _video_length = frame_time (
                                _format_context->streams[_video_stream]
-                               ).get_value_or (ContentTime ()).frames (video_frame_rate().get ());
+                               ).get_value_or (ContentTime ()).frames_round (video_frame_rate().get ());
                }
        }
 }
@@ -191,7 +203,7 @@ FFmpegExaminer::frame_time (AVStream* s) const
        return t;
 }
 
-optional<float>
+optional<double>
 FFmpegExaminer::video_frame_rate () const
 {
        /* This use of r_frame_rate is debateable; there's a few different
@@ -214,15 +226,15 @@ FFmpegExaminer::video_length () const
        return max (Frame (1), _video_length);
 }
 
-optional<float>
+optional<double>
 FFmpegExaminer::sample_aspect_ratio () const
 {
        AVRational sar = av_guess_sample_aspect_ratio (_format_context, _format_context->streams[_video_stream], 0);
        if (sar.num == 0) {
                /* I assume this means that we don't know */
-               return optional<float> ();
+               return optional<double> ();
        }
-       return float (sar.num) / sar.den;
+       return double (sar.num) / sar.den;
 }
 
 string