changeset 1889:e81bae269ae1 libavformat

fix pts handling
author bcoudurier
date Thu, 08 Mar 2007 21:29:38 +0000
parents f794ef55fafe
children 04f9a3ae30af
files swf.c
diffstat 1 files changed, 7 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/swf.c	Thu Mar 08 14:49:43 2007 +0000
+++ b/swf.c	Thu Mar 08 21:29:38 2007 +0000
@@ -67,7 +67,7 @@
     int sound_samples;
     int swf_frame_number;
     int video_frame_number;
-    int ms_per_frame;
+    int frame_rate;
     int tag;
 
     uint8_t audio_fifo[AUDIO_FIFO_SIZE];
@@ -631,7 +631,7 @@
 {
     SWFContext *swf = s->priv_data;
     ByteIOContext *pb = &s->pb;
-    int nbits, len, frame_rate, tag, v;
+    int nbits, len, tag, v;
     offset_t frame_offset = -1;
     AVStream *ast = 0;
     AVStream *vst = 0;
@@ -650,13 +650,9 @@
     nbits = get_byte(pb) >> 3;
     len = (4 * nbits - 3 + 7) / 8;
     url_fskip(pb, len);
-    frame_rate = get_le16(pb);
+    swf->frame_rate = get_le16(pb); /* 8.8 fixed */
     get_le16(pb); /* frame count */
 
-    /* The Flash Player converts 8.8 frame rates
-       to milliseconds internally. Do the same to get
-       a correct framerate */
-    swf->ms_per_frame = ( 1000 * 256 ) / frame_rate;
     swf->samples_per_frame = 0;
 
     for(;;) {
@@ -683,7 +679,7 @@
             v = get_byte(pb);
             swf->samples_per_frame = get_le16(pb);
             ast = av_new_stream(s, -1); /* -1 to avoid clash with video stream ch_id */
-            av_set_pts_info(ast, 24, 1, 1000); /* 24 bit pts in ms */
+            av_set_pts_info(ast, 64, 256, swf->frame_rate); /* XXX same as video stream */
             swf->audio_stream_index = ast->index;
             ast->codec->channels = 1 + (v&1);
             ast->codec->codec_type = CODEC_TYPE_AUDIO;
@@ -706,13 +702,8 @@
             url_fskip(pb, len);
         }
     }
-    if (vst) {
-        av_set_pts_info(vst, 24, 1, 1000); /* 24 bit pts in ms */
-        if (swf->ms_per_frame) {
-            vst->codec->time_base.den = 1000. / swf->ms_per_frame;
-            vst->codec->time_base.num = 1;
-        }
-    }
+    if (vst)
+        av_set_pts_info(vst, 64, 256, swf->frame_rate);
     return 0;
 }
 
@@ -735,7 +726,7 @@
                 if (st->codec->codec_type == CODEC_TYPE_VIDEO && st->id == ch_id) {
                     frame = get_le16(pb);
                     av_get_packet(pb, pkt, len-2);
-                    pkt->pts = frame * swf->ms_per_frame;
+                    pkt->pts = frame;
                     pkt->stream_index = st->index;
                     return pkt->size;
                 }