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:
parent
b64ada26f7
commit
0357e2cf82
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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" );
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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" );
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
*/
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user