/* 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;
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 );
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;
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 );
}
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 )
{
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;
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;
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:
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: