Simplify RoQ demuxer pts calculation by using a appropriate time bases.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Fri, 13 Mar 2009 13:37:35 +0000 (13:37 +0000)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Fri, 13 Mar 2009 13:37:35 +0000 (13:37 +0000)
Originally committed as revision 17946 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/idroq.c

index 8ab3eda..c570eec 100644 (file)
@@ -46,8 +46,6 @@ typedef struct RoqDemuxContext {
     int width;
     int height;
     int audio_channels;
-    int framerate;
-    int frame_pts_inc;
 
     int video_stream_index;
     int audio_stream_index;
@@ -71,6 +69,7 @@ static int roq_read_header(AVFormatContext *s,
 {
     RoqDemuxContext *roq = s->priv_data;
     ByteIOContext *pb = s->pb;
+    int framerate;
     AVStream *st;
     unsigned char preamble[RoQ_CHUNK_PREAMBLE_SIZE];
 
@@ -78,8 +77,7 @@ static int roq_read_header(AVFormatContext *s,
     if (get_buffer(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) !=
         RoQ_CHUNK_PREAMBLE_SIZE)
         return AVERROR(EIO);
-    roq->framerate = AV_RL16(&preamble[6]);
-    roq->frame_pts_inc = 90000 / roq->framerate;
+    framerate = AV_RL16(&preamble[6]);
 
     /* init private context parameters */
     roq->width = roq->height = roq->audio_channels = roq->video_pts =
@@ -89,8 +87,7 @@ static int roq_read_header(AVFormatContext *s,
     st = av_new_stream(s, 0);
     if (!st)
         return AVERROR(ENOMEM);
-    /* set the pts reference (1 pts = 1/90000) */
-    av_set_pts_info(st, 33, 1, 90000);
+    av_set_pts_info(st, 63, 1, framerate);
     roq->video_stream_index = st->index;
     st->codec->codec_type = CODEC_TYPE_VIDEO;
     st->codec->codec_id = CODEC_ID_ROQ;
@@ -161,9 +158,8 @@ static int roq_read_packet(AVFormatContext *s,
             if (ret != chunk_size)
                 return AVERROR(EIO);
             pkt->stream_index = roq->video_stream_index;
-            pkt->pts = roq->video_pts;
+            pkt->pts = roq->video_pts++;
 
-            roq->video_pts += roq->frame_pts_inc;
             packet_read = 1;
             break;
 
@@ -173,7 +169,7 @@ static int roq_read_packet(AVFormatContext *s,
                 AVStream *st = av_new_stream(s, 1);
                 if (!st)
                     return AVERROR(ENOMEM);
-                av_set_pts_info(st, 33, 1, 90000);
+                av_set_pts_info(st, 32, 1, RoQ_AUDIO_SAMPLE_RATE);
                 roq->audio_stream_index = st->index;
                 st->codec->codec_type = CODEC_TYPE_AUDIO;
                 st->codec->codec_id = CODEC_ID_ROQ_DPCM;
@@ -194,13 +190,10 @@ static int roq_read_packet(AVFormatContext *s,
 
             if (chunk_type == RoQ_QUAD_VQ) {
                 pkt->stream_index = roq->video_stream_index;
-                pkt->pts = roq->video_pts;
-                roq->video_pts += roq->frame_pts_inc;
+                pkt->pts = roq->video_pts++;
             } else {
                 pkt->stream_index = roq->audio_stream_index;
                 pkt->pts = roq->audio_frame_count;
-                pkt->pts *= 90000;
-                pkt->pts /= RoQ_AUDIO_SAMPLE_RATE;
                 roq->audio_frame_count += (chunk_size / roq->audio_channels);
             }