From f0c76d5063ea5929f8b514e3bc5b0681cdf8d35e Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Sat, 20 Sep 2008 23:51:02 +0200 Subject: [PATCH] Clean up a bit subpicture region API. --- include/vlc_osd.h | 4 - include/vlc_vout.h | 28 +++++-- modules/codec/cc.c | 2 +- modules/codec/csri.c | 9 +-- modules/codec/cvdsub.c | 26 ++++--- modules/codec/dvbsub.c | 29 ++++---- modules/codec/kate.c | 11 +-- modules/codec/libass.c | 9 +-- modules/codec/spudec/parse.c | 27 +++---- modules/codec/subtitles/subsdec.c | 2 +- modules/codec/subtitles/subsusf.c | 6 +- modules/codec/svcdsub.c | 28 +++---- modules/codec/telx.c | 2 +- modules/codec/zvbi.c | 2 +- .../dynamicoverlay/dynamicoverlay.c | 3 +- modules/video_filter/logo.c | 2 +- modules/video_filter/marq.c | 2 +- modules/video_filter/mosaic.c | 4 +- modules/video_filter/osdmenu.c | 28 ++++--- modules/video_filter/remoteosd.c | 2 +- modules/video_filter/rss.c | 4 +- src/libvlccore.sym | 4 +- src/osd/osd_text.c | 2 +- src/osd/osd_widgets.c | 2 +- src/video_output/video_text.c | 2 +- src/video_output/vout_intf.c | 2 +- src/video_output/vout_subpictures.c | 74 ++++++++----------- 27 files changed, 153 insertions(+), 163 deletions(-) diff --git a/include/vlc_osd.h b/include/vlc_osd.h index d1322f7b77..d90fc559f1 100644 --- a/include/vlc_osd.h +++ b/include/vlc_osd.h @@ -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 ) ); /** diff --git a/include/vlc_vout.h b/include/vlc_vout.h index 6c2b6ffef4..c10710aa34 100644 --- a/include/vlc_vout.h +++ b/include/vlc_vout.h @@ -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 ); diff --git a/modules/codec/cc.c b/modules/codec/cc.c index f575f669f6..77abe71cb8 100644 --- a/modules/codec/cc.c +++ b/modules/codec/cc.c @@ -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" ); diff --git a/modules/codec/csri.c b/modules/codec/csri.c index 919e086f62..681a671aaf 100644 --- a/modules/codec/csri.c +++ b/modules/codec/csri.c @@ -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 ) { diff --git a/modules/codec/cvdsub.c b/modules/codec/cvdsub.c index eb934b5ca7..e5f31496b5 100644 --- a/modules/codec/cvdsub.c +++ b/modules/codec/cvdsub.c @@ -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; diff --git a/modules/codec/dvbsub.c b/modules/codec/dvbsub.c index baf589c101..9937a6a626 100644 --- a/modules/codec/dvbsub.c +++ b/modules/codec/dvbsub.c @@ -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" ); diff --git a/modules/codec/kate.c b/modules/codec/kate.c index b8646aef1c..be89e97ddd 100644 --- a/modules/codec/kate.c +++ b/modules/codec/kate.c @@ -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" ); diff --git a/modules/codec/libass.c b/modules/codec/libass.c index 38242bf618..754ec54da6 100644 --- a/modules/codec/libass.c +++ b/modules/codec/libass.c @@ -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; } diff --git a/modules/codec/spudec/parse.c b/modules/codec/spudec/parse.c index 4e118e02b1..f2c404faac 100644 --- a/modules/codec/spudec/parse.c +++ b/modules/codec/spudec/parse.c @@ -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 ) { diff --git a/modules/codec/subtitles/subsdec.c b/modules/codec/subtitles/subsdec.c index b502f8b42c..4e053a149a 100644 --- a/modules/codec/subtitles/subsdec.c +++ b/modules/codec/subtitles/subsdec.c @@ -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" ); diff --git a/modules/codec/subtitles/subsusf.c b/modules/codec/subtitles/subsusf.c index b03be78b8d..45bebedf7d 100644 --- a/modules/codec/subtitles/subsusf.c +++ b/modules/codec/subtitles/subsusf.c @@ -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" ); diff --git a/modules/codec/svcdsub.c b/modules/codec/svcdsub.c index 5a1ecbfb8e..c8572bdbd8 100644 --- a/modules/codec/svcdsub.c +++ b/modules/codec/svcdsub.c @@ -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; diff --git a/modules/codec/telx.c b/modules/codec/telx.c index 6da895d0d2..a0ab9068eb 100644 --- a/modules/codec/telx.c +++ b/modules/codec/telx.c @@ -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" ); diff --git a/modules/codec/zvbi.c b/modules/codec/zvbi.c index 5e26f457a9..e716f90f1a 100644 --- a/modules/codec/zvbi.c +++ b/modules/codec/zvbi.c @@ -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" ); diff --git a/modules/video_filter/dynamicoverlay/dynamicoverlay.c b/modules/video_filter/dynamicoverlay/dynamicoverlay.c index 7c1cc11b8e..03a3fd6e1f 100644 --- a/modules/video_filter/dynamicoverlay/dynamicoverlay.c +++ b/modules/video_filter/dynamicoverlay/dynamicoverlay.c @@ -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; diff --git a/modules/video_filter/logo.c b/modules/video_filter/logo.c index 52de127820..4c7594f0c8 100644 --- a/modules/video_filter/logo.c +++ b/modules/video_filter/logo.c @@ -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" ); diff --git a/modules/video_filter/marq.c b/modules/video_filter/marq.c index 030442b65d..3accc63125 100644 --- a/modules/video_filter/marq.c +++ b/modules/video_filter/marq.c @@ -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 ); diff --git a/modules/video_filter/mosaic.c b/modules/video_filter/mosaic.c index 169155d7ab..6bbdb4a0f6 100644 --- a/modules/video_filter/mosaic.c +++ b/modules/video_filter/mosaic.c @@ -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 ); diff --git a/modules/video_filter/osdmenu.c b/modules/video_filter/osdmenu.c index b83fa13650..5cf4d0665e 100644 --- a/modules/video_filter/osdmenu.c +++ b/modules/video_filter/osdmenu.c @@ -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; } diff --git a/modules/video_filter/remoteosd.c b/modules/video_filter/remoteosd.c index 276a999ba7..95e71c2fa7 100644 --- a/modules/video_filter/remoteosd.c +++ b/modules/video_filter/remoteosd.c @@ -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" ); diff --git a/modules/video_filter/rss.c b/modules/video_filter/rss.c index 3894d9dac8..9639e6e0e7 100644 --- a/modules/video_filter/rss.c +++ b/modules/video_filter/rss.c @@ -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" ); diff --git a/src/libvlccore.sym b/src/libvlccore.sym index e95f1d4830..12a9e2e9a9 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -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 diff --git a/src/osd/osd_text.c b/src/osd/osd_text.c index ea2c969ac4..0657c2d920 100644 --- a/src/osd/osd_text.c +++ b/src/osd/osd_text.c @@ -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" ); diff --git a/src/osd/osd_widgets.c b/src/osd/osd_widgets.c index 2d384d1b4c..7676516507 100644 --- a/src/osd/osd_widgets.c +++ b/src/osd/osd_widgets.c @@ -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" ); diff --git a/src/video_output/video_text.c b/src/video_output/video_text.c index a0499bb0e6..2fef025deb 100644 --- a/src/video_output/video_text.c +++ b/src/video_output/video_text.c @@ -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" ); diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c index a57e88bacc..2b95da0dde 100644 --- a/src/video_output/vout_intf.c +++ b/src/video_output/vout_intf.c @@ -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 ); diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index 6988b0ef93..c10b35119f 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -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 ); } -- 2.39.2