RTP: add QCLEP and GSM static formats (untested)
[vlc.git] / modules / access / rtp / rtp.c
index 5028aa1..d639ab1 100644 (file)
@@ -179,12 +179,15 @@ static int Open (vlc_object_t *obj)
     {
         case IPPROTO_UDP:
         case IPPROTO_UDPLITE:
-            fd = net_OpenDgram (obj, dhost, (dport + 1) & ~1,
-                                shost, (sport + 1) & ~1, AF_UNSPEC, tp);
+            if ((dport & 1) != 0 || (sport & 1) != 0)
+                msg_Err (obj, "Using odd port number is higly discouraged");
+
+            fd = net_OpenDgram (obj, dhost, dport,
+                                shost, sport, AF_UNSPEC, tp);
             if (fd == -1)
                 break;
-            rtcp_fd = net_OpenDgram (obj, dhost, dport | 1, shost,
-                                     sport ? (sport | 1) : 0, AF_UNSPEC, tp);
+            rtcp_fd = net_OpenDgram (obj, dhost, dport + 1, shost,
+                                     sport ? (sport + 1) : 0, AF_UNSPEC, tp);
             break;
 
          case IPPROTO_DCCP:
@@ -234,6 +237,7 @@ static int Open (vlc_object_t *obj)
     p_sys->max_misorder = var_CreateGetInteger (obj, "rtp-max-misorder");
     p_sys->autodetect   = true;
     p_sys->framed_rtp   = (tp == IPPROTO_TCP);
+    p_sys->dead         = false;
 
     demux->pf_demux   = Demux;
     demux->pf_control = Control;
@@ -445,6 +449,19 @@ static void *pcmu_init (demux_t *demux)
     return codec_init (demux, &fmt);
 }
 
+/* PT=3
+ * GSM
+ */
+static void *gsm_init (demux_t *demux)
+{
+    es_format_t fmt;
+
+    es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('g', 's', 'm', ' '));
+    fmt.audio.i_rate = 8000;
+    fmt.audio.i_channels = 1;
+    return codec_init (demux, &fmt);
+}
+
 /* PT=8
  * PCMA: G.711 A-law (RFC3551)
  */
@@ -481,6 +498,19 @@ static void *l16m_init (demux_t *demux)
     return codec_init (demux, &fmt);
 }
 
+/* PT=12
+ * QCELP
+ */
+static void *qcelp_init (demux_t *demux)
+{
+    es_format_t fmt;
+
+    es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('Q', 'c', 'l', 'p'));
+    fmt.audio.i_rate = 8000;
+    fmt.audio.i_channels = 1;
+    return codec_init (demux, &fmt);
+}
+
 /* PT=14
  * MPA: MPEG Audio (RFC2250, ยง3.4)
  */
@@ -571,6 +601,12 @@ int rtp_autodetect (demux_t *demux, rtp_session_t *session,
         pt.frequency = 8000;
         break;
 
+      case 3:
+        msg_Dbg (demux, "detected GSM");
+        pt.init = gsm_init;
+        pt.frequency = 8000;
+        break;
+
       case 8:
         msg_Dbg (demux, "detected G.711 A-law");
         pt.init = pcma_init;
@@ -589,6 +625,12 @@ int rtp_autodetect (demux_t *demux, rtp_session_t *session,
         pt.frequency = 44100;
         break;
 
+      case 12:
+        msg_Dbg (demux, "detected QCELP");
+        pt.init = qcelp_init;
+        pt.frequency = 8000;
+        break;
+
       case 14:
         msg_Dbg (demux, "detected MPEG Audio");
         pt.init = mpa_init;
@@ -628,6 +670,5 @@ int rtp_autodetect (demux_t *demux, rtp_session_t *session,
  */
 static int Demux (demux_t *demux)
 {
-    rtp_process (demux);
-    return 1;
+    return rtp_process (demux) ? 0 : 1;
 }