[vlc-devel] [RFC 2/3] subtitles: fix misplaced subs on video resize

Salah-Eddin Shaban salah at videolan.org
Wed Mar 1 14:37:03 CET 2017


---
 include/vlc_subpicture.h            |  2 ++
 src/misc/subpicture.c               |  6 ++++++
 src/video_output/vout_subpictures.c | 10 ++++------
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/include/vlc_subpicture.h b/include/vlc_subpicture.h
index aa2ed0d..b64fa64 100644
--- a/include/vlc_subpicture.h
+++ b/include/vlc_subpicture.h
@@ -61,6 +61,8 @@ struct subpicture_region_t
 
     int             i_x;                             /**< position of region */
     int             i_y;                             /**< position of region */
+    int             i_original_x;
+    int             i_original_y;
     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;
     }
 
     /* */
-- 
2.6.6



More information about the vlc-devel mailing list