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

subsusf: directly fill spu->p_region in ParseUSFString()

This commit is contained in:
Steve Lhomme 2023-10-27 14:16:22 +02:00
parent e21ecd8c6a
commit 657aee0a53

View File

@ -104,7 +104,7 @@ static int ParseImageAttachments( decoder_t *p_dec );
static subpicture_t *ParseText ( decoder_t *, block_t * ); static subpicture_t *ParseText ( decoder_t *, block_t * );
static void ParseUSFHeader( decoder_t * ); static void ParseUSFHeader( decoder_t * );
static subpicture_region_t *ParseUSFString( decoder_t *, char * ); static void ParseUSFString( decoder_t *, char *, subpicture_region_t ** );
static subpicture_region_t *LoadEmbeddedImage( decoder_t *p_dec, const char *psz_filename, int i_transparent_color ); static subpicture_region_t *LoadEmbeddedImage( decoder_t *p_dec, const char *psz_filename, int i_transparent_color );
/***************************************************************************** /*****************************************************************************
@ -258,7 +258,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
} }
/* Decode USF strings */ /* Decode USF strings */
p_spu->p_region = ParseUSFString( p_dec, psz_subtitle ); ParseUSFString( p_dec, psz_subtitle, &p_spu->p_region );
p_spu->i_start = p_block->i_pts; p_spu->i_start = p_block->i_pts;
p_spu->i_stop = p_block->i_pts + p_block->i_length; p_spu->i_stop = p_block->i_pts + p_block->i_length;
@ -805,12 +805,13 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
static subpicture_region_t *ParseUSFString( decoder_t *p_dec, static void ParseUSFString( decoder_t *p_dec,
char *psz_subtitle ) char *psz_subtitle,
subpicture_region_t **regions )
{ {
decoder_sys_t *p_sys = p_dec->p_sys; decoder_sys_t *p_sys = p_dec->p_sys;
subpicture_region_t *p_region_first = NULL; *regions = NULL;
subpicture_region_t *p_region_upto = p_region_first; subpicture_region_t *p_region_upto = NULL;
while( *psz_subtitle ) while( *psz_subtitle )
{ {
@ -842,14 +843,14 @@ static subpicture_region_t *ParseUSFString( decoder_t *p_dec,
p_sys->i_align ); p_sys->i_align );
if( p_text_region ) if( p_text_region )
{ {
if( !p_region_first ) if( *regions == NULL)
{ {
p_region_first = p_region_upto = p_text_region; *regions = p_region_upto = p_text_region;
} }
else else
{ {
p_region_upto->p_next = p_text_region; p_region_upto->p_next = p_text_region;
p_region_upto = p_region_upto->p_next; p_region_upto = p_text_region;
} }
} }
else free( psz_flat ); else free( psz_flat );
@ -901,16 +902,15 @@ static subpicture_region_t *ParseUSFString( decoder_t *p_dec,
{ {
SetupPositions( p_image_region, psz_subtitle ); SetupPositions( p_image_region, psz_subtitle );
p_image_region->p_next = NULL; if( *regions == NULL)
} {
if( !p_region_first ) *regions = p_region_upto = p_image_region;
{ }
p_region_first = p_region_upto = p_image_region; else
} {
else if( p_image_region ) p_region_upto->p_next = p_image_region;
{ p_region_upto = p_image_region;
p_region_upto->p_next = p_image_region; }
p_region_upto = p_region_upto->p_next;
} }
} }
else else
@ -928,14 +928,14 @@ static subpicture_region_t *ParseUSFString( decoder_t *p_dec,
p_sys->i_align ); p_sys->i_align );
if( p_text_region ) if( p_text_region )
{ {
if( !p_region_first ) if( *regions == NULL)
{ {
p_region_first = p_region_upto = p_text_region; *regions = p_region_upto = p_text_region;
} }
else else
{ {
p_region_upto->p_next = p_text_region; p_region_upto->p_next = p_text_region;
p_region_upto = p_region_upto->p_next; p_region_upto = p_text_region;
} }
} }
else free( psz_flat ); else free( psz_flat );
@ -949,8 +949,6 @@ static subpicture_region_t *ParseUSFString( decoder_t *p_dec,
psz_subtitle++; psz_subtitle++;
} }
return p_region_first;
} }
/***************************************************************************** /*****************************************************************************