]> git.sesse.net Git - vlc/commitdiff
* src/misc/variables.c, include/variables.h: first pass at object var inheritance.
authorGildas Bazin <gbazin@videolan.org>
Sat, 24 May 2003 23:40:11 +0000 (23:40 +0000)
committerGildas Bazin <gbazin@videolan.org>
Sat, 24 May 2003 23:40:11 +0000 (23:40 +0000)
* rc/video_output/video_output.c, modules/video_filter/deinterlace/deinterlace.c: fixes to the deinterlace object var.

include/variables.h
modules/video_filter/deinterlace/deinterlace.c
src/misc/variables.c
src/video_output/video_output.c

index 45e166ad7f14c06ea47c4d51486c917ae2a79454..5ad243ad8e73f116495d9af13a87402e4126ec28 100644 (file)
@@ -2,7 +2,7 @@
  * variables.h: variables handling
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: variables.h,v 1.13 2003/05/04 22:42:14 gbazin Exp $
+ * $Id: variables.h,v 1.14 2003/05/24 23:40:11 gbazin Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -118,6 +118,8 @@ struct variable_t
 #define VLC_VAR_FREELIST      0x0027
 #define VLC_VAR_CHOICESCOUNT  0x0028
 
+#define VLC_VAR_INHERITVALUE  0x0030
+
 /*****************************************************************************
  * Prototypes
  *****************************************************************************/
index 202220e07335ae78a735cd6aa2ad3deb853c64d8..7683290e53923cbafe3066c92091cb189c785703 100644 (file)
@@ -2,7 +2,7 @@
  * deinterlace.c : deinterlacer plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN
- * $Id: deinterlace.c,v 1.12 2003/05/15 22:27:37 massiot Exp $
+ * $Id: deinterlace.c,v 1.13 2003/05/24 23:40:11 gbazin Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -136,20 +136,19 @@ static int Create( vlc_object_t *p_this )
     vlc_mutex_init( p_vout, &p_vout->p_sys->filter_lock );
 
     /* Look what method was requested */
-    val.psz_string = config_GetPsz( p_vout, "deinterlace-mode" );
-
     var_Create( p_vout, "deinterlace-mode", VLC_VAR_STRING );
+    var_Change( p_vout, "deinterlace-mode", VLC_VAR_INHERITVALUE, NULL, NULL );
+    var_Get( p_vout, "deinterlace-mode", &val );
 
     if( val.psz_string == NULL )
     {
-        msg_Err( p_vout, "configuration variable %s empty",
-                         "deinterlace-mode" );
+        msg_Err( p_vout, "configuration variable deinterlace-mode empty" );
         msg_Err( p_vout, "no deinterlace mode provided, using \"discard\"" );
 
         val.psz_string = strdup( "discard" );
     }
 
-    var_Set( p_vout, "deinterlace-mode", val );
+    msg_Dbg( p_vout, "using %s deinterlace mode", val.psz_string );
 
     SetFilterMethod( p_vout, val.psz_string );
 
@@ -728,6 +727,8 @@ static int FilterCallback( vlc_object_t *p_this, char const *psz_cmd,
     vout_thread_t * p_vout = (vout_thread_t *)p_this;
     int i_old_mode = p_vout->p_sys->i_mode;
 
+    msg_Dbg( p_vout, "using %s deinterlace mode", newval.psz_string );
+
     vlc_mutex_lock( &p_vout->p_sys->filter_lock );
 
     SetFilterMethod( p_vout, newval.psz_string );
index 8b037cf8283eb7641e7458973194b5dc3597b7ad..eacd6a02ffa236cd13b605f0ca4c7b764ad105de 100644 (file)
@@ -2,7 +2,7 @@
  * variables.c: routines for object variables handling
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: variables.c,v 1.24 2003/05/11 18:43:19 gbazin Exp $
+ * $Id: variables.c,v 1.25 2003/05/24 23:40:11 gbazin Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -132,6 +132,9 @@ static int      LookupInner ( variable_t *, int, uint32_t );
 
 static void     CheckValue  ( variable_t *, vlc_value_t * );
 
+static int      InheritValue( vlc_object_t *, const char *, vlc_value_t *,
+                              int );
+
 /*****************************************************************************
  * var_Create: initialize a vlc variable
  *****************************************************************************
@@ -546,6 +549,26 @@ int __var_Change( vlc_object_t *p_this, const char *psz_name,
                 p_val->psz_string = strdup( p_var->psz_text );
             }
             break;
+        case VLC_VAR_INHERITVALUE:
+            {
+                vlc_value_t val;
+
+                if( InheritValue( p_this, psz_name, &val, p_var->i_type )
+                    == VLC_SUCCESS );
+                {
+                    /* Duplicate already done */
+
+                    /* Backup needed stuff */
+                    oldval = p_var->val;
+                    /* Check boundaries and list */
+                    CheckValue( p_var, &val );
+                    /* Set the variable */
+                    p_var->val = val;
+                    /* Free data if needed */
+                    p_var->pf_free( &oldval );
+                }
+            }
+            break;
 
         default:
             break;
@@ -1052,3 +1075,71 @@ static void CheckValue ( variable_t *p_var, vlc_value_t *p_val )
             break;
     }
 }
+
+/*****************************************************************************
+ * InheritValue: try to inherit the value of this variable from the same one
+ *               in our closest parent.
+ *****************************************************************************/
+static int InheritValue( vlc_object_t *p_this, const char *psz_name,
+                         vlc_value_t *p_val, int i_type )
+{
+    int i_var;
+    variable_t *p_var;
+
+    /* No need to take the structure lock,
+     * we are only looking for our parents */
+
+    if( !p_this->p_parent )
+    {
+        switch( i_type & VLC_VAR_TYPE )
+        {
+        case VLC_VAR_STRING:
+            p_val->psz_string = config_GetPsz( p_this, psz_name );
+            if( !p_val->psz_string ) p_val->psz_string = strdup("");
+            break;
+        case VLC_VAR_FLOAT:
+            p_val->f_float = config_GetFloat( p_this, psz_name );
+            break;
+        case VLC_VAR_INTEGER:
+            p_val->i_int = config_GetInt( p_this, psz_name );
+            break;
+        case VLC_VAR_BOOL:
+            p_val->b_bool = config_GetInt( p_this, psz_name );
+            break;
+        default:
+            return VLC_ENOOBJ;
+            break;
+        }
+
+        return VLC_SUCCESS;
+    }
+
+    /* Look for the variable */
+    vlc_mutex_lock( &p_this->p_parent->var_lock );
+
+    i_var = Lookup( p_this->p_parent->p_vars, p_this->p_parent->i_vars,
+                    psz_name );
+
+    if( i_var >= 0 )
+    {
+        /* We found it! */
+
+        p_var = &p_this->p_parent->p_vars[i_var];
+
+        /* Really get the variable */
+        *p_val = p_var->val;
+
+        /* Duplicate value if needed */
+        p_var->pf_dup( p_val );
+
+        vlc_mutex_unlock( &p_this->p_parent->var_lock );
+
+        return VLC_SUCCESS;
+    }
+
+    vlc_mutex_unlock( &p_this->p_parent->var_lock );
+
+    /* We're still not there */
+
+    return InheritValue( p_this->p_parent, psz_name, p_val, i_type );
+}
index c0ac983d2f6d8af05c645c3a691209dfb3d1edac..9921cfc46847fd8325d5df70107220998694069b 100644 (file)
@@ -5,7 +5,7 @@
  * thread, and destroy a previously oppened video output thread.
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: video_output.c,v 1.223 2003/05/24 20:54:27 gbazin Exp $
+ * $Id: video_output.c,v 1.224 2003/05/24 23:40:11 gbazin Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
@@ -364,6 +364,12 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
     InitWindowSize( p_vout, &p_vout->i_window_width,
                     &p_vout->i_window_height );
 
+    /* Create thread and set locks */
+    vlc_mutex_init( p_vout, &p_vout->picture_lock );
+    vlc_mutex_init( p_vout, &p_vout->subpicture_lock );
+    vlc_mutex_init( p_vout, &p_vout->change_lock );
+
+    vlc_object_attach( p_vout, p_parent );
 
     p_vout->p_module = module_Need( p_vout,
                            ( p_vout->psz_filter_chain &&
@@ -390,7 +396,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
     var_Change( p_vout, "deinterlace", VLC_VAR_SETTEXT, &text, NULL );
     val.psz_string = ""; text.psz_string = _("Disable");
     var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text );
-    var_Set( p_vout, "deinterlace", val );
     val.psz_string = "discard"; text.psz_string = _("Discard");
     var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text );
     val.psz_string = "blend"; text.psz_string = _("Blend");
@@ -401,7 +406,10 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
     var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text );
     val.psz_string = "linear"; text.psz_string = _("Linear");
     var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text );
-    //var_Change( p_vout, "deinterlace", VLC_VAR_INHERITVALUE, NULL, NULL );
+    if( var_Get( p_vout, "deinterlace-mode", &val ) == VLC_SUCCESS )
+    {
+        var_Set( p_vout, "deinterlace", val );
+    }
     var_AddCallback( p_vout, "deinterlace", DeinterlaceCallback, NULL );
 
     /* Calculate delay created by internal caching */
@@ -417,13 +425,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
         p_vout->i_pts_delay = DEFAULT_PTS_DELAY;
     }
 
-    /* Create thread and set locks */
-    vlc_mutex_init( p_vout, &p_vout->picture_lock );
-    vlc_mutex_init( p_vout, &p_vout->subpicture_lock );
-    vlc_mutex_init( p_vout, &p_vout->change_lock );
-
-    vlc_object_attach( p_vout, p_parent );
-
     if( vlc_thread_create( p_vout, "video output", RunThread,
                            VLC_THREAD_PRIORITY_OUTPUT, VLC_TRUE ) )
     {
@@ -1233,37 +1234,39 @@ static int DeinterlaceCallback( vlc_object_t *p_this, char const *psz_cmd,
 
     if( psz_filter ) free( psz_filter );
 
-    /* now restart all video streams */
+
     p_input = (input_thread_t *)vlc_object_find( p_this, VLC_OBJECT_INPUT,
                                                  FIND_PARENT );
-    if( p_input )
+    if( !p_input ) return VLC_EGENERIC;
+
+    if( psz_mode && *psz_mode )
     {
-        vlc_mutex_lock( &p_input->stream.stream_lock );
+        val.psz_string = psz_mode;
+        var_Set( p_vout, "deinterlace-mode", val );
+        /* Modify input as well because the vout might have to be restarted */
+        var_Create( p_input, "deinterlace-mode", VLC_VAR_STRING );
+        var_Set( p_input, "deinterlace-mode", val );
+    }
 
-        p_vout->b_filter_change = VLC_TRUE;
+    /* now restart all video streams */
+    vlc_mutex_lock( &p_input->stream.stream_lock );
+
+    p_vout->b_filter_change = VLC_TRUE;
 
 #define ES p_input->stream.pp_es[i]
 
-        for( i = 0 ; i < p_input->stream.i_es_number ; i++ )
+    for( i = 0 ; i < p_input->stream.i_es_number ; i++ )
+    {
+        if( ( ES->i_cat == VIDEO_ES ) && ES->p_decoder_fifo != NULL )
         {
-            if( ( ES->i_cat == VIDEO_ES ) && ES->p_decoder_fifo != NULL )
-            {
-                input_UnselectES( p_input, ES );
-                input_SelectES( p_input, ES );
-            }
-#undef ES
+            input_UnselectES( p_input, ES );
+            input_SelectES( p_input, ES );
         }
-        vlc_mutex_unlock( &p_input->stream.stream_lock );
-
-        vlc_object_release( p_input );
+#undef ES
     }
+    vlc_mutex_unlock( &p_input->stream.stream_lock );
 
-    if( psz_mode && *psz_mode )
-    {
-        val.psz_string = psz_mode;
-        if( var_Set( p_vout, "deinterlace-mode", val ) != VLC_SUCCESS )
-            config_PutPsz( p_vout, "deinterlace-mode", psz_mode );
-    }
+    vlc_object_release( p_input );
 
     val.b_bool = VLC_TRUE;
     var_Set( p_vout, "intf-change", val );