Commit 8fce3d90 authored by Laurent Aimar's avatar Laurent Aimar

Removed spu_Create/DestroySubpicture in favor of subpicture_*.

parent 90554602
...@@ -99,11 +99,19 @@ VLC_EXPORT( int, spu_Init, ( spu_t * ) ); ...@@ -99,11 +99,19 @@ VLC_EXPORT( int, spu_Init, ( spu_t * ) );
VLC_EXPORT( void, spu_Destroy, ( spu_t * ) ); VLC_EXPORT( void, spu_Destroy, ( spu_t * ) );
void spu_Attach( spu_t *, vlc_object_t *, bool ); void spu_Attach( spu_t *, vlc_object_t *, bool );
VLC_EXPORT( subpicture_t *, spu_CreateSubpicture, ( spu_t * ) ); /**
/* XXX you cannot call spu_DestroySubpicture on a displayed picture */ * This function sends a subpicture to the spu_t core.
VLC_EXPORT( void, spu_DestroySubpicture, ( spu_t *, subpicture_t * ) ); *
* You cannot use the provided subpicture anymore. The spu_t core
* will destroy it at its convenience.
*/
VLC_EXPORT( void, spu_DisplaySubpicture, ( spu_t *, subpicture_t * ) ); VLC_EXPORT( void, spu_DisplaySubpicture, ( spu_t *, subpicture_t * ) );
/**
* This function asks the spu_t core a list of subpictures to display.
*
* The returned list can only be used by spu_RenderSubpictures.
*/
VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t display_date, bool b_paused, bool b_subtitle_only ) ); VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t display_date, bool b_paused, bool b_subtitle_only ) );
/** /**
......
...@@ -322,14 +322,23 @@ struct subpicture_region_t ...@@ -322,14 +322,23 @@ struct subpicture_region_t
subpicture_region_private_t *p_private; /**< Private data for spu_t *only* */ subpicture_region_private_t *p_private; /**< Private data for spu_t *only* */
}; };
/* Subpicture region position flags */
#define SUBPICTURE_ALIGN_LEFT 0x1
#define SUBPICTURE_ALIGN_RIGHT 0x2
#define SUBPICTURE_ALIGN_TOP 0x4
#define SUBPICTURE_ALIGN_BOTTOM 0x8
#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \
SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM )
/** /**
* This function will create a new subpicture. * This function will create a new subpicture region.
* You can must use subpicture_region_Delete to destroy it. *
* You must use subpicture_region_Delete to destroy it.
*/ */
VLC_EXPORT( subpicture_region_t *, subpicture_region_New, ( const video_format_t *p_fmt ) ); VLC_EXPORT( subpicture_region_t *, subpicture_region_New, ( const video_format_t *p_fmt ) );
/** /**
* This function will destroy a subpicture allocated by * This function will destroy a subpicture region allocated by
* subpicture_region_New. * subpicture_region_New.
* *
* You may give it NULL. * You may give it NULL.
...@@ -337,7 +346,7 @@ VLC_EXPORT( subpicture_region_t *, subpicture_region_New, ( const video_format_t ...@@ -337,7 +346,7 @@ VLC_EXPORT( subpicture_region_t *, subpicture_region_New, ( const video_format_t
VLC_EXPORT( void, subpicture_region_Delete, ( subpicture_region_t *p_region ) ); VLC_EXPORT( void, subpicture_region_Delete, ( subpicture_region_t *p_region ) );
/** /**
* This function will destroy a list of subpicture allocated by * This function will destroy a list of subpicture regions allocated by
* subpicture_region_New. * subpicture_region_New.
* *
* Provided for convenience. * Provided for convenience.
...@@ -404,17 +413,23 @@ struct subpicture_t ...@@ -404,17 +413,23 @@ struct subpicture_t
subpicture_sys_t *p_sys; /* subpicture data */ subpicture_sys_t *p_sys; /* subpicture data */
}; };
/**
* This function create a new empty subpicture.
*
* You must use subpicture_Delete to destroy it.
*/
VLC_EXPORT( subpicture_t *, subpicture_New, ( void ) );
/**
* This function delete a subpicture created by subpicture_New.
* You may give it NULL.
*/
VLC_EXPORT( void, subpicture_Delete, ( subpicture_t *p_subpic ) );
/* Default subpicture channel ID */ /* Default subpicture channel ID */
#define DEFAULT_CHAN 1 #define DEFAULT_CHAN 1
/* Subpicture position flags */
#define SUBPICTURE_ALIGN_LEFT 0x1
#define SUBPICTURE_ALIGN_RIGHT 0x2
#define SUBPICTURE_ALIGN_TOP 0x4
#define SUBPICTURE_ALIGN_BOTTOM 0x8
#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \
SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM )
/***************************************************************************** /*****************************************************************************
* Prototypes * Prototypes
*****************************************************************************/ *****************************************************************************/
......
...@@ -2419,14 +2419,14 @@ static int transcode_spu_process( sout_stream_t *p_stream, ...@@ -2419,14 +2419,14 @@ static int transcode_spu_process( sout_stream_t *p_stream,
static subpicture_t *spu_new_buffer( decoder_t *p_dec ) static subpicture_t *spu_new_buffer( decoder_t *p_dec )
{ {
sout_stream_t *p_stream = (sout_stream_t *)p_dec->p_owner; VLC_UNUSED( p_dec );
return spu_CreateSubpicture( p_stream->p_sys->p_spu ); return subpicture_New();
} }
static void spu_del_buffer( decoder_t *p_dec, subpicture_t *p_subpic ) static void spu_del_buffer( decoder_t *p_dec, subpicture_t *p_subpic )
{ {
sout_stream_t *p_stream = (sout_stream_t *)p_dec->p_owner; VLC_UNUSED( p_dec );
spu_DestroySubpicture( p_stream->p_sys->p_spu, p_subpic ); subpicture_Delete( p_subpic );
} }
/* /*
...@@ -2542,7 +2542,7 @@ static int transcode_osd_process( sout_stream_t *p_stream, ...@@ -2542,7 +2542,7 @@ static int transcode_osd_process( sout_stream_t *p_stream,
} }
p_block = id->p_encoder->pf_encode_sub( id->p_encoder, p_subpic ); p_block = id->p_encoder->pf_encode_sub( id->p_encoder, p_subpic );
spu_DestroySubpicture( p_sys->p_spu, p_subpic ); subpicture_Delete( p_subpic );
if( p_block ) if( p_block )
{ {
p_block->i_dts = p_block->i_pts = in->i_dts; p_block->i_dts = p_block->i_pts = in->i_dts;
......
...@@ -1085,7 +1085,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) ...@@ -1085,7 +1085,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
if( p_spu->i_start < p_dec->p_owner->i_preroll_end && if( p_spu->i_start < p_dec->p_owner->i_preroll_end &&
( p_spu->i_stop <= 0 || p_spu->i_stop < p_dec->p_owner->i_preroll_end ) ) ( p_spu->i_stop <= 0 || p_spu->i_stop < p_dec->p_owner->i_preroll_end ) )
{ {
spu_DestroySubpicture( p_vout->p_spu, p_spu ); subpicture_Delete( p_spu );
} }
else else
spu_DisplaySubpicture( p_vout->p_spu, p_spu ); spu_DisplaySubpicture( p_vout->p_spu, p_spu );
...@@ -1460,7 +1460,7 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec ) ...@@ -1460,7 +1460,7 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec )
p_sys->p_spu_vout = p_vout; p_sys->p_spu_vout = p_vout;
} }
p_subpic = spu_CreateSubpicture( p_vout->p_spu ); p_subpic = subpicture_New();
if( p_subpic ) if( p_subpic )
{ {
p_subpic->i_channel = p_sys->i_spu_channel; p_subpic->i_channel = p_sys->i_spu_channel;
...@@ -1487,7 +1487,7 @@ static void spu_del_buffer( decoder_t *p_dec, subpicture_t *p_subpic ) ...@@ -1487,7 +1487,7 @@ static void spu_del_buffer( decoder_t *p_dec, subpicture_t *p_subpic )
return; return;
} }
spu_DestroySubpicture( p_vout->p_spu, p_subpic ); subpicture_Delete( p_subpic );
vlc_object_release( p_vout ); vlc_object_release( p_vout );
} }
......
...@@ -339,9 +339,7 @@ sout_StreamDelete ...@@ -339,9 +339,7 @@ sout_StreamDelete
sout_StreamNew sout_StreamNew
sout_UpdateStatistic sout_UpdateStatistic
__spu_Create __spu_Create
spu_CreateSubpicture
spu_Destroy spu_Destroy
spu_DestroySubpicture
spu_DisplaySubpicture spu_DisplaySubpicture
spu_Init spu_Init
spu_RenderSubpictures spu_RenderSubpictures
...@@ -375,6 +373,9 @@ stream_vaControl ...@@ -375,6 +373,9 @@ stream_vaControl
__str_format __str_format
__str_format_meta __str_format_meta
str_format_time str_format_time
subpicture_Delete
subpicture_New
subpicture_region_New
subpicture_region_ChainDelete subpicture_region_ChainDelete
subpicture_region_Delete subpicture_region_Delete
subpicture_region_New subpicture_region_New
......
...@@ -78,7 +78,7 @@ int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel, ...@@ -78,7 +78,7 @@ int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel,
if( !psz_string ) return VLC_EGENERIC; if( !psz_string ) return VLC_EGENERIC;
p_spu = spu_CreateSubpicture( p_spu_channel ); p_spu = subpicture_New();
if( !p_spu ) if( !p_spu )
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -98,7 +98,7 @@ int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel, ...@@ -98,7 +98,7 @@ int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel,
if( !p_spu->p_region ) if( !p_spu->p_region )
{ {
msg_Err( p_spu_channel, "cannot allocate SPU region" ); msg_Err( p_spu_channel, "cannot allocate SPU region" );
spu_DestroySubpicture( p_spu_channel, p_spu ); subpicture_Delete( p_spu );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
......
...@@ -196,8 +196,10 @@ subpicture_t *osd_CreateWidget( spu_t *p_spu, int i_channel ) ...@@ -196,8 +196,10 @@ subpicture_t *osd_CreateWidget( spu_t *p_spu, int i_channel )
subpicture_t *p_subpic; subpicture_t *p_subpic;
mtime_t i_now = mdate(); mtime_t i_now = mdate();
VLC_UNUSED(p_spu);
/* Create and initialize a subpicture */ /* Create and initialize a subpicture */
p_subpic = spu_CreateSubpicture( p_spu ); p_subpic = subpicture_New();
if( p_subpic == NULL ) return NULL; if( p_subpic == NULL ) return NULL;
p_subpic->i_channel = i_channel; p_subpic->i_channel = i_channel;
......
...@@ -80,7 +80,7 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel, ...@@ -80,7 +80,7 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel,
if( !psz_string ) return VLC_EGENERIC; if( !psz_string ) return VLC_EGENERIC;
p_spu = spu_CreateSubpicture( p_vout->p_spu ); p_spu = subpicture_New();
if( !p_spu ) if( !p_spu )
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -102,7 +102,7 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel, ...@@ -102,7 +102,7 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel,
if( !p_spu->p_region ) if( !p_spu->p_region )
{ {
msg_Err( p_vout, "cannot allocate SPU region" ); msg_Err( p_vout, "cannot allocate SPU region" );
spu_DestroySubpicture( p_vout->p_spu, p_spu ); subpicture_Delete( p_spu );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
......
...@@ -457,7 +457,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, image_handler_t *p_image, pic ...@@ -457,7 +457,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, image_handler_t *p_image, pic
if( !p_pip ) if( !p_pip )
return VLC_EGENERIC; return VLC_EGENERIC;
p_subpic = spu_CreateSubpicture( p_vout->p_spu ); p_subpic = subpicture_New();
if( p_subpic == NULL ) if( p_subpic == NULL )
{ {
picture_Release( p_pip ); picture_Release( p_pip );
......
...@@ -48,11 +48,6 @@ ...@@ -48,11 +48,6 @@
#define VLC_FOURCC_RGBA VLC_FOURCC('R','G','B','A') #define VLC_FOURCC_RGBA VLC_FOURCC('R','G','B','A')
#define VLC_FOURCC_TEXT VLC_FOURCC('T','E','X','T') #define VLC_FOURCC_TEXT VLC_FOURCC('T','E','X','T')
/* TODO export */
static subpicture_t *subpicture_New( void );
static void subpicture_Delete( subpicture_t *p_subpic );
static void SubpictureChain( subpicture_t **pp_head, subpicture_t *p_subpic );
/* */ /* */
typedef struct typedef struct
{ {
...@@ -142,6 +137,7 @@ static bool spu_area_overlap( spu_area_t, spu_area_t ); ...@@ -142,6 +137,7 @@ static bool spu_area_overlap( spu_area_t, spu_area_t );
#define SCALE_UNIT (1000) #define SCALE_UNIT (1000)
static void SubpictureChain( subpicture_t **pp_head, subpicture_t *p_subpic );
static int SubpictureCmp( const void *s0, const void *s1 ); static int SubpictureCmp( const void *s0, const void *s1 );
static void SpuRenderRegion( spu_t *, static void SpuRenderRegion( spu_t *,
...@@ -355,38 +351,6 @@ void spu_DisplaySubpicture( spu_t *p_spu, subpicture_t *p_subpic ) ...@@ -355,38 +351,6 @@ void spu_DisplaySubpicture( spu_t *p_spu, subpicture_t *p_subpic )
vlc_mutex_unlock( &p_sys->lock ); vlc_mutex_unlock( &p_sys->lock );
} }
/**
* Allocate a subpicture in the spu heap.
*
* This function create a reserved subpicture in the spu heap.
* A null pointer is returned if the function fails. This method provides an
* already allocated zone of memory in the spu data fields. It needs locking
* since several pictures can be created by several producers threads.
* \param p_spu the subpicture unit in which to create the subpicture
* \return NULL on error, a reserved subpicture otherwise
*/
subpicture_t *spu_CreateSubpicture( spu_t *p_spu )
{
VLC_UNUSED(p_spu);
return subpicture_New();
}
/**
* Remove a subpicture from the heap
*
* This function frees a previously reserved subpicture.
* It is meant to be used when the construction of a picture aborted.
* This function does not need locking since reserved subpictures are ignored
* by the spu.
*/
void spu_DestroySubpicture( spu_t *p_spu, subpicture_t *p_subpic )
{
VLC_UNUSED(p_spu);
subpicture_Delete( p_subpic );
}
/** /**
* This function renders all sub picture units in the list. * This function renders all sub picture units in the list.
*/ */
...@@ -671,10 +635,7 @@ subpicture_t *spu_SortSubpictures( spu_t *p_spu, mtime_t display_date, ...@@ -671,10 +635,7 @@ subpicture_t *spu_SortSubpictures( spu_t *p_spu, mtime_t display_date,
/***************************************************************************** /*****************************************************************************
* subpicture_t allocation * subpicture_t allocation
*****************************************************************************/ *****************************************************************************/
/** subpicture_t *subpicture_New( void )
* This function create a new empty subpicture.
*/
static subpicture_t *subpicture_New( void )
{ {
subpicture_t *p_subpic = calloc( 1, sizeof(*p_subpic) ); subpicture_t *p_subpic = calloc( 1, sizeof(*p_subpic) );
if( !p_subpic ) if( !p_subpic )
...@@ -693,7 +654,7 @@ static subpicture_t *subpicture_New( void ) ...@@ -693,7 +654,7 @@ static subpicture_t *subpicture_New( void )
return p_subpic; return p_subpic;
} }
static void subpicture_Delete( subpicture_t *p_subpic ) void subpicture_Delete( subpicture_t *p_subpic )
{ {
subpicture_region_ChainDelete( p_subpic->p_region ); subpicture_region_ChainDelete( p_subpic->p_region );
p_subpic->p_region = NULL; p_subpic->p_region = NULL;
......
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