simplify PTS handling
authorMike Melanson <mike@multimedia.cx>
Tue, 4 Sep 2007 17:33:35 +0000 (17:33 +0000)
committerMike Melanson <mike@multimedia.cx>
Tue, 4 Sep 2007 17:33:35 +0000 (17:33 +0000)
Originally committed as revision 10291 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/flic.c

index a85cb97..ed7004f 100644 (file)
                                      originated in Dave's Targa Animator (DTA) */
 #define FLIC_CHUNK_MAGIC_1 0xF1FA
 #define FLIC_CHUNK_MAGIC_2 0xF5FA
-#define FLIC_MC_PTS_INC 6000  /* pts increment for Magic Carpet game FLIs */
-#define FLIC_DEFAULT_PTS_INC 6000  /* for FLIs that have 0 speed */
+#define FLIC_MC_SPEED 5  /* speed for Magic Carpet game FLIs */
+#define FLIC_DEFAULT_SPEED 5  /* for FLIs that have 0 speed */
 
 #define FLIC_HEADER_SIZE 128
 #define FLIC_PREAMBLE_SIZE 6
 
 typedef struct FlicDemuxContext {
-    int frame_pts_inc;
-    int64_t pts;
     int video_stream_index;
+    int frame_number;
 } FlicDemuxContext;
 
 static int flic_probe(AVProbeData *p)
@@ -74,7 +73,7 @@ static int flic_read_header(AVFormatContext *s,
     int speed;
     int magic_number;
 
-    flic->pts = 0;
+    flic->frame_number = 0;
 
     /* load the whole header and pull out the width and height */
     if (get_buffer(pb, header, FLIC_HEADER_SIZE) != FLIC_HEADER_SIZE)
@@ -82,6 +81,8 @@ static int flic_read_header(AVFormatContext *s,
 
     magic_number = AV_RL16(&header[4]);
     speed = AV_RL32(&header[0x10]);
+    if (speed == 0)
+        speed = FLIC_DEFAULT_SPEED;
 
     /* initialize the decoder streams */
     st = av_new_stream(s, 0);
@@ -108,14 +109,12 @@ static int flic_read_header(AVFormatContext *s,
     st->codec->extradata = av_malloc(FLIC_HEADER_SIZE);
     memcpy(st->codec->extradata, header, FLIC_HEADER_SIZE);
 
-    av_set_pts_info(st, 33, 1, 90000);
-
     /* Time to figure out the framerate: If there is a FLIC chunk magic
      * number at offset 0x10, assume this is from the Bullfrog game,
      * Magic Carpet. */
     if (AV_RL16(&header[0x10]) == FLIC_CHUNK_MAGIC_1) {
 
-        flic->frame_pts_inc = FLIC_MC_PTS_INC;
+        av_set_pts_info(st, 64, FLIC_MC_SPEED, 70);
 
         /* rewind the stream since the first chunk is at offset 12 */
         url_fseek(pb, 12, SEEK_SET);
@@ -127,36 +126,15 @@ static int flic_read_header(AVFormatContext *s,
         memcpy(st->codec->extradata, header, 12);
 
     } else if (magic_number == FLIC_FILE_MAGIC_1) {
-        /*
-         * in this case, the speed (n) is number of 1/70s ticks between frames:
-         *
-         *    pts        n * frame #
-         *  --------  =  -----------  => pts = n * (90000/70) * frame #
-         *   90000           70
-         *
-         *  therefore, the frame pts increment = n * 1285.7
-         */
-        flic->frame_pts_inc = speed * 1285.7;
+        av_set_pts_info(st, 64, speed, 70);
     } else if ((magic_number == FLIC_FILE_MAGIC_2) ||
                (magic_number == FLIC_FILE_MAGIC_3)) {
-        /*
-         * in this case, the speed (n) is number of milliseconds between frames:
-         *
-         *    pts        n * frame #
-         *  --------  =  -----------  => pts = n * 90 * frame #
-         *   90000          1000
-         *
-         *  therefore, the frame pts increment = n * 90
-         */
-        flic->frame_pts_inc = speed * 90;
+        av_set_pts_info(st, 64, speed, 1000);
     } else {
         av_log(s, AV_LOG_INFO, "Invalid or unsupported magic chunk in file\n");
         return AVERROR_INVALIDDATA;
     }
 
-    if (flic->frame_pts_inc == 0)
-        flic->frame_pts_inc = FLIC_DEFAULT_PTS_INC;
-
     return 0;
 }
 
@@ -188,7 +166,7 @@ static int flic_read_packet(AVFormatContext *s,
                 break;
             }
             pkt->stream_index = flic->video_stream_index;
-            pkt->pts = flic->pts;
+            pkt->pts = flic->frame_number++;
             pkt->pos = url_ftell(pb);
             memcpy(pkt->data, preamble, FLIC_PREAMBLE_SIZE);
             ret = get_buffer(pb, pkt->data + FLIC_PREAMBLE_SIZE,
@@ -197,7 +175,6 @@ static int flic_read_packet(AVFormatContext *s,
                 av_free_packet(pkt);
                 ret = AVERROR(EIO);
             }
-            flic->pts += flic->frame_pts_inc;
             packet_read = 1;
         } else {
             /* not interested in this chunk */