]> git.sesse.net Git - vlc/blobdiff - src/input/es_out.c
Es out now takes care of settings the audio replay gain from meta data
[vlc] / src / input / es_out.c
index 1f3271df6e1705a35eca966a56348dbd5d8c8681..ecf7d8963e2d882ab85598ec68a6608c22fd6d4a 100644 (file)
@@ -108,6 +108,7 @@ struct es_out_sys_t
     /* es to select */
     int         i_audio_last, i_audio_id;
     int         i_sub_last, i_sub_id;
+    int         i_default_sub_id;   /* As specified in container; if applicable */
     char        **ppsz_audio_language;
     char        **ppsz_sub_language;
 
@@ -179,6 +180,8 @@ es_out_t *input_EsOutNew( input_thread_t *p_input )
     var_Get( p_input, "sub-track", &val );
     p_sys->i_sub_last = val.i_int;
 
+    p_sys->i_default_sub_id   = -1;
+
     if( !p_input->b_preparsing )
     {
         var_Get( p_input, "audio-language", &val );
@@ -299,7 +302,7 @@ es_out_id_t *input_EsOutGetFromID( es_out_t *out, int i_id )
     return NULL;
 }
 
-void input_EsOutDiscontinuity( es_out_t *out, vlc_bool_t b_flush, vlc_bool_t b_audio )
+static void EsOutDiscontinuity( es_out_t *out, vlc_bool_t b_flush, vlc_bool_t b_audio )
 {
     es_out_sys_t      *p_sys = out->p_sys;
     int i;
@@ -314,11 +317,13 @@ void input_EsOutDiscontinuity( es_out_t *out, vlc_bool_t b_flush, vlc_bool_t b_a
             input_DecoderDiscontinuity( es->p_dec, b_flush );
     }
 }
-void input_EsOutSetRate( es_out_t *out )
+void input_EsOutChangeRate( es_out_t *out )
 {
     es_out_sys_t      *p_sys = out->p_sys;
     int i;
 
+    EsOutDiscontinuity( out, VLC_FALSE, VLC_FALSE );
+
     for( i = 0; i < p_sys->i_pgrm; i++ )
         input_ClockSetRate( p_sys->p_input, &p_sys->pgrm[i]->clock );
 }
@@ -332,6 +337,30 @@ void input_EsOutSetDelay( es_out_t *out, int i_cat, int64_t i_delay )
     else if( i_cat == SPU_ES )
         p_sys->i_spu_delay = i_delay;
 }
+void input_EsOutChangeState( es_out_t *out )
+{
+    es_out_sys_t *p_sys = out->p_sys;
+    input_thread_t *p_input = p_sys->p_input;
+
+    if( p_input->i_state  == PAUSE_S )
+    {
+        /* Send discontinuity to decoders (it will allow them to flush
+         *                  * if implemented */
+        EsOutDiscontinuity( out, VLC_FALSE, VLC_FALSE );
+    }
+    else
+    {
+        /* Out of pause, reset pcr */
+        es_out_Control( out, ES_OUT_RESET_PCR );
+    }
+}
+void input_EsOutChangePosition( es_out_t *out )
+{
+    //es_out_sys_t *p_sys = out->p_sys;
+
+    es_out_Control( out, ES_OUT_RESET_PCR );
+    EsOutDiscontinuity( out, VLC_TRUE, VLC_FALSE );
+}
 
 vlc_bool_t input_EsOutDecodersEmpty( es_out_t *out )
 {
@@ -857,8 +886,31 @@ static es_out_id_t *EsOutAdd( es_out_t *out, es_format_t *fmt )
     switch( fmt->i_cat )
     {
     case AUDIO_ES:
+    {
+        audio_replay_gain_t rg;
+
         es->i_channel = p_sys->i_audio;
+
+        vlc_mutex_lock( &p_input->p->input.p_item->lock );
+        memset( &rg, 0, sizeof(rg) );
+        vlc_audio_replay_gain_MergeFromMeta( &rg, p_input->p->input.p_item->p_meta );
+        vlc_mutex_unlock( &p_input->p->input.p_item->lock );
+
+        for( i = 0; i < AUDIO_REPLAY_GAIN_MAX; i++ )
+        {
+            if( !es->fmt.audio_replay_gain.pb_peak[i] )
+            {
+                es->fmt.audio_replay_gain.pb_peak[i] = rg.pb_peak[i];
+                es->fmt.audio_replay_gain.pf_peak[i] = rg.pf_peak[i];
+            }
+            if( !es->fmt.audio_replay_gain.pb_gain[i] )
+            {
+                es->fmt.audio_replay_gain.pb_gain[i] = rg.pb_gain[i];
+                es->fmt.audio_replay_gain.pf_gain[i] = rg.pf_gain[i];
+            }
+        }
         break;
+    }
 
     case VIDEO_ES:
         es->i_channel = p_sys->i_video;
@@ -1128,6 +1180,12 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, vlc_bool_t b_force )
 
                 i_wanted  = es->i_channel;
             }
+            else if( p_sys->i_default_sub_id >= 0 )
+            {
+                if( es->i_id == p_sys->i_default_sub_id )
+                    i_wanted = es->i_channel;
+            }
+
             if( p_sys->i_sub_last >= 0 )
                 i_wanted  = p_sys->i_sub_last;
 
@@ -1486,11 +1544,47 @@ static int EsOutControl( es_out_t *out, int i_query, va_list args )
                 playlist_t * p_playlist = pl_Yield( p_sys->p_input );
                 PL_LOCK;
                 p_playlist->gc_date = mdate();
-                vlc_cond_signal( &p_playlist->object_wait );
+                vlc_object_signal_unlocked( p_playlist );
                 PL_UNLOCK;
                 pl_Release( p_playlist );
             }
             return VLC_SUCCESS;
+        case ES_OUT_SET_DEFAULT:
+        {
+            es = (es_out_id_t*) va_arg( args, es_out_id_t * );
+
+            if( es == NULL )
+            {
+                /*p_sys->i_default_video_id = -1;*/
+                /*p_sys->i_default_audio_id = -1;*/
+                p_sys->i_default_sub_id = -1;
+            }
+            else if( es == (es_out_id_t*)((uint8_t*)NULL+AUDIO_ES) )
+            {
+                /*p_sys->i_default_video_id = -1;*/
+            }
+            else if( es == (es_out_id_t*)((uint8_t*)NULL+VIDEO_ES) )
+            {
+                /*p_sys->i_default_audio_id = -1;*/
+            }
+            else if( es == (es_out_id_t*)((uint8_t*)NULL+SPU_ES) )
+            {
+                p_sys->i_default_sub_id = -1;
+            }
+            else
+            {
+                /*if( es->fmt.i_cat == VIDEO_ES )
+                    p_sys->i_default_video_id = es->i_id;
+                else
+                if( es->fmt.i_cat == AUDIO_ES )
+                    p_sys->i_default_audio_id = es->i_id;
+                else*/
+                if( es->fmt.i_cat == SPU_ES )
+                    p_sys->i_default_sub_id = es->i_id;
+            }
+            return VLC_SUCCESS;
+        }
 
         case ES_OUT_SET_PCR:
         case ES_OUT_SET_GROUP_PCR:
@@ -1527,10 +1621,7 @@ static int EsOutControl( es_out_t *out, int i_query, va_list args )
 
         case ES_OUT_RESET_PCR:
             for( i = 0; i < p_sys->i_pgrm; i++ )
-            {
-                p_sys->pgrm[i]->clock.i_synchro_state =  SYNCHRO_REINIT;
-                p_sys->pgrm[i]->clock.last_pts = 0;
-            }
+                input_ClockResetPCR( p_sys->p_input, &p_sys->pgrm[i]->clock );
             return VLC_SUCCESS;
 
         case ES_OUT_GET_TS: