changeset 79:8bdaec4e3e4b libavformat

fixing frame_rate accuracy
author michaelni
date Sat, 08 Mar 2003 14:29:12 +0000
parents f1ea9a26edca
children 63807035cdb5
files ffm.c
diffstat 1 files changed, 9 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ffm.c	Sat Mar 08 11:54:34 2003 +0000
+++ b/ffm.c	Sat Mar 08 14:29:12 2003 +0000
@@ -140,6 +140,8 @@
 
     /* list of streams */
     for(i=0;i<s->nb_streams;i++) {
+        int gcd;
+    
         st = s->streams[i];
         fst = av_mallocz(sizeof(FFMStream));
         if (!fst)
@@ -156,7 +158,9 @@
         /* specific info */
         switch(codec->codec_type) {
         case CODEC_TYPE_VIDEO:
-            put_be32(pb, (codec->frame_rate * 1000) / FRAME_RATE_BASE);
+            gcd= av_gcd(FRAME_RATE_BASE, codec->frame_rate);
+            put_be32(pb, FRAME_RATE_BASE / gcd);
+            put_be32(pb, codec->frame_rate / gcd);
             put_be16(pb, codec->width);
             put_be16(pb, codec->height);
             put_be16(pb, codec->gop_size);
@@ -390,6 +394,7 @@
     /* read each stream */
     for(i=0;i<s->nb_streams;i++) {
         char rc_eq_buf[128];
+        int rate, scale;
 
         st = av_mallocz(sizeof(AVStream));
         if (!st)
@@ -411,7 +416,9 @@
         /* specific info */
         switch(codec->codec_type) {
         case CODEC_TYPE_VIDEO:
-            codec->frame_rate = ((int64_t)get_be32(pb) * FRAME_RATE_BASE) / 1000;
+            scale= get_be32(pb);
+            rate= get_be32(pb);
+            codec->frame_rate = (rate * (int64_t)FRAME_RATE_BASE) / scale;
             codec->width = get_be16(pb);
             codec->height = get_be16(pb);
             codec->gop_size = get_be16(pb);