X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvout_subpictures.c;h=6531492e1daaa2947a05a931b436cdca2bccde0a;hb=42e7d91c277a879cb3fed58fa68836168e4e5208;hp=3b778f7d82b20e9acf173e0dd0533321da71c7cf;hpb=fc94b7cfcecc8bbac7ab2d9981bb1677262370cd;p=vlc diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index 3b778f7d82..6531492e1d 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -26,6 +26,10 @@ /***************************************************************************** * Preamble *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include #include #include @@ -158,7 +162,7 @@ int spu_ParseChain( spu_t *p_spu ) msg_Dbg( p_spu, "no sub filter found" ); config_ChainDestroy( p_spu->pp_filter[p_spu->i_filter]->p_cfg ); vlc_object_detach( p_spu->pp_filter[p_spu->i_filter] ); - vlc_object_destroy( p_spu->pp_filter[p_spu->i_filter] ); + vlc_object_release( p_spu->pp_filter[p_spu->i_filter] ); } if( p_spu->i_filter >= 10 ) @@ -168,7 +172,7 @@ int spu_ParseChain( spu_t *p_spu ) free( psz_name ); } - if( val.psz_string ) free( val.psz_string ); + free( val.psz_string ); return VLC_SUCCESS; } @@ -199,7 +203,7 @@ void spu_Destroy( spu_t *p_spu ) module_Unneed( p_spu->p_blend, p_spu->p_blend->p_module ); vlc_object_detach( p_spu->p_blend ); - vlc_object_destroy( p_spu->p_blend ); + vlc_object_release( p_spu->p_blend ); } if( p_spu->p_text ) @@ -208,7 +212,7 @@ void spu_Destroy( spu_t *p_spu ) module_Unneed( p_spu->p_text, p_spu->p_text->p_module ); vlc_object_detach( p_spu->p_text ); - vlc_object_destroy( p_spu->p_text ); + vlc_object_release( p_spu->p_text ); } if( p_spu->p_scale ) @@ -217,13 +221,13 @@ void spu_Destroy( spu_t *p_spu ) module_Unneed( p_spu->p_scale, p_spu->p_scale->p_module ); vlc_object_detach( p_spu->p_scale ); - vlc_object_destroy( p_spu->p_scale ); + vlc_object_release( p_spu->p_scale ); } spu_DeleteChain( p_spu ); vlc_mutex_destroy( &p_spu->subpicture_lock ); - vlc_object_destroy( p_spu ); + vlc_object_release( p_spu ); } static void spu_DeleteChain( spu_t *p_spu ) @@ -237,7 +241,7 @@ static void spu_DeleteChain( spu_t *p_spu ) free( p_spu->pp_filter[p_spu->i_filter]->p_owner ); config_ChainDestroy( p_spu->pp_filter[p_spu->i_filter]->p_cfg ); vlc_object_detach( p_spu->pp_filter[p_spu->i_filter] ); - vlc_object_destroy( p_spu->pp_filter[p_spu->i_filter] ); + vlc_object_release( p_spu->pp_filter[p_spu->i_filter] ); } } @@ -276,7 +280,7 @@ void spu_Attach( spu_t *p_spu, vlc_object_t *p_this, vlc_bool_t b_attach ) */ static void RegionPictureRelease( picture_t *p_pic ) { - if( p_pic->p_data_orig ) free( p_pic->p_data_orig ); + free( p_pic->p_data_orig ); } subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this, video_format_t *p_fmt ) @@ -306,7 +310,7 @@ subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this, if( !p_region->picture.i_planes ) { free( p_region ); - if( p_fmt->p_palette ) free( p_fmt->p_palette ); + free( p_fmt->p_palette ); return NULL; } @@ -358,13 +362,11 @@ void __spu_DestroyRegion( vlc_object_t *p_this, subpicture_region_t *p_region ) if( !p_region ) return; if( p_region->picture.pf_release ) p_region->picture.pf_release( &p_region->picture ); - if( p_region->fmt.p_palette ) free( p_region->fmt.p_palette ); + free( p_region->fmt.p_palette ); if( p_region->p_cache ) __spu_DestroyRegion( p_this, p_region->p_cache ); - if( p_region->psz_text ) - free( p_region->psz_text ); - if( p_region->psz_html ) - free( p_region->psz_html ); + free( p_region->psz_text ); + free( p_region->psz_html ); //free( p_region->p_style ); FIXME --fenrir plugin does not allocate the memory for it. I think it might lead to segfault, video renderer can live longer than the decoder free( p_region ); } @@ -513,16 +515,35 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, subpicture_t *p_subpic, int i_scale_width_orig, int i_scale_height_orig ) { - int i_source_video_width = p_fmt->i_width * 1000 / i_scale_width_orig; - int i_source_video_height = p_fmt->i_height * 1000 / i_scale_height_orig; + int i_source_video_width; + int i_source_video_height; + subpicture_t *p_subpic_v = p_subpic; /* Get lock */ vlc_mutex_lock( &p_spu->subpicture_lock ); + for( p_subpic_v = p_subpic; + p_subpic_v != NULL && p_subpic_v->i_status != FREE_SUBPICTURE; + p_subpic_v = p_subpic_v->p_next ) + { + if( p_subpic_v->pf_pre_render ) + { + p_subpic_v->pf_pre_render( p_fmt, p_spu, p_subpic_v, mdate() ); + } + } + + if( i_scale_width_orig <= 0 ) + i_scale_width_orig = 1; + if( i_scale_height_orig <= 0 ) + i_scale_height_orig = 1; + + i_source_video_width = p_fmt->i_width * 1000 / i_scale_width_orig; + i_source_video_height = p_fmt->i_height * 1000 / i_scale_height_orig; + /* Check i_status again to make sure spudec hasn't destroyed the subpic */ while( ( p_subpic != NULL ) && ( p_subpic->i_status != FREE_SUBPICTURE ) ) { - subpicture_region_t *p_region = p_subpic->p_region; + subpicture_region_t *p_region; int pi_scale_width[ SCALE_SIZE ]; int pi_scale_height[ SCALE_SIZE ]; int pi_subpic_x[ SCALE_SIZE ]; @@ -542,6 +563,18 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, for( k = 0; k < SCALE_SIZE ; k++ ) pi_subpic_x[ k ] = p_subpic->i_x; + if( p_subpic->pf_update_regions ) + { + if ( p_subpic->p_region ) { + spu_DestroyRegion( p_spu, p_subpic->p_region ); + } + p_subpic->p_region = p_region = p_subpic->pf_update_regions( p_fmt, p_spu, p_subpic, mdate() ); + } + else + { + p_region = p_subpic->p_region; + } + /* Load the blending module */ if( !p_spu->p_blend && p_region ) { @@ -552,7 +585,8 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, p_spu->p_blend->fmt_out.video.i_aspect = p_fmt->i_aspect; p_spu->p_blend->fmt_out.video.i_chroma = p_fmt->i_chroma; - /* The blend module will be loaded when needed with the real input format */ + /* The blend module will be loaded when needed with the real + * input format */ memset( &p_spu->p_blend->fmt_in, 0, sizeof(p_spu->p_blend->fmt_in) ); p_spu->p_blend->p_module = NULL; } @@ -590,19 +624,20 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, p_spu->p_text->p_module = module_Need( p_spu->p_text, "text renderer", 0, 0 ); } - if( psz_modulename ) free( psz_modulename ); + free( psz_modulename ); } if( p_spu->p_text ) { subpicture_region_t *p_text_region = p_subpic->p_region; - /* Only overwrite the size fields if the region is still in pre-rendered - * TEXT format. We have to traverse the subregion list because if more - * than one subregion is present, the text region isn't guarentteed to - * be the first in the list, and only text regions use this flag. - * All of this effort assists with the rescaling of text that has been - * rendered at native resolution, rather than video resolution. + /* Only overwrite the size fields if the region is still in + * pre-rendered TEXT format. We have to traverse the subregion + * list because if more than one subregion is present, the text + * region isn't guarentteed to be the first in the list, and + * only text regions use this flag. All of this effort assists + * with the rescaling of text that has been rendered at native + * resolution, rather than video resolution. */ while( p_text_region && ( p_text_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') ) ) @@ -610,7 +645,7 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, p_text_region = p_text_region->p_next; } - if( p_text_region && + if( p_text_region && ( ( p_text_region->i_align & SUBPICTURE_RENDERED ) == 0 ) ) { if( (p_subpic->i_original_picture_height > 0) && @@ -657,12 +692,12 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, for( k = 0; k < SCALE_SIZE ; k++ ) { - /* Case of both width and height being specified has been dealt with - * above by instead rendering to an output pane of the explicit - * dimensions specified - we don't need to scale it. + /* Case of both width and height being specified has been dealt + * with above by instead rendering to an output pane of the + * explicit dimensions specified - we don't need to scale it. */ if( (p_subpic->i_original_picture_height > 0) && - (p_subpic->i_original_picture_width <= 0) ) + (p_subpic->i_original_picture_width <= 0) ) { pi_scale_height[ k ] = pi_scale_height[ k ] * i_source_video_height / p_subpic->i_original_picture_height; @@ -671,7 +706,6 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, } } - /* Set default subpicture aspect ratio */ if( p_region && p_region->fmt.i_aspect && ( !p_region->fmt.i_sar_num || !p_region->fmt.i_sar_den ) ) @@ -687,7 +721,7 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, } /* Take care of the aspect ratio */ - if( p_region && + if( p_region && ( ( p_region->fmt.i_sar_num * p_fmt->i_sar_den ) != ( p_region->fmt.i_sar_den * p_fmt->i_sar_num ) ) ) { @@ -816,7 +850,7 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, } /* Scale SPU if necessary */ - if( p_region->p_cache && + if( p_region->p_cache && ( p_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') ) ) { if( pi_scale_width[ i_scale_idx ] * p_region->fmt.i_width / 1000 != @@ -830,9 +864,9 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, } } - if( ( ( pi_scale_width[ i_scale_idx ] != 1000 ) || + if( ( ( pi_scale_width[ i_scale_idx ] != 1000 ) || ( pi_scale_height[ i_scale_idx ] != 1000 ) ) && - ( ( pi_scale_width[ i_scale_idx ] > 0 ) || + ( ( pi_scale_width[ i_scale_idx ] > 0 ) || ( pi_scale_height[ i_scale_idx ] > 0 ) ) && p_spu->p_scale && !p_region->p_cache && ( p_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') ) ) @@ -1009,7 +1043,6 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, } } - i_x_offset = __MAX( i_x_offset, 0 ); i_y_offset = __MAX( i_y_offset, 0 ); @@ -1300,8 +1333,8 @@ static void sub_del_buffer( filter_t *p_filter, subpicture_t *p_subpic ) static subpicture_t *spu_new_buffer( filter_t *p_filter ) { - subpicture_t *p_subpic = (subpicture_t *)malloc(sizeof(subpicture_t)); (void)p_filter; + subpicture_t *p_subpic = (subpicture_t *)malloc(sizeof(subpicture_t)); if( !p_subpic ) return NULL; memset( p_subpic, 0, sizeof(subpicture_t) ); p_subpic->b_absolute = VLC_TRUE; @@ -1348,22 +1381,23 @@ static picture_t *spu_new_video_buffer( filter_t *p_filter ) static void spu_del_video_buffer( filter_t *p_filter, picture_t *p_pic ) { (void)p_filter; - if( p_pic && p_pic->p_data_orig ) free( p_pic->p_data_orig ); - if( p_pic ) free( p_pic ); + if( p_pic ) + { + free( p_pic->p_data_orig ); + free( p_pic ); + } } static int SubFilterCallback( vlc_object_t *p_object, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { - (void)p_object; (void)oldval; (void)newval; + VLC_UNUSED(p_object); VLC_UNUSED(oldval); + VLC_UNUSED(newval); VLC_UNUSED(psz_var); - if( !strcmp( psz_var, "sub-filter" ) ) - { - spu_t *p_spu = (spu_t *)p_data; - vlc_mutex_lock( &p_spu->subpicture_lock ); - spu_DeleteChain( p_spu ); - spu_ParseChain( p_spu ); - vlc_mutex_unlock( &p_spu->subpicture_lock ); - } + spu_t *p_spu = (spu_t *)p_data; + vlc_mutex_lock( &p_spu->subpicture_lock ); + spu_DeleteChain( p_spu ); + spu_ParseChain( p_spu ); + vlc_mutex_unlock( &p_spu->subpicture_lock ); return VLC_SUCCESS; }