Core implementation of --[no]-autoscale and --scale with x11 vout support
authorJoseph Tulou <brezhoneg1@yahoo.fr>
Fri, 30 Jan 2009 16:28:42 +0000 (17:28 +0100)
committerJean-Baptiste Kempf <jb@videolan.org>
Mon, 2 Feb 2009 02:32:17 +0000 (03:32 +0100)
Modifications by /me (renaming, var_Get, hotkeys, etc..)
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
include/vlc_keys.h
include/vlc_vout.h
modules/control/hotkeys.c
modules/video_output/opengl.c
modules/video_output/x11/xcommon.c
src/libvlc-module.c
src/video_output/video_output.c
src/video_output/vout_intf.c
src/video_output/vout_pictures.c

index a5a3f94..bfd2672 100644 (file)
@@ -339,7 +339,9 @@ typedef enum vlc_key {
     ACTIONID_ZOOM_DOUBLE,
     /* Cycle Through Audio Devices */
     ACTIONID_AUDIODEVICE_CYCLE,
-    /* Scaling in fullscreen */
-    ACTIONID_TOGGLE_SCALING,
+    /* scaling */
+    ACTIONID_TOGGLE_AUTOSCALE,
+    ACTIONID_SCALE_UP,
+    ACTIONID_SCALE_DOWN
 } vlc_key_t;
 #endif
index adab0a6..f9020ac 100644 (file)
@@ -506,7 +506,8 @@ struct vout_thread_t
     /**@{*/
     uint16_t            i_changes;          /**< changes made to the thread.
                                                       \see \ref vout_changes */
-    bool                b_scale;                  /**< allow picture scaling */
+    bool                b_autoscale;        /**< auto scaling picture or not */
+    int                 i_zoom;               /**< scaling factor if no auto */
     bool                b_fullscreen;         /**< toogle fullscreen display */
     unsigned int        i_window_width;              /**< video window width */
     unsigned int        i_window_height;            /**< video window height */
@@ -566,12 +567,14 @@ struct vout_thread_t
 #define VOUT_INFO_CHANGE        0x0001
 /** b_interface changed */
 #define VOUT_INTF_CHANGE        0x0004
-/** b_scale changed */
+/** b_autoscale changed */
 #define VOUT_SCALE_CHANGE       0x0008
 /** b_cursor changed */
 #define VOUT_CURSOR_CHANGE      0x0020
 /** b_fullscreen changed */
 #define VOUT_FULLSCREEN_CHANGE  0x0040
+/** i_zoom changed */
+#define VOUT_ZOOM_CHANGE        0x0080
 /** size changed */
 #define VOUT_SIZE_CHANGE        0x0200
 /** depth changed */
@@ -596,6 +599,9 @@ struct vout_thread_t
 
 #define MAX_JITTER_SAMPLES      20
 
+/* scaling factor (applied to i_zoom in vout_thread_t) */
+#define ZOOM_FP_FACTOR          1000
+
 /*****************************************************************************
  * Prototypes
  *****************************************************************************/
index b11e8a6..bdb4ce1 100644 (file)
@@ -609,10 +609,44 @@ static void Run( intf_thread_t *p_intf )
                 }
                 free( val.psz_string );
             }
-            else if( i_action == ACTIONID_TOGGLE_SCALING && p_vout )
+            else if( i_action == ACTIONID_TOGGLE_AUTOSCALE && p_vout )
             {
-                bool b_scaling = var_GetBool( p_vout, "scaling" );
-                var_SetBool( p_vout, "scaling", !b_scaling );
+                float f_scalefactor = var_GetFloat( p_vout, "scale" );
+                if ( f_scalefactor != 1.0 )
+                {
+                    var_SetFloat( p_vout, "scale", 1.0 );
+                    vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN,
+                                         _("Zooming reset") );
+                }
+                else
+                {
+                    bool b_autoscale = !var_GetBool( p_vout, "autoscale" );
+                    var_SetBool( p_vout, "autoscale", b_autoscale );
+                    if( b_autoscale )
+                        vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN,
+                                         _("Scaled to screen") );
+                    else
+                        vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN,
+                                         _("Original Size") );
+                }
+            }
+            else if( i_action == ACTIONID_SCALE_UP && p_vout )
+            {
+               float f_scalefactor;
+
+               f_scalefactor = var_GetFloat( p_vout, "scale" );
+               if( f_scalefactor < 10. )
+                   f_scalefactor += .1;
+               var_SetFloat( p_vout, "scale", f_scalefactor );
+            }
+            else if( i_action == ACTIONID_SCALE_DOWN && p_vout )
+            {
+               float f_scalefactor;
+
+               f_scalefactor = var_GetFloat( p_vout, "scale" );
+               if( f_scalefactor > .3 )
+                   f_scalefactor -= .1;
+               var_SetFloat( p_vout, "scale", f_scalefactor );
             }
             else if( i_action == ACTIONID_DEINTERLACE && p_vout )
             {
index 1e8121b..101a0de 100644 (file)
@@ -190,7 +190,8 @@ static int CreateVout( vlc_object_t *p_this )
     p_sys->p_vout->render.i_aspect = p_vout->render.i_aspect;
     p_sys->p_vout->fmt_render = p_vout->fmt_render;
     p_sys->p_vout->fmt_in = p_vout->fmt_in;
-    p_sys->p_vout->b_scale = p_vout->b_scale;
+    p_sys->p_vout->b_autoscale = p_vout->b_autoscale;
+    p_sys->p_vout->i_zoom = p_vout->i_zoom;
     p_sys->p_vout->i_alignment = p_vout->i_alignment;
 
     psz = config_GetPsz( p_vout, "opengl-provider" );
index e15dd6c..bad0e01 100644 (file)
@@ -1478,6 +1478,29 @@ static int ManageVideo( vout_thread_t *p_vout )
         p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
     }
 
+    /* autoscale toggle */
+    if( p_vout->i_changes & VOUT_SCALE_CHANGE )
+    {
+        p_vout->i_changes &= ~VOUT_SCALE_CHANGE;
+
+        p_vout->b_autoscale = var_GetBool( p_vout, "autoscale" );
+        p_vout->i_zoom = ZOOM_FP_FACTOR;
+
+        p_vout->i_changes |= VOUT_SIZE_CHANGE;
+    }
+
+    /* scaling factor */
+    if( p_vout->i_changes & VOUT_ZOOM_CHANGE )
+    {
+        p_vout->i_changes &= ~VOUT_ZOOM_CHANGE;
+
+        p_vout->b_autoscale = false;
+        p_vout->i_zoom =
+            (int)( ZOOM_FP_FACTOR * var_GetFloat( p_vout, "scale" ) );
+
+        p_vout->i_changes |= VOUT_SIZE_CHANGE;
+    }
+
     if( p_vout->i_changes & VOUT_CROP_CHANGE ||
         p_vout->i_changes & VOUT_ASPECT_CHANGE )
     {
index 29a3b17..dd43f49 100644 (file)
@@ -510,9 +510,14 @@ static const char *const ppsz_pos_descriptions[] =
     "aspect, or a float value (1.25, 1.3333, etc.) expressing pixel " \
     "squareness.")
 
-#define SCALING_TEXT N_("Video scaling")
-#define SCALING_LONGTEXT N_( \
-    "This enables upscaling a video in a given window.")
+#define AUTOSCALE_TEXT N_("Video Auto Scaling")
+#define AUTOSCALE_LONGTEXT N_( \
+    "Forces video scaling to fit a given window.")
+
+#define SCALEFACTOR_TEXT N_("Video scale factor")
+#define SCALEFACTOR_LONGTEXT N_( \
+    "scale factor used if --no-auto-scale is selected." \
+    "Default value is 1.0 (original video size).")
 
 #define CUSTOM_CROP_RATIOS_TEXT N_("Custom crop ratios list")
 #define CUSTOM_CROP_RATIOS_LONGTEXT N_( \
@@ -1348,8 +1353,12 @@ static const char *const ppsz_albumart_descriptions[] =
 #define ASPECT_RATIO_KEY_LONGTEXT N_("Cycle through a predefined list of source aspect ratios.")
 #define CROP_KEY_TEXT N_("Cycle video crop")
 #define CROP_KEY_LONGTEXT N_("Cycle through a predefined list of crop formats.")
-#define TOGGLE_SCALING_KEY_TEXT N_("Toggle upscaling")
-#define TOGGLE_SCALING_KEY_LONGTEXT N_("Activate or deactivate upscaling.")
+#define TOGGLE_AUTOSCALE_KEY_TEXT N_("Toggle autoscaling")
+#define TOGGLE_AUTOSCALE_KEY_LONGTEXT N_("Activate or deactivate autoscaling.")
+#define SCALE_UP_KEY_TEXT N_("Increase scale factor")
+#define SCALE_UP_KEY_LONGTEXT N_("Increase scale factor.")
+#define SCALE_DOWN_KEY_TEXT N_("Decrease scale factor")
+#define SCALE_DOWN_KEY_LONGTEXT N_("Decrease scale factor.")
 #define DEINTERLACE_KEY_TEXT N_("Cycle deinterlace modes")
 #define DEINTERLACE_KEY_LONGTEXT N_("Cycle through deinterlace modes.")
 #define INTF_SHOW_KEY_TEXT N_("Show interface")
@@ -1604,7 +1613,9 @@ vlc_module_begin ()
     add_string( "aspect-ratio", NULL, NULL,
                 ASPECT_RATIO_TEXT, ASPECT_RATIO_LONGTEXT, false )
         change_safe ()
-    add_bool( "scaling", true, NULL, SCALING_TEXT, SCALING_LONGTEXT, false )
+    add_bool( "autoscale", true, NULL, AUTOSCALE_TEXT, AUTOSCALE_LONGTEXT, false )
+        change_safe ()
+    add_float( "scale", 1.0, NULL, SCALEFACTOR_TEXT, SCALEFACTOR_LONGTEXT, false )
         change_safe ()
     add_string( "monitor-par", NULL, NULL,
                 MASPECT_RATIO_TEXT, MASPECT_RATIO_LONGTEXT, true )
@@ -2133,7 +2144,9 @@ vlc_module_begin ()
 #   define KEY_SUBTITLE_TRACK     's'
 #   define KEY_ASPECT_RATIO       'a'
 #   define KEY_CROP               'c'
-#   define KEY_TOGGLE_SCALING     'o'
+#   define KEY_TOGGLE_AUTOSCALE   'o'
+#   define KEY_SCALE_UP           KEY_MODIFIER_ALT|'o'
+#   define KEY_SCALE_DOWN         KEY_MODIFIER_SHIFT|KEY_MODIFIER_ALT|'o'
 #   define KEY_DEINTERLACE        'd'
 #   define KEY_INTF_SHOW          'i'
 #   define KEY_INTF_HIDE          KEY_MODIFIER_SHIFT|'i'
@@ -2245,7 +2258,9 @@ vlc_module_begin ()
 #   define KEY_SUBTITLE_TRACK     'v'
 #   define KEY_ASPECT_RATIO       'a'
 #   define KEY_CROP               'c'
-#   define KEY_TOGGLE_SCALING     'o'
+#   define KEY_TOGGLE_AUTOSCALE   'o'
+#   define KEY_SCALE_UP           KEY_MODIFIER_ALT|'o'
+#   define KEY_SCALE_DOWN         KEY_MODIFIER_SHIFT|KEY_MODIFIER_ALT|'o'
 #   define KEY_DEINTERLACE        'd'
 #   define KEY_INTF_SHOW          'i'
 #   define KEY_INTF_HIDE          KEY_MODIFIER_SHIFT|'i'
@@ -2403,8 +2418,12 @@ vlc_module_begin ()
              ASPECT_RATIO_KEY_TEXT, ASPECT_RATIO_KEY_LONGTEXT, false )
     add_key( "key-crop", KEY_CROP, NULL,
              CROP_KEY_TEXT, CROP_KEY_LONGTEXT, false )
-    add_key( "key-toggle-scaling", KEY_TOGGLE_SCALING, NULL,
-             TOGGLE_SCALING_KEY_TEXT, TOGGLE_SCALING_KEY_LONGTEXT, false )
+    add_key( "key-toggle-autoscale", KEY_TOGGLE_AUTOSCALE, NULL,
+             TOGGLE_AUTOSCALE_KEY_TEXT, TOGGLE_AUTOSCALE_KEY_LONGTEXT, false )
+    add_key( "key-incr-scalefactor", KEY_SCALE_UP, NULL,
+             SCALE_UP_KEY_TEXT, SCALE_UP_KEY_LONGTEXT, false )
+    add_key( "key-decr-scalefactor", KEY_SCALE_DOWN, NULL,
+             SCALE_DOWN_KEY_TEXT, SCALE_DOWN_KEY_LONGTEXT, false )
     add_key( "key-deinterlace", KEY_DEINTERLACE, NULL,
              DEINTERLACE_KEY_TEXT, DEINTERLACE_KEY_LONGTEXT, false )
     add_key( "key-intf-show", KEY_INTF_SHOW, NULL,
@@ -2744,7 +2763,9 @@ const struct hotkey libvlc_hotkeys[] =
     { "key-menu-down", ACTIONID_MENU_DOWN, 0, },
     { "key-menu-select", ACTIONID_MENU_SELECT, 0, },
     { "key-audiodevice-cycle", ACTIONID_AUDIODEVICE_CYCLE, 0, },
-    { "key-toggle-scaling", ACTIONID_TOGGLE_SCALING, 0, },
+    { "key-toggle-autoscale", ACTIONID_TOGGLE_AUTOSCALE, 0, },
+    { "key-incr-scalefactor", ACTIONID_SCALE_UP, 0, },
+    { "key-decr-scalefactor", ACTIONID_SCALE_DOWN, 0, },
     { NULL, 0, 0, }
 };
 
index 27de388..b01db69 100644 (file)
@@ -374,7 +374,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
 
     /* Initialize misc stuff */
     p_vout->i_changes    = 0;
-    p_vout->b_scale      = 1;
+    p_vout->b_autoscale  = 1;
+    p_vout->i_zoom      = ZOOM_FP_FACTOR;
     p_vout->b_fullscreen = 0;
     p_vout->i_alignment  = 0;
     p_vout->p->render_time  = 10;
index 219d030..4145bde 100644 (file)
@@ -400,14 +400,20 @@ void vout_IntfInit( vout_thread_t *p_vout )
         var_TriggerCallback( p_vout, "aspect-ratio" );
     free( old_val.psz_string );
 
-    /* Add a variable to indicate if scaling video is activated or not */
-    var_Create( p_vout, "scaling", VLC_VAR_BOOL | VLC_VAR_DOINHERIT
+    /* Add variables to manage scaling video */
+    var_Create( p_vout, "autoscale", VLC_VAR_BOOL | VLC_VAR_DOINHERIT
                 | VLC_VAR_ISCOMMAND );
-    text.psz_string = _("Scaling video");
-    var_Change( p_vout, "scaling", VLC_VAR_SETTEXT, &text, NULL );
-    var_AddCallback( p_vout, "scaling", ScalingCallback, NULL );
-    var_Get( p_vout, "scaling", &val );
-    p_vout->b_scale = val.b_bool;
+    text.psz_string = _("Autoscale video");
+    var_Change( p_vout, "autoscale", VLC_VAR_SETTEXT, &text, NULL );
+    var_AddCallback( p_vout, "autoscale", ScalingCallback, NULL );
+    p_vout->b_autoscale = var_GetBool( p_vout, "autoscale" );
+
+    var_Create( p_vout, "scale", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT
+                | VLC_VAR_ISCOMMAND );
+    text.psz_string = _("Scale factor");
+    var_Change( p_vout, "scale", VLC_VAR_SETTEXT, &text, NULL );
+    var_AddCallback( p_vout, "scale", ScalingCallback, NULL );
+    p_vout->i_zoom = (int)( ZOOM_FP_FACTOR * var_GetFloat( p_vout, "scale" ) );
 
     /* Initialize the dimensions of the video window */
     InitWindowSize( p_vout, &p_vout->i_window_width,
@@ -1215,11 +1221,18 @@ static int ScalingCallback( vlc_object_t *p_this, char const *psz_cmd,
                          vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
+    (void)oldval; (void)newval; (void)p_data;
 
     vlc_mutex_lock( &p_vout->change_lock );
 
-    p_vout->b_scale = newval.b_bool;
-    p_vout->i_changes |= VOUT_SIZE_CHANGE;
+    if( !strcmp( psz_cmd, "autoscale" ) )
+    {
+        p_vout->i_changes |= VOUT_SCALE_CHANGE;
+    }
+    else if( !strcmp( psz_cmd, "scale" ) )
+    {
+        p_vout->i_changes |= VOUT_ZOOM_CHANGE;
+    }
 
     vlc_mutex_unlock( &p_vout->change_lock );
 
index ffb2c57..3275aac 100644 (file)
@@ -461,16 +461,30 @@ void vout_PlacePicture( const vout_thread_t *p_vout,
         return;
     }
 
-    if( p_vout->b_scale )
+    bool b_autoscale = p_vout->b_autoscale;
+    int i_zoom = p_vout->i_zoom;
+
+    /* be realistic, scaling factor confined between .2 and 10. */
+    if( i_zoom > 10 * ZOOM_FP_FACTOR  || i_zoom <  ZOOM_FP_FACTOR / 5 )
+        i_zoom = ZOOM_FP_FACTOR;
+
+    if( b_autoscale )
     {
         *pi_width = i_width;
         *pi_height = i_height;
     }
-    else
+    else if( i_zoom == ZOOM_FP_FACTOR )  /* original size */
     {
         *pi_width = __MIN( i_width, p_vout->fmt_in.i_visible_width );
         *pi_height = __MIN( i_height, p_vout->fmt_in.i_visible_height );
     }
+    else 
+    {
+        *pi_width = 
+             p_vout->fmt_in.i_visible_width * i_zoom / ZOOM_FP_FACTOR;
+        *pi_height =
+             p_vout->fmt_in.i_visible_height * i_zoom / ZOOM_FP_FACTOR;
+    }
 
      int64_t i_scaled_width = p_vout->fmt_in.i_visible_width * (int64_t)p_vout->fmt_in.i_sar_num *
                               *pi_height / p_vout->fmt_in.i_visible_height / p_vout->fmt_in.i_sar_den;