diff rdt.c @ 3962:72efef66f566 libavformat

This patch refactors RDT packet header parsing so that it can be used in rtsp.c to detect the ID of the packet source also in case of TCP streams. This allows proper playback of RDT streams with multiple stream types, e.g. audio + video. Accepted by LucaB in "RDT/Realmedia patches #2" thread on ML.
author rbultje
date Wed, 01 Oct 2008 12:37:07 +0000
parents ed6f6aa977ec
children dbe779f54647
line wrap: on
line diff
--- a/rdt.c	Tue Sep 30 13:27:19 2008 +0000
+++ b/rdt.c	Wed Oct 01 12:37:07 2008 +0000
@@ -140,27 +140,25 @@
  * Actual data handling.
  */
 
-static int rdt_parse_header(struct RTPDemuxContext *s, const uint8_t *buf,
-                            int len, int *seq, uint32_t *timestamp, int *flags)
+int
+ff_rdt_parse_header(const uint8_t *buf, int len,
+                    int *sn, int *seq, int *rn, uint32_t *ts)
 {
-    rdt_data *rdt = s->dynamic_protocol_context;
-    int consumed = 0, sn;
+    int consumed = 10;
 
-    if (buf[0] < 0x40 || buf[0] > 0x42) {
+    if (len > 0 && (buf[0] < 0x40 || buf[0] > 0x42)) {
         buf += 9;
         len -= 9;
         consumed += 9;
     }
-    sn = (buf[0]>>1) & 0x1f;
-    *seq = AV_RB16(buf+1);
-    *timestamp = AV_RB32(buf+4);
-    if (!(buf[3] & 1) && (sn != rdt->prev_sn || *timestamp != rdt->prev_ts)) {
-        *flags |= PKT_FLAG_KEY;
-        rdt->prev_sn = sn;
-        rdt->prev_ts = *timestamp;
-    }
+    if (len < 10)
+        return -1;
+    if (sn)  *sn  = (buf[0]>>1) & 0x1f;
+    if (seq) *seq = AV_RB16(buf+1);
+    if (ts)  *ts  = AV_RB32(buf+4);
+    if (rn)  *rn  = buf[3] & 0x3f;
 
-    return consumed + 10;
+    return consumed;
 }
 
 /**< return 0 on packet, no more left, 1 on packet, 1 on partial packet... */
@@ -208,7 +206,8 @@
 ff_rdt_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
                     const uint8_t *buf, int len)
 {
-    int seq, flags = 0;
+    rdt_data *rdt = s->dynamic_protocol_context;
+    int seq, flags = 0, rule, sn;
     uint32_t timestamp;
     int rv= 0;
 
@@ -221,9 +220,14 @@
 
     if (len < 12)
         return -1;
-    rv = rdt_parse_header(s, buf, len, &seq, &timestamp, &flags);
+    rv = ff_rdt_parse_header(buf, len, &sn, &seq, &rule, &timestamp);
     if (rv < 0)
         return rv;
+    if (!(rule & 1) && (sn != rdt->prev_sn || timestamp != rdt->prev_ts)) {
+        flags |= PKT_FLAG_KEY;
+        rdt->prev_sn = sn;
+        rdt->prev_ts = timestamp;
+    }
     buf += rv;
     len -= rv;
     s->seq = seq;