]> git.sesse.net Git - vlc/commitdiff
opus: handle RTP depayloading (fixes #11938)
authorTristan Matthews <tmatth@videolan.org>
Fri, 9 Jan 2015 21:55:22 +0000 (21:55 +0000)
committerTristan Matthews <tmatth@videolan.org>
Mon, 12 Jan 2015 22:14:02 +0000 (17:14 -0500)
If no header is given, deduce it from the decoder format.

Tested for mono, stereo and with/without --codec avcodec at
8000, 12000, 16000, 24000 and 48000hz.

modules/access/live555.cpp
modules/codec/opus.c

index a86c43943b8ef2ccbfa69c5923004b070d77e4e0..3423f82ffa825f06d103a022c077a0a3fbed2235 100644 (file)
@@ -996,6 +996,10 @@ static int SessionsSetup( demux_t *p_demux )
                     else
                         msg_Warn( p_demux,"Missing or unsupported vorbis header." );
                 }
+                else if( !strcmp( sub->codecName(), "OPUS" ) )
+                {
+                    tk->fmt.i_codec = VLC_CODEC_OPUS;
+                }
             }
             else if( !strcmp( sub->mediumName(), "video" ) )
             {
index 74bb101db591508054400e2cc416df385d5a9d77..1eb885ef26bc9342ce27860eff2a2c185bcad288 100644 (file)
@@ -238,11 +238,36 @@ static int ProcessHeaders( decoder_t *p_dec )
     void     *pp_data[XIPH_MAX_HEADER_COUNT];
     unsigned i_count;
 
+    int i_extra = p_dec->fmt_in.i_extra;
+    uint8_t *p_extra = p_dec->fmt_in.p_extra;
+
+    /* If we have no header (e.g. from RTP), make one. */
+    bool b_dummy_header = false;
+    if( !i_extra )
+    {
+        OpusHeader header;
+        opus_prepare_header( p_dec->fmt_in.audio.i_channels,
+                             p_dec->fmt_in.audio.i_rate, &header );
+        if( opus_write_header( &p_extra, &i_extra, &header,
+                               opus_get_version_string() ) )
+            return VLC_ENOMEM;
+        b_dummy_header = true;
+    }
+
     if( xiph_SplitHeaders( pi_size, pp_data, &i_count,
-                           p_dec->fmt_in.i_extra, p_dec->fmt_in.p_extra) )
+                           i_extra, p_extra ) )
+    {
+        if( b_dummy_header )
+            free( p_extra );
         return VLC_EGENERIC;
+    }
+
     if( i_count < 2 )
-        return VLC_EGENERIC;;
+    {
+        if( b_dummy_header )
+            free( p_extra );
+        return VLC_EGENERIC;
+    }
 
     oggpacket.granulepos = -1;
     oggpacket.e_o_s = 0;
@@ -257,6 +282,9 @@ static int ProcessHeaders( decoder_t *p_dec )
     if (ret != VLC_SUCCESS)
         msg_Err( p_dec, "initial Opus header is corrupted" );
 
+    if( b_dummy_header )
+        free( p_extra );
+
     return ret;
 }