[vlc-commits] es_out: add a priv control to change cat ids

Thomas Guillem git at videolan.org
Fri Feb 28 20:46:36 CET 2020


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Feb 20 15:28:16 2020 +0100| [6742a42e317685df9b068ffbf4c27cc03f0f6e41] | committer: Thomas Guillem

es_out: add a priv control to change cat ids

This control can be used before any tracks are added. In that case, it will
just behave like the "cat-track-id" option (future tracks will be selected
according to this new str_ids). It will also update the new track list
selection by selecting every tracks given by this list and unselecting all
others.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6742a42e317685df9b068ffbf4c27cc03f0f6e41
---

 src/input/es_out.c           | 69 ++++++++++++++++++++++++++++++++++++++++++++
 src/input/es_out.h           | 10 +++++++
 src/input/es_out_timeshift.c |  1 +
 3 files changed, 80 insertions(+)

diff --git a/src/input/es_out.c b/src/input/es_out.c
index d397f2ab33..a2f6b3e0d1 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -2585,6 +2585,59 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
         p_esprops->p_main_es = es;
 }
 
+static void EsOutSelectListFromProps( es_out_t *out, enum es_format_category_e cat )
+{
+    es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
+    es_out_es_props_t *esprops = GetPropsByCat( p_sys, cat );
+    if( !esprops || !esprops->str_ids )
+        return;
+
+    char *buffer = malloc( strlen( esprops->str_ids ) + 1);
+    if( !buffer )
+        return;
+
+    bool unselect_others = false;
+    es_out_id_t *other;
+    foreach_es_then_es_slaves( other )
+    {
+        if( other->fmt.i_cat != cat )
+            continue;
+
+        bool select = false;
+        if( !unselect_others )
+        {
+            /* strtok_r will modify str_ids */
+            strcpy( buffer, esprops->str_ids );
+            char *saveptr;
+            for( const char *str_id = strtok_r( buffer, ",", &saveptr );
+                 str_id != NULL;
+                 str_id = strtok_r( NULL, ",", &saveptr ) )
+            {
+                if( strcmp( other->id.str_id, str_id ) == 0 )
+                {
+                    select = true;
+                    break;
+                }
+            }
+        }
+
+        if( !select )
+        {
+            if( EsIsSelected( other ) )
+                EsOutUnselectEs( out, other, other->p_pgrm == p_sys->p_pgrm );
+        }
+        else
+        {
+            if( !EsIsSelected( other ) )
+                EsOutSelectEs( out, other );
+            if( esprops->e_policy == ES_OUT_ES_POLICY_EXCLUSIVE )
+                unselect_others = true;
+        }
+    }
+
+    free( buffer );
+}
+
 static void EsOutSelectList( es_out_t *out, enum es_format_category_e cat,
                              vlc_es_id_t * const*es_id_list )
 {
@@ -3478,6 +3531,22 @@ static int EsOutVaPrivControlLocked( es_out_t *out, int query, va_list args )
         }
         return EsOutControlLocked( out, p_sys->main_source, new_query, es );
     }
+    case ES_OUT_PRIV_SET_ES_CAT_IDS:
+    {
+        enum es_format_category_e cat = va_arg( args, enum es_format_category_e );
+        const char *str_ids = va_arg( args, const char * );
+        es_out_es_props_t *p_esprops = GetPropsByCat( p_sys, cat );
+        free( p_esprops->str_ids );
+        p_esprops->str_ids = str_ids ? strdup( str_ids ) : NULL;
+
+        if( p_esprops->str_ids )
+        {
+            /* Update new tracks selection using the new str_ids */
+            EsOutSelectListFromProps( out, cat );
+        }
+
+        return VLC_SUCCESS;
+    }
     case ES_OUT_PRIV_GET_WAKE_UP:
     {
         vlc_tick_t *pi_wakeup = va_arg( args, vlc_tick_t* );
diff --git a/src/input/es_out.h b/src/input/es_out.h
index 53b9bb0afa..af3fff944d 100644
--- a/src/input/es_out.h
+++ b/src/input/es_out.h
@@ -60,6 +60,8 @@ enum es_out_query_private_e
     ES_OUT_PRIV_RESTART_ES_BY_ID,
     ES_OUT_PRIV_SET_ES_DEFAULT_BY_ID,
 
+    ES_OUT_PRIV_SET_ES_CAT_IDS, /* arg1=es_format_category_e arg2=const char *, res=cannot fail */
+
     /* Stop all selected ES and save the stopped state in a context. free the
      * context or call ES_OUT_PRIV_STOP_ALL_ES */
     ES_OUT_PRIV_STOP_ALL_ES,                        /* arg1=void ** */
@@ -169,6 +171,14 @@ static inline int es_out_SetEsDefaultById( es_out_t *p_out, int id )
 {
     return es_out_PrivControl( p_out, ES_OUT_PRIV_SET_ES_DEFAULT_BY_ID, id );
 }
+static inline void es_out_SetEsCatIds( es_out_t *p_out,
+                                       enum es_format_category_e cat,
+                                       const char *str_ids )
+{
+    int ret = es_out_PrivControl( p_out, ES_OUT_PRIV_SET_ES_CAT_IDS,
+                                  cat, str_ids );
+    assert( ret == VLC_SUCCESS );
+}
 static inline int es_out_StopAllEs( es_out_t *p_out, void **context )
 {
     return es_out_PrivControl( p_out, ES_OUT_PRIV_STOP_ALL_ES, context );
diff --git a/src/input/es_out_timeshift.c b/src/input/es_out_timeshift.c
index 65c1526ee0..9a1ab29996 100644
--- a/src/input/es_out_timeshift.c
+++ b/src/input/es_out_timeshift.c
@@ -819,6 +819,7 @@ static int PrivControlLocked( es_out_t *p_out, int i_query, va_list args )
     case ES_OUT_PRIV_SET_ES:
     case ES_OUT_PRIV_UNSET_ES:
     case ES_OUT_PRIV_RESTART_ES:
+    case ES_OUT_PRIV_SET_ES_CAT_IDS:
     case ES_OUT_PRIV_SET_ES_LIST:
     case ES_OUT_PRIV_SET_ES_BY_ID:
     case ES_OUT_PRIV_RESTART_ES_BY_ID:



More information about the vlc-commits mailing list