mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Reset RTCP timestamps after seeking, add range start offset to the packets timestamps
If these aren't reset, the timestamps make a huge jump when the next RTCP is received. Originally committed as revision 22918 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
2cab6b48ad
commit
5948f82227
@ -437,7 +437,7 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestam
|
|||||||
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->first_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 = s->range_start_offset + addend + delta_timestamp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,6 +162,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 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 */
|
||||||
int read_buf_index;
|
int read_buf_index;
|
||||||
|
@ -1314,6 +1314,7 @@ static int rtsp_read_play(AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
RTSPState *rt = s->priv_data;
|
RTSPState *rt = s->priv_data;
|
||||||
RTSPMessageHeader reply1, *reply = &reply1;
|
RTSPMessageHeader reply1, *reply = &reply1;
|
||||||
|
int i;
|
||||||
char cmd[1024];
|
char cmd[1024];
|
||||||
|
|
||||||
av_log(s, AV_LOG_DEBUG, "hello state=%d\n", rt->state);
|
av_log(s, AV_LOG_DEBUG, "hello state=%d\n", rt->state);
|
||||||
@ -1330,6 +1331,22 @@ static int rtsp_read_play(AVFormatContext *s)
|
|||||||
if (reply->status_code != RTSP_STATUS_OK) {
|
if (reply->status_code != RTSP_STATUS_OK) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (reply->range_start != AV_NOPTS_VALUE &&
|
||||||
|
rt->transport == RTSP_TRANSPORT_RTP) {
|
||||||
|
for (i = 0; i < rt->nb_rtsp_streams; i++) {
|
||||||
|
RTSPStream *rtsp_st = rt->rtsp_streams[i];
|
||||||
|
RTPDemuxContext *rtpctx = rtsp_st->transport_priv;
|
||||||
|
AVStream *st = NULL;
|
||||||
|
if (rtsp_st->stream_index >= 0)
|
||||||
|
st = s->streams[rtsp_st->stream_index];
|
||||||
|
rtpctx->last_rtcp_ntp_time = AV_NOPTS_VALUE;
|
||||||
|
rtpctx->first_rtcp_ntp_time = AV_NOPTS_VALUE;
|
||||||
|
if (st)
|
||||||
|
rtpctx->range_start_offset = av_rescale_q(reply->range_start,
|
||||||
|
AV_TIME_BASE_Q,
|
||||||
|
st->time_base);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
rt->state = RTSP_STATE_STREAMING;
|
rt->state = RTSP_STATE_STREAMING;
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user