Commit 72d2a5b4 authored by Antoine Cellerier's avatar Antoine Cellerier

subpicture_t now has a b_pausable attribute. When set to VLC_TRUE (default...

subpicture_t now has a b_pausable attribute. When set to VLC_TRUE (default value is VLC_FALSE), this will keep displaying the subpicture_t when the parent input is paused. This means that subtitles should now be paused when clicking on pause. (refs #29)
parent 532a761d
...@@ -104,7 +104,7 @@ VLC_EXPORT( subpicture_region_t *,__spu_MakeRegion, ( vlc_object_t *, video_form ...@@ -104,7 +104,7 @@ VLC_EXPORT( subpicture_region_t *,__spu_MakeRegion, ( vlc_object_t *, video_form
#define spu_DestroyRegion(a,b) __spu_DestroyRegion(VLC_OBJECT(a),b) #define spu_DestroyRegion(a,b) __spu_DestroyRegion(VLC_OBJECT(a),b)
VLC_EXPORT( void, __spu_DestroyRegion, ( vlc_object_t *, subpicture_region_t * ) ); VLC_EXPORT( void, __spu_DestroyRegion, ( vlc_object_t *, subpicture_region_t * ) );
VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t ) ); VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t, vlc_bool_t ) );
VLC_EXPORT( void, spu_RenderSubpictures, ( spu_t *, video_format_t *, picture_t *, picture_t *, subpicture_t *, int, int ) ); VLC_EXPORT( void, spu_RenderSubpictures, ( spu_t *, video_format_t *, picture_t *, picture_t *, subpicture_t *, int, int ) );
/** @}*/ /** @}*/
......
...@@ -323,7 +323,7 @@ struct module_symbols_t ...@@ -323,7 +323,7 @@ struct module_symbols_t
subpicture_region_t * (*__spu_CreateRegion_inner) (vlc_object_t *, video_format_t *); subpicture_region_t * (*__spu_CreateRegion_inner) (vlc_object_t *, video_format_t *);
subpicture_region_t * (*__spu_MakeRegion_inner) (vlc_object_t *, video_format_t *, picture_t *); subpicture_region_t * (*__spu_MakeRegion_inner) (vlc_object_t *, video_format_t *, picture_t *);
void (*__spu_DestroyRegion_inner) (vlc_object_t *, subpicture_region_t *); void (*__spu_DestroyRegion_inner) (vlc_object_t *, subpicture_region_t *);
subpicture_t * (*spu_SortSubpictures_inner) (spu_t *, mtime_t); subpicture_t * (*spu_SortSubpictures_inner) (spu_t *, mtime_t, vlc_bool_t);
void (*spu_RenderSubpictures_inner) (spu_t *, video_format_t *, picture_t *, picture_t *, subpicture_t *, int, int); void (*spu_RenderSubpictures_inner) (spu_t *, video_format_t *, picture_t *, picture_t *, subpicture_t *, int, int);
char * (*stream_ReadLine_inner) (stream_t *); char * (*stream_ReadLine_inner) (stream_t *);
stream_t * (*__stream_DemuxNew_inner) (vlc_object_t *p_obj, char *psz_demux, es_out_t *out); stream_t * (*__stream_DemuxNew_inner) (vlc_object_t *p_obj, char *psz_demux, es_out_t *out);
......
...@@ -246,6 +246,8 @@ struct subpicture_t ...@@ -246,6 +246,8 @@ struct subpicture_t
vlc_bool_t b_ephemer; /**< If this flag is set to true the subtitle vlc_bool_t b_ephemer; /**< If this flag is set to true the subtitle
will be displayed untill the next one appear */ will be displayed untill the next one appear */
vlc_bool_t b_fade; /**< enable fading */ vlc_bool_t b_fade; /**< enable fading */
vlc_bool_t b_pausable; /**< subpicture will be paused if
stream is paused */
/**@}*/ /**@}*/
subpicture_region_t *p_region; /**< region list composing this subtitle */ subpicture_region_t *p_region; /**< region list composing this subtitle */
......
...@@ -496,6 +496,8 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) ...@@ -496,6 +496,8 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = p_dec->pf_spu_buffer_new( p_dec );
if( !p_spu ) return NULL; if( !p_spu ) return NULL;
p_spu->b_pausable = VLC_TRUE;
p_spu->i_x = p_sys->i_x_start; p_spu->i_x = p_sys->i_x_start;
p_spu->i_x = p_spu->i_x * 3 / 4; /* FIXME: use aspect ratio for x? */ p_spu->i_x = p_spu->i_x * 3 / 4; /* FIXME: use aspect ratio for x? */
p_spu->i_y = p_sys->i_y_start; p_spu->i_y = p_sys->i_y_start;
......
...@@ -285,6 +285,8 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -285,6 +285,8 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
picture_t *p_image = (picture_t *)p_dec->p_sys; picture_t *p_image = (picture_t *)p_dec->p_sys;
picture_t *p_pic; picture_t *p_pic;
printf("pouet\n");
if( pp_block == NULL || !*pp_block ) return NULL; if( pp_block == NULL || !*pp_block ) return NULL;
p_pic = p_dec->pf_vout_buffer_new( p_dec ); p_pic = p_dec->pf_vout_buffer_new( p_dec );
if( p_pic == NULL ) if( p_pic == NULL )
......
...@@ -71,6 +71,8 @@ subpicture_t * E_(ParsePacket)( decoder_t *p_dec ) ...@@ -71,6 +71,8 @@ subpicture_t * E_(ParsePacket)( decoder_t *p_dec )
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = p_dec->pf_spu_buffer_new( p_dec );
if( !p_spu ) return NULL; if( !p_spu ) return NULL;
p_spu->b_pausable = VLC_TRUE;
/* Rationale for the "p_spudec->i_rle_size * 4": we are going to /* Rationale for the "p_spudec->i_rle_size * 4": we are going to
* expand the RLE stuff so that we won't need to read nibbles later * expand the RLE stuff so that we won't need to read nibbles later
* on. This will speed things up a lot. Plus, we'll only need to do * on. This will speed things up a lot. Plus, we'll only need to do
......
...@@ -381,6 +381,8 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block ) ...@@ -381,6 +381,8 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
return NULL; return NULL;
} }
p_spu->b_pausable = VLC_TRUE;
/* Create a new subpicture region */ /* Create a new subpicture region */
memset( &fmt, 0, sizeof(video_format_t) ); memset( &fmt, 0, sizeof(video_format_t) );
fmt.i_chroma = VLC_FOURCC('T','E','X','T'); fmt.i_chroma = VLC_FOURCC('T','E','X','T');
......
...@@ -466,6 +466,8 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) ...@@ -466,6 +466,8 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = p_dec->pf_spu_buffer_new( p_dec );
if( !p_spu ) return NULL; if( !p_spu ) return NULL;
p_spu->b_pausable = VLC_TRUE;
p_spu->i_x = p_sys->i_x_start; p_spu->i_x = p_sys->i_x_start;
p_spu->i_y = p_sys->i_y_start; p_spu->i_y = p_sys->i_y_start;
p_spu->i_start = p_data->i_pts; p_spu->i_start = p_data->i_pts;
......
...@@ -2319,7 +2319,8 @@ static int transcode_video_process( sout_stream_t *p_stream, ...@@ -2319,7 +2319,8 @@ static int transcode_video_process( sout_stream_t *p_stream,
/* Check if we have a subpicture to overlay */ /* Check if we have a subpicture to overlay */
if( p_sys->p_spu ) if( p_sys->p_spu )
{ {
p_subpic = spu_SortSubpictures( p_sys->p_spu, p_pic->date ); p_subpic = spu_SortSubpictures( p_sys->p_spu, p_pic->date,
VLC_FALSE /* Fixme: check if stream is paused */ );
/* TODO: get another pic */ /* TODO: get another pic */
} }
...@@ -2884,7 +2885,7 @@ static int transcode_osd_process( sout_stream_t *p_stream, ...@@ -2884,7 +2885,7 @@ static int transcode_osd_process( sout_stream_t *p_stream,
/* Check if we have a subpicture to send */ /* Check if we have a subpicture to send */
if( p_sys->p_spu && in->i_dts > 0) if( p_sys->p_spu && in->i_dts > 0)
{ {
p_subpic = spu_SortSubpictures( p_sys->p_spu, in->i_dts ); p_subpic = spu_SortSubpictures( p_sys->p_spu, in->i_dts, VLC_FALSE );
} }
else else
{ {
......
...@@ -780,6 +780,8 @@ static void RunThread( vout_thread_t *p_vout) ...@@ -780,6 +780,8 @@ static void RunThread( vout_thread_t *p_vout)
display_date = 0; display_date = 0;
current_date = mdate(); current_date = mdate();
p_input = NULL;
i_loops++; i_loops++;
if( i_loops % 20 == 0 ) if( i_loops % 20 == 0 )
{ {
...@@ -1042,7 +1044,11 @@ static void RunThread( vout_thread_t *p_vout) ...@@ -1042,7 +1044,11 @@ static void RunThread( vout_thread_t *p_vout)
*/ */
if( display_date > 0 ) if( display_date > 0 )
{ {
p_subpic = spu_SortSubpictures( p_vout->p_spu, display_date ); if( !p_input )
p_input = vlc_object_find( p_vout, VLC_OBJECT_INPUT,
FIND_PARENT );
p_subpic = spu_SortSubpictures( p_vout->p_spu, display_date,
p_input ? var_GetBool( p_input, "state" ) == PAUSE_S : VLC_FALSE );
} }
/* /*
......
...@@ -445,7 +445,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -445,7 +445,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
picture_t *p_pif; picture_t *p_pif;
vlc_value_t val, format; vlc_value_t val, format;
DIR *path; DIR *path;
int i_ret; int i_ret;
var_Get( p_vout, "snapshot-path", &val ); var_Get( p_vout, "snapshot-path", &val );
......
...@@ -401,6 +401,7 @@ subpicture_t *spu_CreateSubpicture( spu_t *p_spu ) ...@@ -401,6 +401,7 @@ subpicture_t *spu_CreateSubpicture( spu_t *p_spu )
memset( p_subpic, 0, sizeof(subpicture_t) ); memset( p_subpic, 0, sizeof(subpicture_t) );
p_subpic->i_status = RESERVED_SUBPICTURE; p_subpic->i_status = RESERVED_SUBPICTURE;
p_subpic->b_absolute = VLC_TRUE; p_subpic->b_absolute = VLC_TRUE;
p_subpic->b_pausable = VLC_FALSE;
p_subpic->b_fade = VLC_FALSE; p_subpic->b_fade = VLC_FALSE;
p_subpic->i_alpha = 0xFF; p_subpic->i_alpha = 0xFF;
p_subpic->p_region = 0; p_subpic->p_region = 0;
...@@ -412,7 +413,7 @@ subpicture_t *spu_CreateSubpicture( spu_t *p_spu ) ...@@ -412,7 +413,7 @@ subpicture_t *spu_CreateSubpicture( spu_t *p_spu )
p_subpic->pf_create_region = __spu_CreateRegion; p_subpic->pf_create_region = __spu_CreateRegion;
p_subpic->pf_make_region = __spu_MakeRegion; p_subpic->pf_make_region = __spu_MakeRegion;
p_subpic->pf_destroy_region = __spu_DestroyRegion; p_subpic->pf_destroy_region = __spu_DestroyRegion;
return p_subpic; return p_subpic;
} }
...@@ -823,7 +824,8 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, ...@@ -823,7 +824,8 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
* to be removed if a newer one is available), which makes it a lot * to be removed if a newer one is available), which makes it a lot
* more difficult to guess if a subpicture has to be rendered or not. * more difficult to guess if a subpicture has to be rendered or not.
*****************************************************************************/ *****************************************************************************/
subpicture_t *spu_SortSubpictures( spu_t *p_spu, mtime_t display_date ) subpicture_t *spu_SortSubpictures( spu_t *p_spu, mtime_t display_date,
vlc_bool_t b_paused )
{ {
int i_index, i_channel; int i_index, i_channel;
subpicture_t *p_subpic = NULL; subpicture_t *p_subpic = NULL;
...@@ -869,7 +871,9 @@ subpicture_t *spu_SortSubpictures( spu_t *p_spu, mtime_t display_date ) ...@@ -869,7 +871,9 @@ subpicture_t *spu_SortSubpictures( spu_t *p_spu, mtime_t display_date )
if( display_date > p_spu->p_subpicture[i_index].i_stop && if( display_date > p_spu->p_subpicture[i_index].i_stop &&
( !p_spu->p_subpicture[i_index].b_ephemer || ( !p_spu->p_subpicture[i_index].b_ephemer ||
p_spu->p_subpicture[i_index].i_stop > p_spu->p_subpicture[i_index].i_stop >
p_spu->p_subpicture[i_index].i_start ) ) p_spu->p_subpicture[i_index].i_start ) &&
!( p_spu->p_subpicture[i_index].b_pausable &&
b_paused ) )
{ {
/* Too late, destroy the subpic */ /* Too late, destroy the subpic */
spu_DestroySubpicture( p_spu, &p_spu->p_subpicture[i_index] ); spu_DestroySubpicture( p_spu, &p_spu->p_subpicture[i_index] );
......
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