Commit 12348ca2 authored by John Brooks's avatar John Brooks Committed by Martin Storsjö

rtpdec: unwrap RTP timestamps for PTS calculation

The timestamp field in RTPDemuxContext was unused before this.
Signed-off-by: 's avatarMartin Storsjö <martin@martin.st>
parent bb4b0ad8
...@@ -439,7 +439,13 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestam ...@@ -439,7 +439,13 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestam
if (!s->base_timestamp) if (!s->base_timestamp)
s->base_timestamp = timestamp; s->base_timestamp = timestamp;
pkt->pts = s->range_start_offset + timestamp - s->base_timestamp; /* assume that the difference is INT32_MIN < x < INT32_MAX, but allow the first timestamp to exceed INT32_MAX */
if (!s->timestamp)
s->unwrapped_timestamp += timestamp;
else
s->unwrapped_timestamp += (int32_t)(timestamp - s->timestamp);
s->timestamp = timestamp;
pkt->pts = s->unwrapped_timestamp + s->range_start_offset - s->base_timestamp;
} }
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
......
...@@ -151,6 +151,7 @@ struct RTPDemuxContext { ...@@ -151,6 +151,7 @@ struct RTPDemuxContext {
uint32_t timestamp; uint32_t timestamp;
uint32_t base_timestamp; uint32_t base_timestamp;
uint32_t cur_timestamp; uint32_t cur_timestamp;
int64_t unwrapped_timestamp;
int64_t range_start_offset; int64_t range_start_offset;
int max_payload_size; int max_payload_size;
struct MpegTSContext *ts; /* only used for MP2T payloads */ struct MpegTSContext *ts; /* only used for MP2T payloads */
......
...@@ -52,6 +52,8 @@ static int rtsp_read_play(AVFormatContext *s) ...@@ -52,6 +52,8 @@ static int rtsp_read_play(AVFormatContext *s)
rtpctx->last_rtcp_ntp_time = AV_NOPTS_VALUE; rtpctx->last_rtcp_ntp_time = AV_NOPTS_VALUE;
rtpctx->first_rtcp_ntp_time = AV_NOPTS_VALUE; rtpctx->first_rtcp_ntp_time = AV_NOPTS_VALUE;
rtpctx->base_timestamp = 0; rtpctx->base_timestamp = 0;
rtpctx->timestamp = 0;
rtpctx->unwrapped_timestamp = 0;
rtpctx->rtcp_ts_offset = 0; rtpctx->rtcp_ts_offset = 0;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment