[vlc-commits] transcode: set visible resolution correctly

Rafaël Carré git at videolan.org
Mon Sep 9 12:13:47 CEST 2013


vlc | branch: master | Rafaël Carré <funman at videolan.org> | Mon Sep  9 12:10:29 2013 +0200| [34026a50abd88ad66233af2557e0b3539afed6ec] | committer: Rafaël Carré

transcode: set visible resolution correctly

Fix needed after b71c85b3d88b8
Encoders should use i_visible_width / i_visible_height

Refs #9147

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

 modules/stream_out/transcode/video.c |   67 +++++++++++++++++-----------------
 1 file changed, 33 insertions(+), 34 deletions(-)

diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index 5e07ca2..2b59a64 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -344,17 +344,13 @@ static void transcode_video_encoder_init( sout_stream_t *p_stream,
 
     /* Calculate scaling
      * width/height of source */
-    int i_src_width = p_fmt_out->video.i_width;
-    int i_src_height = p_fmt_out->video.i_height;
+    int i_src_visible_width = p_fmt_out->video.i_visible_width;
+    int i_src_visible_height = p_fmt_out->video.i_visible_height;
 
     /* with/height scaling */
     float f_scale_width = 1;
     float f_scale_height = 1;
 
-    /* width/height of output stream */
-    int i_dst_width;
-    int i_dst_height;
-
     /* aspect ratio */
     float f_aspect = (double)p_fmt_out->video.i_sar_num *
                      p_fmt_out->video.i_width /
@@ -364,7 +360,7 @@ static void transcode_video_encoder_init( sout_stream_t *p_stream,
     msg_Dbg( p_stream, "decoder aspect is %f:1", f_aspect );
 
     /* Change f_aspect from source frame to source pixel */
-    f_aspect = f_aspect * i_src_height / i_src_width;
+    f_aspect = f_aspect * i_src_visible_height / i_src_visible_width;
     msg_Dbg( p_stream, "source pixel aspect is %f:1", f_aspect );
 
     /* Calculate scaling factor for specified parameters */
@@ -374,53 +370,53 @@ static void transcode_video_encoder_init( sout_stream_t *p_stream,
         /* Global scaling. Make sure width will remain a factor of 16 */
         float f_real_scale;
         int  i_new_height;
-        int i_new_width = i_src_width * p_sys->f_scale;
+        int i_new_width = i_src_visible_width * p_sys->f_scale;
 
         if( i_new_width % 16 <= 7 && i_new_width >= 16 )
             i_new_width -= i_new_width % 16;
         else
             i_new_width += 16 - i_new_width % 16;
 
-        f_real_scale = (float)( i_new_width ) / (float) i_src_width;
+        f_real_scale = (float)( i_new_width ) / (float) i_src_visible_width;
 
-        i_new_height = __MAX( 16, i_src_height * (float)f_real_scale );
+        i_new_height = __MAX( 16, i_src_visible_height * (float)f_real_scale );
 
         f_scale_width = f_real_scale;
-        f_scale_height = (float) i_new_height / (float) i_src_height;
+        f_scale_height = (float) i_new_height / (float) i_src_visible_height;
     }
     else if( id->p_encoder->fmt_out.video.i_width > 0 &&
              id->p_encoder->fmt_out.video.i_height <= 0 )
     {
         /* Only width specified */
-        f_scale_width = (float)id->p_encoder->fmt_out.video.i_width/i_src_width;
+        f_scale_width = (float)id->p_encoder->fmt_out.video.i_width/i_src_visible_width;
         f_scale_height = f_scale_width;
     }
     else if( id->p_encoder->fmt_out.video.i_width <= 0 &&
              id->p_encoder->fmt_out.video.i_height > 0 )
     {
          /* Only height specified */
-         f_scale_height = (float)id->p_encoder->fmt_out.video.i_height/i_src_height;
+         f_scale_height = (float)id->p_encoder->fmt_out.video.i_height/i_src_visible_height;
          f_scale_width = f_scale_height;
      }
      else if( id->p_encoder->fmt_out.video.i_width > 0 &&
               id->p_encoder->fmt_out.video.i_height > 0 )
      {
          /* Width and height specified */
-         f_scale_width = (float)id->p_encoder->fmt_out.video.i_width/i_src_width;
-         f_scale_height = (float)id->p_encoder->fmt_out.video.i_height/i_src_height;
+         f_scale_width = (float)id->p_encoder->fmt_out.video.i_width/i_src_visible_width;
+         f_scale_height = (float)id->p_encoder->fmt_out.video.i_height/i_src_visible_height;
      }
 
      /* check maxwidth and maxheight */
      if( p_sys->i_maxwidth && f_scale_width > (float)p_sys->i_maxwidth /
-                                                     i_src_width )
+                                                     i_src_visible_width )
      {
-         f_scale_width = (float)p_sys->i_maxwidth / i_src_width;
+         f_scale_width = (float)p_sys->i_maxwidth / i_src_visible_width;
      }
 
      if( p_sys->i_maxheight && f_scale_height > (float)p_sys->i_maxheight /
-                                                       i_src_height )
+                                                       i_src_visible_height )
      {
-         f_scale_height = (float)p_sys->i_maxheight / i_src_height;
+         f_scale_height = (float)p_sys->i_maxheight / i_src_visible_height;
      }
 
 
@@ -432,26 +428,29 @@ static void transcode_video_encoder_init( sout_stream_t *p_stream,
      /* Calculate width, height from scaling
       * Make sure its multiple of 2
       */
-     i_dst_width =  2 * (int)(f_scale_width*i_src_width/2+0.5);
-     i_dst_height = 2 * (int)(f_scale_height*i_src_height/2+0.5);
+     /* width/height of output stream */
+     int i_dst_visible_width =  2 * (int)(f_scale_width*i_src_visible_width/2+0.5);
+     int i_dst_visible_height = 2 * (int)(f_scale_height*i_src_visible_height/2+0.5);
+     int i_dst_width =  2 * (int)(f_scale_width*p_fmt_out->video.i_width/2+0.5);
+     int i_dst_height = 2 * (int)(f_scale_height*p_fmt_out->video.i_height/2+0.5);
 
      /* Change aspect ratio from scaled pixel to output frame */
-     f_aspect = f_aspect * i_dst_width / i_dst_height;
+     f_aspect = f_aspect * i_dst_visible_width / i_dst_visible_height;
 
      /* Store calculated values */
-     id->p_encoder->fmt_out.video.i_width =
-     id->p_encoder->fmt_out.video.i_visible_width = i_dst_width;
-     id->p_encoder->fmt_out.video.i_height =
-     id->p_encoder->fmt_out.video.i_visible_height = i_dst_height;
+     id->p_encoder->fmt_out.video.i_width = i_dst_width;
+     id->p_encoder->fmt_out.video.i_visible_width = i_dst_visible_width;
+     id->p_encoder->fmt_out.video.i_height = i_dst_height;
+     id->p_encoder->fmt_out.video.i_visible_height = i_dst_visible_height;
 
-     id->p_encoder->fmt_in.video.i_width =
-     id->p_encoder->fmt_in.video.i_visible_width = i_dst_width;
-     id->p_encoder->fmt_in.video.i_height =
-     id->p_encoder->fmt_in.video.i_visible_height = i_dst_height;
+     id->p_encoder->fmt_in.video.i_width = i_dst_width;
+     id->p_encoder->fmt_in.video.i_visible_width = i_dst_visible_width;
+     id->p_encoder->fmt_in.video.i_height = i_dst_height;
+     id->p_encoder->fmt_in.video.i_visible_height = i_dst_visible_height;
 
      msg_Dbg( p_stream, "source %ix%i, destination %ix%i",
-         i_src_width, i_src_height,
-         i_dst_width, i_dst_height
+         i_src_visible_width, i_src_visible_height,
+         i_dst_visible_width, i_dst_visible_height
      );
 
     /* Handle frame rate conversion */
@@ -489,8 +488,8 @@ static void transcode_video_encoder_init( sout_stream_t *p_stream,
     {
         vlc_ureduce( &id->p_encoder->fmt_out.video.i_sar_num,
                      &id->p_encoder->fmt_out.video.i_sar_den,
-                     (uint64_t)p_fmt_out->video.i_sar_num * i_src_width  * i_dst_height,
-                     (uint64_t)p_fmt_out->video.i_sar_den * i_src_height * i_dst_width,
+                     (uint64_t)p_fmt_out->video.i_sar_num * i_src_visible_width  * i_dst_visible_height,
+                     (uint64_t)p_fmt_out->video.i_sar_den * i_src_visible_height * i_dst_visible_width,
                      0 );
     }
     else



More information about the vlc-commits mailing list