summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSasi Inguva <isasi@google.com>2016-03-12 02:40:25 -0800
committerMichael Niedermayer <michael@niedermayer.cc>2016-03-12 14:47:43 +0100
commite939dde48d446216530a4106e0471f1a155dfe26 (patch)
tree37d1dad7dad5f017005e2cdb5e9c7db02019fb65
parent9d4ab1380addb2a4e2863c625a63eed16009f90c (diff)
avformat/utils: factor update_dts_from_pts() out
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavformat/utils.c64
1 files changed, 43 insertions, 21 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index e0aea877ff..3c050efe82 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -936,14 +936,44 @@ static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t
return dts;
}
+/**
+ * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
+ * of the packets in a window.
+ */
+static void update_dts_from_pts(AVFormatContext *s, int stream_index,
+ AVPacketList *pkt_buffer)
+{
+ AVStream *st = s->streams[stream_index];
+ int delay = st->codec->has_b_frames;
+ int i;
+
+ int64_t pts_buffer[MAX_REORDER_DELAY+1];
+
+ for (i = 0; i<MAX_REORDER_DELAY+1; i++)
+ pts_buffer[i] = AV_NOPTS_VALUE;
+
+ for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
+ if (pkt_buffer->pkt.stream_index != stream_index)
+ continue;
+
+ if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
+ pts_buffer[0] = pkt_buffer->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]);
+
+ pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
+ }
+ }
+}
+
static void update_initial_timestamps(AVFormatContext *s, int stream_index,
int64_t dts, int64_t pts, AVPacket *pkt)
{
AVStream *st = s->streams[stream_index];
AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
- int64_t pts_buffer[MAX_REORDER_DELAY+1];
+ AVPacketList *pktl_it;
+
uint64_t shift;
- int i, delay;
if (st->first_dts != AV_NOPTS_VALUE ||
dts == AV_NOPTS_VALUE ||
@@ -951,36 +981,28 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
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 = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
- for (i = 0; i<MAX_REORDER_DELAY+1; i++)
- pts_buffer[i] = AV_NOPTS_VALUE;
-
if (is_relative(pts))
pts += shift;
- for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
- if (pktl->pkt.stream_index != stream_index)
+ for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
+ if (pktl_it->pkt.stream_index != stream_index)
continue;
- if (is_relative(pktl->pkt.pts))
- pktl->pkt.pts += shift;
-
- if (is_relative(pktl->pkt.dts))
- pktl->pkt.dts += shift;
+ if (is_relative(pktl_it->pkt.pts))
+ pktl_it->pkt.pts += shift;
- if (st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
- st->start_time = pktl->pkt.pts;
+ if (is_relative(pktl_it->pkt.dts))
+ pktl_it->pkt.dts += shift;
- 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 (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE)
+ st->start_time = pktl_it->pkt.pts;
+ }
- pktl->pkt.dts = select_from_pts_buffer(st, pts_buffer, pktl->pkt.dts);
- }
+ if (has_decode_delay_been_guessed(st)) {
+ update_dts_from_pts(s, stream_index, pktl);
}
if (st->start_time == AV_NOPTS_VALUE)