Mercurial > libavformat.hg
diff rtsp.c @ 5966:9a86b49201bb libavformat
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.
author | mstorsjo |
---|---|
date | Tue, 20 Apr 2010 07:34:28 +0000 |
parents | 780410aa35b7 |
children | c5a3e1951fc6 |
line wrap: on
line diff
--- 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)