[vlc-devel] [PATCH] rtp: option to assume Theora for unknown dynamic payloads

Pierre Ynard linkfanel at yahoo.fr
Thu Dec 2 20:57:41 CET 2010


This one doesn't require questionable hacks with the clock rate since
it's always 90000.


diff --git a/modules/access/rtp/Modules.am b/modules/access/rtp/Modules.am
index 849c8e4..57b39ce 100644
--- a/modules/access/rtp/Modules.am
+++ b/modules/access/rtp/Modules.am
@@ -5,7 +5,8 @@ librtp_plugin_la_SOURCES = \
 	rtp.c \
 	rtp.h \
 	input.c \
-	session.c
+	session.c \
+	xiph.c
 librtp_plugin_la_CFLAGS = $(AM_CFLAGS)
 librtp_plugin_la_LIBADD = $(AM_LIBADD)
 librtp_plugin_la_DEPENDENCIES =
diff --git a/modules/access/rtp/rtp.c b/modules/access/rtp/rtp.c
index 3cf48eb..b9aec03 100644
--- a/modules/access/rtp/rtp.c
+++ b/modules/access/rtp/rtp.c
@@ -75,6 +75,16 @@
     "RTP packets will be discarded if they are too far behind (i.e. in the " \
     "past) by this many packets from the last received packet." )
 
+#define RTP_DYNAMIC_PT_TEXT N_("RTP payload format assumed for dynamic " \
+                               "payloads")
+#define RTP_DYNAMIC_PT_LONGTEXT N_( \
+    "This payload format will be assumed for dynamic payload types " \
+    "(between 96 and 127) if it can't be determined otherwise with " \
+    "out-of-band mappings (SDP)" )
+
+static const char *const dynamic_pt_list[] = { "theora" };
+static const char *const dynamic_pt_list_text[] = { "Theora Encoded Video" };
+
 static int  Open (vlc_object_t *);
 static void Close (vlc_object_t *);
 
@@ -114,6 +124,9 @@ vlc_module_begin ()
     add_integer ("rtp-max-misorder", 100, RTP_MAX_MISORDER_TEXT,
                  RTP_MAX_MISORDER_LONGTEXT, true)
         change_integer_range (0, 32767)
+    add_string ("rtp-dynamic-pt", NULL, RTP_DYNAMIC_PT_TEXT,
+                RTP_DYNAMIC_PT_LONGTEXT, true)
+        change_string_list (dynamic_pt_list, dynamic_pt_list_text, NULL)
 
     /*add_shortcut ("sctp")*/
     add_shortcut ("dccp", "rtptcp", /* "tcp" is already taken :( */
@@ -407,19 +420,19 @@ static int Control (demux_t *demux, int i_query, va_list args)
  * Generic packet handlers
  */
 
-static void *codec_init (demux_t *demux, es_format_t *fmt)
+void *codec_init (demux_t *demux, es_format_t *fmt)
 {
     return es_out_Add (demux->out, fmt);
 }
 
-static void codec_destroy (demux_t *demux, void *data)
+void codec_destroy (demux_t *demux, void *data)
 {
     if (data)
         es_out_Del (demux->out, (es_out_id_t *)data);
 }
 
 /* Send a packet to decoder */
-static void codec_decode (demux_t *demux, void *data, block_t *block)
+void codec_decode (demux_t *demux, void *data, block_t *block)
 {
     if (data)
     {
@@ -695,6 +708,28 @@ int rtp_autodetect (demux_t *demux, rtp_session_t *session,
           pt.frequency = 90000;
           break;
         }
+        else if (ptype >= 96)
+        {
+            char *dynamic = var_InheritString(demux, "rtp-dynamic-pt");
+            if (dynamic == NULL)
+                ;
+            else if (!strcmp(dynamic, "theora"))
+            {
+                msg_Dbg (demux, "assuming Theora Encoded Video");
+                pt.init = theora_init;
+                pt.destroy = xiph_destroy;
+                pt.decode = xiph_decode;
+                pt.frequency = 90000;
+            }
+            else
+            {
+                msg_Err (demux, "invalid dynamic payload format `%s' "
+                                "specified", dynamic);
+                free(dynamic);
+                return -1;
+            }
+            free(dynamic);
+        }
         else
         {
           return -1;
@@ -706,5 +741,5 @@ int rtp_autodetect (demux_t *demux, rtp_session_t *session,
 
 /*
  * Dynamic payload type handlers
- * Hmm, none implemented yet.
+ * Hmm, none implemented yet apart from Xiph ones.
  */
diff --git a/modules/access/rtp/rtp.h b/modules/access/rtp/rtp.h
index c90b010..e9deebd 100644
--- a/modules/access/rtp/rtp.h
+++ b/modules/access/rtp/rtp.h
@@ -39,6 +39,14 @@ static inline uint8_t rtp_ptype (const block_t *block)
     return block->p_buffer[1] & 0x7F;
 }
 
+void *codec_init (demux_t *demux, es_format_t *fmt);
+void codec_destroy (demux_t *demux, void *data);
+void codec_decode (demux_t *demux, void *data, block_t *block);
+
+void *theora_init (demux_t *demux);
+void xiph_destroy (demux_t *demux, void *data);
+void xiph_decode (demux_t *demux, void *data, block_t *block);
+
 /** @section RTP session */
 rtp_session_t *rtp_session_create (demux_t *);
 void rtp_session_destroy (demux_t *, rtp_session_t *);
diff --git a/modules/access/rtp/xiph.c b/modules/access/rtp/xiph.c
index 4866513..a40d1f6 100644
--- a/modules/access/rtp/xiph.c
+++ b/modules/access/rtp/xiph.c
@@ -61,6 +61,7 @@ static void *xiph_init (bool vorbis)
     return self;
 }
 
+#if 0
 /* PT=dynamic
  * vorbis: Xiph Vorbis audio (RFC 5215)
  */
@@ -69,17 +70,18 @@ static void *vorbis_init (demux_t *demux)
     (void)demux;
     return xiph_init (true);
 }
+#endif
 
 /* PT=dynamic
  * vorbis: Xiph Theora video
  */
-static void *theora_init (demux_t *demux)
+void *theora_init (demux_t *demux)
 {
     (void)demux;
     return xiph_init (false);
 }
 
-static void xiph_destroy (demux_t *demux, void *data)
+void xiph_destroy (demux_t *demux, void *data)
 {
     rtp_xiph_t *self = data;
 
@@ -145,7 +147,7 @@ static ssize_t xiph_header (void **pextra, const uint8_t *buf, size_t len)
 }
 
 
-static void xiph_decode (demux_t *demux, void *data, block_t *block)
+void xiph_decode (demux_t *demux, void *data, block_t *block)
 {
     rtp_xiph_t *self = data;
 
@@ -240,7 +242,12 @@ static void xiph_decode (demux_t *demux, void *data, block_t *block)
             case 0: /* Raw payload */
             {
                 if (self->ident != ident)
-                    break; /* Ignore raw without configuration */
+                {
+                    msg_Warn (demux, self->vorbis ?
+                        "ignoring raw Vorbis payload without configuration" :
+                        "ignoring raw Theora payload without configuration");
+                    break;
+                }
                 block_t *raw = block_Alloc (len);
                 memcpy (raw->p_buffer, block->p_buffer, len);
                 raw->i_pts = block->i_pts; /* FIXME: what about pkts > 1 */


-- 
Pierre Ynard
"Une âme dans un corps, c'est comme un dessin sur une feuille de papier."



More information about the vlc-devel mailing list