Browse Source

codec: webvtt: split the code to acutally Delete webvtt_dom_node_t data

So we don't use recursions. We only need an extra loop on the child elements
to delete. But it will not cause a recursion.
cherry-pick-c5513cf9
Steve Lhomme 2 years ago
parent
commit
8532a9dd06
  1. 69
      modules/codec/webvtt/subsvtt.c

69
modules/codec/webvtt/subsvtt.c

@ -461,41 +461,50 @@ static void webvtt_domnode_AppendLast( webvtt_dom_node_t **pp_append,
#define webvtt_domnode_AppendLast( a, b ) \
webvtt_domnode_AppendLast( (webvtt_dom_node_t **) a, (webvtt_dom_node_t *) b )
static webvtt_dom_node_t *webvtt_domnode_DeleteNode( webvtt_dom_node_t *p_node )
{
webvtt_dom_node_t *p_child = NULL;
if( p_node->type == NODE_TAG )
{
webvtt_dom_tag_t *p_tag_node = (webvtt_dom_tag_t *) p_node;
text_style_Delete( p_tag_node->p_cssstyle );
free( p_tag_node->psz_attrs );
free( p_tag_node->psz_tag );
p_child = p_tag_node->p_child;
}
else if( p_node->type == NODE_TEXT )
{
webvtt_dom_text_t *p_text_node = (webvtt_dom_text_t *)p_node;
free( p_text_node->psz_text );
}
else if( p_node->type == NODE_CUE )
{
webvtt_dom_cue_t *p_cue_node = (webvtt_dom_cue_t *)p_node;
text_style_Delete( p_cue_node->p_cssstyle );
webvtt_cue_settings_Clean( &p_cue_node->settings );
free( p_cue_node->psz_id );
p_child = p_cue_node->p_child;
}
else if( p_node->type == NODE_REGION )
{
webvtt_region_t *p_region_node = (webvtt_region_t *)p_node;
text_style_Delete( p_region_node->p_cssstyle );
free( p_region_node->psz_id );
p_child = p_region_node->p_child;
}
free( p_node );
return p_child;
}
static void webvtt_domnode_ChainDelete( webvtt_dom_node_t *p_node )
{
while( p_node )
{
webvtt_dom_node_t *p_next = p_node->p_next;
if( p_node->type == NODE_TAG )
{
webvtt_dom_tag_t *p_tag_node = (webvtt_dom_tag_t *) p_node;
text_style_Delete( p_tag_node->p_cssstyle );
free( p_tag_node->psz_attrs );
free( p_tag_node->psz_tag );
webvtt_domnode_ChainDelete( p_tag_node->p_child );
}
else if( p_node->type == NODE_TEXT )
{
webvtt_dom_text_t *p_text_node = (webvtt_dom_text_t *)p_node;
free( p_text_node->psz_text );
}
else if( p_node->type == NODE_CUE )
{
webvtt_dom_cue_t *p_cue_node = (webvtt_dom_cue_t *)p_node;
text_style_Delete( p_cue_node->p_cssstyle );
webvtt_cue_settings_Clean( &p_cue_node->settings );
free( p_cue_node->psz_id );
webvtt_domnode_ChainDelete( p_cue_node->p_child );
}
else if( p_node->type == NODE_REGION )
{
webvtt_region_t *p_region_node = (webvtt_region_t *)p_node;
text_style_Delete( p_region_node->p_cssstyle );
free( p_region_node->psz_id );
webvtt_domnode_ChainDelete( p_region_node->p_child );
}
free( p_node );
webvtt_dom_node_t *p_child = webvtt_domnode_DeleteNode( p_node );
while ( p_child )
p_child = webvtt_domnode_DeleteNode( p_child );
p_node = p_next;
}

Loading…
Cancel
Save