Commit 0357e2cf authored by Laurent Aimar's avatar Laurent Aimar

Added decoder_NewSubpicture/decoder_DeleteSubpicture helpers.

parent b64ada26
...@@ -95,14 +95,15 @@ struct decoder_t ...@@ -95,14 +95,15 @@ struct decoder_t
void ( * pf_picture_link) ( decoder_t *, picture_t * ); void ( * pf_picture_link) ( decoder_t *, picture_t * );
void ( * pf_picture_unlink) ( 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 * 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 /* Input attachments
* XXX use decoder_GetInputAttachments */ * XXX use decoder_GetInputAttachments */
int (*pf_get_attachments)( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment ); int (*pf_get_attachments)( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment );
...@@ -163,12 +164,24 @@ struct encoder_t ...@@ -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. * This function gives all input attachments at once.
* *
* You MUST release the returned values * 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 * This function converts a decoder timestamp into a display date comparable
......
...@@ -329,7 +329,7 @@ static subpicture_t *Subtitle( decoder_t *p_dec, char *psz_subtitle, char *psz_h ...@@ -329,7 +329,7 @@ static subpicture_t *Subtitle( decoder_t *p_dec, char *psz_subtitle, char *psz_h
EnsureUTF8( psz_html ); EnsureUTF8( psz_html );
/* Create the subpicture unit */ /* Create the subpicture unit */
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Warn( p_dec, "can't get spu buffer" ); 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 ...@@ -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" ); msg_Err( p_dec, "cannot allocate SPU region" );
free( psz_subtitle ); free( psz_subtitle );
free( psz_html ); free( psz_html );
p_dec->pf_spu_buffer_del( p_dec, p_spu ); decoder_DeleteSubpicture( p_dec, p_spu );
return NULL; return NULL;
} }
......
...@@ -159,7 +159,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -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 * displaying is done in the DisplayAnchor function in intf.c (called from
* DisplayPendingAnchor, which in turn is called from the main RunIntf * DisplayPendingAnchor, which in turn is called from the main RunIntf
* loop). */ * loop). */
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Dbg( p_dec, "couldn't allocate new subpicture" ); msg_Dbg( p_dec, "couldn't allocate new subpicture" );
......
...@@ -174,7 +174,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -174,7 +174,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
return NULL; return NULL;
} }
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Warn( p_dec, "can't get spu buffer" ); 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 ) ...@@ -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 )); p_spu->p_sys = malloc( sizeof( subpicture_sys_t ));
if( !p_spu->p_sys ) 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 ); block_Release( p_block );
return NULL; return NULL;
} }
...@@ -196,7 +196,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -196,7 +196,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( !p_spu->p_sys->p_subs_data ) if( !p_spu->p_sys->p_subs_data )
{ {
free( p_spu->p_sys ); 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 ); block_Release( p_block );
return NULL; return NULL;
} }
......
...@@ -502,7 +502,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) ...@@ -502,7 +502,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
int i; int i;
/* Allocate the subpicture internal data. */ /* 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; if( !p_spu ) return NULL;
p_spu->i_start = p_data->i_pts; p_spu->i_start = p_data->i_pts;
...@@ -530,7 +530,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) ...@@ -530,7 +530,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
if( !p_region ) if( !p_region )
{ {
msg_Err( p_dec, "cannot allocate SPU 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; return NULL;
} }
......
...@@ -1449,7 +1449,7 @@ static subpicture_t *render( decoder_t *p_dec ) ...@@ -1449,7 +1449,7 @@ static subpicture_t *render( decoder_t *p_dec )
int i_base_y; int i_base_y;
/* Allocate the subpicture internal data. */ /* Allocate the subpicture internal data. */
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
return NULL; return NULL;
......
...@@ -578,7 +578,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t ...@@ -578,7 +578,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
/* we have an event */ /* we have an event */
/* Get a new spu */ /* Get a new spu */
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Err( p_dec, "Failed to allocate spu buffer" ); 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 ...@@ -636,7 +636,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
if( !p_bitmap_region ) if( !p_bitmap_region )
{ {
msg_Err( p_dec, "cannot allocate SPU 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; return NULL;
} }
...@@ -656,7 +656,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t ...@@ -656,7 +656,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
if( !p_spu->p_region ) if( !p_spu->p_region )
{ {
msg_Err( p_dec, "cannot allocate SPU 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; return NULL;
} }
......
...@@ -231,7 +231,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -231,7 +231,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
return NULL; return NULL;
} }
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Warn( p_dec, "can't get spu buffer" ); 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 ) ...@@ -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 )); p_spu->p_sys = malloc( sizeof( subpicture_sys_t ));
if( !p_spu->p_sys ) 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 ); block_Release( p_block );
return NULL; return NULL;
} }
...@@ -252,7 +252,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -252,7 +252,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( !p_spu->p_sys->p_subs_data ) if( !p_spu->p_sys->p_subs_data )
{ {
free( p_spu->p_sys ); 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 ); block_Release( p_block );
return NULL; return NULL;
} }
......
...@@ -85,7 +85,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec ) ...@@ -85,7 +85,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec )
spu_properties_t spu_properties; spu_properties_t spu_properties;
/* Allocate the subpicture internal data. */ /* 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; if( !p_spu ) return NULL;
/* 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
...@@ -118,7 +118,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec ) ...@@ -118,7 +118,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec )
if( ParseControlSeq( p_dec, p_spu, p_spu_data, &spu_properties ) ) if( ParseControlSeq( p_dec, p_spu, p_spu_data, &spu_properties ) )
{ {
/* There was a parse error, delete the subpicture */ /* 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; return NULL;
} }
...@@ -126,7 +126,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec ) ...@@ -126,7 +126,7 @@ subpicture_t * ParsePacket( decoder_t *p_dec )
if( ParseRLE( p_dec, p_spu_data, &spu_properties ) ) if( ParseRLE( p_dec, p_spu_data, &spu_properties ) )
{ {
/* There was a parse error, delete the subpicture */ /* 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; return NULL;
} }
......
...@@ -402,7 +402,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block ) ...@@ -402,7 +402,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
} }
/* Create the subpicture unit */ /* Create the subpicture unit */
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Warn( p_dec, "can't get spu buffer" ); 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 ) ...@@ -421,7 +421,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
{ {
msg_Err( p_dec, "cannot allocate SPU region" ); msg_Err( p_dec, "cannot allocate SPU region" );
free( psz_subtitle ); free( psz_subtitle );
p_dec->pf_spu_buffer_del( p_dec, p_spu ); decoder_DeleteSubpicture( p_dec, p_spu );
return NULL; return NULL;
} }
......
...@@ -208,7 +208,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block ) ...@@ -208,7 +208,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
} }
/* Create the subpicture unit */ /* Create the subpicture unit */
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Warn( p_dec, "can't get spu buffer" ); msg_Warn( p_dec, "can't get spu buffer" );
......
...@@ -471,7 +471,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) ...@@ -471,7 +471,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
int i; int i;
/* Allocate the subpicture internal data. */ /* 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; if( !p_spu ) return NULL;
p_spu->i_start = p_data->i_pts; p_spu->i_start = p_data->i_pts;
...@@ -509,7 +509,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) ...@@ -509,7 +509,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
if( !p_region ) if( !p_region )
{ {
msg_Err( p_dec, "cannot allocate SVCD subtitle 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; return NULL;
} }
......
...@@ -692,7 +692,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -692,7 +692,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
strcpy( p_sys->psz_prev_text, psz_text ); strcpy( p_sys->psz_prev_text, psz_text );
/* Create the subpicture unit */ /* Create the subpicture unit */
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Warn( p_dec, "can't get spu buffer" ); 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 ) ...@@ -730,7 +730,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
error: error:
if ( p_spu != NULL ) if ( p_spu != NULL )
{ {
p_dec->pf_spu_buffer_del( p_dec, p_spu ); decoder_DeleteSubpicture( p_dec, p_spu );
p_spu = NULL; p_spu = NULL;
} }
......
...@@ -441,7 +441,7 @@ error: ...@@ -441,7 +441,7 @@ error:
vbi_unref_page( &p_page ); vbi_unref_page( &p_page );
if( p_spu != NULL ) if( p_spu != NULL )
{ {
p_dec->pf_spu_buffer_del( p_dec, p_spu ); decoder_DeleteSubpicture( p_dec, p_spu );
p_spu = NULL; p_spu = NULL;
} }
...@@ -459,7 +459,7 @@ static subpicture_t *Subpicture( decoder_t *p_dec, video_format_t *p_fmt, ...@@ -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 */ /* If there is a page or sub to render, then we do that here */
/* Create the subpicture unit */ /* Create the subpicture unit */
p_spu = p_dec->pf_spu_buffer_new( p_dec ); p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu ) if( !p_spu )
{ {
msg_Warn( p_dec, "can't get spu buffer" ); 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, ...@@ -487,7 +487,7 @@ static subpicture_t *Subpicture( decoder_t *p_dec, video_format_t *p_fmt,
if( p_spu->p_region == NULL ) if( p_spu->p_region == NULL )
{ {
msg_Err( p_dec, "cannot allocate SPU 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; return NULL;
} }
......
...@@ -161,6 +161,17 @@ struct decoder_owner_sys_t ...@@ -161,6 +161,17 @@ struct decoder_owner_sys_t
/***************************************************************************** /*****************************************************************************
* Public functions * 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: /* decoder_GetInputAttachments:
*/ */
......
...@@ -77,9 +77,11 @@ date_Increment ...@@ -77,9 +77,11 @@ date_Increment
date_Init date_Init
date_Move date_Move
date_Set date_Set
decoder_DeleteSubpicture
decoder_GetDisplayDate decoder_GetDisplayDate
decoder_GetDisplayRate decoder_GetDisplayRate
decoder_GetInputAttachments decoder_GetInputAttachments
decoder_NewSubpicture
decoder_SynchroChoose decoder_SynchroChoose
decoder_SynchroDate decoder_SynchroDate
decoder_SynchroDecode decoder_SynchroDecode
......
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