fixing frame_rate accuracy
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 8 Mar 2003 14:29:12 +0000 (14:29 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 8 Mar 2003 14:29:12 +0000 (14:29 +0000)
Originally committed as revision 1652 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/ffm.c

index 425155d..f261567 100644 (file)
@@ -140,6 +140,8 @@ static int ffm_write_header(AVFormatContext *s)
 
     /* 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 @@ static int ffm_write_header(AVFormatContext *s)
         /* 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 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
     /* 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 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
         /* 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);