]> git.sesse.net Git - vlc/blobdiff - src/input/es_out.c
FSF address change.
[vlc] / src / input / es_out.c
index 95dbbd71a225d09a4b36a4398afdfbfac7ea219d..12bbd8ca1a91e4e4b0cf645711419428226e606c 100644 (file)
@@ -19,7 +19,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
@@ -103,8 +103,8 @@ struct es_out_sys_t
     int         i_sub;
 
     /* es to select */
-    int         i_audio_last;
-    int         i_sub_last;
+    int         i_audio_last, i_audio_id;
+    int         i_sub_last, i_sub_id;
     char        **ppsz_audio_language;
     char        **ppsz_sub_language;
 
@@ -194,6 +194,12 @@ es_out_t *input_EsOutNew( input_thread_t *p_input )
     }
     if( val.psz_string ) free( val.psz_string );
 
+    var_Get( p_input, "audio-track-id", &val );
+    p_sys->i_audio_id = val.i_int;
+
+    var_Get( p_input, "sub-track-id", &val );
+    p_sys->i_sub_id = val.i_int;
+
     p_sys->p_es_audio = NULL;
     p_sys->p_es_video = NULL;
     p_sys->p_es_sub   = NULL;
@@ -764,6 +770,17 @@ static void EsSelect( es_out_t *out, es_out_id_t *es )
             return;
         }
     }
+    if( es->fmt.i_cat == SPU_ES )
+    {
+        var_Get( p_input, "spu", &val );
+        if( !var_GetBool( p_input, "spu" ) ||
+            ( p_input->p_sout && !var_GetBool( p_input, "sout-spu" ) ) )
+        {
+            msg_Dbg( p_input, "spu is disabled, not selecting ES 0x%x",
+                     es->i_id );
+            return;
+       }
+    }
 
     es->i_preroll_end = -1;
     es->p_dec = input_DecoderNew( p_input, &es->fmt, VLC_FALSE );
@@ -903,6 +920,14 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, vlc_bool_t b_force )
 
             if( p_sys->i_audio_last >= 0 )
                 i_wanted = p_sys->i_audio_last;
+
+            if( p_sys->i_audio_id >= 0 )
+            {
+                if( es->i_id == p_sys->i_audio_id )
+                    i_wanted = es->i_channel;
+                else
+                    return;
+            }
         }
         else if( i_cat == SPU_ES )
         {
@@ -933,6 +958,14 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, vlc_bool_t b_force )
             }
             if( p_sys->i_sub_last >= 0 )
                 i_wanted  = p_sys->i_sub_last;
+
+            if( p_sys->i_sub_id >= 0 )
+            {
+                if( es->i_id == p_sys->i_sub_id )
+                    i_wanted = es->i_channel;
+                else
+                    return;
+            }
         }
         else if( i_cat == VIDEO_ES )
         {
@@ -1036,6 +1069,8 @@ static int EsOutSend( es_out_t *out, es_out_id_t *es, block_t *p_block )
         }
     }
 
+    p_block->i_rate = p_input->i_rate;
+
     /* TODO handle mute */
     if( es->p_dec && ( es->fmt.i_cat != AUDIO_ES ||
         p_input->i_rate == INPUT_RATE_DEFAULT ) )
@@ -1056,6 +1091,8 @@ static int EsOutSend( es_out_t *out, es_out_id_t *es, block_t *p_block )
 static void EsOutDel( es_out_t *out, es_out_id_t *es )
 {
     es_out_sys_t *p_sys = out->p_sys;
+    vlc_bool_t b_reselect = VLC_FALSE;
+    int i;
 
     /* We don't try to reselect */
     if( es->p_dec )
@@ -1072,6 +1109,9 @@ static void EsOutDel( es_out_t *out, es_out_id_t *es )
         msg_Dbg( p_sys->p_input, "Program doesn't contain anymore ES" );
     }
 
+    if( p_sys->p_es_audio == es || p_sys->p_es_video == es ||
+        p_sys->p_es_sub == es ) b_reselect = VLC_TRUE;
+
     if( p_sys->p_es_audio == es ) p_sys->p_es_audio = NULL;
     if( p_sys->p_es_video == es ) p_sys->p_es_video = NULL;
     if( p_sys->p_es_sub   == es ) p_sys->p_es_sub   = NULL;
@@ -1089,6 +1129,14 @@ static void EsOutDel( es_out_t *out, es_out_id_t *es )
             break;
     }
 
+    /* Re-select another track when needed */
+    if( b_reselect )
+        for( i = 0; i < p_sys->i_es; i++ )
+        {
+            if( es->fmt.i_cat == p_sys->es[i]->fmt.i_cat )
+                EsOutSelect( out, p_sys->es[i], VLC_FALSE );
+        }
+
     if( es->psz_language )
         free( es->psz_language );
     if( es->psz_language_code )