# HG changeset patch # User cehoyos # Date 1235513949 0 # Node ID 0000335f1ebaeb1e89d16ecafca1e799dead0fe0 # Parent 9b00d2a02fa19e97fe74a0cdaf81753f32aa5734 Add timestamp computation if values are exported by decoder. Patch by Ivan Schreter, schreter gmx net diff -r 9b00d2a02fa1 -r 0000335f1eba avformat.h --- a/avformat.h Tue Feb 24 20:17:02 2009 +0000 +++ b/avformat.h Tue Feb 24 22:19:09 2009 +0000 @@ -22,8 +22,8 @@ #define AVFORMAT_AVFORMAT_H #define LIBAVFORMAT_VERSION_MAJOR 52 -#define LIBAVFORMAT_VERSION_MINOR 29 -#define LIBAVFORMAT_VERSION_MICRO 2 +#define LIBAVFORMAT_VERSION_MINOR 30 +#define LIBAVFORMAT_VERSION_MICRO 0 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ @@ -494,6 +494,16 @@ const uint8_t *cur_ptr; int cur_len; AVPacket cur_pkt; + + // Timestamp generation support: + /** + * Timestamp corresponding to the last dts sync point. + * + * Initialized when AVCodecParserContext.dts_sync_point >= 0 and + * a DTS is received from the underlying container. Otherwise set to + * AV_NOPTS_VALUE by default. + */ + int64_t reference_dts; } AVStream; #define AV_PROGRAM_RUNNING 1 diff -r 9b00d2a02fa1 -r 0000335f1eba utils.c --- a/utils.c Tue Feb 24 20:17:02 2009 +0000 +++ b/utils.c Tue Feb 24 22:19:09 2009 +0000 @@ -834,6 +834,25 @@ pkt->dts += offset; } + if (pc && pc->dts_sync_point >= 0) { + // we have synchronization info from the parser + int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num; + if (den > 0) { + int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den; + if (pkt->dts != AV_NOPTS_VALUE) { + // got DTS from the stream, update reference timestamp + st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den; + pkt->pts = pkt->dts + pc->pts_dts_delta * num / den; + } else if (st->reference_dts != AV_NOPTS_VALUE) { + // compute DTS based on reference timestamp + pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den; + pkt->pts = pkt->dts + pc->pts_dts_delta * num / den; + } + if (pc->dts_sync_point > 0) + st->reference_dts = pkt->dts; // new reference + } + } + /* This may be redundant, but it should not hurt. */ if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts) presentation_delayed = 1; @@ -1157,6 +1176,7 @@ } st->last_IP_pts = AV_NOPTS_VALUE; st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */ + st->reference_dts = AV_NOPTS_VALUE; /* fail safe */ st->cur_ptr = NULL; st->cur_len = 0; @@ -2332,6 +2352,7 @@ st->last_IP_pts = AV_NOPTS_VALUE; for(i=0; ipts_buffer[i]= AV_NOPTS_VALUE; + st->reference_dts = AV_NOPTS_VALUE; st->sample_aspect_ratio = (AVRational){0,1};