Make sure we round properly when deciding how many audio frames to discard.
authorCarl Hetherington <cth@carlh.net>
Tue, 29 Sep 2015 09:20:50 +0000 (10:20 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 29 Sep 2015 09:20:50 +0000 (10:20 +0100)
ChangeLog
src/lib/dcpomatic_time.h
src/lib/ffmpeg_decoder.cc

index 6e343d2f37dbea49d78ccd484c0e82e6a2cfb949..b5a6ba3d9f149bc38a42835c0bcf68beeaaa04da 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2015-09-29  Carl Hetherington  <cth@carlh.net>
+
+       * Improve fix for failure to analyse some audio.
+
 2015-09-28  Carl Hetherington  <cth@carlh.net>
 
        * Version 2.3.9 released.
index 7d755a46cf1a7e53a826f3f7ddd1f596b35ccc81..a5a0684e591b104656985e8dfcf427b19100c703 100644 (file)
@@ -140,6 +140,11 @@ public:
                return floor (_t * r / HZ);
        }
 
+       template <typename T>
+       int64_t frames_ceil (T r) const {
+               return ceil (_t * r / HZ);
+       }
+
        /** @param r Frames per second */
        template <typename T>
        void split (T r, int& h, int& m, int& s, int& f) const
index 7923be59bb6c3e696ee372135cc39e512c3c4dbd..c23d56b425e575c83169ae7f2eaffc3f43cbda84 100644 (file)
@@ -337,7 +337,7 @@ FFmpegDecoder::decode_audio_packet ()
 
                        if (ct < ContentTime ()) {
                                /* Discard audio data that comes before time 0 */
-                               Frame const remove = min (int64_t (data->frames()), -ct.frames_round ((*stream)->frame_rate ()));
+                               Frame const remove = min (int64_t (data->frames()), (-ct).frames_ceil(double((*stream)->frame_rate ())));
                                data->move (remove, 0, data->frames() - remove);
                                data->set_frames (data->frames() - remove);
                                ct += ContentTime::from_frames (remove, (*stream)->frame_rate ());