changeset 10054:8ab9fbad11b2 libavcodec

Fix start_display_time/end_display_time to be relative to packet pts in xsub decoder. Makes no difference for the sample AVI files since they all have no packet pts values.
author reimar
date Sat, 15 Aug 2009 09:12:58 +0000
parents 089dd845c8c0
children fdb318d12314
files xsubdec.c
diffstat 1 files changed, 7 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/xsubdec.c	Sat Aug 15 00:58:26 2009 +0000
+++ b/xsubdec.c	Sat Aug 15 09:12:58 2009 +0000
@@ -30,7 +30,7 @@
 static const uint8_t tc_offsets[9] = { 0, 1, 3, 4, 6, 7, 9, 10, 11 };
 static const uint8_t tc_muls[9] = { 10, 6, 10, 6, 10, 10, 10, 10, 1 };
 
-static uint64_t parse_timecode(const uint8_t *buf) {
+static int64_t parse_timecode(const uint8_t *buf, int64_t packet_time) {
     int i;
     int64_t ms = 0;
     if (buf[2] != ':' || buf[5] != ':' || buf[8] != '.')
@@ -40,7 +40,7 @@
         if (c > 9) return AV_NOPTS_VALUE;
         ms = (ms + c) * tc_muls[i];
     }
-    return ms;
+    return ms - packet_time;
 }
 
 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
@@ -51,6 +51,7 @@
     const uint8_t *buf_end = buf + buf_size;
     uint8_t *bitmap;
     int w, h, x, y, rlelen, i;
+    int64_t packet_time = 0;
     GetBitContext gb;
 
     memset(sub, 0, sizeof(*sub));
@@ -66,8 +67,10 @@
         av_log(avctx, AV_LOG_ERROR, "invalid time code\n");
         return -1;
     }
-    sub->start_display_time = parse_timecode(buf +  1);
-    sub->end_display_time   = parse_timecode(buf + 14);
+    if (avpkt->pts != AV_NOPTS_VALUE)
+        packet_time = av_rescale_q(avpkt->pts, AV_TIME_BASE_Q, (AVRational){1, 1000});
+    sub->start_display_time = parse_timecode(buf +  1, packet_time);
+    sub->end_display_time   = parse_timecode(buf + 14, packet_time);
     buf += 27;
 
     // read header