From 0357e2cf82ad87897a43ea3b5a2540aacff504a7 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Thu, 23 Oct 2008 21:08:16 +0200 Subject: [PATCH] Added decoder_NewSubpicture/decoder_DeleteSubpicture helpers. --- include/vlc_codec.h | 23 ++++++++++++++++++----- modules/codec/cc.c | 4 ++-- modules/codec/cmml/cmml.c | 2 +- modules/codec/csri.c | 6 +++--- modules/codec/cvdsub.c | 4 ++-- modules/codec/dvbsub.c | 2 +- modules/codec/kate.c | 6 +++--- modules/codec/libass.c | 6 +++--- modules/codec/spudec/parse.c | 6 +++--- modules/codec/subtitles/subsdec.c | 4 ++-- modules/codec/subtitles/subsusf.c | 2 +- modules/codec/svcdsub.c | 4 ++-- modules/codec/telx.c | 4 ++-- modules/codec/zvbi.c | 6 +++--- src/input/decoder.c | 11 +++++++++++ src/libvlccore.sym | 2 ++ 16 files changed, 59 insertions(+), 33 deletions(-) diff --git a/include/vlc_codec.h b/include/vlc_codec.h index a60bc3bcf5..41cf66bdb4 100644 --- a/include/vlc_codec.h +++ b/include/vlc_codec.h @@ -95,14 +95,15 @@ struct decoder_t void ( * pf_picture_link) ( decoder_t *, picture_t * ); void ( * pf_picture_unlink) ( decoder_t *, picture_t * ); - /* SPU output callbacks */ - subpicture_t * ( * pf_spu_buffer_new) ( decoder_t * ); - void ( * pf_spu_buffer_del) ( decoder_t *, subpicture_t * ); - /* * Owner fields */ + /* SPU output callbacks + * XXX use decoder_NewSubpicture and decoder_DeleteSubpicture */ + subpicture_t *(*pf_spu_buffer_new) ( decoder_t * ); + void (*pf_spu_buffer_del) ( decoder_t *, subpicture_t * ); + /* Input attachments * XXX use decoder_GetInputAttachments */ int (*pf_get_attachments)( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment ); @@ -163,12 +164,24 @@ struct encoder_t * @} */ +/** + * This function will return a new subpicture usable by a decoder as an output + * buffer. You have to release it using decoder_DeleteSubpicture or by returning + * it to the caller as a pf_decode_sub return value. + */ +VLC_EXPORT( subpicture_t *, decoder_NewSubpicture, ( decoder_t * ) ); + +/** + * This function will release a subpicture create by decoder_NewSubicture. + */ +VLC_EXPORT( void, decoder_DeleteSubpicture, ( decoder_t *, subpicture_t *p_subpicture ) ); + /** * This function gives all input attachments at once. * * You MUST release the returned values */ -VLC_EXPORT( int, decoder_GetInputAttachments, ( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment ) ); +VLC_EXPORT( int, decoder_GetInputAttachments, ( decoder_t *, input_attachment_t ***ppp_attachment, int *pi_attachment ) ); /** * This function converts a decoder timestamp into a display date comparable diff --git a/modules/codec/cc.c b/modules/codec/cc.c index 76024b96ea..4db6b31a7f 100644 --- a/modules/codec/cc.c +++ b/modules/codec/cc.c @@ -329,7 +329,7 @@ static subpicture_t *Subtitle( decoder_t *p_dec, char *psz_subtitle, char *psz_h EnsureUTF8( psz_html ); /* Create the subpicture unit */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Warn( p_dec, "can't get spu buffer" ); @@ -350,7 +350,7 @@ static subpicture_t *Subtitle( decoder_t *p_dec, char *psz_subtitle, char *psz_h msg_Err( p_dec, "cannot allocate SPU region" ); free( psz_subtitle ); free( psz_html ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } diff --git a/modules/codec/cmml/cmml.c b/modules/codec/cmml/cmml.c index 2e5109efce..14fe347a0d 100644 --- a/modules/codec/cmml/cmml.c +++ b/modules/codec/cmml/cmml.c @@ -159,7 +159,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) * displaying is done in the DisplayAnchor function in intf.c (called from * DisplayPendingAnchor, which in turn is called from the main RunIntf * loop). */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Dbg( p_dec, "couldn't allocate new subpicture" ); diff --git a/modules/codec/csri.c b/modules/codec/csri.c index 61ae9f4cff..f1f6de07a7 100644 --- a/modules/codec/csri.c +++ b/modules/codec/csri.c @@ -174,7 +174,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) return NULL; } - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Warn( p_dec, "can't get spu buffer" ); @@ -185,7 +185,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_spu->p_sys = malloc( sizeof( subpicture_sys_t )); if( !p_spu->p_sys ) { - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); block_Release( p_block ); return NULL; } @@ -196,7 +196,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if( !p_spu->p_sys->p_subs_data ) { free( p_spu->p_sys ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); block_Release( p_block ); return NULL; } diff --git a/modules/codec/cvdsub.c b/modules/codec/cvdsub.c index e5f31496b5..a2d1a76d86 100644 --- a/modules/codec/cvdsub.c +++ b/modules/codec/cvdsub.c @@ -502,7 +502,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) int i; /* Allocate the subpicture internal data. */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) return NULL; p_spu->i_start = p_data->i_pts; @@ -530,7 +530,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) if( !p_region ) { msg_Err( p_dec, "cannot allocate SPU region" ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } diff --git a/modules/codec/dvbsub.c b/modules/codec/dvbsub.c index 9658c89512..0310fa4441 100644 --- a/modules/codec/dvbsub.c +++ b/modules/codec/dvbsub.c @@ -1449,7 +1449,7 @@ static subpicture_t *render( decoder_t *p_dec ) int i_base_y; /* Allocate the subpicture internal data. */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) return NULL; diff --git a/modules/codec/kate.c b/modules/codec/kate.c index 2ce29bf976..20090c1a47 100644 --- a/modules/codec/kate.c +++ b/modules/codec/kate.c @@ -578,7 +578,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t /* we have an event */ /* Get a new spu */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Err( p_dec, "Failed to allocate spu buffer" ); @@ -636,7 +636,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t if( !p_bitmap_region ) { msg_Err( p_dec, "cannot allocate SPU region" ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } @@ -656,7 +656,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t if( !p_spu->p_region ) { msg_Err( p_dec, "cannot allocate SPU region" ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } diff --git a/modules/codec/libass.c b/modules/codec/libass.c index 6efe21cfab..0fa34ce762 100644 --- a/modules/codec/libass.c +++ b/modules/codec/libass.c @@ -231,7 +231,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) return NULL; } - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Warn( p_dec, "can't get spu buffer" ); @@ -242,7 +242,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_spu->p_sys = malloc( sizeof( subpicture_sys_t )); if( !p_spu->p_sys ) { - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); block_Release( p_block ); return NULL; } @@ -252,7 +252,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if( !p_spu->p_sys->p_subs_data ) { free( p_spu->p_sys ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); block_Release( p_block ); return NULL; } diff --git a/modules/codec/spudec/parse.c b/modules/codec/spudec/parse.c index 5a2ee51330..88968f10b7 100644 --- a/modules/codec/spudec/parse.c +++ b/modules/codec/spudec/parse.c @@ -85,7 +85,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec ) spu_properties_t spu_properties; /* Allocate the subpicture internal data. */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) return NULL; /* Rationale for the "p_spudec->i_rle_size * 4": we are going to @@ -118,7 +118,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec ) if( ParseControlSeq( p_dec, p_spu, p_spu_data, &spu_properties ) ) { /* There was a parse error, delete the subpicture */ - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } @@ -126,7 +126,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec ) if( ParseRLE( p_dec, p_spu_data, &spu_properties ) ) { /* There was a parse error, delete the subpicture */ - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } diff --git a/modules/codec/subtitles/subsdec.c b/modules/codec/subtitles/subsdec.c index 359944c37d..24b9021dfb 100644 --- a/modules/codec/subtitles/subsdec.c +++ b/modules/codec/subtitles/subsdec.c @@ -402,7 +402,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block ) } /* Create the subpicture unit */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Warn( p_dec, "can't get spu buffer" ); @@ -421,7 +421,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block ) { msg_Err( p_dec, "cannot allocate SPU region" ); free( psz_subtitle ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } diff --git a/modules/codec/subtitles/subsusf.c b/modules/codec/subtitles/subsusf.c index c088b3d226..b2467efe19 100644 --- a/modules/codec/subtitles/subsusf.c +++ b/modules/codec/subtitles/subsusf.c @@ -208,7 +208,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block ) } /* Create the subpicture unit */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Warn( p_dec, "can't get spu buffer" ); diff --git a/modules/codec/svcdsub.c b/modules/codec/svcdsub.c index b0fdfb8135..d5e5e9dac7 100644 --- a/modules/codec/svcdsub.c +++ b/modules/codec/svcdsub.c @@ -471,7 +471,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) int i; /* Allocate the subpicture internal data. */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) return NULL; p_spu->i_start = p_data->i_pts; @@ -509,7 +509,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) if( !p_region ) { msg_Err( p_dec, "cannot allocate SVCD subtitle region" ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } diff --git a/modules/codec/telx.c b/modules/codec/telx.c index 9c6978f0fd..1cc96d5381 100644 --- a/modules/codec/telx.c +++ b/modules/codec/telx.c @@ -692,7 +692,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) strcpy( p_sys->psz_prev_text, psz_text ); /* Create the subpicture unit */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Warn( p_dec, "can't get spu buffer" ); @@ -730,7 +730,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) error: if ( p_spu != NULL ) { - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); p_spu = NULL; } diff --git a/modules/codec/zvbi.c b/modules/codec/zvbi.c index e716f90f1a..833c886845 100644 --- a/modules/codec/zvbi.c +++ b/modules/codec/zvbi.c @@ -441,7 +441,7 @@ error: vbi_unref_page( &p_page ); if( p_spu != NULL ) { - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); p_spu = NULL; } @@ -459,7 +459,7 @@ static subpicture_t *Subpicture( decoder_t *p_dec, video_format_t *p_fmt, /* If there is a page or sub to render, then we do that here */ /* Create the subpicture unit */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) { msg_Warn( p_dec, "can't get spu buffer" ); @@ -487,7 +487,7 @@ static subpicture_t *Subpicture( decoder_t *p_dec, video_format_t *p_fmt, if( p_spu->p_region == NULL ) { msg_Err( p_dec, "cannot allocate SPU region" ); - p_dec->pf_spu_buffer_del( p_dec, p_spu ); + decoder_DeleteSubpicture( p_dec, p_spu ); return NULL; } diff --git a/src/input/decoder.c b/src/input/decoder.c index 7043b4c6ce..c7e300a42b 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -161,6 +161,17 @@ struct decoder_owner_sys_t /***************************************************************************** * Public functions *****************************************************************************/ +subpicture_t *decoder_NewSubpicture( decoder_t *p_decoder ) +{ + subpicture_t *p_subpicture = p_decoder->pf_spu_buffer_new( p_decoder ); + if( !p_subpicture ) + msg_Warn( p_decoder, "can't get output subpicture" ); + return p_subpicture; +} +void decoder_DeleteSubpicture( decoder_t *p_decoder, subpicture_t *p_subpicture ) +{ + p_decoder->pf_spu_buffer_del( p_decoder, p_subpicture ); +} /* decoder_GetInputAttachments: */ diff --git a/src/libvlccore.sym b/src/libvlccore.sym index ef6e2f79e3..bf4f18ed91 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -77,9 +77,11 @@ date_Increment date_Init date_Move date_Set +decoder_DeleteSubpicture decoder_GetDisplayDate decoder_GetDisplayRate decoder_GetInputAttachments +decoder_NewSubpicture decoder_SynchroChoose decoder_SynchroDate decoder_SynchroDecode -- 2.39.5