Commit 66815e2e authored by Gildas Bazin's avatar Gildas Bazin

* src/misc/variables.c, include/variables.h: first pass at object var inheritance.
* rc/video_output/video_output.c, modules/video_filter/deinterlace/deinterlace.c: fixes to the deinterlace object var.
parent f70356eb
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* variables.h: variables handling * variables.h: variables handling
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * 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> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -118,6 +118,8 @@ struct variable_t ...@@ -118,6 +118,8 @@ struct variable_t
#define VLC_VAR_FREELIST 0x0027 #define VLC_VAR_FREELIST 0x0027
#define VLC_VAR_CHOICESCOUNT 0x0028 #define VLC_VAR_CHOICESCOUNT 0x0028
#define VLC_VAR_INHERITVALUE 0x0030
/***************************************************************************** /*****************************************************************************
* Prototypes * Prototypes
*****************************************************************************/ *****************************************************************************/
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* deinterlace.c : deinterlacer plugin for vlc * deinterlace.c : deinterlacer plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2000, 2001, 2002, 2003 VideoLAN * 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> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -136,20 +136,19 @@ static int Create( vlc_object_t *p_this ) ...@@ -136,20 +136,19 @@ static int Create( vlc_object_t *p_this )
vlc_mutex_init( p_vout, &p_vout->p_sys->filter_lock ); vlc_mutex_init( p_vout, &p_vout->p_sys->filter_lock );
/* Look what method was requested */ /* Look what method was requested */
val.psz_string = config_GetPsz( p_vout, "deinterlace-mode" );
var_Create( p_vout, "deinterlace-mode", VLC_VAR_STRING ); 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 ) if( val.psz_string == NULL )
{ {
msg_Err( p_vout, "configuration variable %s empty", msg_Err( p_vout, "configuration variable deinterlace-mode empty" );
"deinterlace-mode" );
msg_Err( p_vout, "no deinterlace mode provided, using \"discard\"" ); msg_Err( p_vout, "no deinterlace mode provided, using \"discard\"" );
val.psz_string = strdup( "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 ); SetFilterMethod( p_vout, val.psz_string );
...@@ -728,6 +727,8 @@ static int FilterCallback( vlc_object_t *p_this, char const *psz_cmd, ...@@ -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; vout_thread_t * p_vout = (vout_thread_t *)p_this;
int i_old_mode = p_vout->p_sys->i_mode; 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 ); vlc_mutex_lock( &p_vout->p_sys->filter_lock );
SetFilterMethod( p_vout, newval.psz_string ); SetFilterMethod( p_vout, newval.psz_string );
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* variables.c: routines for object variables handling * variables.c: routines for object variables handling
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * 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> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -132,6 +132,9 @@ static int LookupInner ( variable_t *, int, uint32_t ); ...@@ -132,6 +132,9 @@ static int LookupInner ( variable_t *, int, uint32_t );
static void CheckValue ( variable_t *, vlc_value_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 * var_Create: initialize a vlc variable
***************************************************************************** *****************************************************************************
...@@ -546,6 +549,26 @@ int __var_Change( vlc_object_t *p_this, const char *psz_name, ...@@ -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 ); p_val->psz_string = strdup( p_var->psz_text );
} }
break; 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: default:
break; break;
...@@ -1052,3 +1075,71 @@ static void CheckValue ( variable_t *p_var, vlc_value_t *p_val ) ...@@ -1052,3 +1075,71 @@ static void CheckValue ( variable_t *p_var, vlc_value_t *p_val )
break; 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 );
}
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* thread, and destroy a previously oppened video output thread. * thread, and destroy a previously oppened video output thread.
***************************************************************************** *****************************************************************************
* Copyright (C) 2000-2001 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -364,6 +364,12 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, ...@@ -364,6 +364,12 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
InitWindowSize( p_vout, &p_vout->i_window_width, InitWindowSize( p_vout, &p_vout->i_window_width,
&p_vout->i_window_height ); &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->p_module = module_Need( p_vout,
( p_vout->psz_filter_chain && ( p_vout->psz_filter_chain &&
...@@ -390,7 +396,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, ...@@ -390,7 +396,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
var_Change( p_vout, "deinterlace", VLC_VAR_SETTEXT, &text, NULL ); var_Change( p_vout, "deinterlace", VLC_VAR_SETTEXT, &text, NULL );
val.psz_string = ""; text.psz_string = _("Disable"); val.psz_string = ""; text.psz_string = _("Disable");
var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text ); var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text );
var_Set( p_vout, "deinterlace", val );
val.psz_string = "discard"; text.psz_string = _("Discard"); val.psz_string = "discard"; text.psz_string = _("Discard");
var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text ); var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text );
val.psz_string = "blend"; text.psz_string = _("Blend"); val.psz_string = "blend"; text.psz_string = _("Blend");
...@@ -401,7 +406,10 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, ...@@ -401,7 +406,10 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text ); var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text );
val.psz_string = "linear"; text.psz_string = _("Linear"); 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_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 ); var_AddCallback( p_vout, "deinterlace", DeinterlaceCallback, NULL );
/* Calculate delay created by internal caching */ /* Calculate delay created by internal caching */
...@@ -417,13 +425,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, ...@@ -417,13 +425,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
p_vout->i_pts_delay = DEFAULT_PTS_DELAY; 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, if( vlc_thread_create( p_vout, "video output", RunThread,
VLC_THREAD_PRIORITY_OUTPUT, VLC_TRUE ) ) VLC_THREAD_PRIORITY_OUTPUT, VLC_TRUE ) )
{ {
...@@ -1233,37 +1234,39 @@ static int DeinterlaceCallback( vlc_object_t *p_this, char const *psz_cmd, ...@@ -1233,37 +1234,39 @@ static int DeinterlaceCallback( vlc_object_t *p_this, char const *psz_cmd,
if( psz_filter ) free( psz_filter ); if( psz_filter ) free( psz_filter );
/* now restart all video streams */
p_input = (input_thread_t *)vlc_object_find( p_this, VLC_OBJECT_INPUT, p_input = (input_thread_t *)vlc_object_find( p_this, VLC_OBJECT_INPUT,
FIND_PARENT ); 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] #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 );
input_UnselectES( p_input, ES );
input_SelectES( p_input, ES );
}
#undef ES
} }
vlc_mutex_unlock( &p_input->stream.stream_lock ); #undef ES
vlc_object_release( p_input );
} }
vlc_mutex_unlock( &p_input->stream.stream_lock );
if( psz_mode && *psz_mode ) vlc_object_release( p_input );
{
val.psz_string = psz_mode;
if( var_Set( p_vout, "deinterlace-mode", val ) != VLC_SUCCESS )
config_PutPsz( p_vout, "deinterlace-mode", psz_mode );
}
val.b_bool = VLC_TRUE; val.b_bool = VLC_TRUE;
var_Set( p_vout, "intf-change", val ); var_Set( p_vout, "intf-change", val );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment