Commit f0c76d50 authored by Laurent Aimar's avatar Laurent Aimar

Clean up a bit subpicture region API.

parent 7c4a6119
......@@ -118,10 +118,6 @@ VLC_EXPORT( subpicture_t *, spu_CreateSubpicture, ( spu_t * ) );
VLC_EXPORT( void, spu_DestroySubpicture, ( spu_t *, subpicture_t * ) );
VLC_EXPORT( void, spu_DisplaySubpicture, ( spu_t *, subpicture_t * ) );
#define spu_CreateRegion(a,b) __spu_CreateRegion(VLC_OBJECT(a),b)
VLC_EXPORT( subpicture_region_t *,__spu_CreateRegion, ( vlc_object_t *, video_format_t * ) );
#define spu_DestroyRegion(a,b) __spu_DestroyRegion(VLC_OBJECT(a),b)
VLC_EXPORT( void, __spu_DestroyRegion, ( vlc_object_t *, subpicture_region_t * ) );
VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t display_date, bool b_paused, bool b_subtitle_only ) );
/**
......
......@@ -319,9 +319,31 @@ struct subpicture_region_t
text_style_t *p_style; /**< a description of the text style formatting */
subpicture_region_t *p_next; /**< next region in the list */
subpicture_region_private_t *p_private; /**< modified version of this region */
subpicture_region_private_t *p_private; /**< Private data for spu_t *only* */
};
/**
* This function will create a new subpicture.
* You can must use subpicture_region_Delete to destroy it.
*/
VLC_EXPORT( subpicture_region_t *, subpicture_region_New, ( const video_format_t *p_fmt ) );
/**
* This function will destroy a subpicture allocated by
* subpicture_region_New.
*
* You may give it NULL.
*/
VLC_EXPORT( void, subpicture_region_Delete, ( subpicture_region_t *p_region ) );
/**
* This function will destroy a list of subpicture allocated by
* subpicture_region_New.
*
* Provided for convenience.
*/
VLC_EXPORT( void, subpicture_region_ChainDelete, ( subpicture_region_t *p_head ) );
/**
* Video subtitle
*
......@@ -375,10 +397,6 @@ struct subpicture_t
void ( *pf_destroy ) ( subpicture_t * );
/** Pointer to functions for region management */
subpicture_region_t * ( *pf_create_region ) ( vlc_object_t *,
video_format_t * );
void ( *pf_destroy_region ) ( vlc_object_t *, subpicture_region_t * );
void (*pf_pre_render) ( spu_t *, subpicture_t *, const video_format_t * );
void (*pf_update_regions)( spu_t *,
subpicture_t *, const video_format_t *, mtime_t );
......
......@@ -344,7 +344,7 @@ static subpicture_t *Subtitle( decoder_t *p_dec, char *psz_subtitle, char *psz_h
fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( !p_spu->p_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
......
......@@ -250,12 +250,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
video_format_t fmt;
/* TODO maybe checking if we really need redrawing */
while( p_subpic->p_region )
{
subpicture_region_t *p_region = p_subpic->p_region;
p_subpic->p_region = p_region->p_next;
spu_DestroyRegion( p_spu, p_region );
}
subpicture_region_ChainDelete( p_subpic->p_region );
p_subpic->p_region = NULL;
/* FIXME check why this is needed */
......@@ -297,7 +292,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
p_subpic->i_original_picture_height = fmt.i_height;
p_subpic->i_original_picture_width = fmt.i_width;
p_spu_region = p_subpic->p_region = p_subpic->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_spu_region = p_subpic->p_region = subpicture_region_New( &fmt );
if( p_spu_region )
{
......
......@@ -498,6 +498,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
subpicture_t *p_spu;
subpicture_region_t *p_region;
video_format_t fmt;
video_palette_t palette;
int i;
/* Allocate the subpicture internal data. */
......@@ -515,11 +516,22 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
fmt.i_width = fmt.i_visible_width = p_sys->i_width;
fmt.i_height = fmt.i_visible_height = p_sys->i_height;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
fmt.p_palette = &palette;
fmt.p_palette->i_entries = 4;
for( i = 0; i < fmt.p_palette->i_entries; i++ )
{
fmt.p_palette->palette[i][0] = p_sys->p_palette[i][0];
fmt.p_palette->palette[i][1] = p_sys->p_palette[i][1];
fmt.p_palette->palette[i][2] = p_sys->p_palette[i][2];
fmt.p_palette->palette[i][3] = p_sys->p_palette[i][3];
}
p_region = subpicture_region_New( &fmt );
if( !p_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
//goto error;
p_dec->pf_spu_buffer_del( p_dec, p_spu );
return NULL;
}
p_spu->p_region = p_region;
......@@ -527,16 +539,6 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
p_region->i_x = p_region->i_x * 3 / 4; /* FIXME: use aspect ratio for x? */
p_region->i_y = p_sys->i_y_start;
/* Build palette */
fmt.p_palette->i_entries = 4;
for( i = 0; i < fmt.p_palette->i_entries; i++ )
{
fmt.p_palette->palette[i][0] = p_sys->p_palette[i][0];
fmt.p_palette->palette[i][1] = p_sys->p_palette[i][1];
fmt.p_palette->palette[i][2] = p_sys->p_palette[i][2];
fmt.p_palette->palette[i][3] = p_sys->p_palette[i][3];
}
RenderImage( p_dec, p_data, p_region );
return p_spu;
......
......@@ -1500,6 +1500,7 @@ static subpicture_t *render( decoder_t *p_dec )
subpicture_region_t *p_spu_region;
uint8_t *p_src, *p_dst;
video_format_t fmt;
video_palette_t palette;
int i_pitch;
i_timeout = p_sys->p_page->i_timeout;
......@@ -1545,19 +1546,7 @@ static subpicture_t *render( decoder_t *p_dec )
fmt.i_width = fmt.i_visible_width = p_region->i_width;
fmt.i_height = fmt.i_visible_height = p_region->i_height;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
if( !p_spu_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
continue;
}
p_spu_region->i_x = i_base_x + p_regiondef->i_x;
p_spu_region->i_y = i_base_y + p_regiondef->i_y;
p_spu_region->i_align = p_sys->i_spu_position;
*pp_spu_region = p_spu_region;
pp_spu_region = &p_spu_region->p_next;
/* Build palette */
fmt.p_palette = &palette;
fmt.p_palette->i_entries = ( p_region->i_depth == 1 ) ? 4 :
( ( p_region->i_depth == 2 ) ? 16 : 256 );
p_color = ( p_region->i_depth == 1 ) ? p_clut->c_2b :
......@@ -1570,6 +1559,18 @@ static subpicture_t *render( decoder_t *p_dec )
fmt.p_palette->palette[j][3] = 0xff - p_color[j].T;
}
p_spu_region = subpicture_region_New( &fmt );
if( !p_spu_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
continue;
}
p_spu_region->i_x = i_base_x + p_regiondef->i_x;
p_spu_region->i_y = i_base_y + p_regiondef->i_y;
p_spu_region->i_align = p_sys->i_spu_position;
*pp_spu_region = p_spu_region;
pp_spu_region = &p_spu_region->p_next;
p_src = p_region->p_pixbuf;
p_dst = p_spu_region->p_picture->Y_PIXELS;
i_pitch = p_spu_region->p_picture->Y_PITCH;
......@@ -1598,7 +1599,7 @@ static subpicture_t *render( decoder_t *p_dec )
fmt.i_width = fmt.i_visible_width = p_region->i_width;
fmt.i_height = fmt.i_visible_height = p_region->i_height;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_spu_region = subpicture_region_New( &fmt );
if( !p_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
......
......@@ -552,6 +552,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
subpicture_region_t *p_bitmap_region = NULL;
int ret;
video_format_t fmt;
video_format_t palette;
kate_tracker kin;
bool tracker_valid = false;
......@@ -620,6 +621,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
#ifdef ENABLE_BITMAPS
if (ev->bitmap && ev->bitmap->type==kate_bitmap_type_paletted && ev->palette) {
/* create a separate region for the bitmap */
memset( &fmt, 0, sizeof(video_format_t) );
fmt.i_chroma = VLC_FOURCC('Y','U','V','P');
......@@ -627,8 +629,10 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
fmt.i_width = fmt.i_visible_width = ev->bitmap->width;
fmt.i_height = fmt.i_visible_height = ev->bitmap->height;
fmt.i_x_offset = fmt.i_y_offset = 0;
fmt.p_palette = &palette;
CreateKatePalette( fmt.p_palette, ev->palette );
p_bitmap_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_bitmap_region = subpicture_region_New( &fmt );
if( !p_bitmap_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
......@@ -636,9 +640,6 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
return NULL;
}
/* create the palette */
CreateKatePalette( fmt.p_palette, ev->palette );
/* create the bitmap */
CreateKateBitmap( p_bitmap_region->p_picture, ev->bitmap );
......@@ -651,7 +652,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( !p_spu->p_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
......
......@@ -399,7 +399,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
fmt_region.i_height =
fmt_region.i_visible_height = region[i].y1 - region[i].y0;
pp_region[i] = r = p_subpic->pf_create_region( VLC_OBJECT(p_spu), &fmt_region );
pp_region[i] = r = subpicture_region_New( &fmt_region );
if( !r )
break;
r->i_x = region[i].x0;
......@@ -620,12 +620,7 @@ static void RegionDraw( subpicture_region_t *p_region, ass_image_t *p_img )
static void SubpictureReleaseRegions( spu_t *p_spu, subpicture_t *p_subpic )
{
while( p_subpic->p_region )
{
subpicture_region_t *p_region = p_subpic->p_region;
p_subpic->p_region = p_region->p_next;
spu_DestroyRegion( p_spu, p_region );
}
subpicture_region_ChainDelete( p_subpic->p_region );
p_subpic->p_region = NULL;
}
......
......@@ -658,6 +658,7 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu,
int i_x, i_y, i_len, i_color, i_pitch;
uint16_t *p_source = (uint16_t *)p_spu_data->p_data;
video_format_t fmt;
video_palette_t palette;
/* Create a new subpicture region */
memset( &fmt, 0, sizeof(video_format_t) );
......@@ -667,19 +668,7 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu,
fmt.i_height = fmt.i_visible_height = p_spu_properties->i_height -
p_spu_data->i_y_top_offset - p_spu_data->i_y_bottom_offset;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
if( !p_spu->p_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
return;
}
p_spu->p_region->i_x = p_spu_properties->i_x;
p_spu->p_region->i_y = p_spu_properties->i_y + p_spu_data->i_y_top_offset;
p_p = p_spu->p_region->p_picture->p->p_pixels;
i_pitch = p_spu->p_region->p_picture->p->i_pitch;
/* Build palette */
fmt.p_palette = &palette;
fmt.p_palette->i_entries = 4;
for( i_x = 0; i_x < fmt.p_palette->i_entries; i_x++ )
{
......@@ -691,6 +680,18 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu,
p_spu_data->pi_alpha[i_x] << 4;
}
p_spu->p_region = subpicture_region_New( &fmt );
if( !p_spu->p_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
return;
}
p_spu->p_region->i_x = p_spu_properties->i_x;
p_spu->p_region->i_y = p_spu_properties->i_y + p_spu_data->i_y_top_offset;
p_p = p_spu->p_region->p_picture->p->p_pixels;
i_pitch = p_spu->p_region->p_picture->p->i_pitch;
/* Draw until we reach the bottom of the subtitle */
for( i_y = 0; i_y < (int)fmt.i_height * i_pitch; i_y += i_pitch )
{
......
......@@ -418,7 +418,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( !p_spu->p_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
......
......@@ -386,7 +386,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec,
fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_text_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_text_region = subpicture_region_New( &fmt );
if( p_text_region != NULL )
{
......@@ -396,7 +396,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec,
p_text_region->psz_html = strndup( psz_subtitle, i_len );
if( ! p_text_region->psz_html )
{
p_spu->pf_destroy_region( VLC_OBJECT(p_dec), p_text_region );
subpicture_region_Delete( p_text_region );
return NULL;
}
......@@ -1201,7 +1201,7 @@ static subpicture_region_t *LoadEmbeddedImage( decoder_t *p_dec,
fmt_out.i_height =
fmt_out.i_visible_height = p_pic->format.i_visible_height;
p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt_out );
p_region = subpicture_region_New( &fmt_out );
if( !p_region )
{
msg_Err( p_dec, "cannot allocate SPU region" );
......
......@@ -467,6 +467,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
subpicture_t *p_spu;
subpicture_region_t *p_region;
video_format_t fmt;
video_palette_t palette;
int i;
/* Allocate the subpicture internal data. */
......@@ -494,20 +495,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
fmt.i_width = fmt.i_visible_width = p_sys->i_width;
fmt.i_height = fmt.i_visible_height = p_sys->i_height;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
if( !p_region )
{
msg_Err( p_dec, "cannot allocate SVCD subtitle region" );
//goto error;
}
p_region->fmt.i_aspect = VOUT_ASPECT_FACTOR;
p_spu->p_region = p_region;
p_region->i_x = p_sys->i_x_start;
p_region->i_y = p_sys->i_y_start;
/* Build palette */
fmt.p_palette = &palette;
fmt.p_palette->i_entries = 4;
for( i = 0; i < fmt.p_palette->i_entries; i++ )
{
......@@ -517,6 +505,18 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
fmt.p_palette->palette[i][3] = p_sys->p_palette[i][3];
}
p_region = subpicture_region_New( &fmt );
if( !p_region )
{
msg_Err( p_dec, "cannot allocate SVCD subtitle region" );
p_dec->pf_spu_buffer_del( p_dec, p_spu );
return NULL;
}
p_spu->p_region = p_region;
p_region->i_x = p_sys->i_x_start;
p_region->i_y = p_sys->i_y_start;
SVCDSubRenderImage( p_dec, p_data, p_region );
return p_spu;
......
......@@ -708,7 +708,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( p_spu->p_region == NULL )
{
msg_Err( p_dec, "cannot allocate SPU region" );
......
......@@ -483,7 +483,7 @@ static subpicture_t *Subpicture( decoder_t *p_dec, video_format_t *p_fmt,
}
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( p_spu->p_region == NULL )
{
msg_Err( p_dec, "cannot allocate SPU region" );
......
......@@ -347,8 +347,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
{
subpicture_region_t *p_region;
*pp_region = p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter),
&p_overlay->format );
*pp_region = p_region = subpicture_region_New( &p_overlay->format );
if( !p_region )
break;
......
......@@ -864,7 +864,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
fmt.i_width = fmt.i_visible_width = p_pic->p[Y_PLANE].i_visible_pitch;
fmt.i_height = fmt.i_visible_height = p_pic->p[Y_PLANE].i_visible_lines;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
p_region = subpicture_region_New( &fmt );
if( !p_region )
{
msg_Err( p_filter, "cannot allocate SPU region" );
......
......@@ -286,7 +286,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = 0;
fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( !p_spu->p_region )
{
p_filter->pf_sub_buffer_del( p_filter, p_spu );
......
......@@ -641,10 +641,10 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
fmt_out.i_visible_height = fmt_out.i_height;
}
p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt_out );
p_region = subpicture_region_New( &fmt_out );
/* FIXME the copy is probably not needed anymore */
if( p_region )
picture_Copy( &p_region->p_picture, p_converted );
picture_Copy( p_region->p_picture, p_converted );
if( !p_sys->b_keep )
picture_Release( p_converted );
......
......@@ -375,7 +375,7 @@ static subpicture_region_t *create_text_region( filter_t *p_filter, subpicture_t
fmt.i_width = fmt.i_visible_width = i_width;
fmt.i_height = fmt.i_visible_height = i_height;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
p_region = subpicture_region_New( &fmt );
if( !p_region )
{
msg_Err( p_filter, "cannot allocate another SPU region" );
......@@ -401,6 +401,7 @@ static subpicture_region_t *create_picture_region( filter_t *p_filter, subpictur
{
subpicture_region_t *p_region = NULL;
video_format_t fmt;
video_palette_t palette;
if( !p_spu ) return NULL;
......@@ -412,20 +413,21 @@ static subpicture_region_t *create_picture_region( filter_t *p_filter, subpictur
fmt.i_width = fmt.i_visible_width = i_width;
fmt.i_height = fmt.i_visible_height = i_height;
fmt.i_x_offset = fmt.i_y_offset = 0;
if( fmt.i_chroma == VLC_FOURCC('Y','U','V','P') )
{
fmt.p_palette = &palette;
fmt.p_palette->i_entries = 0;
fmt.i_visible_width = 0;
fmt.i_visible_height = 0;
}
p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
p_region = subpicture_region_New( &fmt );
if( !p_region )
{
msg_Err( p_filter, "cannot allocate SPU region" );
p_filter->pf_sub_buffer_del( p_filter, p_spu );
return NULL;
}
if( !p_pic && ( fmt.i_chroma == VLC_FOURCC('Y','U','V','P') ) )
{
p_region->fmt.p_palette->i_entries = 0;
p_region->fmt.i_width = p_region->fmt.i_visible_width = 0;
p_region->fmt.i_height = p_region->fmt.i_visible_height = 0;
}
/* FIXME the copy is probably not needed anymore */
if( p_pic )
picture_Copy( p_region->p_picture, p_pic );
......@@ -570,13 +572,9 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date )
if( !p_new )
{
/* Cleanup when bailing out */
subpicture_region_t *p_tmp = NULL;
while( p_region_list )
{
p_tmp = p_region_list->p_next;
p_spu->pf_destroy_region( VLC_OBJECT(p_filter), p_region_list );
};
p_spu->pf_destroy_region( VLC_OBJECT(p_filter), p_region );
subpicture_region_ChainDelete( p_region_list );
subpicture_region_Delete( p_region );
p_filter->pf_sub_buffer_del( p_filter, p_spu );
return NULL;
}
......
......@@ -1162,7 +1162,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
fmt.i_width = fmt.i_visible_width = p_pic->p[Y_PLANE].i_visible_pitch;
fmt.i_height = fmt.i_visible_height = p_pic->p[Y_PLANE].i_visible_lines;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
p_region = subpicture_region_New( &fmt );
if( !p_region )
{
msg_Err( p_filter, "cannot allocate SPU region" );
......
......@@ -443,7 +443,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
fmt.i_chroma = VLC_FOURCC('T','E','X','T');
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( !p_spu->p_region )
{
p_filter->pf_sub_buffer_del( p_filter, p_spu );
......@@ -548,7 +548,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
fmt_out.i_height =
fmt_out.i_visible_height = p_pic->p[Y_PLANE].i_visible_lines;
p_region = p_spu->pf_create_region( VLC_OBJECT( p_filter ), &fmt_out );
p_region = subpicture_region_New( &fmt_out );
if( !p_region )
{
msg_Err( p_filter, "cannot allocate SPU region" );
......
......@@ -336,10 +336,8 @@ sout_StreamDelete
sout_StreamNew
sout_UpdateStatistic
__spu_Create
__spu_CreateRegion
spu_CreateSubpicture
spu_Destroy
__spu_DestroyRegion
spu_DestroySubpicture
spu_DisplaySubpicture
spu_Init
......@@ -374,6 +372,8 @@ stream_vaControl
__str_format
__str_format_meta
str_format_time
subpicture_region_New
subpicture_region_Delete
tls_ClientCreate
tls_ClientDelete
ToLocale
......
......@@ -94,7 +94,7 @@ int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel,
fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_spu_channel), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( !p_spu->p_region )
{
msg_Err( p_spu_channel, "cannot allocate SPU region" );
......
......@@ -164,7 +164,7 @@ static int CreatePicture( spu_t *p_spu, subpicture_t *p_subpic,
fmt.i_width = fmt.i_visible_width = i_width;
fmt.i_height = fmt.i_visible_height = i_height;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_subpic->p_region = p_subpic->pf_create_region( VLC_OBJECT(p_spu), &fmt );
p_subpic->p_region = subpicture_region_New( &fmt );
if( !p_subpic->p_region )
{
msg_Err( p_spu, "cannot allocate SPU region" );
......
......@@ -98,7 +98,7 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel,
fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_vout), &fmt );
p_spu->p_region = subpicture_region_New( &fmt );
if( !p_spu->p_region )
{
msg_Err( p_vout, "cannot allocate SPU region" );
......
......@@ -475,7 +475,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, image_handler_t *p_image, pic
fmt_out.i_sar_num =
fmt_out.i_sar_den = 0;
p_subpic->p_region = spu_CreateRegion( p_vout->p_spu, &fmt_out );
p_subpic->p_region = subpicture_region_New( &fmt_out );
if( p_subpic->p_region )
{
picture_Release( p_subpic->p_region->p_picture );
......
......@@ -253,26 +253,21 @@ void spu_Attach( spu_t *p_spu, vlc_object_t *p_this, bool b_attach )
}
}
/**
* Create a subpicture region
*
* \param p_this vlc_object_t
* \param p_fmt the format that this subpicture region should have
*/
subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this,
video_format_t *p_fmt )
/* */
subpicture_region_t *subpicture_region_New( const video_format_t *p_fmt )
{
subpicture_region_t *p_region = calloc( 1, sizeof(*p_region ) );
if( !p_region )
return NULL;
/* FIXME is that *really* wanted? */
if( p_fmt->i_chroma == VLC_FOURCC_YUVP )
p_fmt->p_palette = calloc( 1, sizeof(video_palette_t) );
else
p_fmt->p_palette = NULL; /* XXX and that above all? */
p_region->fmt = *p_fmt;
p_region->fmt.p_palette = NULL;
if( p_fmt->i_chroma == VLC_FOURCC_YUVP )
{
p_region->fmt.p_palette = calloc( 1, sizeof(*p_region->fmt.p_palette) );
if( p_fmt->p_palette )
*p_region->fmt.p_palette = *p_fmt->p_palette;
}
p_region->i_alpha = 0xff;
p_region->p_next = NULL;
p_region->p_private = NULL;
......@@ -295,13 +290,8 @@ subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this,
return p_region;
}
/**
* Destroy a subpicture region
*
* \param p_this vlc_object_t
* \param p_region the subpicture region to destroy
*/
void __spu_DestroyRegion( vlc_object_t *p_this, subpicture_region_t *p_region )
/* */
void subpicture_region_Delete( subpicture_region_t *p_region )
{
if( !p_region )
return;
......@@ -320,6 +310,19 @@ void __spu_DestroyRegion( vlc_object_t *p_this, subpicture_region_t *p_region )
free( p_region );
}
/* */
void subpicture_region_ChainDelete( subpicture_region_t *p_head )
{
while( p_head )
{
subpicture_region_t *p_next = p_head->p_next;
subpicture_region_Delete( p_head );
p_head = p_next;
}
}
/**
* Display a subpicture
*
......@@ -403,9 +406,6 @@ subpicture_t *spu_CreateSubpicture( spu_t *p_spu )
p_subpic->p_sys = NULL;
vlc_mutex_unlock( &p_spu->subpicture_lock );
p_subpic->pf_create_region = __spu_CreateRegion;
p_subpic->pf_destroy_region = __spu_DestroyRegion;
return p_subpic;
}
......@@ -437,12 +437,8 @@ void spu_DestroySubpicture( spu_t *p_spu, subpicture_t *p_subpic )
p_subpic, p_subpic->i_status );
}
while( p_subpic->p_region )
{
subpicture_region_t *p_region = p_subpic->p_region;
p_subpic->p_region = p_region->p_next;
spu_DestroyRegion( p_spu, p_region );
}
subpicture_region_ChainDelete( p_subpic->p_region );
p_subpic->p_region = NULL;
if( p_subpic->pf_destroy )
{
......@@ -1543,12 +1539,8 @@ static void SpuClearChannel( spu_t *p_spu, int i_channel, bool b_locked )
if( p_subpic->i_channel == i_channel )
{
while( p_subpic->p_region )
{
subpicture_region_t *p_region = p_subpic->p_region;
p_subpic->p_region = p_region->p_next;
spu_DestroyRegion( p_spu, p_region );
}
subpicture_region_ChainDelete( p_subpic->p_region );
p_subpic->p_region = NULL;
if( p_subpic->pf_destroy ) p_subpic->pf_destroy( p_subpic );
p_subpic->i_status = FREE_SUBPICTURE;
......@@ -1676,21 +1668,13 @@ static subpicture_t *spu_new_buffer( filter_t *p_filter )
p_subpic->b_absolute = true;
p_subpic->i_alpha = 0xFF;
p_subpic->pf_create_region = __spu_CreateRegion;
p_subpic->pf_destroy_region = __spu_DestroyRegion;
VLC_UNUSED(p_filter);
return p_subpic;
}
static void spu_del_buffer( filter_t *p_filter, subpicture_t *p_subpic )
{
while( p_subpic->p_region )
{
subpicture_region_t *p_region = p_subpic->p_region;
p_subpic->p_region = p_region->p_next;
p_subpic->pf_destroy_region( VLC_OBJECT(p_filter), p_region );
}
subpicture_region_ChainDelete( p_subpic->p_region );
free( p_subpic );
}
......
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