From 8fce3d90cf2a6fcd10eab690ded15e351bb9a6f5 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Sun, 21 Sep 2008 14:22:11 +0200 Subject: [PATCH] Removed spu_Create/DestroySubpicture in favor of subpicture_*. --- include/vlc_osd.h | 14 +++++++-- include/vlc_vout.h | 39 +++++++++++++++++-------- modules/stream_out/transcode.c | 10 +++---- src/input/decoder.c | 6 ++-- src/libvlccore.sym | 5 ++-- src/osd/osd_text.c | 4 +-- src/osd/osd_widgets.c | 4 ++- src/video_output/video_text.c | 4 +-- src/video_output/vout_intf.c | 2 +- src/video_output/vout_subpictures.c | 45 ++--------------------------- 10 files changed, 60 insertions(+), 73 deletions(-) diff --git a/include/vlc_osd.h b/include/vlc_osd.h index 8e44fbd389..a385390541 100644 --- a/include/vlc_osd.h +++ b/include/vlc_osd.h @@ -99,11 +99,19 @@ 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( subpicture_t *, spu_CreateSubpicture, ( spu_t * ) ); -/* XXX you cannot call spu_DestroySubpicture on a displayed picture */ -VLC_EXPORT( void, spu_DestroySubpicture, ( spu_t *, subpicture_t * ) ); +/** + * This function sends a subpicture to the spu_t core. + * + * 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 * ) ); +/** + * 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 ) ); /** diff --git a/include/vlc_vout.h b/include/vlc_vout.h index 277afa4200..d5409b8969 100644 --- a/include/vlc_vout.h +++ b/include/vlc_vout.h @@ -322,14 +322,23 @@ struct subpicture_region_t 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. - * You can must use subpicture_region_Delete to destroy it. + * This function will create a new subpicture region. + * + * You must use subpicture_region_Delete to destroy it. */ 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. * * You may give it NULL. @@ -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 ) ); /** - * This function will destroy a list of subpicture allocated by + * This function will destroy a list of subpicture regions allocated by * subpicture_region_New. * * Provided for convenience. @@ -404,17 +413,23 @@ struct subpicture_t 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 */ #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 *****************************************************************************/ diff --git a/modules/stream_out/transcode.c b/modules/stream_out/transcode.c index 474040f1b1..c00374bd14 100644 --- a/modules/stream_out/transcode.c +++ b/modules/stream_out/transcode.c @@ -2419,14 +2419,14 @@ static int transcode_spu_process( sout_stream_t *p_stream, static subpicture_t *spu_new_buffer( decoder_t *p_dec ) { - sout_stream_t *p_stream = (sout_stream_t *)p_dec->p_owner; - return spu_CreateSubpicture( p_stream->p_sys->p_spu ); + VLC_UNUSED( p_dec ); + return subpicture_New(); } 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; - spu_DestroySubpicture( p_stream->p_sys->p_spu, p_subpic ); + VLC_UNUSED( p_dec ); + subpicture_Delete( p_subpic ); } /* @@ -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 ); - spu_DestroySubpicture( p_sys->p_spu, p_subpic ); + subpicture_Delete( p_subpic ); if( p_block ) { p_block->i_dts = p_block->i_pts = in->i_dts; diff --git a/src/input/decoder.c b/src/input/decoder.c index 4b5714b35d..9545b6ad19 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -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 && ( 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 spu_DisplaySubpicture( p_vout->p_spu, p_spu ); @@ -1460,7 +1460,7 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec ) p_sys->p_spu_vout = p_vout; } - p_subpic = spu_CreateSubpicture( p_vout->p_spu ); + p_subpic = subpicture_New(); if( p_subpic ) { 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 ) return; } - spu_DestroySubpicture( p_vout->p_spu, p_subpic ); + subpicture_Delete( p_subpic ); vlc_object_release( p_vout ); } diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 81e9782843..11a761bc5d 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -339,9 +339,7 @@ sout_StreamDelete sout_StreamNew sout_UpdateStatistic __spu_Create -spu_CreateSubpicture spu_Destroy -spu_DestroySubpicture spu_DisplaySubpicture spu_Init spu_RenderSubpictures @@ -375,6 +373,9 @@ stream_vaControl __str_format __str_format_meta str_format_time +subpicture_Delete +subpicture_New +subpicture_region_New subpicture_region_ChainDelete subpicture_region_Delete subpicture_region_New diff --git a/src/osd/osd_text.c b/src/osd/osd_text.c index 0657c2d920..ddc3dd10ff 100644 --- a/src/osd/osd_text.c +++ b/src/osd/osd_text.c @@ -78,7 +78,7 @@ int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel, if( !psz_string ) return VLC_EGENERIC; - p_spu = spu_CreateSubpicture( p_spu_channel ); + p_spu = subpicture_New(); if( !p_spu ) return VLC_EGENERIC; @@ -98,7 +98,7 @@ int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel, if( !p_spu->p_region ) { msg_Err( p_spu_channel, "cannot allocate SPU region" ); - spu_DestroySubpicture( p_spu_channel, p_spu ); + subpicture_Delete( p_spu ); return VLC_EGENERIC; } diff --git a/src/osd/osd_widgets.c b/src/osd/osd_widgets.c index 7676516507..5e880ead03 100644 --- a/src/osd/osd_widgets.c +++ b/src/osd/osd_widgets.c @@ -196,8 +196,10 @@ subpicture_t *osd_CreateWidget( spu_t *p_spu, int i_channel ) subpicture_t *p_subpic; mtime_t i_now = mdate(); + VLC_UNUSED(p_spu); + /* Create and initialize a subpicture */ - p_subpic = spu_CreateSubpicture( p_spu ); + p_subpic = subpicture_New(); if( p_subpic == NULL ) return NULL; p_subpic->i_channel = i_channel; diff --git a/src/video_output/video_text.c b/src/video_output/video_text.c index 2fef025deb..d0e7a0ac3c 100644 --- a/src/video_output/video_text.c +++ b/src/video_output/video_text.c @@ -80,7 +80,7 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel, if( !psz_string ) return VLC_EGENERIC; - p_spu = spu_CreateSubpicture( p_vout->p_spu ); + p_spu = subpicture_New(); if( !p_spu ) return VLC_EGENERIC; @@ -102,7 +102,7 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel, if( !p_spu->p_region ) { msg_Err( p_vout, "cannot allocate SPU region" ); - spu_DestroySubpicture( p_vout->p_spu, p_spu ); + subpicture_Delete( p_spu ); return VLC_EGENERIC; } diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c index 3b7b243de5..3bce1b0b82 100644 --- a/src/video_output/vout_intf.c +++ b/src/video_output/vout_intf.c @@ -457,7 +457,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, image_handler_t *p_image, pic if( !p_pip ) return VLC_EGENERIC; - p_subpic = spu_CreateSubpicture( p_vout->p_spu ); + p_subpic = subpicture_New(); if( p_subpic == NULL ) { picture_Release( p_pip ); diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index f5124ef366..bb6b98300d 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -48,11 +48,6 @@ #define VLC_FOURCC_RGBA VLC_FOURCC('R','G','B','A') #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 { @@ -142,6 +137,7 @@ static bool spu_area_overlap( spu_area_t, spu_area_t ); #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 void SpuRenderRegion( spu_t *, @@ -355,38 +351,6 @@ void spu_DisplaySubpicture( spu_t *p_spu, subpicture_t *p_subpic ) 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. */ @@ -671,10 +635,7 @@ subpicture_t *spu_SortSubpictures( spu_t *p_spu, mtime_t display_date, /***************************************************************************** * subpicture_t allocation *****************************************************************************/ -/** - * This function create a new empty subpicture. - */ -static subpicture_t *subpicture_New( void ) +subpicture_t *subpicture_New( void ) { subpicture_t *p_subpic = calloc( 1, sizeof(*p_subpic) ); if( !p_subpic ) @@ -693,7 +654,7 @@ static subpicture_t *subpicture_New( void ) 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 ); p_subpic->p_region = NULL; -- 2.39.2