ES_OUT_SET_ES_FMT, /* arg1= es_out_id_t* arg2=es_format_t* */
/* Allow preroll of data (data with dts/pts < i_pts for all ES will be decoded but not displayed */
- ES_OUT_SET_NEXT_DISPLAY_TIME, /* arg1=int64_t i_pts(microsecond) */
+ ES_OUT_SET_NEXT_DISPLAY_TIME, /* arg1=int64_t i_pts(microsecond) */
/* Set meta data for group (dynamic) */
ES_OUT_SET_GROUP_META, /* arg1=int i_group arg2=vlc_meta_t */
/* Set epg for group (dynamic) */
/* */
ES_OUT_DEL_GROUP, /* arg1=int i_group */
+ /* Set scrambled state for one es */
+ ES_OUT_SET_ES_SCRAMBLED_STATE, /* arg1=int i_group arg2=es_out_id_t* */
+
/* First value usable for private control */
ES_OUT_PRIVATE_START = 0x10000,
};
* variable value being the one currently selected, -1 if no teletext)
* - "signal-quality"
* - "signal-strength"
+ * - "program-scrambled" (if the current program is scrambled)
* - "cache" (level of data cached [0 .. 1])
*
* The read-write variables are:
/* A chapter has been added or removed or selected. */
INPUT_EVENT_CHAPTER,
- /* A program has been added or removed or selected */
+ /* A program ("program") has been added or removed or selected,
+ * or "program-scrambled" has changed.*/
INPUT_EVENT_PROGRAM,
/* A ES has been added or removed or selected */
INPUT_EVENT_ES,
int i_es;
bool b_selected;
+ bool b_scrambled;
/* Clock for this program */
input_clock_t *p_clock;
int i_id;
es_out_pgrm_t *p_pgrm;
+ /* */
+ bool b_scrambled;
+
/* Channel in the track type */
int i_channel;
es_format_t fmt;
input_SendEventEsDel( p_input, VIDEO_ES, -1 );
input_SendEventEsDel( p_input, SPU_ES, -1 );
input_SendEventTeletextDel( p_input, -1 );
+ input_SendEventProgramScrambled( p_input, p_pgrm->i_id, p_pgrm->b_scrambled );
/* TODO event */
var_SetInteger( p_input, "teletext-es", -1 );
p_pgrm->i_id = i_group;
p_pgrm->i_es = 0;
p_pgrm->b_selected = false;
+ p_pgrm->b_scrambled = false;
p_pgrm->psz_name = NULL;
p_pgrm->psz_now_playing = NULL;
p_pgrm->psz_publisher = NULL;
/* Remove old entries */
input_Control( p_input, INPUT_DEL_INFO, psz_cat, NULL );
- /* TODO update epg name */
+ /* TODO update epg name ?
+ * TODO update scrambled info name ? */
free( psz_cat );
}
free( p_pgrm->psz_name );
free( psz_cat );
}
+static void EsOutProgramUpdateScrambled( es_out_t *p_out, es_out_pgrm_t *p_pgrm )
+{
+ es_out_sys_t *p_sys = p_out->p_sys;
+ input_thread_t *p_input = p_sys->p_input;
+ bool b_scrambled = false;
+
+ for( int i = 0; i < p_sys->i_es; i++ )
+ {
+ if( p_sys->es[i]->p_pgrm == p_pgrm && p_sys->es[i]->b_scrambled )
+ {
+ b_scrambled = true;
+ break;
+ }
+ }
+ if( !p_pgrm->b_scrambled == !b_scrambled )
+ return;
+
+ p_pgrm->b_scrambled = b_scrambled;
+ char *psz_cat = EsOutProgramGetMetaName( p_pgrm );
+
+ if( b_scrambled )
+ input_Control( p_input, INPUT_ADD_INFO, psz_cat, _("Scrambled"), _("Yes") );
+ else
+ input_Control( p_input, INPUT_DEL_INFO, psz_cat, _("Scrambled") );
+
+ input_SendEventProgramScrambled( p_input, p_pgrm->i_id, b_scrambled );
+}
+
/* EsOutAdd:
* Add an es_out
*/
es->fmt.i_id = out->p_sys->i_id;
es->i_id = es->fmt.i_id;
es->i_meta_id = out->p_sys->i_id;
+ es->b_scrambled = false;
switch( es->fmt.i_cat )
{
EsOutUpdateInfo( out, es, &es->fmt, NULL );
+ if( es->b_scrambled )
+ EsOutProgramUpdateScrambled( out, es->p_pgrm );
+
vlc_mutex_unlock( &p_sys->lock );
return es;
TAB_REMOVE( p_sys->i_es, p_sys->es, es );
+ /* Update program */
es->p_pgrm->i_es--;
if( es->p_pgrm->i_es == 0 )
- {
msg_Dbg( p_sys->p_input, "Program doesn't contain anymore ES" );
- }
+ if( es->b_scrambled )
+ EsOutProgramUpdateScrambled( out, es->p_pgrm );
+
+ /* */
if( p_sys->p_es_audio == es || p_sys->p_es_video == es ||
p_sys->p_es_sub == es ) b_reselect = true;
return VLC_SUCCESS;
}
+ case ES_OUT_SET_ES_SCRAMBLED_STATE:
+ {
+ es = (es_out_id_t*) va_arg( args, es_out_id_t * );
+ bool b_scrambled = (bool)va_arg( args, int );
+
+ if( !es->b_scrambled != !b_scrambled )
+ {
+ es->b_scrambled = b_scrambled;
+ EsOutProgramUpdateScrambled( out, es->p_pgrm );
+ }
+ return VLC_SUCCESS;
+ }
+
case ES_OUT_SET_NEXT_DISPLAY_TIME:
{
const int64_t i_date = (int64_t)va_arg( args, int64_t );
EsOutProgramEpg( out, i_group, p_epg );
return VLC_SUCCESS;
}
+
case ES_OUT_DEL_GROUP:
{
int i_group = (int)va_arg( args, int );
case ES_OUT_SET_NEXT_DISPLAY_TIME:
case ES_OUT_SET_GROUP_META:
case ES_OUT_SET_GROUP_EPG:
+ case ES_OUT_SET_ES_SCRAMBLED_STATE:
case ES_OUT_DEL_GROUP:
case ES_OUT_SET_ES:
case ES_OUT_RESTART_ES:
p_cmd->control.int_i64.i_i64 = (int64_t)va_arg( args, int64_t );
break;
+ case ES_OUT_SET_ES_SCRAMBLED_STATE:
+ p_cmd->control.es_bool.p_es = (es_out_id_t*)va_arg( args, es_out_id_t * );
+ p_cmd->control.es_bool.b_bool = (bool)va_arg( args, int );
+ break;
+
case ES_OUT_RESET_PCR: /* no arg */
break;
return es_out_Control( p_out, i_query, p_cmd->control.int_epg.i_int,
p_cmd->control.int_epg.p_epg );
+ case ES_OUT_SET_ES_SCRAMBLED_STATE: /* arg1=int es_out_id_t* arg2=bool */
+ return es_out_Control( p_out, i_query, p_cmd->control.es_bool.p_es->p_es,
+ p_cmd->control.es_bool.b_bool );
+
/* Modified control */
case ES_OUT_SET_ES: /* arg1= es_out_id_t* */
case ES_OUT_RESTART_ES: /* arg1= es_out_id_t* */
{
VarListSelect( p_input, "program", INPUT_EVENT_PROGRAM, i_program );
}
+void input_SendEventProgramScrambled( input_thread_t *p_input, int i_group, bool b_scrambled )
+{
+ if( var_GetInteger( p_input, "program" ) != i_group )
+ return;
+
+ var_SetBool( p_input, "program-scrambled", b_scrambled );
+ Trigger( p_input, INPUT_EVENT_PROGRAM );
+}
static const char *GetEsVarName( int i_cat )
{
int i_program, const char *psz_text );
void input_SendEventProgramDel( input_thread_t *p_input, int i_program );
void input_SendEventProgramSelect( input_thread_t *p_input, int i_program );
+void input_SendEventProgramScrambled( input_thread_t *p_input, int i_group, bool b_scrambled );
void input_SendEventEsDel( input_thread_t *p_input, int i_cat, int i_id );
void input_SendEventEsAdd( input_thread_t *p_input, int i_cat, int i_id, const char *psz_text );
var_Create( p_input, "signal-strength", VLC_VAR_FLOAT );
var_SetFloat( p_input, "signal-strength", -1 );
+ var_Create( p_input, "program-scrambled", VLC_VAR_BOOL );
+ var_SetBool( p_input, "program-scrambled", false );
+
var_Create( p_input, "cache", VLC_VAR_FLOAT );
var_SetFloat( p_input, "cache", 0.0 );