1
mirror of https://code.videolan.org/videolan/vlc synced 2024-09-04 09:11:33 +02:00

Added decoder_NewSubpicture/decoder_DeleteSubpicture helpers.

This commit is contained in:
Laurent Aimar 2008-10-23 21:08:16 +02:00
parent b64ada26f7
commit 0357e2cf82
16 changed files with 59 additions and 33 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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" );

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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" );

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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:
*/

View File

@ -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