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 * ) ); ...@@ -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_DestroySubpicture, ( spu_t *, subpicture_t * ) );
VLC_EXPORT( void, spu_DisplaySubpicture, ( 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 ) ); 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 ...@@ -319,9 +319,31 @@ struct subpicture_region_t
text_style_t *p_style; /**< a description of the text style formatting */ text_style_t *p_style; /**< a description of the text style formatting */
subpicture_region_t *p_next; /**< next region in the list */ 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 * Video subtitle
* *
...@@ -375,10 +397,6 @@ struct subpicture_t ...@@ -375,10 +397,6 @@ struct subpicture_t
void ( *pf_destroy ) ( subpicture_t * ); void ( *pf_destroy ) ( subpicture_t * );
/** Pointer to functions for region management */ /** 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_pre_render) ( spu_t *, subpicture_t *, const video_format_t * );
void (*pf_update_regions)( spu_t *, void (*pf_update_regions)( spu_t *,
subpicture_t *, const video_format_t *, mtime_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 ...@@ -344,7 +344,7 @@ static subpicture_t *Subtitle( decoder_t *p_dec, char *psz_subtitle, char *psz_h
fmt.i_aspect = 0; fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0; fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 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 ) if( !p_spu->p_region )
{ {
msg_Err( p_dec, "cannot allocate SPU region" ); msg_Err( p_dec, "cannot allocate SPU region" );
......
...@@ -250,12 +250,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic, ...@@ -250,12 +250,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
video_format_t fmt; video_format_t fmt;
/* TODO maybe checking if we really need redrawing */ /* TODO maybe checking if we really need redrawing */
while( p_subpic->p_region ) subpicture_region_ChainDelete( 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 );
}
p_subpic->p_region = NULL; p_subpic->p_region = NULL;
/* FIXME check why this is needed */ /* FIXME check why this is needed */
...@@ -297,7 +292,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic, ...@@ -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_height = fmt.i_height;
p_subpic->i_original_picture_width = fmt.i_width; 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 ) if( p_spu_region )
{ {
......
...@@ -498,6 +498,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) ...@@ -498,6 +498,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
subpicture_t *p_spu; subpicture_t *p_spu;
subpicture_region_t *p_region; subpicture_region_t *p_region;
video_format_t fmt; video_format_t fmt;
video_palette_t palette;
int i; int i;
/* Allocate the subpicture internal data. */ /* Allocate the subpicture internal data. */
...@@ -515,11 +516,22 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_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_width = fmt.i_visible_width = p_sys->i_width;
fmt.i_height = fmt.i_visible_height = p_sys->i_height; fmt.i_height = fmt.i_visible_height = p_sys->i_height;
fmt.i_x_offset = fmt.i_y_offset = 0; 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 ) if( !p_region )
{ {
msg_Err( p_dec, "cannot allocate SPU 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; p_spu->p_region = p_region;
...@@ -527,16 +539,6 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) ...@@ -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_x = p_region->i_x * 3 / 4; /* FIXME: use aspect ratio for x? */
p_region->i_y = p_sys->i_y_start; 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 ); RenderImage( p_dec, p_data, p_region );
return p_spu; return p_spu;
......
...@@ -1500,6 +1500,7 @@ static subpicture_t *render( decoder_t *p_dec ) ...@@ -1500,6 +1500,7 @@ static subpicture_t *render( decoder_t *p_dec )
subpicture_region_t *p_spu_region; subpicture_region_t *p_spu_region;
uint8_t *p_src, *p_dst; uint8_t *p_src, *p_dst;
video_format_t fmt; video_format_t fmt;
video_palette_t palette;
int i_pitch; int i_pitch;
i_timeout = p_sys->p_page->i_timeout; i_timeout = p_sys->p_page->i_timeout;
...@@ -1545,19 +1546,7 @@ static subpicture_t *render( decoder_t *p_dec ) ...@@ -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_width = fmt.i_visible_width = p_region->i_width;
fmt.i_height = fmt.i_visible_height = p_region->i_height; fmt.i_height = fmt.i_visible_height = p_region->i_height;
fmt.i_x_offset = fmt.i_y_offset = 0; fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt ); fmt.p_palette = &palette;
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->i_entries = ( p_region->i_depth == 1 ) ? 4 : fmt.p_palette->i_entries = ( p_region->i_depth == 1 ) ? 4 :
( ( p_region->i_depth == 2 ) ? 16 : 256 ); ( ( p_region->i_depth == 2 ) ? 16 : 256 );
p_color = ( p_region->i_depth == 1 ) ? p_clut->c_2b : p_color = ( p_region->i_depth == 1 ) ? p_clut->c_2b :
...@@ -1570,6 +1559,18 @@ static subpicture_t *render( decoder_t *p_dec ) ...@@ -1570,6 +1559,18 @@ static subpicture_t *render( decoder_t *p_dec )
fmt.p_palette->palette[j][3] = 0xff - p_color[j].T; 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_src = p_region->p_pixbuf;
p_dst = p_spu_region->p_picture->Y_PIXELS; p_dst = p_spu_region->p_picture->Y_PIXELS;
i_pitch = p_spu_region->p_picture->Y_PITCH; i_pitch = p_spu_region->p_picture->Y_PITCH;
...@@ -1598,7 +1599,7 @@ static subpicture_t *render( decoder_t *p_dec ) ...@@ -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_width = fmt.i_visible_width = p_region->i_width;
fmt.i_height = fmt.i_visible_height = p_region->i_height; fmt.i_height = fmt.i_visible_height = p_region->i_height;
fmt.i_x_offset = fmt.i_y_offset = 0; 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 ) if( !p_region )
{ {
msg_Err( p_dec, "cannot allocate SPU 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 ...@@ -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; subpicture_region_t *p_bitmap_region = NULL;
int ret; int ret;
video_format_t fmt; video_format_t fmt;
video_format_t palette;
kate_tracker kin; kate_tracker kin;
bool tracker_valid = false; bool tracker_valid = false;
...@@ -620,6 +621,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t ...@@ -620,6 +621,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
#ifdef ENABLE_BITMAPS #ifdef ENABLE_BITMAPS
if (ev->bitmap && ev->bitmap->type==kate_bitmap_type_paletted && ev->palette) { if (ev->bitmap && ev->bitmap->type==kate_bitmap_type_paletted && ev->palette) {
/* create a separate region for the bitmap */ /* create a separate region for the bitmap */
memset( &fmt, 0, sizeof(video_format_t) ); memset( &fmt, 0, sizeof(video_format_t) );
fmt.i_chroma = VLC_FOURCC('Y','U','V','P'); 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 ...@@ -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_width = fmt.i_visible_width = ev->bitmap->width;
fmt.i_height = fmt.i_visible_height = ev->bitmap->height; fmt.i_height = fmt.i_visible_height = ev->bitmap->height;
fmt.i_x_offset = fmt.i_y_offset = 0; 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 ) if( !p_bitmap_region )
{ {
msg_Err( p_dec, "cannot allocate SPU 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 ...@@ -636,9 +640,6 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
return NULL; return NULL;
} }
/* create the palette */
CreateKatePalette( fmt.p_palette, ev->palette );
/* create the bitmap */ /* create the bitmap */
CreateKateBitmap( p_bitmap_region->p_picture, ev->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 ...@@ -651,7 +652,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
fmt.i_aspect = 0; fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0; fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 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 ) if( !p_spu->p_region )
{ {
msg_Err( p_dec, "cannot allocate SPU region" ); msg_Err( p_dec, "cannot allocate SPU region" );
......
...@@ -399,7 +399,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic, ...@@ -399,7 +399,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
fmt_region.i_height = fmt_region.i_height =
fmt_region.i_visible_height = region[i].y1 - region[i].y0; 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 ) if( !r )
break; break;
r->i_x = region[i].x0; r->i_x = region[i].x0;
...@@ -620,12 +620,7 @@ static void RegionDraw( subpicture_region_t *p_region, ass_image_t *p_img ) ...@@ -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 ) static void SubpictureReleaseRegions( spu_t *p_spu, subpicture_t *p_subpic )
{ {
while( p_subpic->p_region ) subpicture_region_ChainDelete( 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 );
}
p_subpic->p_region = NULL; p_subpic->p_region = NULL;
} }
......
...@@ -658,6 +658,7 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu, ...@@ -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; int i_x, i_y, i_len, i_color, i_pitch;
uint16_t *p_source = (uint16_t *)p_spu_data->p_data; uint16_t *p_source = (uint16_t *)p_spu_data->p_data;
video_format_t fmt; video_format_t fmt;
video_palette_t palette;
/* Create a new subpicture region */ /* Create a new subpicture region */
memset( &fmt, 0, sizeof(video_format_t) ); memset( &fmt, 0, sizeof(video_format_t) );
...@@ -667,19 +668,7 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu, ...@@ -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 - 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; p_spu_data->i_y_top_offset - p_spu_data->i_y_bottom_offset;
fmt.i_x_offset = fmt.i_y_offset = 0; fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt ); fmt.p_palette = &palette;
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->i_entries = 4; fmt.p_palette->i_entries = 4;
for( i_x = 0; i_x < fmt.p_palette->i_entries; i_x++ ) 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, ...@@ -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_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 */ /* 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 ) 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 ) ...@@ -418,7 +418,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
fmt.i_aspect = 0; fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0; fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 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 ) if( !p_spu->p_region )
{ {
msg_Err( p_dec, "cannot allocate SPU region" ); msg_Err( p_dec, "cannot allocate SPU region" );
......
...@@ -386,7 +386,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec, ...@@ -386,7 +386,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec,
fmt.i_aspect = 0; fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0; fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 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 ) if( p_text_region != NULL )
{ {
...@@ -396,7 +396,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec, ...@@ -396,7 +396,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec,
p_text_region->psz_html = strndup( psz_subtitle, i_len ); p_text_region->psz_html = strndup( psz_subtitle, i_len );
if( ! p_text_region->psz_html ) 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; return NULL;
} }
...@@ -1201,7 +1201,7 @@ static subpicture_region_t *LoadEmbeddedImage( decoder_t *p_dec, ...@@ -1201,7 +1201,7 @@ static subpicture_region_t *LoadEmbeddedImage( decoder_t *p_dec,
fmt_out.i_height = fmt_out.i_height =
fmt_out.i_visible_height = p_pic->format.i_visible_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 ) if( !p_region )
{ {
msg_Err( p_dec, "cannot allocate SPU 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 ) ...@@ -467,6 +467,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
subpicture_t *p_spu; subpicture_t *p_spu;
subpicture_region_t *p_region; subpicture_region_t *p_region;
video_format_t fmt; video_format_t fmt;
video_palette_t palette;
int i; int i;
/* Allocate the subpicture internal data. */ /* Allocate the subpicture internal data. */
...@@ -494,20 +495,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_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_width = fmt.i_visible_width = p_sys->i_width;
fmt.i_height = fmt.i_visible_height = p_sys->i_height; fmt.i_height = fmt.i_visible_height = p_sys->i_height;
fmt.i_x_offset = fmt.i_y_offset = 0; 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;
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->i_entries = 4; fmt.p_palette->i_entries = 4;
for( i = 0; i < fmt.p_palette->i_entries; i++ ) 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 ) ...@@ -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]; 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 ); SVCDSubRenderImage( p_dec, p_data, p_region );
return p_spu; return p_spu;
......
...@@ -708,7 +708,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -708,7 +708,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
fmt.i_aspect = 0; fmt.i_aspect = 0;
fmt.i_width = fmt.i_height = 0; fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 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 ) if( p_spu->p_region == NULL )
{ {
msg_Err( p_dec, "cannot allocate SPU region" ); 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, ...@@ -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; 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 ) if( p_spu->p_region == NULL )
{ {
msg_Err( p_dec, "cannot allocate SPU region" ); msg_Err( p_dec, "cannot allocate SPU region" );
......
...@@ -347,8 +347,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date ) ...@@ -347,8 +347,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
{ {
subpicture_region_t *p_region; subpicture_region_t *p_region;
*pp_region = p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), *pp_region = p_region = subpicture_region_New( &p_overlay->format );
&p_overlay->format );
if( !p_region ) if( !p_region )
break; break;
......
...@@ -864,7 +864,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date ) ...@@ -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_width = fmt.i_visible_width = p_pic->p[Y_PLANE].i_visible_pitch;