summaryrefslogtreecommitdiff
path: root/libavformat/utils.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-09-26 22:54:57 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-09-26 22:58:02 +0200
commit2e4ec8947d954f1d00e724c520920499397b8ef7 (patch)
tree5ec18159e941a75064e7edf57a0ae5bcc5037cde /libavformat/utils.c
parenta8e3815db5095fc52b9bd8637fc19cb638bd3aad (diff)
lavf: fill in past dts based on reordered pts once the delay becomes known.
Previously we had ignored the past dts and just filled in from the point where we have had sufficient information. This should fix Ticket1734 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r--libavformat/utils.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 83b2d269f8..05c4b7f5cc 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -940,15 +940,21 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
{
AVStream *st= s->streams[stream_index];
AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
+ int64_t pts_buffer[MAX_REORDER_DELAY];
int64_t shift;
+ int i, delay;
if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE || is_relative(dts))
return;
+ delay = st->codec->has_b_frames;
st->first_dts= dts - (st->cur_dts - RELATIVE_TS_BASE);
st->cur_dts= dts;
shift = st->first_dts - RELATIVE_TS_BASE;
+ for (i=0; i<MAX_REORDER_DELAY; i++)
+ pts_buffer[i] = AV_NOPTS_VALUE;
+
if (is_relative(pts))
pts += shift;
@@ -963,6 +969,14 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
st->start_time= pktl->pkt.pts;
+
+ if(pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
+ pts_buffer[0]= pktl->pkt.pts;
+ for(i=0; i<delay && pts_buffer[i] > pts_buffer[i+1]; i++)
+ FFSWAP(int64_t, pts_buffer[i], pts_buffer[i+1]);
+ if(pktl->pkt.dts == AV_NOPTS_VALUE)
+ pktl->pkt.dts= pts_buffer[0];
+ }
}
if (st->start_time == AV_NOPTS_VALUE)
st->start_time = pts;