[vlc-devel] commit: Added a INPUT_CONTROL_RESTART_ES and use it in video_output. ( Laurent Aimar )

git version control git at videolan.org
Thu Aug 28 14:29:11 CEST 2008


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu Aug 28 14:30:02 2008 +0200| [1b025556e3277cc727d1e70c7c55a2a0192b4d1a] | committer: Laurent Aimar 

Added a INPUT_CONTROL_RESTART_ES and use it in video_output.

This removes the need for suxor_thread_t.

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

 include/vlc_es_out.h            |    1 +
 include/vlc_input.h             |    3 ++
 include/vlc_plugin.h            |    4 +-
 src/input/control.c             |    5 +++
 src/input/es_out.c              |   74 +++++++++++++++++++-------------------
 src/input/input.c               |    8 +++-
 src/input/input_internal.h      |    1 +
 src/video_output/video_output.c |   44 +----------------------
 8 files changed, 56 insertions(+), 84 deletions(-)

diff --git a/include/vlc_es_out.h b/include/vlc_es_out.h
index bd65448..8fe2d45 100644
--- a/include/vlc_es_out.h
+++ b/include/vlc_es_out.h
@@ -55,6 +55,7 @@ enum es_out_query_e
 
     /* set ES selected for the es category (audio/video/spu) */
     ES_OUT_SET_ES,      /* arg1= es_out_id_t*                   */
+    ES_OUT_RESTART_ES,  /* arg1= es_out_id_t*                   */
 
     /* set 'default' tag on ES (copied across from container) */
     ES_OUT_SET_DEFAULT, /* arg1= es_out_id_t*                   */
diff --git a/include/vlc_input.h b/include/vlc_input.h
index f9f5678..63debca 100644
--- a/include/vlc_input.h
+++ b/include/vlc_input.h
@@ -529,6 +529,9 @@ enum input_query_e
     /* On the fly record while playing */
     INPUT_SET_RECORD_STATE, /* arg1=bool    res=can fail */
     INPUT_GET_RECORD_STATE, /* arg1=bool*   res=can fail */
+
+    /* ES */
+    INPUT_RESTART_ES,       /* arg1=int (-AUDIO/VIDEO/SPU_ES for the whole category) */
 };
 
 VLC_EXPORT( int, input_vaControl,( input_thread_t *, int i_query, va_list  ) );
diff --git a/include/vlc_plugin.h b/include/vlc_plugin.h
index 771241e..b32841c 100644
--- a/include/vlc_plugin.h
+++ b/include/vlc_plugin.h
@@ -39,8 +39,8 @@
 /**
  * Current plugin ABI version
  */
-# define MODULE_SYMBOL 1_0_0a
-# define MODULE_SUFFIX "__1_0_0a"
+# define MODULE_SYMBOL 1_0_0b
+# define MODULE_SUFFIX "__1_0_0b"
 
 /*****************************************************************************
  * Add a few defines. You do not want to read this section. Really.
diff --git a/src/input/control.c b/src/input/control.c
index 1e286f8..ed3d12e 100644
--- a/src/input/control.c
+++ b/src/input/control.c
@@ -609,6 +609,11 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
             *pb_bool = var_GetBool( p_input, "record" );
             return VLC_SUCCESS;
 
+        case INPUT_RESTART_ES:
+            val.i_int = (int)va_arg( args, int );
+            input_ControlPush( p_input, INPUT_CONTROL_RESTART_ES, &val );
+            return VLC_SUCCESS;
+
         default:
             msg_Err( p_input, "unknown query in input_vaControl" );
             return VLC_EGENERIC;
diff --git a/src/input/es_out.c b/src/input/es_out.c
index fab5faf..b105356 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -1769,50 +1769,26 @@ static int EsOutControl( es_out_t *out, int i_query, va_list args )
             return VLC_SUCCESS;
 
         case ES_OUT_SET_ES:
+        case ES_OUT_RESTART_ES:
+        {
+            int i_cat;
+
             es = (es_out_id_t*) va_arg( args, es_out_id_t * );
-            /* Special case NULL, NULL+i_cat */
+
             if( es == NULL )
-            {
-                for( i = 0; i < p_sys->i_es; i++ )
-                {
-                    if( EsIsSelected( p_sys->es[i] ) )
-                        EsUnselect( out, p_sys->es[i],
-                                    p_sys->es[i]->p_pgrm == p_sys->p_pgrm );
-                }
-            }
+                i_cat = UNKNOWN_ES;
             else if( es == (es_out_id_t*)((uint8_t*)NULL+AUDIO_ES) )
-            {
-                for( i = 0; i < p_sys->i_es; i++ )
-                {
-                    if( p_sys->es[i]->fmt.i_cat == AUDIO_ES &&
-                        EsIsSelected( p_sys->es[i] ) )
-                        EsUnselect( out, p_sys->es[i],
-                                    p_sys->es[i]->p_pgrm == p_sys->p_pgrm );
-                }
-            }
+                i_cat = AUDIO_ES;
             else if( es == (es_out_id_t*)((uint8_t*)NULL+VIDEO_ES) )
-            {
-                for( i = 0; i < p_sys->i_es; i++ )
-                {
-                    if( p_sys->es[i]->fmt.i_cat == VIDEO_ES &&
-                        EsIsSelected( p_sys->es[i] ) )
-                        EsUnselect( out, p_sys->es[i],
-                                    p_sys->es[i]->p_pgrm == p_sys->p_pgrm );
-                }
-            }
+                i_cat = VIDEO_ES;
             else if( es == (es_out_id_t*)((uint8_t*)NULL+SPU_ES) )
-            {
-                for( i = 0; i < p_sys->i_es; i++ )
-                {
-                    if( p_sys->es[i]->fmt.i_cat == SPU_ES &&
-                        EsIsSelected( p_sys->es[i] ) )
-                        EsUnselect( out, p_sys->es[i],
-                                    p_sys->es[i]->p_pgrm == p_sys->p_pgrm );
-                }
-            }
+                i_cat = SPU_ES;
             else
+                i_cat = -1;
+
+            for( i = 0; i < p_sys->i_es; i++ )
             {
-                for( i = 0; i < p_sys->i_es; i++ )
+                if( i_cat == -1 )
                 {
                     if( es == p_sys->es[i] )
                     {
@@ -1820,13 +1796,37 @@ static int EsOutControl( es_out_t *out, int i_query, va_list args )
                         break;
                     }
                 }
+                else
+                {
+                    if( i_cat == UNKNOWN_ES || p_sys->es[i]->fmt.i_cat == i_cat )
+                    {
+                        if( EsIsSelected( p_sys->es[i] ) )
+                        {
+                            if( i_query == ES_OUT_RESTART_ES )
+                            {
+                                if( p_sys->es[i]->p_dec )
+                                {
+                                    EsDestroyDecoder( out, p_sys->es[i] );
+                                    EsCreateDecoder( out, p_sys->es[i] );
+                                }
+                            }
+                            else
+                            {
+                                EsUnselect( out, p_sys->es[i],
+                                            p_sys->es[i]->p_pgrm == p_sys->p_pgrm );
+                            }
+                        }
+                    }
+                }
             }
+            if( i_query == ES_OUT_SET_ES )
             {
                 vlc_event_t event;
                 event.type = vlc_InputSelectedStreamChanged;
                 vlc_event_send( &p_sys->p_input->p->event_manager, &event );
             }
             return VLC_SUCCESS;
+        }
  
         case ES_OUT_SET_DEFAULT:
         {
diff --git a/src/input/input.c b/src/input/input.c
index f0d7e27..2ecc160 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -1747,8 +1747,12 @@ static bool Control( input_thread_t *p_input, int i_type,
         case INPUT_CONTROL_SET_ES:
             /* No need to force update, es_out does it if needed */
             es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ES,
-                            input_EsOutGetFromID( p_input->p->p_es_out,
-                                                  val.i_int ) );
+                            input_EsOutGetFromID( p_input->p->p_es_out, val.i_int ) );
+            break;
+
+        case INPUT_CONTROL_RESTART_ES:
+            es_out_Control( p_input->p->p_es_out, ES_OUT_RESTART_ES,
+                            input_EsOutGetFromID( p_input->p->p_es_out, val.i_int ) );
             break;
 
         case INPUT_CONTROL_SET_AUDIO_DELAY:
diff --git a/src/input/input_internal.h b/src/input/input_internal.h
index 69545ff..b3e5716 100644
--- a/src/input/input_internal.h
+++ b/src/input/input_internal.h
@@ -189,6 +189,7 @@ enum input_control_e
     INPUT_CONTROL_SET_BOOKMARK,
 
     INPUT_CONTROL_SET_ES,
+    INPUT_CONTROL_RESTART_ES,
 
     INPUT_CONTROL_SET_AUDIO_DELAY,
     INPUT_CONTROL_SET_SPU_DELAY,
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index bb76692..6be98a6 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1371,35 +1371,6 @@ static void PictureHeapFixRgb( picture_heap_t *p_heap )
 }
 
 /*****************************************************************************
- * Helper thread for object variables callbacks.
- * Only used to avoid deadlocks when using the video embedded mode.
- *****************************************************************************/
-typedef struct suxor_thread_t
-{
-    VLC_COMMON_MEMBERS
-    input_thread_t *p_input;
-
-} suxor_thread_t;
-
-static void* SuxorRestartVideoES( vlc_object_t * p_vlc_t )
-{
-    suxor_thread_t *p_this = (suxor_thread_t *) p_vlc_t;
-    int canc = vlc_savecancel ();
-    /* Now restart current video stream */
-    int val = var_GetInteger( p_this->p_input, "video-es" );
-    if( val >= 0 )
-    {
-        var_SetInteger( p_this->p_input, "video-es", -VIDEO_ES );
-        var_SetInteger( p_this->p_input, "video-es", val );
-    }
-
-    vlc_object_release( p_this->p_input );
-    vlc_object_release( p_this );
-    vlc_restorecancel (canc);
-    return NULL;
-}
-
-/*****************************************************************************
  * object variables callbacks: a bunch of object variables are used by the
  * interfaces to interact with the vout.
  *****************************************************************************/
@@ -1484,20 +1455,7 @@ static int FilterCallback( vlc_object_t *p_this, char const *psz_cmd,
     var_Set( p_input, "vout-filter", val );
 
     /* Now restart current video stream */
-    var_Get( p_input, "video-es", &val );
-    if( val.i_int >= 0 )
-    {
-        static const char typename[] = "kludge";
-        suxor_thread_t *p_suxor =
-            vlc_custom_create( p_vout, sizeof(suxor_thread_t),
-                               VLC_OBJECT_GENERIC, typename );
-        p_suxor->p_input = p_input;
-        p_vout->b_filter_change = true;
-        vlc_object_yield( p_input );
-        vlc_thread_create( p_suxor, "suxor", SuxorRestartVideoES,
-                           VLC_THREAD_PRIORITY_LOW, false );
-    }
-
+    input_Control( p_input, INPUT_RESTART_ES, -VIDEO_ES );
     vlc_object_release( p_input );
 
     return VLC_SUCCESS;




More information about the vlc-devel mailing list