On Thu, 17 Nov 2011, John Brooks wrote:

---
libavformat/rtpdec.c  |    8 +++++++-
libavformat/rtpdec.h  |    1 +
libavformat/rtspdec.c |    2 ++
3 files changed, 10 insertions(+), 1 deletions(-)

In general, looks ok to me. Some questions below.

diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index 592c08d..88cf15b 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -439,7 +439,13 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket 
*pkt, uint32_t timestam

    if (!s->base_timestamp)
        s->base_timestamp = timestamp;
-    pkt->pts = s->range_start_offset + timestamp - s->base_timestamp;
+    /* assume that the difference is INT32_MIN < x < INT32_MAX, but allow the 
first timestamp to exceed INT32_MAX */
+    if (!s->timestamp)
+        s->unwrapped_timestamp += timestamp;

In this case, I guess unwrapped_timestamp always is 0, so += and = would do the same, right? (Using = would feel more intuitive to me, but it's no big deal.)

+    else
+        s->unwrapped_timestamp += (int32_t)(timestamp - s->timestamp);
+    s->timestamp = timestamp;
+    pkt->pts = s->unwrapped_timestamp + s->range_start_offset - 
s->base_timestamp;
}

static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h
index d58eddd..eb1e62d 100644
--- a/libavformat/rtpdec.h
+++ b/libavformat/rtpdec.h
@@ -151,6 +151,7 @@ struct RTPDemuxContext {
    uint32_t timestamp;
    uint32_t base_timestamp;
    uint32_t cur_timestamp;
+    int64_t  unwrapped_timestamp;
    int64_t  range_start_offset;
    int max_payload_size;
    struct MpegTSContext *ts;   /* only used for MP2T payloads */
diff --git a/libavformat/rtspdec.c b/libavformat/rtspdec.c
index c453b82..1b4982f 100644
--- a/libavformat/rtspdec.c
+++ b/libavformat/rtspdec.c
@@ -52,6 +52,8 @@ static int rtsp_read_play(AVFormatContext *s)
                rtpctx->last_rtcp_ntp_time  = AV_NOPTS_VALUE;
                rtpctx->first_rtcp_ntp_time = AV_NOPTS_VALUE;
                rtpctx->base_timestamp      = 0;
+                rtpctx->timestamp           = 0;
+                rtpctx->unwrapped_timestamp = 0;
                rtpctx->rtcp_ts_offset      = 0;
            }
        }
--
1.7.5.4

Except for this, I'll have to think it through to make sure there's no case where this causes a difference to the current code, when switching from RTP-only to RTCP-based timestamps.

// Martin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to