# HG changeset patch # User mstorsjo # Date 1271748868 0 # Node ID 9a86b49201bbebe2658edc1b8c52187e11302c5d # Parent 13a03c6663b3cc291ab30a7759db9481ec8c488c Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext In order to sync RTP streams that get their initial RTCP timestamp at different times, propagate the NTP timestamp of the first RTCP packet to all other streams. This makes the timestamps of returned packets start at (near) zero instead of at any random offset. diff -r 13a03c6663b3 -r 9a86b49201bb rtpdec.c --- a/rtpdec.c Tue Apr 20 01:41:00 2010 +0000 +++ b/rtpdec.c Tue Apr 20 07:34:28 2010 +0000 @@ -80,6 +80,8 @@ if (buf[1] != 200) return -1; s->last_rtcp_ntp_time = AV_RB64(buf + 8); + if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) + s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; s->last_rtcp_timestamp = AV_RB32(buf + 16); return 0; } @@ -326,6 +328,7 @@ return NULL; s->payload_type = payload_type; s->last_rtcp_ntp_time = AV_NOPTS_VALUE; + s->first_rtcp_ntp_time = AV_NOPTS_VALUE; s->ic = s1; s->st = st; s->rtp_payload_data = rtp_payload_data; @@ -433,7 +436,7 @@ /* compute pts from timestamp with received ntp_time */ delta_timestamp = timestamp - s->last_rtcp_timestamp; /* convert to the PTS timebase */ - addend = av_rescale(s->last_rtcp_ntp_time, s->st->time_base.den, (uint64_t)s->st->time_base.num << 32); + addend = av_rescale(s->last_rtcp_ntp_time - s->first_rtcp_ntp_time, s->st->time_base.den, (uint64_t)s->st->time_base.num << 32); pkt->pts = addend + delta_timestamp; } } diff -r 13a03c6663b3 -r 9a86b49201bb rtpdec.h --- a/rtpdec.h Tue Apr 20 01:41:00 2010 +0000 +++ b/rtpdec.h Tue Apr 20 07:34:28 2010 +0000 @@ -174,6 +174,7 @@ /* rtcp sender statistics receive */ int64_t last_rtcp_ntp_time; // TODO: move into statistics + int64_t first_rtcp_ntp_time; // TODO: move into statistics uint32_t last_rtcp_timestamp; // TODO: move into statistics /* rtcp sender statistics */ diff -r 13a03c6663b3 -r 9a86b49201bb rtsp.c --- a/rtsp.c Tue Apr 20 01:41:00 2010 +0000 +++ b/rtsp.c Tue Apr 20 07:34:28 2010 +0000 @@ -1796,8 +1796,27 @@ return AVERROR_EOF; if (rt->transport == RTSP_TRANSPORT_RDT) { ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, buf, len); - } else + } else { ret = rtp_parse_packet(rtsp_st->transport_priv, pkt, buf, len); + if (ret < 0) { + /* Either bad packet, or a RTCP packet. Check if the + * first_rtcp_ntp_time field was initialized. */ + RTPDemuxContext *rtpctx = rtsp_st->transport_priv; + if (rtpctx->first_rtcp_ntp_time != AV_NOPTS_VALUE) { + /* first_rtcp_ntp_time has been initialized for this stream, + * copy the same value to all other uninitialized streams, + * in order to map their timestamp origin to the same ntp time + * as this one. */ + int i; + for (i = 0; i < rt->nb_rtsp_streams; i++) { + RTPDemuxContext *rtpctx2 = rtsp_st->transport_priv; + if (rtpctx2 && + rtpctx2->first_rtcp_ntp_time == AV_NOPTS_VALUE) + rtpctx2->first_rtcp_ntp_time = rtpctx->first_rtcp_ntp_time; + } + } + } + } if (ret < 0) goto redo; if (ret == 1)