[vlc-commits] commit: RTP: reorder for better readability ( Rémi Denis-Courmont )
git at videolan.org
git at videolan.org
Sun Oct 31 21:15:39 CET 2010
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Oct 31 22:12:23 2010 +0200| [fad7f0d534c6179d2c34298362ab9acad4a3b883] | committer: Rémi Denis-Courmont
RTP: reorder for better readability
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=fad7f0d534c6179d2c34298362ab9acad4a3b883
---
modules/access/rtp/session.c | 152 ++++++++++++++++++++++--------------------
1 files changed, 80 insertions(+), 72 deletions(-)
diff --git a/modules/access/rtp/session.c b/modules/access/rtp/session.c
index 267928e..a9df4f1 100644
--- a/modules/access/rtp/session.c
+++ b/modules/access/rtp/session.c
@@ -376,80 +376,13 @@ drop:
}
-static void
-rtp_decode (demux_t *demux, const rtp_session_t *session, rtp_source_t *src)
-{
- block_t *block = src->blocks;
-
- assert (block);
- src->blocks = block->p_next;
- block->p_next = NULL;
-
- /* Discontinuity detection */
- uint16_t delta_seq = rtp_seq (block) - (src->last_seq + 1);
- if (delta_seq != 0)
- {
- if (delta_seq >= 0x8000)
- { /* Trash too late packets (and PIM Assert duplicates) */
- msg_Dbg (demux, "ignoring late packet (sequence: %"PRIu16")",
- rtp_seq (block));
- goto drop;
- }
- msg_Warn (demux, "%"PRIu16" packet(s) lost", delta_seq);
- block->i_flags |= BLOCK_FLAG_DISCONTINUITY;
- }
- src->last_seq = rtp_seq (block);
-
- /* Match the payload type */
- void *pt_data;
- const rtp_pt_t *pt = rtp_find_ptype (session, src, block, &pt_data);
- if (pt == NULL)
- {
- msg_Dbg (demux, "unknown payload (%"PRIu8")",
- rtp_ptype (block));
- goto drop;
- }
-
- /* Computes the PTS from the RTP timestamp and payload RTP frequency.
- * DTS is unknown. Also, while the clock frequency depends on the payload
- * format, a single source MUST only use payloads of a chosen frequency.
- * Otherwise it would be impossible to compute consistent timestamps. */
- const uint32_t timestamp = rtp_timestamp (block);
- block->i_pts = src->ref_ntp
- + CLOCK_FREQ * (int32_t)(timestamp - src->ref_rtp) / pt->frequency;
- /* TODO: proper inter-medias/sessions sync (using RTCP-SR) */
- src->ref_ntp = block->i_pts;
- src->ref_rtp = timestamp;
-
- /* CSRC count */
- size_t skip = 12u + (block->p_buffer[0] & 0x0F) * 4;
-
- /* Extension header (ignored for now) */
- if (block->p_buffer[0] & 0x10)
- {
- skip += 4;
- if (block->i_buffer < skip)
- goto drop;
-
- skip += 4 * GetWBE (block->p_buffer + skip - 2);
- }
-
- if (block->i_buffer < skip)
- goto drop;
-
- block->p_buffer += skip;
- block->i_buffer -= skip;
-
- pt->decode (demux, pt_data, block);
- return;
-
-drop:
- block_Release (block);
-}
-
+static void rtp_decode (demux_t *, const rtp_session_t *, rtp_source_t *);
/**
- * Dequeues an RTP packet and pass it to decoder. Not cancellation-safe(?).
+ * Dequeues RTP packets and pass them to decoder. Not cancellation-safe(?).
+ * A packet is decoded if it is the next in sequence order, or if we have
+ * given up waiting on the missing packets (time out) from the last one
+ * already decoded.
*
* @param demux VLC demux object
* @param session RTP session receiving the packet
@@ -527,3 +460,78 @@ bool rtp_dequeue (demux_t *demux, const rtp_session_t *session,
}
return pending;
}
+
+
+/**
+ * Decodes one RTP packet.
+ */
+static void
+rtp_decode (demux_t *demux, const rtp_session_t *session, rtp_source_t *src)
+{
+ block_t *block = src->blocks;
+
+ assert (block);
+ src->blocks = block->p_next;
+ block->p_next = NULL;
+
+ /* Discontinuity detection */
+ uint16_t delta_seq = rtp_seq (block) - (src->last_seq + 1);
+ if (delta_seq != 0)
+ {
+ if (delta_seq >= 0x8000)
+ { /* Trash too late packets (and PIM Assert duplicates) */
+ msg_Dbg (demux, "ignoring late packet (sequence: %"PRIu16")",
+ rtp_seq (block));
+ goto drop;
+ }
+ msg_Warn (demux, "%"PRIu16" packet(s) lost", delta_seq);
+ block->i_flags |= BLOCK_FLAG_DISCONTINUITY;
+ }
+ src->last_seq = rtp_seq (block);
+
+ /* Match the payload type */
+ void *pt_data;
+ const rtp_pt_t *pt = rtp_find_ptype (session, src, block, &pt_data);
+ if (pt == NULL)
+ {
+ msg_Dbg (demux, "unknown payload (%"PRIu8")",
+ rtp_ptype (block));
+ goto drop;
+ }
+
+ /* Computes the PTS from the RTP timestamp and payload RTP frequency.
+ * DTS is unknown. Also, while the clock frequency depends on the payload
+ * format, a single source MUST only use payloads of a chosen frequency.
+ * Otherwise it would be impossible to compute consistent timestamps. */
+ const uint32_t timestamp = rtp_timestamp (block);
+ block->i_pts = src->ref_ntp
+ + CLOCK_FREQ * (int32_t)(timestamp - src->ref_rtp) / pt->frequency;
+ /* TODO: proper inter-medias/sessions sync (using RTCP-SR) */
+ src->ref_ntp = block->i_pts;
+ src->ref_rtp = timestamp;
+
+ /* CSRC count */
+ size_t skip = 12u + (block->p_buffer[0] & 0x0F) * 4;
+
+ /* Extension header (ignored for now) */
+ if (block->p_buffer[0] & 0x10)
+ {
+ skip += 4;
+ if (block->i_buffer < skip)
+ goto drop;
+
+ skip += 4 * GetWBE (block->p_buffer + skip - 2);
+ }
+
+ if (block->i_buffer < skip)
+ goto drop;
+
+ block->p_buffer += skip;
+ block->i_buffer -= skip;
+
+ pt->decode (demux, pt_data, block);
+ return;
+
+drop:
+ block_Release (block);
+}
More information about the vlc-commits
mailing list