提交 2cab6b48 编写于 作者: M Martin Storsjö

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.

Originally committed as revision 22917 to svn://svn.ffmpeg.org/ffmpeg/trunk
上级 2293a2e6
...@@ -80,6 +80,8 @@ static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int l ...@@ -80,6 +80,8 @@ static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int l
if (buf[1] != 200) if (buf[1] != 200)
return -1; return -1;
s->last_rtcp_ntp_time = AV_RB64(buf + 8); 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); s->last_rtcp_timestamp = AV_RB32(buf + 16);
return 0; return 0;
} }
...@@ -326,6 +328,7 @@ RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *r ...@@ -326,6 +328,7 @@ RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *r
return NULL; return NULL;
s->payload_type = payload_type; s->payload_type = payload_type;
s->last_rtcp_ntp_time = AV_NOPTS_VALUE; s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
s->ic = s1; s->ic = s1;
s->st = st; s->st = st;
s->rtp_payload_data = rtp_payload_data; s->rtp_payload_data = rtp_payload_data;
...@@ -433,7 +436,7 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestam ...@@ -433,7 +436,7 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestam
/* compute pts from timestamp with received ntp_time */ /* compute pts from timestamp with received ntp_time */
delta_timestamp = timestamp - s->last_rtcp_timestamp; delta_timestamp = timestamp - s->last_rtcp_timestamp;
/* convert to the PTS timebase */ /* 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; pkt->pts = addend + delta_timestamp;
} }
} }
......
...@@ -174,6 +174,7 @@ struct RTPDemuxContext { ...@@ -174,6 +174,7 @@ struct RTPDemuxContext {
/* rtcp sender statistics receive */ /* rtcp sender statistics receive */
int64_t last_rtcp_ntp_time; // TODO: move into statistics 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 uint32_t last_rtcp_timestamp; // TODO: move into statistics
/* rtcp sender statistics */ /* rtcp sender statistics */
......
...@@ -1796,8 +1796,27 @@ static int rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -1796,8 +1796,27 @@ static int rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
return AVERROR_EOF; return AVERROR_EOF;
if (rt->transport == RTSP_TRANSPORT_RDT) { if (rt->transport == RTSP_TRANSPORT_RDT) {
ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, buf, len); 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); 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) if (ret < 0)
goto redo; goto redo;
if (ret == 1) if (ret == 1)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册