From 2f3b419cf1adb07278f59a811dbb6b26ecabafa5 Mon Sep 17 00:00:00 2001
From: Aurelien Jacobs <aurel@gnuage.org>
Date: Thu, 16 Aug 2007 22:01:54 +0000
Subject: [PATCH] Don't pre-scale default_duration to avoid precision loss in
 fps calculation. closes Issue95

Originally committed as revision 10127 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavformat/matroskadec.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e6776367ef4..dd39bbde113 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1089,7 +1089,7 @@ matroska_add_stream (MatroskaDemuxContext *matroska)
                             if ((res = ebml_read_uint (matroska, &id,
                                                        &num)) < 0)
                                 break;
-                            track->default_duration = num/matroska->time_scale;
+                            track->default_duration = num;
                             break;
                         }
 
@@ -1100,7 +1100,7 @@ matroska_add_stream (MatroskaDemuxContext *matroska)
                                                        &num)) < 0)
                                 break;
                             if (!track->default_duration)
-                            track->default_duration = 1000000000/(matroska->time_scale*num);
+                            track->default_duration = 1000000000/num;
                             break;
                         }
 
@@ -1407,7 +1407,7 @@ matroska_add_stream (MatroskaDemuxContext *matroska)
                 uint64_t num;
                 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
                     break;
-                track->default_duration = num / matroska->time_scale;
+                track->default_duration = num;
                 break;
             }
 
@@ -2174,7 +2174,7 @@ matroska_read_header (AVFormatContext    *s,
 
             if (track->default_duration)
                 av_reduce(&st->codec->time_base.num, &st->codec->time_base.den,
-                          track->default_duration, 1000, 30000);
+                          track->default_duration, 1000000000, 30000);
 
             if(extradata){
                 st->codec->extradata = extradata;
@@ -2283,7 +2283,7 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
         return res;
     }
     if (duration == AV_NOPTS_VALUE)
-        duration = matroska->tracks[track]->default_duration;
+        duration = matroska->tracks[track]->default_duration / matroska->time_scale;
 
     /* block_time (relative to cluster time) */
     block_time = AV_RB16(data);
-- 
GitLab