diff --git a/include/vlc_osd.h b/include/vlc_osd.h index d1322f7b7731320b7a2131c689e5966441a54b59..d90fc559f11a829b01a5f55aa9d4e3e91794e4f7 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 6c2b6ffef402c8166a7e7a9204fcf209613ef194..c10710aa3482ac0086fabd02602772d90da2b2c6 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 f575f669f645544c0468c4a615234e66d7dd6c7c..77abe71cb8559ab14f3f97a7b3c7e20eaebb38f4 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 919e086f628c3dd28f8d0b9a9d71850383db7163..681a671aaf4df3f395c28d4a2246de2af4a18f07 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 eb934b5ca75143e70f1ad277c1779ac3410f2b43..e5f31496b523847a2e0b774135c3a8a492cc31cb 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 baf589c101115745cbca36c7fadc4d7664016c8f..9937a6a6266274dfeaf1f9f184f7f65cc9e0e89d 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 b8646aef1cea6b578da0a4ea90dd0df9554e9491..be89e97ddd3289fc44ad0cd16aa38c4c364000b7 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 38242bf61831cb4f25c4259ae39c64f6152b48d9..754ec54da6dd07e74129702551720a49e2eec181 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 4e118e02b180af03793a7989899e57e3446f2d82..f2c404faaccd0dc3ccca024f9ddf6b4f8b0dc691 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 b502f8b42c9f03438619a233d3f5198257689ed1..4e053a149a5bc2efb9432db67b4fbccad60d84d1 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 b03be78b8d6661ed11a0c60cb302405eb37412d3..45bebedf7de9f446680652a8f9951c6003b371a9 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 5a1ecbfb8ee42400176af1b3e8718271ba7b16bd..c8572bdbd8cb605a650adba2e531a3838e968bc9 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 6da895d0d279acc5da1915c9f4243884c9683c67..a0ab9068eb23a7274aa29f9c34cafa9bb4e367c3 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 5e26f457a97b63a2f38dda99a2b28fe2459c31fb..e716f90f1a9ea80675c6f8fdaf052caf2f13fc61 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 7c1cc11b8eedd2142b028bca6a242367bcba391d..03a3fd6e1fcfc9f929bdb30b240e9c11d029ff50 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 52de12782095362bf5eeaef9f6bd66b08130de34..4c7594f0c8e7ab73c670e1bf788cf11308368843 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 030442b65dea8a8cf37096bbbd663ff9d0c6f54d..3accc6312512baf16bf055fa3b93dac8868b7d3f 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 169155d7ab023dc364e31fc64e8177033ef204a6..6bbdb4a0f62f1a9114f0e809a1405d24d4f22889 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 b83fa136507a1d55a10b5e69243cb63209f515df..5cf4d0665e7fadef8a73d8353b42800c65a05a15 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 276a999ba70b6872e4ca3d11b7509b7c9daa1475..95e71c2fa7182c6dcb0f2932700b804a9204a102 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 3894d9dac8c637f367bd1087ef5ec5aac66a0722..9639e6e0e72c69192cb0488dc275ea5f5a77116c 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 e95f1d4830e4dd10126cfb2bd22412ecfbd0e1bc..12a9e2e9a9fa19ae203890499afc02480c9593c9 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 ea2c969ac4d6919b7fffd127fb694d922b227bb5..0657c2d920cdbac54ead36c303f8c1e90354a2c5 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 2d384d1b4cd3f4a16ba1983c77acc7f2d832d3c3..76765165074b73c5571c4f66750326c6f3c762b1 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 a0499bb0e66cf1eb692d3851e9e73c5d757ea965..2fef025debbf7dff8dc1b52e59a7c100fce8307b 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 a57e88bacca98aaf222855670064136c51bece24..2b95da0dde40451e80938691867f8d8fbb69ec77 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 6988b0ef93ed9d37923809f475d4209fe0ba7ccf..c10b35119f073666c17a517dfd5f8dcef4da585d 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 ); }