]> git.sesse.net Git - vlc/commitdiff
live555: retrieve RTSP track languages from SDP
authorGilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
Wed, 18 Dec 2013 13:07:12 +0000 (13:07 +0000)
committerJean-Baptiste Kempf <jb@videolan.org>
Wed, 25 Dec 2013 19:20:04 +0000 (20:20 +0100)
First for the "a=lang:" session attribute, then for each subsession
look for the same attribute, and use the session attribute if none
was found.

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/access/live555.cpp

index 824cdf2198ae7daf8488e6c32a12abfeddc7ac48..88ddc2e3a9978097a787f84de1decf645d9576df 100644 (file)
@@ -685,6 +685,8 @@ static int SessionsSetup( demux_t *p_demux )
     unsigned int   i_receive_buffer = 0;
     int            i_frame_buffer = DEFAULT_FRAME_BUFFER_SIZE;
     unsigned const thresh = 200000; /* RTP reorder threshold .2 second (default .1) */
+    const char     *p_sess_lang = NULL;
+    const char     *p_lang;
 
     b_rtsp_tcp    = var_CreateGetBool( p_demux, "rtsp-tcp" ) ||
                     var_GetBool( p_demux, "rtsp-http" );
@@ -699,6 +701,20 @@ static int SessionsSetup( demux_t *p_demux )
         return VLC_EGENERIC;
     }
 
+    if( strcmp( p_sys->p_sdp, "m=" ) != 0 )
+    {
+        const char *p_sess_attr_end;
+
+        p_sess_attr_end = strstr( p_sys->p_sdp, "\nm=" );
+        if( !p_sess_attr_end )
+            p_sess_attr_end = strstr( p_sys->p_sdp, "\rm=" );
+
+        p_sess_lang = p_sess_attr_end ? strstr( p_sys->p_sdp, "a=lang:" ) : NULL;
+        if( p_sess_lang &&
+            p_sess_lang - p_sys->p_sdp > p_sess_attr_end - p_sys->p_sdp )
+            p_sess_lang = NULL;
+    }
+
     /* Initialise each media subsession */
     iter = new MediaSubsessionIterator( *p_sys->ms );
     while( ( sub = iter->next() ) != NULL )
@@ -1086,6 +1102,19 @@ static int SessionsSetup( demux_t *p_demux )
                 }
             }
 
+            /* Try and parse a=lang: attribute */
+            p_lang = strstr( sub->savedSDPLines(), "a=lang:" );
+            if( !p_lang )
+                p_lang = p_sess_lang;
+
+            if( p_lang )
+            {
+                unsigned i_lang_len;
+                p_lang += 7;
+                i_lang_len = strcspn( p_lang, " \r\n" );
+                tk->fmt.psz_language = strndup( p_lang, i_lang_len );
+            }
+
             if( !tk->b_quicktime && !tk->b_muxed && !tk->b_asf )
             {
                 tk->p_es = es_out_Add( p_demux->out, &tk->fmt );