[vlc-commits] Fixed subpicture rendering when render size != source size.

Laurent Aimar git at videolan.org
Sat Feb 12 20:05:46 CET 2011


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sat Feb 12 19:34:59 2011 +0100| [48e64493fbe215db7f96609ad0e6b54b089b695d] | committer: Laurent Aimar

Fixed subpicture rendering when render size != source size.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=48e64493fbe215db7f96609ad0e6b54b089b695d
---

 src/video_output/vout_subpictures.c |   76 +++++++++++++++--------------------
 1 files changed, 32 insertions(+), 44 deletions(-)

diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c
index 7351c08..524bf20 100644
--- a/src/video_output/vout_subpictures.c
+++ b/src/video_output/vout_subpictures.c
@@ -326,7 +326,7 @@ static spu_scale_t spu_scale_unit( void )
 {
     return spu_scale_create( SCALE_UNIT, SCALE_UNIT );
 }
-static spu_scale_t spu_scale_createq( int wn, int wd, int hn, int hd )
+static spu_scale_t spu_scale_createq( int64_t wn, int64_t wd, int64_t hn, int64_t hd )
 {
     return spu_scale_create( wn * SCALE_UNIT / wd,
                              hn * SCALE_UNIT / hd );
@@ -1075,8 +1075,6 @@ static subpicture_t *SpuRenderSubpictures( spu_t *p_spu,
         p_subtitle_area = calloc( i_subtitle_region_count, sizeof(*p_subtitle_area) );
 
     /* Process all subpictures and regions (in the right order) */
-    const int i_source_video_width  = p_fmt_src->i_width;
-    const int i_source_video_height = p_fmt_src->i_height;
     for( unsigned int i_index = 0; i_index < i_subpicture; i_index++ )
     {
         subpicture_t *p_subpic = pp_subpicture[i_index];
@@ -1085,59 +1083,33 @@ static subpicture_t *SpuRenderSubpictures( spu_t *p_spu,
         if( !p_subpic->p_region )
             continue;
 
-        /* FIXME when possible use a better rendering size than source size
-         * (max of display size and source size for example) FIXME */
-        int i_render_width  = p_subpic->i_original_picture_width;
-        int i_render_height = p_subpic->i_original_picture_height;
-        if( !i_render_width || !i_render_height )
+        if( p_subpic->i_original_picture_width  <= 0 ||
+            p_subpic->i_original_picture_height <= 0 )
         {
-            if( i_render_width != 0 || i_render_height != 0 )
-                msg_Err( p_spu, "unsupported original picture size %dx%d",
-                         i_render_width, i_render_height );
+            if( p_subpic->i_original_picture_width  > 0 ||
+                p_subpic->i_original_picture_height > 0 )
+                msg_Err( p_spu, "original picture size %dx%d is unsupported",
+                         p_subpic->i_original_picture_width,
+                         p_subpic->i_original_picture_height );
+            else
+                msg_Warn( p_spu, "original picture size is undefined" );
 
-            p_subpic->i_original_picture_width  = i_render_width = i_source_video_width;
-            p_subpic->i_original_picture_height = i_render_height = i_source_video_height;
+            p_subpic->i_original_picture_width  = p_fmt_src->i_width;
+            p_subpic->i_original_picture_height = p_fmt_src->i_height;
         }
 
         if( p_sys->p_text )
         {
+            /* FIXME aspect ratio ? */
             p_sys->p_text->fmt_out.video.i_width          =
-            p_sys->p_text->fmt_out.video.i_visible_width  = i_render_width;
+            p_sys->p_text->fmt_out.video.i_visible_width  = p_subpic->i_original_picture_width;
 
             p_sys->p_text->fmt_out.video.i_height         =
-            p_sys->p_text->fmt_out.video.i_visible_height = i_render_height;
+            p_sys->p_text->fmt_out.video.i_visible_height = p_subpic->i_original_picture_height;
 
             var_SetInteger( p_sys->p_text, "scale", SCALE_UNIT );
         }
 
-        /* Compute scaling from picture to source size */
-        spu_scale_t scale = spu_scale_createq( i_source_video_width,  i_render_width,
-                                               i_source_video_height, i_render_height );
-
-        /* Update scaling from source size to display size(p_fmt_dst) */
-        scale.w = scale.w * p_fmt_dst->i_width  / i_source_video_width;
-        scale.h = scale.h * p_fmt_dst->i_height / i_source_video_height;
-
-        /* Set default subpicture aspect ratio
-         * FIXME if we only handle 1 aspect ratio per picture, why is it set per
-         * region ? */
-        p_region = p_subpic->p_region;
-        if( !p_region->fmt.i_sar_num || !p_region->fmt.i_sar_den )
-        {
-            p_region->fmt.i_sar_den = p_fmt_src->i_sar_den;
-            p_region->fmt.i_sar_num = p_fmt_src->i_sar_num;
-        }
-
-        /* Take care of the aspect ratio */
-        if( p_region->fmt.i_sar_num * p_fmt_src->i_sar_den !=
-            p_region->fmt.i_sar_den * p_fmt_src->i_sar_num )
-        {
-            /* FIXME FIXME what about region->i_x/i_y ? */
-            scale.w = scale.w *
-                (int64_t)p_region->fmt.i_sar_num * p_fmt_dst->i_sar_den /
-                p_region->fmt.i_sar_den / p_fmt_dst->i_sar_num;
-        }
-
         /* Render all regions
          * We always transform non absolute subtitle into absolute one on the
          * first rendering to allow good subtitle overlap support.
@@ -1146,6 +1118,23 @@ static subpicture_t *SpuRenderSubpictures( spu_t *p_spu,
         {
             spu_area_t area;
 
+            /* Compute region scale AR */
+            video_format_t region_fmt =p_region->fmt;
+            if( region_fmt.i_sar_num <= 0 || region_fmt.i_sar_den <= 0 )
+            {
+                region_fmt.i_sar_num = p_fmt_src->i_sar_num;
+                region_fmt.i_sar_den = p_fmt_src->i_sar_den;
+            }
+
+            /* Compute scaling from original size to destination size
+             * FIXME The current scaling ensure that the heights match, the width being
+             * cropped.
+             */
+            spu_scale_t scale= spu_scale_createq( (int64_t)p_fmt_dst->i_height                 * p_fmt_dst->i_sar_den * region_fmt.i_sar_num,
+                                                  (int64_t)p_subpic->i_original_picture_height * p_fmt_dst->i_sar_num * region_fmt.i_sar_den,
+                                                  p_fmt_dst->i_height,
+                                                  p_subpic->i_original_picture_height );
+
             /* Check scale validity */
             if( scale.w <= 0 || scale.h <= 0 )
                 continue;
@@ -1156,7 +1145,6 @@ static subpicture_t *SpuRenderSubpictures( spu_t *p_spu,
                              p_chroma_list, p_fmt_dst,
                              p_subtitle_area, i_subtitle_area,
                              p_subpic->b_subtitle ? render_subtitle_date : render_osd_date );
-
             if( *pp_output_last )
                 pp_output_last = &(*pp_output_last)->p_next;
 



More information about the vlc-commits mailing list