[vlc-devel] [PATCH 4/6] es_out: replace EsIsSelected function with a variable
Thomas Guillem
thomas at gllm.fr
Wed Aug 29 14:24:29 CEST 2018
It will allow to get the selected state from any threads.
---
src/input/es_out.c | 64 ++++++++++++++++++++--------------------------
1 file changed, 28 insertions(+), 36 deletions(-)
diff --git a/src/input/es_out.c b/src/input/es_out.c
index 462ad23423..aab4493976 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -91,6 +91,7 @@ struct es_out_id_t
es_format_t fmt;
char *psz_language;
char *psz_language_code;
+ bool b_selected;
decoder_t *p_dec;
decoder_t *p_dec_record;
@@ -194,7 +195,6 @@ static void EsOutSelect( es_out_t *, es_out_id_t *es, bool b_force );
static void EsOutUpdateInfo( es_out_t *, es_out_id_t *es, const es_format_t *, const vlc_meta_t * );
static int EsOutSetRecord( es_out_t *, bool b_record );
-static bool EsIsSelected( es_out_id_t *es );
static void EsOutSelectEs( es_out_t *out, es_out_id_t *es );
static void EsOutDeleteInfoEs( es_out_t *, es_out_id_t *es );
static void EsOutUnselectEs( es_out_t *out, es_out_id_t *es, bool b_update );
@@ -336,6 +336,11 @@ es_out_t *input_EsOutNew( input_thread_t *p_input, int i_rate )
/*****************************************************************************
*
*****************************************************************************/
+static void EsMarkSelected(es_out_id_t *es, bool b_selected)
+{
+ es->b_selected = b_selected;
+}
+
static void EsOutDelete( es_out_t *out )
{
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
@@ -437,7 +442,7 @@ static es_out_id_t *EsOutGetSelectedCat( es_out_t *out,
es_out_id_t *es;
foreach_es_then_es_slaves( es )
- if( es->fmt.i_cat == cat && EsIsSelected( es ) )
+ if( es->fmt.i_cat == cat && es->b_selected )
return es;
return NULL;
}
@@ -1002,7 +1007,7 @@ static void EsOutProgramSelect( es_out_t *out, es_out_pgrm_t *p_pgrm )
foreach_es_then_es_slaves(es)
{
- if (es->p_pgrm == old && EsIsSelected(es)
+ if (es->p_pgrm == old && es->b_selected
&& p_sys->i_mode != ES_OUT_MODE_ALL)
EsOutUnselectEs(out, es, true);
if (es->p_pgrm == old)
@@ -1549,6 +1554,7 @@ static es_out_id_t *EsOutAddSlaveLocked( es_out_t *out, const es_format_t *fmt,
es->i_meta_id = p_sys->i_id++; /* always incremented */
es->b_scrambled = false;
es->b_forced = false;
+ es->b_selected = false;
switch( es->fmt.i_cat )
{
@@ -1642,24 +1648,6 @@ static es_out_id_t *EsOutAdd( es_out_t *out, const es_format_t *fmt )
return es;
}
-static bool EsIsSelected( es_out_id_t *es )
-{
- if( es->p_master )
- {
- bool b_decode = false;
- if( es->p_master->p_dec )
- {
- int i_channel = EsOutGetClosedCaptionsChannel( &es->fmt );
- input_DecoderGetCcState( es->p_master->p_dec, es->fmt.i_codec,
- i_channel, &b_decode );
- }
- return b_decode;
- }
- else
- {
- return es->p_dec != NULL;
- }
-}
static void EsOutCreateDecoder( es_out_t *out, es_out_id_t *p_es )
{
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
@@ -1714,7 +1702,7 @@ static void EsOutSelectEs( es_out_t *out, es_out_id_t *es )
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
input_thread_t *p_input = p_sys->p_input;
- if( EsIsSelected( es ) )
+ if( es->b_selected )
{
msg_Warn( p_input, "ES 0x%x is already selected", es->i_id );
return;
@@ -1776,6 +1764,7 @@ static void EsOutSelectEs( es_out_t *out, es_out_id_t *es )
}
/* Mark it as selected */
+ EsMarkSelected(es, true);
input_SendEventEsSelect( p_input, &es->fmt );
}
@@ -1799,6 +1788,7 @@ static void EsDeleteCCChannels( es_out_t *out, es_out_id_t *parent )
if( i_spu_id == parent->cc.pp_es[i]->i_id )
{
/* Force unselection of the CC */
+ EsMarkSelected(parent->cc.pp_es[i], false);
input_SendEventEsUnselect( p_input, &parent->cc.pp_es[i]->fmt );
}
EsOutDelLocked( out, parent->cc.pp_es[i] );
@@ -1813,7 +1803,7 @@ static void EsOutUnselectEs( es_out_t *out, es_out_id_t *es, bool b_update )
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
input_thread_t *p_input = p_sys->p_input;
- if( !EsIsSelected( es ) )
+ if( !es->b_selected )
{
msg_Warn( p_input, "ES 0x%x is already unselected", es->i_id );
return;
@@ -1835,6 +1825,8 @@ static void EsOutUnselectEs( es_out_t *out, es_out_id_t *es, bool b_update )
EsOutDestroyDecoder( out, es );
}
+ EsMarkSelected(es, false);
+
if( !b_update )
return;
@@ -1868,7 +1860,7 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
if( p_sys->i_mode == ES_OUT_MODE_ALL || b_force )
{
- if( !EsIsSelected( es ) )
+ if( !es->b_selected )
{
if( b_auto_unselect )
EsOutUnselectEs( out, p_esprops->p_main_es, false );
@@ -1889,7 +1881,7 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
{
if( atoi( prgm ) == es->p_pgrm->i_id || b_force )
{
- if( !EsIsSelected( es ) )
+ if( !es->b_selected )
EsOutSelectEs( out, es );
break;
}
@@ -1974,7 +1966,7 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
wanted_es = es;
}
- if( wanted_es == es && !EsIsSelected( es ) )
+ if( wanted_es == es && !es->b_selected )
{
if( b_auto_unselect )
EsOutUnselectEs( out, p_esprops->p_main_es, false );
@@ -1984,7 +1976,7 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
}
/* FIXME TODO handle priority here */
- if( p_esprops && p_sys->i_mode == ES_OUT_MODE_AUTO && EsIsSelected( es ) )
+ if( p_esprops && p_sys->i_mode == ES_OUT_MODE_AUTO && es->b_selected )
p_esprops->p_main_es = es;
}
@@ -2205,7 +2197,7 @@ static void EsOutDelLocked( es_out_t *out, es_out_id_t *es )
foreach_es_then_es_slaves(other)
if( es->fmt.i_cat == other->fmt.i_cat )
{
- if (EsIsSelected(other))
+ if (other->b_selected)
{
input_SendEventEsSelect(p_sys->p_input, &es->fmt);
if( p_esprops->p_main_es == NULL )
@@ -2261,12 +2253,12 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
{
es_out_id_t *es = va_arg( args, es_out_id_t * );
bool b = va_arg( args, int );
- if( b && !EsIsSelected( es ) )
+ if( b && !es->b_selected )
{
EsOutSelectEs( out, es );
- return EsIsSelected( es ) ? VLC_SUCCESS : VLC_EGENERIC;
+ return es->b_selected ? VLC_SUCCESS : VLC_EGENERIC;
}
- else if( !b && EsIsSelected( es ) )
+ else if( !b && es->b_selected )
{
EsOutUnselectEs( out, es, es->p_pgrm == p_sys->p_pgrm );
return VLC_SUCCESS;
@@ -2279,7 +2271,7 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
es_out_id_t *es = va_arg( args, es_out_id_t * );
bool *pb = va_arg( args, bool * );
- *pb = EsIsSelected( es );
+ *pb = es->b_selected;
return VLC_SUCCESS;
}
@@ -2334,7 +2326,7 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
foreach_es_then_es_slaves(es)
{
- if (EsIsSelected(es))
+ if (es->b_selected)
EsOutUnselectEs(out, es, es->p_pgrm == p_sys->p_pgrm);
}
foreach_es_then_es_slaves(es)
@@ -2385,7 +2377,7 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
}
else if (i_cat == UNKNOWN_ES || other->fmt.i_cat == i_cat)
{
- if (EsIsSelected(other))
+ if (other->b_selected)
{
if (i_query == ES_OUT_RESTART_ES)
{
@@ -2410,7 +2402,7 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
{
if (es == other)
{
- if (EsIsSelected(other))
+ if (other->b_selected)
{
EsOutUnselectEs(out, other, other->p_pgrm == p_sys->p_pgrm);
return VLC_SUCCESS;
@@ -2437,7 +2429,7 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
foreach_es_then_es_slaves(es)
{
- if (EsIsSelected(es))
+ if (es->b_selected)
{
EsOutDestroyDecoder(out, es);
*++selected_es = es->i_id;
--
2.18.0
More information about the vlc-devel
mailing list