Mercurial > libavcodec.hg
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