Reset RTCP timestamps after seeking, add range start offset to the packets timestamps
authorMartin Storsjö <martin@martin.st>
Tue, 20 Apr 2010 07:38:52 +0000 (07:38 +0000)
committerMartin Storsjö <martin@martin.st>
Tue, 20 Apr 2010 07:38:52 +0000 (07:38 +0000)
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

libavformat/rtpdec.c
libavformat/rtpdec.h
libavformat/rtsp.c

index bd3566e..0d2df59 100644 (file)
@@ -437,7 +437,7 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestam
         delta_timestamp = timestamp - s->last_rtcp_timestamp;
         /* 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);
-        pkt->pts = addend + delta_timestamp;
+        pkt->pts = s->range_start_offset + addend + delta_timestamp;
     }
 }
 
index 599e13d..477ab72 100644 (file)
@@ -162,6 +162,7 @@ struct RTPDemuxContext {
     uint32_t timestamp;
     uint32_t base_timestamp;
     uint32_t cur_timestamp;
+    int64_t  range_start_offset;
     int max_payload_size;
     struct MpegTSContext *ts;   /* only used for MP2T payloads */
     int read_buf_index;
index 0931201..06a6e9c 100644 (file)
@@ -1314,6 +1314,7 @@ static int rtsp_read_play(AVFormatContext *s)
 {
     RTSPState *rt = s->priv_data;
     RTSPMessageHeader reply1, *reply = &reply1;
+    int i;
     char cmd[1024];
 
     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) {
             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;
     return 0;