[vlc-devel] [PATCH 3/3] Subtitles: fix misplaced subs on video resize

Rémi Denis-Courmont remi at remlab.net
Fri Mar 3 18:14:28 CET 2017


Le perjantaina 3. maaliskuuta 2017, 19.05.53 EET Salah-Eddin Shaban a écrit :
> When handling of overlapped subtitles was introduced all subtitles were
> marked as absolute on first rendering. This caused the position to be
> calculated only once and not be updated when the video size changed. ---
>  include/vlc_subpicture.h            |  8 ++++++++
>  src/misc/subpicture.c               |  6 ++++++
>  src/video_output/vout_subpictures.c | 10 ++++------
>  3 files changed, 18 insertions(+), 6 deletions(-)
> 
> diff --git a/include/vlc_subpicture.h b/include/vlc_subpicture.h
> index aa2ed0d..3c07a2a 100644
> --- a/include/vlc_subpicture.h
> +++ b/include/vlc_subpicture.h
> @@ -61,6 +61,14 @@ struct subpicture_region_t
> 
>      int             i_x;                             /**< position of
> region */ int             i_y;                             /**< position of
> region */ +
> +    /**
> +     * used to save region position in case it has to be changed
> +     * temporarily e.g. because of overlapped subtitles
> +     */
> +    int             i_original_x;
> +    int             i_original_y;
> +

Frankly, it looks like a kludge around a kludge. I do not know the SPU code 
much but I doubt that this is right.

What if multiple resize occur in short succession? It´s actually likely when 
the user drags the edge of the window.

>      int             i_align;                  /**< alignment within a
> region */
> int             i_alpha;                               /**< transparency */
> 
> diff --git a/src/misc/subpicture.c b/src/misc/subpicture.c
> index f18be17..9f8eb1c 100644
> --- a/src/misc/subpicture.c
> +++ b/src/misc/subpicture.c
> @@ -170,6 +170,12 @@ void subpicture_Update( subpicture_t *p_subpicture,
> 
>      p_upd->pf_update( p_subpicture, p_fmt_src, p_fmt_dst, i_ts );
> 
> +    for( subpicture_region_t *r = p_subpicture->p_region; r; r = r->p_next
> ) +    {
> +        r->i_original_x = r->i_x;
> +        r->i_original_y = r->i_y;
> +    }
> +
>      video_format_Clean( &p_private->src );
>      video_format_Clean( &p_private->dst );
> 
> diff --git a/src/video_output/vout_subpictures.c
> b/src/video_output/vout_subpictures.c index bbccaf4..cc3bf57 100644
> --- a/src/video_output/vout_subpictures.c
> +++ b/src/video_output/vout_subpictures.c
> @@ -1024,13 +1024,13 @@ static subpicture_t *SpuRenderSubpictures(spu_t
> *spu, sys->text->fmt_out.video.i_visible_height =
> subpic->i_original_picture_height; }
> 
> -        /* Render all regions
> -         * We always transform non absolute subtitle into absolute one on
> the -         * first rendering to allow good subtitle overlap support. -  
>       */
> +        /* Render all regions */
>          for (region = subpic->p_region; region != NULL; region =
> region->p_next) { spu_area_t area;
> 
> +            region->i_x = region->i_original_x;
> +            region->i_y = region->i_original_y;
> +
>              /* Compute region scale AR */
>              video_format_t region_fmt = region->fmt;
>              if (region_fmt.i_sar_num <= 0 || region_fmt.i_sar_den <= 0) {
> @@ -1072,8 +1072,6 @@ static subpicture_t *SpuRenderSubpictures(spu_t *spu,
>                      subtitle_area[subtitle_area_count++] = area;
>              }
>          }
> -        if (subpic->b_subtitle && subpic->p_region)
> -            subpic->b_absolute = true;
>      }
> 
>      /* */


-- 
雷米‧德尼-库尔蒙
https://www.remlab.net/



More information about the vlc-devel mailing list