diff --git a/include/vlc_codec.h b/include/vlc_codec.h index a60bc3bcf5ab9038f6bf9f07577cd5bae2a1ffbf..41cf66bdb42a6845a2d9fc8936025a537c827cc5 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 76024b96eac07054d748efc0f3bedaf047702dfd..4db6b31a7f476d30102bb50bbe7713a0eb16ee2a 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 2e5109efcea5c622b55395004ce62890a1fd5516..14fe347a0db4a3f534781e9d7a6a69abe10c895a 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 61ae9f4cffb98928c131ec4ad9ca84e9f0b8611b..f1f6de07a7e2a8bdf7a1a77fb0d684e760ca8e92 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 e5f31496b523847a2e0b774135c3a8a492cc31cb..a2d1a76d86560b3964bf7f7dacac8576105a4fd0 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 9658c89512f6a2048771545ab4cdce1a2f96208f..0310fa4441fe32f69c2c0fcc60f971d5c51f63cf 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 2ce29bf976a738af2bb2482681516f64a9838be7..20090c1a47058542705997ff25ef1e121f5f9393 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 6efe21cfabc22d816535b8deb9162b48013bd100..0fa34ce7621f3ae09b4a34b0128879d74e8ab6b5 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 5a2ee513301f521cc765557759a4591df2240940..88968f10b7eb6262e9e85194380b1847b1b1f52a 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 359944c37dc3424f7cfa8033aa6708cd8e4e0ce0..24b9021dfb5b61b4e0574520680c74ddb4bcc83e 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 c088b3d226d14ed39ea6e049b75ccbdf2862d123..b2467efe193232d2a611d0d6087544a2a761d455 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 b0fdfb81357c32ec0bda20fb4334464fac0cc6b6..d5e5e9dac7b4a0a3f5ff20ad77ea6f24c094c878 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 9c6978f0fdb153fc3433023d4508ae18a56c818e..1cc96d538158a69fc13310fd114b3056e0ebd51e 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 e716f90f1a9ea80675c6f8fdaf052caf2f13fc61..833c88684502144ff928d3f3737f9f4b4bbafa4b 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 7043b4c6ce2b5845295fb5f2c038060ad0dda0a7..c7e300a42bafece15c64f9bf90a2786d9b5fadf6 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 ef6e2f79e3a9b5de20273a1a6c60d286726e413d..bf4f18ed917fee5944e2854543f360ca2b72945a 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