Commit 776b8264 authored by Laurent Aimar's avatar Laurent Aimar

Cleaned up a bit spu_t API.

parent a01d5d94
...@@ -46,7 +46,7 @@ extern "C" { ...@@ -46,7 +46,7 @@ extern "C" {
typedef struct spu_private_t spu_private_t; typedef struct spu_private_t spu_private_t;
/* Default subpicture channel ID */ /* Default subpicture channel ID */
#define DEFAULT_CHAN 1 #define SPU_DEFAULT_CHANNEL (1)
/** /**
* Subpicture unit descriptor * Subpicture unit descriptor
...@@ -55,36 +55,9 @@ struct spu_t ...@@ -55,36 +55,9 @@ struct spu_t
{ {
VLC_COMMON_MEMBERS VLC_COMMON_MEMBERS
int (*pf_control)( spu_t *, int, va_list );
spu_private_t *p; spu_private_t *p;
}; };
enum spu_query_e
{
SPU_CHANNEL_REGISTER, /* arg1= int * res= */
SPU_CHANNEL_CLEAR /* arg1= int res= */
};
static inline int spu_vaControl( spu_t *p_spu, int i_query, va_list args )
{
if( p_spu->pf_control )
return p_spu->pf_control( p_spu, i_query, args );
else
return VLC_EGENERIC;
}
static inline int spu_Control( spu_t *p_spu, int i_query, ... )
{
va_list args;
int i_result;
va_start( args, i_query );
i_result = spu_vaControl( p_spu, i_query, args );
va_end( args );
return i_result;
}
VLC_EXPORT( spu_t *, spu_Create, ( vlc_object_t * ) ); VLC_EXPORT( spu_t *, spu_Create, ( vlc_object_t * ) );
#define spu_Create(a) spu_Create(VLC_OBJECT(a)) #define spu_Create(a) spu_Create(VLC_OBJECT(a))
VLC_EXPORT( int, spu_Init, ( spu_t * ) ); VLC_EXPORT( int, spu_Init, ( spu_t * ) );
...@@ -114,6 +87,16 @@ VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t render_subti ...@@ -114,6 +87,16 @@ VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t render_subti
*/ */
VLC_EXPORT( void, spu_RenderSubpictures, ( spu_t *, picture_t *, const video_format_t *p_fmt_dst, subpicture_t *p_list, const video_format_t *p_fmt_src, mtime_t render_subtitle_date ) ); VLC_EXPORT( void, spu_RenderSubpictures, ( spu_t *, picture_t *, const video_format_t *p_fmt_dst, subpicture_t *p_list, const video_format_t *p_fmt_src, mtime_t render_subtitle_date ) );
/**
* It registers a new SPU channel.
*/
VLC_EXPORT( int, spu_RegisterChannel, ( spu_t * ) );
/**
* It clears all subpictures associated to a SPU channel.
*/
VLC_EXPORT( void, spu_ClearChannel, ( spu_t *, int ) );
/** @}*/ /** @}*/
#ifdef __cplusplus #ifdef __cplusplus
......
...@@ -683,7 +683,7 @@ static int EventKey( vlc_object_t *p_this, char const *psz_cmd, ...@@ -683,7 +683,7 @@ static int EventKey( vlc_object_t *p_this, char const *psz_cmd,
if ( !vbi_bcd_digits_greater( p_sys->i_wanted_subpage, 0x00 ) || vbi_bcd_digits_greater( p_sys->i_wanted_subpage, 0x99 ) ) if ( !vbi_bcd_digits_greater( p_sys->i_wanted_subpage, 0x00 ) || vbi_bcd_digits_greater( p_sys->i_wanted_subpage, 0x99 ) )
p_sys->i_wanted_subpage = VBI_ANY_SUBNO; p_sys->i_wanted_subpage = VBI_ANY_SUBNO;
else else
vout_OSDMessage( p_this, DEFAULT_CHAN, "%s: %d", _("Subpage"), vbi_bcd2dec( p_sys->i_wanted_subpage) ); vout_OSDMessage( p_this, SPU_DEFAULT_CHANNEL, "%s: %d", _("Subpage"), vbi_bcd2dec( p_sys->i_wanted_subpage) );
p_sys->b_update = true; p_sys->b_update = true;
vlc_mutex_unlock( &p_sys->lock ); vlc_mutex_unlock( &p_sys->lock );
...@@ -697,7 +697,7 @@ static int EventKey( vlc_object_t *p_this, char const *psz_cmd, ...@@ -697,7 +697,7 @@ static int EventKey( vlc_object_t *p_this, char const *psz_cmd,
p_sys->i_key[0] = p_sys->i_key[1]; p_sys->i_key[0] = p_sys->i_key[1];
p_sys->i_key[1] = p_sys->i_key[2]; p_sys->i_key[1] = p_sys->i_key[2];
p_sys->i_key[2] = (int)(newval.i_int - '0'); p_sys->i_key[2] = (int)(newval.i_int - '0');
vout_OSDMessage( p_this, DEFAULT_CHAN, "%s: %c%c%c", _("Page"), (char)(p_sys->i_key[0]+'0'), (char)(p_sys->i_key[1]+'0'), (char)(p_sys->i_key[2]+'0') ); vout_OSDMessage( p_this, SPU_DEFAULT_CHANNEL, "%s: %c%c%c", _("Page"), (char)(p_sys->i_key[0]+'0'), (char)(p_sys->i_key[1]+'0'), (char)(p_sys->i_key[2]+'0') );
int i_new_page = 0; int i_new_page = 0;
......
...@@ -165,8 +165,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -165,8 +165,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
* Alternatively, we should keep a reference to the vout thread. */ * Alternatively, we should keep a reference to the vout thread. */
if( p_vout && p_vout != p_sys->p_last_vout ) if( p_vout && p_vout != p_sys->p_last_vout )
for( unsigned i = 0; i < CHANNELS_NUMBER; i++ ) for( unsigned i = 0; i < CHANNELS_NUMBER; i++ )
spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_REGISTER, p_intf->p_sys->p_channels[i] = spu_RegisterChannel( vout_GetSpu( p_vout ) );
&p_intf->p_sys->p_channels[ i ] );
p_sys->p_last_vout = p_vout; p_sys->p_last_vout = p_vout;
/* Quit */ /* Quit */
...@@ -176,7 +175,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -176,7 +175,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
libvlc_Quit( p_intf->p_libvlc ); libvlc_Quit( p_intf->p_libvlc );
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Quit" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Quit" ) );
break; break;
/* Volume and audio actions */ /* Volume and audio actions */
...@@ -205,7 +204,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -205,7 +204,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
if( i_newvol == 0 ) if( i_newvol == 0 )
{ {
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, vout_OSDIcon( VLC_OBJECT( p_intf ), SPU_DEFAULT_CHANNEL,
OSD_MUTE_ICON ); OSD_MUTE_ICON );
} }
else else
...@@ -299,13 +298,13 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -299,13 +298,13 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
int state = var_GetInteger( p_input, "state" ); int state = var_GetInteger( p_input, "state" );
if( state != PAUSE_S ) if( state != PAUSE_S )
{ {
vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, vout_OSDIcon( VLC_OBJECT( p_intf ), SPU_DEFAULT_CHANNEL,
OSD_PAUSE_ICON ); OSD_PAUSE_ICON );
state = PAUSE_S; state = PAUSE_S;
} }
else else
{ {
vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, vout_OSDIcon( VLC_OBJECT( p_intf ), SPU_DEFAULT_CHANNEL,
OSD_PLAY_ICON ); OSD_PLAY_ICON );
state = PLAYING_S; state = PLAYING_S;
} }
...@@ -322,7 +321,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -322,7 +321,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
else else
{ {
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, vout_OSDIcon( VLC_OBJECT( p_intf ), SPU_DEFAULT_CHANNEL,
OSD_PLAY_ICON ); OSD_PLAY_ICON );
playlist_Play( p_playlist ); playlist_Play( p_playlist );
} }
...@@ -370,7 +369,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -370,7 +369,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
list.p_list->p_values[i+1] ); list.p_list->p_values[i+1] );
i++; i++;
} }
vout_OSDMessage( p_intf, DEFAULT_CHAN, vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL,
_("Audio Device: %s"), _("Audio Device: %s"),
list2.p_list->p_values[i].psz_string); list2.p_list->p_values[i].psz_string);
} }
...@@ -392,7 +391,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -392,7 +391,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
if( var_GetInteger( p_input, "state" ) != PAUSE_S ) if( var_GetInteger( p_input, "state" ) != PAUSE_S )
{ {
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, vout_OSDIcon( VLC_OBJECT( p_intf ), SPU_DEFAULT_CHANNEL,
OSD_PAUSE_ICON ); OSD_PAUSE_ICON );
var_SetInteger( p_input, "state", PAUSE_S ); var_SetInteger( p_input, "state", PAUSE_S );
} }
...@@ -467,7 +466,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -467,7 +466,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
else else
i++; i++;
var_Set( p_input, "audio-es", list.p_list->p_values[i] ); var_Set( p_input, "audio-es", list.p_list->p_values[i] );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
_("Audio track: %s"), _("Audio track: %s"),
list2.p_list->p_values[i].psz_string ); list2.p_list->p_values[i].psz_string );
} }
...@@ -484,7 +483,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -484,7 +483,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
i_count = list.p_list->i_count; i_count = list.p_list->i_count;
if( i_count <= 1 ) if( i_count <= 1 )
{ {
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
_("Subtitle track: %s"), _("N/A") ); _("Subtitle track: %s"), _("N/A") );
var_FreeList( &list, &list2 ); var_FreeList( &list, &list2 );
goto cleanup_and_continue; goto cleanup_and_continue;
...@@ -508,7 +507,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -508,7 +507,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
else else
i++; i++;
var_Set( p_input, "spu-es", list.p_list->p_values[i] ); var_Set( p_input, "spu-es", list.p_list->p_values[i] );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
_("Subtitle track: %s"), _("Subtitle track: %s"),
list2.p_list->p_values[i].psz_string ); list2.p_list->p_values[i].psz_string );
var_FreeList( &list, &list2 ); var_FreeList( &list, &list2 );
...@@ -533,7 +532,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -533,7 +532,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
if( i == val_list.p_list->i_count ) i = 0; if( i == val_list.p_list->i_count ) i = 0;
var_SetString( p_vout, "aspect-ratio", var_SetString( p_vout, "aspect-ratio",
val_list.p_list->p_values[i].psz_string ); val_list.p_list->p_values[i].psz_string );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
_("Aspect ratio: %s"), _("Aspect ratio: %s"),
text_list.p_list->p_values[i].psz_string ); text_list.p_list->p_values[i].psz_string );
...@@ -561,7 +560,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -561,7 +560,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
if( i == val_list.p_list->i_count ) i = 0; if( i == val_list.p_list->i_count ) i = 0;
var_SetString( p_vout, "crop", var_SetString( p_vout, "crop",
val_list.p_list->p_values[i].psz_string ); val_list.p_list->p_values[i].psz_string );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
_("Crop: %s"), _("Crop: %s"),
text_list.p_list->p_values[i].psz_string ); text_list.p_list->p_values[i].psz_string );
...@@ -575,7 +574,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -575,7 +574,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
if ( f_scalefactor != 1.0 ) if ( f_scalefactor != 1.0 )
{ {
var_SetFloat( p_vout, "scale", 1.0 ); var_SetFloat( p_vout, "scale", 1.0 );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
"%s", _("Zooming reset") ); "%s", _("Zooming reset") );
} }
else else
...@@ -583,10 +582,10 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -583,10 +582,10 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
bool b_autoscale = !var_GetBool( p_vout, "autoscale" ); bool b_autoscale = !var_GetBool( p_vout, "autoscale" );
var_SetBool( p_vout, "autoscale", b_autoscale ); var_SetBool( p_vout, "autoscale", b_autoscale );
if( b_autoscale ) if( b_autoscale )
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
"%s", _("Scaled to screen") ); "%s", _("Scaled to screen") );
else else
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
"%s", _("Original Size") ); "%s", _("Original Size") );
} }
} }
...@@ -614,7 +613,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -614,7 +613,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
if( i_deinterlace != 0 ) if( i_deinterlace != 0 )
{ {
var_SetInteger( p_vout, "deinterlace", 0 ); var_SetInteger( p_vout, "deinterlace", 0 );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
"%s", _("Deinterlace off") ); "%s", _("Deinterlace off") );
} }
else else
...@@ -634,7 +633,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -634,7 +633,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
break; break;
} }
} }
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
"%s (%s)", _("Deinterlace on"), psz_text ? psz_text : psz_mode ); "%s (%s)", _("Deinterlace on"), psz_text ? psz_text : psz_mode );
var_FreeList( &vlist, &tlist ); var_FreeList( &vlist, &tlist );
...@@ -667,7 +666,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -667,7 +666,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
if( i == -1 ) i = val_list.p_list->i_count-1; if( i == -1 ) i = val_list.p_list->i_count-1;
var_SetFloat( p_vout, "zoom", var_SetFloat( p_vout, "zoom",
val_list.p_list->p_values[i].f_float ); val_list.p_list->p_values[i].f_float );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
_("Zoom mode: %s"), _("Zoom mode: %s"),
text_list.p_list->p_values[i].psz_string ); text_list.p_list->p_values[i].psz_string );
...@@ -693,12 +692,12 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -693,12 +692,12 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
else if( i_action == ACTIONID_NEXT ) else if( i_action == ACTIONID_NEXT )
{ {
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, "%s", _("Next") ); vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL, "%s", _("Next") );
playlist_Next( p_playlist ); playlist_Next( p_playlist );
} }
else if( i_action == ACTIONID_PREV ) else if( i_action == ACTIONID_PREV )
{ {
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, "%s", vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL, "%s",
_("Previous") ); _("Previous") );
playlist_Prev( p_playlist ); playlist_Prev( p_playlist );
} }
...@@ -709,13 +708,13 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -709,13 +708,13 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
else if( i_action == ACTIONID_FRAME_NEXT ) else if( i_action == ACTIONID_FRAME_NEXT )
{ {
var_TriggerCallback( p_input, "frame-next" ); var_TriggerCallback( p_input, "frame-next" );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
"%s", _("Next frame") ); "%s", _("Next frame") );
} }
else if( i_action == ACTIONID_RATE_NORMAL ) else if( i_action == ACTIONID_RATE_NORMAL )
{ {
var_SetFloat( p_input, "rate", 1. ); var_SetFloat( p_input, "rate", 1. );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL,
"%s", _("1.00x") ); "%s", _("1.00x") );
} }
else if( i_action == ACTIONID_FASTER ) else if( i_action == ACTIONID_FASTER )
...@@ -770,7 +769,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -770,7 +769,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
i_delay -= 50000; /* 50 ms */ i_delay -= 50000; /* 50 ms */
var_SetTime( p_input, "spu-delay", i_delay ); var_SetTime( p_input, "spu-delay", i_delay );
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDMessage( p_intf, DEFAULT_CHAN, vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL,
_( "Subtitle delay %i ms" ), _( "Subtitle delay %i ms" ),
(int)(i_delay/1000) ); (int)(i_delay/1000) );
} }
...@@ -780,7 +779,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -780,7 +779,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
i_delay += 50000; /* 50 ms */ i_delay += 50000; /* 50 ms */
var_SetTime( p_input, "spu-delay", i_delay ); var_SetTime( p_input, "spu-delay", i_delay );
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDMessage( p_intf, DEFAULT_CHAN, vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL,
_( "Subtitle delay %i ms" ), _( "Subtitle delay %i ms" ),
(int)(i_delay/1000) ); (int)(i_delay/1000) );
} }
...@@ -790,7 +789,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -790,7 +789,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
--i_pos; --i_pos;
var_SetInteger( p_input, "sub-margin", i_pos ); var_SetInteger( p_input, "sub-margin", i_pos );
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDMessage( p_intf, DEFAULT_CHAN, vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL,
_( "Subtitle position %i px" ), _( "Subtitle position %i px" ),
(int)(i_pos) ); (int)(i_pos) );
} }
...@@ -800,7 +799,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -800,7 +799,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
++i_pos; ++i_pos;
var_SetInteger( p_input, "sub-margin", i_pos ); var_SetInteger( p_input, "sub-margin", i_pos );
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDMessage( p_intf, DEFAULT_CHAN, vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL,
_( "Subtitle position %i px" ), _( "Subtitle position %i px" ),
(int)(i_pos) ); (int)(i_pos) );
} }
...@@ -810,7 +809,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -810,7 +809,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
i_delay -= 50000; /* 50 ms */ i_delay -= 50000; /* 50 ms */
var_SetTime( p_input, "audio-delay", i_delay ); var_SetTime( p_input, "audio-delay", i_delay );
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDMessage( p_intf, DEFAULT_CHAN, vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL,
_( "Audio delay %i ms" ), _( "Audio delay %i ms" ),
(int)(i_delay/1000) ); (int)(i_delay/1000) );
} }
...@@ -820,7 +819,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -820,7 +819,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
i_delay += 50000; /* 50 ms */ i_delay += 50000; /* 50 ms */
var_SetTime( p_input, "audio-delay", i_delay ); var_SetTime( p_input, "audio-delay", i_delay );
ClearChannels( p_intf, p_vout ); ClearChannels( p_intf, p_vout );
vout_OSDMessage( p_intf, DEFAULT_CHAN, vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL,
_( "Audio delay %i ms" ), _( "Audio delay %i ms" ),
(int)(i_delay/1000) ); (int)(i_delay/1000) );
} }
...@@ -859,9 +858,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) ...@@ -859,9 +858,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
const bool b_record = var_ToggleBool( p_input, "record" ); const bool b_record = var_ToggleBool( p_input, "record" );
if( b_record ) if( b_record )
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _("Recording") ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _("Recording") );
else else
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _("Recording done") ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _("Recording done") );
} }
} }
} }
...@@ -1048,7 +1047,7 @@ static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout, ...@@ -1048,7 +1047,7 @@ static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout,
static void DisplayRate( input_thread_t *p_input, float f_rate ) static void DisplayRate( input_thread_t *p_input, float f_rate )
{ {
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Speed: %.2fx"), f_rate ); vout_OSDMessage( VLC_OBJECT(p_input), SPU_DEFAULT_CHANNEL, _("Speed: %.2fx"), f_rate );
} }
static float AdjustRateFine( input_thread_t *p_input, const int i_dir ) static float AdjustRateFine( input_thread_t *p_input, const int i_dir )
...@@ -1072,16 +1071,11 @@ static float AdjustRateFine( input_thread_t *p_input, const int i_dir ) ...@@ -1072,16 +1071,11 @@ static float AdjustRateFine( input_thread_t *p_input, const int i_dir )
static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout ) static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout )
{ {
int i;
if( p_vout ) if( p_vout )
{ {
spu_t *p_spu = vout_GetSpu( p_vout ); spu_t *p_spu = vout_GetSpu( p_vout );
spu_Control( p_spu, SPU_CHANNEL_CLEAR, DEFAULT_CHAN ); spu_ClearChannel( p_spu, SPU_DEFAULT_CHANNEL );
for( i = 0; i < CHANNELS_NUMBER; i++ ) for( int i = 0; i < CHANNELS_NUMBER; i++ )
{ spu_ClearChannel( p_spu, p_intf->p_sys->p_channels[i] );
spu_Control( p_spu, SPU_CHANNEL_CLEAR,
p_intf->p_sys->p_channels[ i ] );
}
} }
} }
...@@ -211,12 +211,12 @@ ...@@ -211,12 +211,12 @@
var_Set( p_playlist, "random", val ); var_Set( p_playlist, "random", val );
if( val.b_bool ) if( val.b_bool )
{ {
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Random On" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Random On" ) );
config_PutInt( p_playlist, "random", 1 ); config_PutInt( p_playlist, "random", 1 );
} }
else else
{ {
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Random Off" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Random Off" ) );
config_PutInt( p_playlist, "random", 0 ); config_PutInt( p_playlist, "random", 0 );
} }
...@@ -278,7 +278,7 @@ ...@@ -278,7 +278,7 @@
config_PutInt( p_playlist, "loop", 0 ); config_PutInt( p_playlist, "loop", 0 );
/* show the change */ /* show the change */
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Repeat One" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat One" ) );
} }
else if( repeating.b_bool && !looping.b_bool ) else if( repeating.b_bool && !looping.b_bool )
{ {
...@@ -294,7 +294,7 @@ ...@@ -294,7 +294,7 @@
config_PutInt( p_playlist, "loop", 1 ); config_PutInt( p_playlist, "loop", 1 );
/* show the change */ /* show the change */
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Repeat All" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat All" ) );
} }
else else
{ {
...@@ -310,7 +310,7 @@ ...@@ -310,7 +310,7 @@
config_PutInt( p_playlist, "loop", 0 ); config_PutInt( p_playlist, "loop", 0 );
/* show the change */ /* show the change */
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Repeat Off" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) );
} }
/* communicate with core and the main intf loop */ /* communicate with core and the main intf loop */
...@@ -336,12 +336,12 @@ ...@@ -336,12 +336,12 @@
var_Set( p_playlist, "repeat", val ); var_Set( p_playlist, "repeat", val );
if( val.b_bool ) if( val.b_bool )
{ {
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Repeat One" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat One" ) );
config_PutInt( p_playlist, "repeat", 1 ); config_PutInt( p_playlist, "repeat", 1 );
} }
else else
{ {
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Repeat Off" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) );
config_PutInt( p_playlist, "repeat", 0 ); config_PutInt( p_playlist, "repeat", 0 );
} }
...@@ -364,12 +364,12 @@ ...@@ -364,12 +364,12 @@
var_Set( p_playlist, "loop", val ); var_Set( p_playlist, "loop", val );
if( val.b_bool ) if( val.b_bool )
{ {
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Repeat All" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat All" ) );
config_PutInt( p_playlist, "loop", 1 ); config_PutInt( p_playlist, "loop", 1 );
} }
else else
{ {
vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Repeat Off" ) ); vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) );
config_PutInt( p_playlist, "loop", 0 ); config_PutInt( p_playlist, "loop", 0 );
} }
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
void CmdQuit::execute() void CmdQuit::execute()
{ {
// Stop the playlist // Stop the playlist
vout_OSDMessage( getIntf(), DEFAULT_CHAN, "%s", _( "Quit" ) ); vout_OSDMessage( getIntf(), SPU_DEFAULT_CHANNEL, "%s", _( "Quit" ) );
// Kill libvlc // Kill libvlc
libvlc_Quit( getIntf()->p_libvlc ); libvlc_Quit( getIntf()->p_libvlc );
......
...@@ -69,7 +69,7 @@ static int vlclua_osd_icon( lua_State *L ) ...@@ -69,7 +69,7 @@ static int vlclua_osd_icon( lua_State *L )
{ {
const char *psz_icon = luaL_checkstring( L, 1 ); const char *psz_icon = luaL_checkstring( L, 1 );
int i_icon = vlc_osd_icon_from_string( psz_icon ); int i_icon = vlc_osd_icon_from_string( psz_icon );
int i_chan = luaL_optint( L, 2, DEFAULT_CHAN ); int i_chan = luaL_optint( L, 2, SPU_DEFAULT_CHANNEL );
if( !i_icon ) if( !i_icon )
return luaL_error( L, "\"%s\" is not a valid osd icon.", psz_icon ); return luaL_error( L, "\"%s\" is not a valid osd icon.", psz_icon );
else else
...@@ -83,7 +83,7 @@ static int vlclua_osd_icon( lua_State *L ) ...@@ -83,7 +83,7 @@ static int vlclua_osd_icon( lua_State *L )
static int vlclua_osd_message( lua_State *L ) static int vlclua_osd_message( lua_State *L )
{ {
const char *psz_message = luaL_checkstring( L, 1 ); const char *psz_message = luaL_checkstring( L, 1 );
int i_chan = luaL_optint( L, 2, DEFAULT_CHAN ); int i_chan = luaL_optint( L, 2, SPU_DEFAULT_CHANNEL );
vlc_object_t *p_this = vlclua_get_this( L ); vlc_object_t *p_this = vlclua_get_this( L );
vout_OSDMessage( p_this, i_chan, "%s", psz_message ); vout_OSDMessage( p_this, i_chan, "%s", psz_message );
return 0; return 0;
...@@ -113,7 +113,7 @@ static int vlclua_osd_slider( lua_State *L ) ...@@ -113,7 +113,7 @@ static int vlclua_osd_slider( lua_State *L )
int i_position = luaL_checkint( L, 1 ); int i_position = luaL_checkint( L, 1 );
const char *psz_type = luaL_checkstring( L, 2 ); const char *psz_type = luaL_checkstring( L, 2 );
int i_type = vlc_osd_slider_type_from_string( psz_type ); int i_type = vlc_osd_slider_type_from_string( psz_type );
int i_chan = luaL_optint( L, 3, DEFAULT_CHAN ); int i_chan = luaL_optint( L, 3, SPU_DEFAULT_CHANNEL );
if( !i_type ) if( !i_type )
return luaL_error( L, "\"%s\" is not a valid slider type.", return luaL_error( L, "\"%s\" is not a valid slider type.",
psz_type ); psz_type );
...@@ -134,7 +134,7 @@ static int vlclua_spu_channel_register( lua_State *L ) ...@@ -134,7 +134,7 @@ static int vlclua_spu_channel_register( lua_State *L )
if( !p_vout ) if( !p_vout )
return luaL_error( L, "Unable to find vout." ); return luaL_error( L, "Unable to find vout." );
spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_REGISTER, &i_chan ); i_chan = spu_RegisterChannel( vout_GetSpu( p_vout ) );
vlc_object_release( p_vout ); vlc_object_release( p_vout );
lua_pushinteger( L, i_chan ); lua_pushinteger( L, i_chan );
return 1; return 1;
...@@ -149,7 +149,7 @@ static int vlclua_spu_channel_clear( lua_State *L ) ...@@ -149,7 +149,7 @@ static int vlclua_spu_channel_clear( lua_State *L )
if( !p_vout ) if( !p_vout )
return luaL_error( L, "Unable to find vout." ); return luaL_error( L, "Unable to find vout." );
spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_CLEAR, i_chan ); spu_ClearChannel( vout_GetSpu( p_vout ), i_chan );
vlc_object_release( p_vout ); vlc_object_release( p_vout );
return 0; return 0;
} }
......
...@@ -1935,8 +1935,8 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block, bool b_flush ...@@ -1935,8 +1935,8 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block, bool b_flush
p_vout = input_resource_HoldVout( p_input->p->p_resource ); p_vout = input_resource_HoldVout( p_input->p->p_resource );
if( p_vout && p_owner->p_spu_vout == p_vout ) if( p_vout && p_owner->p_spu_vout == p_vout )
spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_CLEAR, spu_ClearChannel( vout_GetSpu( p_vout ),
p_owner->i_spu_channel ); p_owner->i_spu_channel );
if( p_vout ) if( p_vout )
vlc_object_release( p_vout ); vlc_object_release( p_vout );
...@@ -2098,7 +2098,7 @@ static void DeleteDecoder( decoder_t * p_dec ) ...@@ -2098,7 +2098,7 @@ static void DeleteDecoder( decoder_t * p_dec )
if( p_vout ) if( p_vout )
{ {
if( p_owner->p_spu_vout == p_vout ) if( p_owner->p_spu_vout == p_vout )
spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_CLEAR, p_owner->i_spu_channel ); spu_ClearChannel( vout_GetSpu( p_vout ), p_owner->i_spu_channel );
vlc_object_release( p_vout ); vlc_object_release( p_vout );
} }
} }
...@@ -2427,8 +2427,7 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec, ...@@ -2427,8 +2427,7 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec,
vlc_mutex_unlock( &p_owner->lock ); vlc_mutex_unlock( &p_owner->lock );
spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_REGISTER, p_owner->i_spu_channel = spu_RegisterChannel( vout_GetSpu( p_vout ) );
&p_owner->i_spu_channel );
p_owner->i_spu_order = 0; p_owner->i_spu_order = 0;
p_owner->p_spu_vout = p_vout; p_owner->p_spu_vout = p_vout;
} }
......
...@@ -273,7 +273,7 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource, ...@@ -273,7 +273,7 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource,
{ {
msg_Dbg( p_resource->p_input, "saving a free vout" ); msg_Dbg( p_resource->p_input, "saving a free vout" );
vout_Flush( p_vout, 1 ); vout_Flush( p_vout, 1 );
spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_CLEAR, -1 ); spu_ClearChannel( vout_GetSpu( p_vout ), -1 );
p_resource->p_vout_free = p_vout; p_resource->p_vout_free = p_vout;
} }
......
...@@ -390,6 +390,8 @@ spu_DisplaySubpicture ...@@ -390,6 +390,8 @@ spu_DisplaySubpicture
spu_Init spu_Init
spu_RenderSubpictures spu_RenderSubpictures
spu_SortSubpictures spu_SortSubpictures
spu_RegisterChannel
spu_ClearChannel
sql_Create sql_Create
sql_Destroy sql_Destroy
stats_TimerClean stats_TimerClean
......
...@@ -269,7 +269,7 @@ int vout_OSDEpg( vout_thread_t *p_vout, input_item_t *p_input ) ...@@ -269,7 +269,7 @@ int vout_OSDEpg( vout_thread_t *p_vout, input_item_t *p_input )
return VLC_EGENERIC; return VLC_EGENERIC;
} }
p_spu->i_channel = DEFAULT_CHAN; p_spu->i_channel = SPU_DEFAULT_CHANNEL;
p_spu->i_start = i_now; p_spu->i_start = i_now;
p_spu->i_stop = i_now + 3000 * INT64_C(1000); p_spu->i_stop = i_now + 3000 * INT64_C(1000);
p_spu->b_ephemer = true; p_spu->b_ephemer = true;
......
...@@ -873,7 +873,7 @@ static void ThreadDisplayOsdTitle(vout_thread_t *vout, const char *string) ...@@ -873,7 +873,7 @@ static void ThreadDisplayOsdTitle(vout_thread_t *vout, const char *string)
INT64_C(1000) * vout->p->title.timeout; INT64_C(1000) * vout->p->title.timeout;
if (stop > start) if (stop > start)
vout_ShowTextAbsolute(vout, DEFAULT_CHAN, vout_ShowTextAbsolute(vout, SPU_DEFAULT_CHANNEL,
string, NULL, string, NULL,
vout->p->title.position, vout->p->title.position,
30 + vout->p->fmt_in.i_width 30 + vout->p->fmt_in.i_width
......
...@@ -373,7 +373,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -373,7 +373,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, picture_t *p_pic )
if( !p_subpic ) if( !p_subpic )
return VLC_EGENERIC; return VLC_EGENERIC;
/* FIXME DEFAULT_CHAN is not good (used by the text) but /* FIXME SPU_DEFAULT_CHANNEL is not good (used by the text) but
* hardcoded 0 doesn't seem right */ * hardcoded 0 doesn't seem right */
p_subpic->i_channel = 0; p_subpic->i_channel = 0;
p_subpic->i_start = mdate(); p_subpic->i_start = mdate();
...@@ -395,7 +395,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -395,7 +395,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, picture_t *p_pic )
static void VoutOsdSnapshot( vout_thread_t *p_vout, picture_t *p_pic, const char *psz_filename ) static void VoutOsdSnapshot( vout_thread_t *p_vout, picture_t *p_pic, const char *psz_filename )
{ {
msg_Dbg( p_vout, "snapshot taken (%s)", psz_filename ); msg_Dbg( p_vout, "snapshot taken (%s)", psz_filename );
vout_OSDMessage( VLC_OBJECT( p_vout ), DEFAULT_CHAN, "%s", psz_filename ); vout_OSDMessage( VLC_OBJECT( p_vout ), SPU_DEFAULT_CHANNEL, "%s", psz_filename );
if( var_GetBool( p_vout, "snapshot-preview" ) ) if( var_GetBool( p_vout, "snapshot-preview" ) )
{ {
......
...@@ -164,10 +164,6 @@ static int CropCallback( vlc_object_t *, char const *, ...@@ -164,10 +164,6 @@ static int CropCallback( vlc_object_t *, char const *,
static int MarginCallback( vlc_object_t *, char const *, static int MarginCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * ); vlc_value_t, vlc_value_t, void * );
static int SpuControl( spu_t *, int, va_list );
static void SpuClearChannel( spu_t *p_spu, int i_channel );
/* Buffer allocation for SPU filter (blend, scale, ...) */ /* Buffer allocation for SPU filter (blend, scale, ...) */
static subpicture_t *spu_new_buffer( filter_t * ); static subpicture_t *spu_new_buffer( filter_t * );
static void spu_del_buffer( filter_t *, subpicture_t * ); static void spu_del_buffer( filter_t *, subpicture_t * );
...@@ -208,7 +204,6 @@ spu_t *spu_Create( vlc_object_t *p_this ) ...@@ -208,7 +204,6 @@ spu_t *spu_Create( vlc_object_t *p_this )
vlc_object_attach( p_spu, p_this ); vlc_object_attach( p_spu, p_this );
/* Initialize spu fields */ /* Initialize spu fields */
p_spu->pf_control = SpuControl;
p_spu->p = p_sys = (spu_private_t*)&p_spu[1]; p_spu->p = p_sys = (spu_private_t*)&p_spu[1];
/* Initialize private fields */ /* Initialize private fields */
...@@ -357,9 +352,9 @@ void spu_DisplaySubpicture( spu_t *p_spu, subpicture_t *p_subpic ) ...@@ -357,9 +352,9 @@ void spu_DisplaySubpicture( spu_t *p_spu, subpicture_t *p_subpic )
{ {
spu_private_t *p_sys = p_spu->p; spu_private_t *p_sys = p_spu->p;
/* DEFAULT_CHAN always reset itself */ /* SPU_DEFAULT_CHANNEL always reset itself */
if( p_subpic->i_channel == DEFAULT_CHAN ) if( p_subpic->i_channel == SPU_DEFAULT_CHANNEL )
SpuClearChannel( p_spu, DEFAULT_CHAN ); spu_ClearChannel( p_spu, SPU_DEFAULT_CHANNEL );
/* p_private is for spu only and cannot be non NULL here */ /* p_private is for spu only and cannot be non NULL here */
for( subpicture_region_t *r = p_subpic->p_region; r != NULL; r = r->p_next ) for( subpicture_region_t *r = p_subpic->p_region; r != NULL; r = r->p_next )
...@@ -715,6 +710,40 @@ void spu_OffsetSubtitleDate( spu_t *p_spu, mtime_t i_duration ) ...@@ -715,6 +710,40 @@ void spu_OffsetSubtitleDate( spu_t *p_spu, mtime_t i_duration )
vlc_mutex_unlock( &p_sys->lock ); vlc_mutex_unlock( &p_sys->lock );
} }
int spu_RegisterChannel( spu_t *p_spu )
{
spu_private_t *p_sys = p_spu->p;
vlc_mutex_lock( &p_sys->lock );
int i_channel = p_sys->i_channel++;
vlc_mutex_unlock( &p_sys->lock );
return i_channel;
}
void spu_ClearChannel( spu_t *p_spu, int i_channel )
{
spu_private_t *p_sys = p_spu->p;
vlc_mutex_lock( &p_sys->lock );
for( int i_subpic = 0; i_subpic < VOUT_MAX_SUBPICTURES; i_subpic++ )
{
spu_heap_entry_t *p_entry = &p_sys->heap.p_entry[i_subpic];
subpicture_t *p_subpic = p_entry->p_subpicture;
if( !p_subpic )
continue;
if( p_subpic->i_channel != i_channel && ( i_channel != -1 || p_subpic->i_channel == SPU_DEFAULT_CHANNEL ) )
continue;
/* You cannot delete subpicture outside of spu_SortSubpictures */
p_entry->b_reject = true;
}
vlc_mutex_unlock( &p_sys->lock );
}
/***************************************************************************** /*****************************************************************************
* subpicture_t allocation * subpicture_t allocation
*****************************************************************************/ *****************************************************************************/
...@@ -1759,67 +1788,6 @@ static int SubpictureCmp( const void *s0, const void *s1 ) ...@@ -1759,67 +1788,6 @@ static int SubpictureCmp( const void *s0, const void *s1 )
return r; return r;
} }
/*****************************************************************************
* SpuClearChannel: clear an spu channel
*****************************************************************************
* This function destroys the subpictures which belong to the spu channel
* corresponding to i_channel_id.
*****************************************************************************/
static void SpuClearChannel( spu_t *p_spu, int i_channel )
{
spu_private_t *p_sys = p_spu->p;
int i_subpic; /* subpicture index */
vlc_mutex_lock( &p_sys->lock );
for( i_subpic = 0; i_subpic < VOUT_MAX_SUBPICTURES; i_subpic++ )
{
spu_heap_entry_t *p_entry = &p_sys->heap.p_entry[i_subpic];
subpicture_t *p_subpic = p_entry->p_subpicture;
if( !p_subpic )
continue;
if( p_subpic->i_channel != i_channel && ( i_channel != -1 || p_subpic->i_channel == DEFAULT_CHAN ) )
continue;
/* You cannot delete subpicture outside of spu_SortSubpictures */
p_entry->b_reject = true;
}
vlc_mutex_unlock( &p_sys->lock );
}
/*****************************************************************************
* spu_ControlDefault: default methods for the subpicture unit control.
*****************************************************************************/
static int SpuControl( spu_t *p_spu, int i_query, va_list args )
{
spu_private_t *p_sys = p_spu->p;
int *pi, i;
switch( i_query )
{
case SPU_CHANNEL_REGISTER:
pi = (int *)va_arg( args, int * );
vlc_mutex_lock( &p_sys->lock );
if( pi )
*pi = p_sys->i_channel++;
vlc_mutex_unlock( &p_sys->lock );
break;
case SPU_CHANNEL_CLEAR:
i = (int)va_arg( args, int );
SpuClearChannel( p_spu, i );
break;
default:
msg_Dbg( p_spu, "control query not supported" );
return VLC_EGENERIC;
}
return VLC_SUCCESS;
}
/***************************************************************************** /*****************************************************************************
* Object variables callbacks * Object variables callbacks
*****************************************************************************/ *****************************************************************************/
...@@ -1955,7 +1923,7 @@ static int SubFilterAllocationInit( filter_t *p_filter, void *p_data ) ...@@ -1955,7 +1923,7 @@ static int SubFilterAllocationInit( filter_t *p_filter, void *p_data )
p_filter->pf_sub_buffer_del = sub_del_buffer; p_filter->pf_sub_buffer_del = sub_del_buffer;
p_filter->p_owner = p_sys; p_filter->p_owner = p_sys;
spu_Control( p_spu, SPU_CHANNEL_REGISTER, &p_sys->i_channel ); p_sys->i_channel = spu_RegisterChannel( p_spu );
p_sys->p_spu = p_spu; p_sys->p_spu = p_spu;
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -1965,7 +1933,7 @@ static void SubFilterAllocationClean( filter_t *p_filter ) ...@@ -1965,7 +1933,7 @@ static void SubFilterAllocationClean( filter_t *p_filter )
{ {
filter_owner_sys_t *p_sys = p_filter->p_owner; filter_owner_sys_t *p_sys = p_filter->p_owner;
SpuClearChannel( p_sys->p_spu, p_sys->i_channel ); spu_ClearChannel( p_sys->p_spu, p_sys->i_channel );
free( p_filter->p_owner ); free( p_filter->p_owner );
} }
......
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