int i_flags, int i_hmargin, int i_vmargin,
mtime_t i_start, mtime_t i_stop )
{
- return osd_ShowTextAbsolute( vout_GetSpu( p_vout ), i_channel,
- psz_string, p_style,
- i_flags, i_hmargin, i_vmargin,
- i_start, i_stop );
+ (void)p_style; (void)i_hmargin; (void)i_vmargin;
+ vout_OSDText( p_vout, i_channel, i_flags & ~SUBPICTURE_ALIGN_MASK,
+ i_stop - i_start, psz_string );
}
VLC_EXPORT( spu_t *, spu_Create, ( vlc_object_t * ) );
#define spu_Create(a) spu_Create(VLC_OBJECT(a))
-VLC_EXPORT( int, spu_Init, ( spu_t * ) );
VLC_EXPORT( void, spu_Destroy, ( spu_t * ) );
void spu_Attach( spu_t *, vlc_object_t *, bool );
*/
VLC_EXPORT( void, spu_ClearChannel, ( spu_t *, int ) );
+/**
+ * It changes the sub filters list
+ */
+VLC_EXPORT( void, spu_ChangeFilters, ( spu_t *, const char * ) );
+
/** @}*/
#ifdef __cplusplus
VLC_EXPORT( int, vout_RegisterSubpictureChannel, ( vout_thread_t * ) );
VLC_EXPORT( void, vout_FlushSubpictureChannel, ( vout_thread_t *, int ) );
-/**
- * Return the spu_t object associated to a vout_thread_t.
- *
- * The return object is valid only as long as the vout is. You must not
- * release the spu_t object returned.
- * It cannot return NULL so no need to check.
- */
-VLC_EXPORT( spu_t *, vout_GetSpu, ( vout_thread_t * ) );
-
VLC_EXPORT( void, vout_EnableFilter, ( vout_thread_t *, const char *,bool , bool ) );
/**@}*/
p_vout = THEMIM->getVout();
if( p_vout )
{
- if( !strcmp( psz_filter_type, "sub-filter" ) )
- var_SetString( vout_GetSpu( p_vout ), psz_filter_type, psz_string );
- else
- var_SetString( p_vout, psz_filter_type, psz_string );
+ var_SetString( p_vout, psz_filter_type, psz_string );
vlc_object_release( p_vout );
}
}
if( !p_sys->p_spu )
- {
p_sys->p_spu = spu_Create( p_stream );
- spu_Init( p_sys->p_spu );
- }
return VLC_SUCCESS;
{
msg_Warn( p_stream, "spu channel not initialized, doing it now" );
if( !p_sys->p_spu )
- {
p_sys->p_spu = spu_Create( p_stream );
- spu_Init( p_sys->p_spu );
- }
}
if( p_subpic )
}
if( !p_sys->p_spu )
- {
p_sys->p_spu = spu_Create( p_stream );
- spu_Init( p_sys->p_spu );
- }
return VLC_SUCCESS;
}
if( val.psz_string && *val.psz_string )
{
p_sys->p_spu = spu_Create( p_stream );
- var_Create( p_sys->p_spu, "sub-filter", VLC_VAR_STRING );
- var_Set( p_sys->p_spu, "sub-filter", val );
- spu_Init( p_sys->p_spu );
+ if( p_sys->p_spu )
+ spu_ChangeFilters( p_sys->p_spu, val.psz_string );
}
free( val.psz_string );
var_Get( p_stream, SOUT_CFG_PREFIX "osd", &val );
if( val.b_bool )
{
- vlc_value_t osd_val;
char *psz_next;
psz_next = config_ChainCreate( &p_sys->psz_osdenc,
if( !p_sys->p_spu )
{
- osd_val.psz_string = strdup("osdmenu");
p_sys->p_spu = spu_Create( p_stream );
- var_Create( p_sys->p_spu, "sub-filter", VLC_VAR_STRING );
- var_Set( p_sys->p_spu, "sub-filter", osd_val );
- spu_Init( p_sys->p_spu );
- free( osd_val.psz_string );
+ if( p_sys->p_spu )
+ spu_ChangeFilters( p_sys->p_spu, "osdmenu" );
}
else
{
- osd_val.psz_string = strdup("osdmenu");
- var_Set( p_sys->p_spu, "sub-filter", osd_val );
- free( osd_val.psz_string );
+ spu_ChangeFilters( p_sys->p_spu, "osdmenu" );
}
}
spu_Create
spu_Destroy
spu_DisplaySubpicture
-spu_Init
+spu_ChangeFilters
spu_RenderSubpictures
spu_SortSubpictures
spu_RegisterChannel
vout_FlushSubpictureChannel
vout_EnableFilter
vout_GetSnapshot
-vout_GetSpu
vout_OSDIcon
vout_OSDMessage
vout_OSDEpg
switch (cmd->type) {
case VOUT_CONTROL_OSD_TITLE:
case VOUT_CONTROL_CHANGE_FILTERS:
+ case VOUT_CONTROL_CHANGE_SUB_FILTERS:
free(cmd->u.string);
break;
default:
#endif
VOUT_CONTROL_OSD_TITLE, /* string */
VOUT_CONTROL_CHANGE_FILTERS, /* string */
+ VOUT_CONTROL_CHANGE_SUB_FILTERS, /* string */
VOUT_CONTROL_PAUSE,
VOUT_CONTROL_RESET,
/* Initialize subpicture unit */
vout->p->p_spu = spu_Create(vout);
- /* */
- spu_Init(vout->p->p_spu);
-
/* Take care of some "interface/control" related initialisations */
vout_IntfInit(vout);
spu_ClearChannel(vout->p->p_spu, channel);
}
-spu_t *vout_GetSpu(vout_thread_t *vout)
-{
- return vout->p->p_spu;
-}
-
/* vout_Control* are usable by anyone at anytime */
void vout_ControlChangeFullscreen(vout_thread_t *vout, bool fullscreen)
{
vout_control_PushString(&vout->p->control, VOUT_CONTROL_CHANGE_FILTERS,
filters);
}
+void vout_ControlChangeSubFilters(vout_thread_t *vout, const char *filters)
+{
+ vout_control_PushString(&vout->p->control, VOUT_CONTROL_CHANGE_SUB_FILTERS,
+ filters);
+}
/* */
static picture_t *VoutVideoFilterNewPicture(filter_t *filter)
vlc_mutex_unlock(&vout->p->vfilter_lock);
}
+static void ThreadChangeSubFilters(vout_thread_t *vout, const char *filters)
+{
+ spu_ChangeFilters(vout->p->p_spu, filters);
+}
+
static void ThreadChangePause(vout_thread_t *vout, bool is_paused, mtime_t date)
{
assert(!vout->p->pause.is_on || !is_paused);
case VOUT_CONTROL_CHANGE_FILTERS:
ThreadChangeFilters(vout, cmd.u.string);
break;
+ case VOUT_CONTROL_CHANGE_SUB_FILTERS:
+ ThreadChangeSubFilters(vout, cmd.u.string);
+ break;
case VOUT_CONTROL_PAUSE:
ThreadChangePause(vout, cmd.u.pause.is_on, cmd.u.pause.date);
break;
void vout_ControlChangeCropWindow(vout_thread_t *, int x, int y, int width, int height);
void vout_ControlChangeCropBorder(vout_thread_t *, int left, int top, int right, int bottom);
void vout_ControlChangeFilters(vout_thread_t *, const char *);
+void vout_ControlChangeSubFilters(vout_thread_t *, const char *);
/* */
void vout_IntfInit( vout_thread_t * );
vlc_value_t, vlc_value_t, void * );
static int VideoSplitterCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
+static int SubFilterCallback( vlc_object_t *, char const *,
+ vlc_value_t, vlc_value_t, void * );
static int TitleShowCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
var_Change( p_vout, "vout-filter", VLC_VAR_SETTEXT, &text, NULL );
var_AddCallback( p_vout, "vout-filter", VideoSplitterCallback, NULL );
+ /* Add a sub-filter variable */
+ var_Create( p_vout, "sub-filter",
+ VLC_VAR_STRING | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND );
+ var_AddCallback( p_vout, "sub-filter", SubFilterCallback, NULL );
+ var_TriggerCallback( p_vout, "sub-filter" );
+
/* Mouse coordinates */
var_Create( p_vout, "mouse-button-down", VLC_VAR_INTEGER );
var_Create( p_vout, "mouse-moved", VLC_VAR_COORDS );
}
module_release( p_obj );
- if( !strcmp( psz_filter_type, "sub-filter") )
- psz_string = var_GetString( vout_GetSpu( p_vout ), psz_filter_type );
- else
- psz_string = var_GetString( p_vout, psz_filter_type );
+ psz_string = var_GetString( p_vout, psz_filter_type );
/* Todo : Use some generic chain manipulation functions */
if( !psz_string ) psz_string = strdup("");
if( b_setconfig )
{
- if( !strcmp( psz_filter_type, "sub-filter") )
- config_PutPsz( vout_GetSpu( p_vout ), psz_filter_type, psz_string );
- else
- config_PutPsz( p_vout, psz_filter_type, psz_string );
+ config_PutPsz( p_vout, psz_filter_type, psz_string );
}
- if( !strcmp( psz_filter_type, "sub-filter") )
- var_SetString( vout_GetSpu( p_vout ), psz_filter_type, psz_string );
- else
- var_SetString( p_vout, psz_filter_type, psz_string );
+ var_SetString( p_vout, psz_filter_type, psz_string );
free( psz_string );
}
return VLC_SUCCESS;
}
+static int SubFilterCallback( vlc_object_t *p_this, char const *psz_cmd,
+ vlc_value_t oldval, vlc_value_t newval, void *p_data)
+{
+ vout_thread_t *p_vout = (vout_thread_t *)p_this;
+ VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
+
+ vout_ControlChangeSubFilters( p_vout, newval.psz_string );
+ return VLC_SUCCESS;
+}
+
static int TitleShowCallback( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data )
{
static void spu_del_video_buffer( filter_t *, picture_t * );
/* Buffer aloccation fir SUB filter */
-static int SubFilterCallback( vlc_object_t *, char const *,
- vlc_value_t, vlc_value_t, void * );
-
static int SubFilterAllocationInit( filter_t *, void * );
static void SubFilterAllocationClean( filter_t * );
return p_spu;
}
-/**
- * Initialise the subpicture unit
- *
- * \param p_spu the subpicture unit object
- */
-int spu_Init( spu_t *p_spu )
-{
- var_Create( p_spu, "sub-filter", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
- var_AddCallback( p_spu, "sub-filter", SubFilterCallback, p_spu );
- var_TriggerCallback( p_spu, "sub-filter" );
-
- return VLC_SUCCESS;
-}
-
/**
* Destroy the subpicture unit
*
{
spu_private_t *p_sys = p_spu->p;
- var_DelCallback( p_spu, "sub-filter", SubFilterCallback, p_spu );
-
if( p_sys->p_blend )
filter_DeleteBlend( p_sys->p_blend );
vlc_mutex_unlock( &p_sys->lock );
}
+void spu_ChangeFilters( spu_t *p_spu, const char *psz_filters )
+{
+ spu_private_t *p_sys = p_spu->p;
+
+ vlc_mutex_lock( &p_sys->lock );
+
+ free( p_sys->psz_chain_update );
+ p_sys->psz_chain_update = strdup( psz_filters );
+
+ vlc_mutex_unlock( &p_sys->lock );
+}
+
/*****************************************************************************
* subpicture_t allocation
*****************************************************************************/
free( p_filter->p_owner );
}
-static int SubFilterCallback( vlc_object_t *p_object, char const *psz_var,
- vlc_value_t oldval, vlc_value_t newval, void *p_data )
-{
- spu_t *p_spu = p_data;
- spu_private_t *p_sys = p_spu->p;
-
- VLC_UNUSED(p_object); VLC_UNUSED(oldval); VLC_UNUSED(psz_var);
-
- vlc_mutex_lock( &p_sys->lock );
-
- free( p_sys->psz_chain_update );
- p_sys->psz_chain_update = strdup( newval.psz_string );
-
- vlc_mutex_unlock( &p_sys->lock );
- return VLC_SUCCESS;
-}
-