Commit 9885e348 authored by Joseph Tulou's avatar Joseph Tulou Committed by Jean-Baptiste Kempf

Core implementation of --[no]-autoscale and --scale with x11 vout support

Modifications by /me (renaming, var_Get, hotkeys, etc..)
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent 0c52acae
...@@ -339,7 +339,9 @@ typedef enum vlc_key { ...@@ -339,7 +339,9 @@ typedef enum vlc_key {
ACTIONID_ZOOM_DOUBLE, ACTIONID_ZOOM_DOUBLE,
/* Cycle Through Audio Devices */ /* Cycle Through Audio Devices */
ACTIONID_AUDIODEVICE_CYCLE, ACTIONID_AUDIODEVICE_CYCLE,
/* Scaling in fullscreen */ /* scaling */
ACTIONID_TOGGLE_SCALING, ACTIONID_TOGGLE_AUTOSCALE,
ACTIONID_SCALE_UP,
ACTIONID_SCALE_DOWN
} vlc_key_t; } vlc_key_t;
#endif #endif
...@@ -506,7 +506,8 @@ struct vout_thread_t ...@@ -506,7 +506,8 @@ struct vout_thread_t
/**@{*/ /**@{*/
uint16_t i_changes; /**< changes made to the thread. uint16_t i_changes; /**< changes made to the thread.
\see \ref vout_changes */ \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 */ bool b_fullscreen; /**< toogle fullscreen display */
unsigned int i_window_width; /**< video window width */ unsigned int i_window_width; /**< video window width */
unsigned int i_window_height; /**< video window height */ unsigned int i_window_height; /**< video window height */
...@@ -566,12 +567,14 @@ struct vout_thread_t ...@@ -566,12 +567,14 @@ struct vout_thread_t
#define VOUT_INFO_CHANGE 0x0001 #define VOUT_INFO_CHANGE 0x0001
/** b_interface changed */ /** b_interface changed */
#define VOUT_INTF_CHANGE 0x0004 #define VOUT_INTF_CHANGE 0x0004
/** b_scale changed */ /** b_autoscale changed */
#define VOUT_SCALE_CHANGE 0x0008 #define VOUT_SCALE_CHANGE 0x0008
/** b_cursor changed */ /** b_cursor changed */
#define VOUT_CURSOR_CHANGE 0x0020 #define VOUT_CURSOR_CHANGE 0x0020
/** b_fullscreen changed */ /** b_fullscreen changed */
#define VOUT_FULLSCREEN_CHANGE 0x0040 #define VOUT_FULLSCREEN_CHANGE 0x0040
/** i_zoom changed */
#define VOUT_ZOOM_CHANGE 0x0080
/** size changed */ /** size changed */
#define VOUT_SIZE_CHANGE 0x0200 #define VOUT_SIZE_CHANGE 0x0200
/** depth changed */ /** depth changed */
...@@ -596,6 +599,9 @@ struct vout_thread_t ...@@ -596,6 +599,9 @@ struct vout_thread_t
#define MAX_JITTER_SAMPLES 20 #define MAX_JITTER_SAMPLES 20
/* scaling factor (applied to i_zoom in vout_thread_t) */
#define ZOOM_FP_FACTOR 1000
/***************************************************************************** /*****************************************************************************
* Prototypes * Prototypes
*****************************************************************************/ *****************************************************************************/
......
...@@ -609,10 +609,44 @@ static void Run( intf_thread_t *p_intf ) ...@@ -609,10 +609,44 @@ static void Run( intf_thread_t *p_intf )
} }
free( val.psz_string ); 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" ); float f_scalefactor = var_GetFloat( p_vout, "scale" );
var_SetBool( p_vout, "scaling", !b_scaling ); 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 ) else if( i_action == ACTIONID_DEINTERLACE && p_vout )
{ {
......
...@@ -190,7 +190,8 @@ static int CreateVout( vlc_object_t *p_this ) ...@@ -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->render.i_aspect = p_vout->render.i_aspect;
p_sys->p_vout->fmt_render = p_vout->fmt_render; p_sys->p_vout->fmt_render = p_vout->fmt_render;
p_sys->p_vout->fmt_in = p_vout->fmt_in; 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; p_sys->p_vout->i_alignment = p_vout->i_alignment;
psz = config_GetPsz( p_vout, "opengl-provider" ); psz = config_GetPsz( p_vout, "opengl-provider" );
......
...@@ -1478,6 +1478,29 @@ static int ManageVideo( vout_thread_t *p_vout ) ...@@ -1478,6 +1478,29 @@ static int ManageVideo( vout_thread_t *p_vout )
p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE; 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 || if( p_vout->i_changes & VOUT_CROP_CHANGE ||
p_vout->i_changes & VOUT_ASPECT_CHANGE ) p_vout->i_changes & VOUT_ASPECT_CHANGE )
{ {
......
...@@ -510,9 +510,14 @@ static const char *const ppsz_pos_descriptions[] = ...@@ -510,9 +510,14 @@ static const char *const ppsz_pos_descriptions[] =
"aspect, or a float value (1.25, 1.3333, etc.) expressing pixel " \ "aspect, or a float value (1.25, 1.3333, etc.) expressing pixel " \
"squareness.") "squareness.")
#define SCALING_TEXT N_("Video scaling") #define AUTOSCALE_TEXT N_("Video Auto Scaling")
#define SCALING_LONGTEXT N_( \ #define AUTOSCALE_LONGTEXT N_( \
"This enables upscaling a video in a given window.") "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_TEXT N_("Custom crop ratios list")
#define CUSTOM_CROP_RATIOS_LONGTEXT N_( \ #define CUSTOM_CROP_RATIOS_LONGTEXT N_( \
...@@ -1348,8 +1353,12 @@ static const char *const ppsz_albumart_descriptions[] = ...@@ -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 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_TEXT N_("Cycle video crop")
#define CROP_KEY_LONGTEXT N_("Cycle through a predefined list of crop formats.") #define CROP_KEY_LONGTEXT N_("Cycle through a predefined list of crop formats.")
#define TOGGLE_SCALING_KEY_TEXT N_("Toggle upscaling") #define TOGGLE_AUTOSCALE_KEY_TEXT N_("Toggle autoscaling")
#define TOGGLE_SCALING_KEY_LONGTEXT N_("Activate or deactivate upscaling.") #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_TEXT N_("Cycle deinterlace modes")
#define DEINTERLACE_KEY_LONGTEXT N_("Cycle through deinterlace modes.") #define DEINTERLACE_KEY_LONGTEXT N_("Cycle through deinterlace modes.")
#define INTF_SHOW_KEY_TEXT N_("Show interface") #define INTF_SHOW_KEY_TEXT N_("Show interface")
...@@ -1604,7 +1613,9 @@ vlc_module_begin () ...@@ -1604,7 +1613,9 @@ vlc_module_begin ()
add_string( "aspect-ratio", NULL, NULL, add_string( "aspect-ratio", NULL, NULL,
ASPECT_RATIO_TEXT, ASPECT_RATIO_LONGTEXT, false ) ASPECT_RATIO_TEXT, ASPECT_RATIO_LONGTEXT, false )
change_safe () 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 () change_safe ()
add_string( "monitor-par", NULL, NULL, add_string( "monitor-par", NULL, NULL,
MASPECT_RATIO_TEXT, MASPECT_RATIO_LONGTEXT, true ) MASPECT_RATIO_TEXT, MASPECT_RATIO_LONGTEXT, true )
...@@ -2133,7 +2144,9 @@ vlc_module_begin () ...@@ -2133,7 +2144,9 @@ vlc_module_begin ()
# define KEY_SUBTITLE_TRACK 's' # define KEY_SUBTITLE_TRACK 's'
# define KEY_ASPECT_RATIO 'a' # define KEY_ASPECT_RATIO 'a'
# define KEY_CROP 'c' # 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_DEINTERLACE 'd'
# define KEY_INTF_SHOW 'i' # define KEY_INTF_SHOW 'i'
# define KEY_INTF_HIDE KEY_MODIFIER_SHIFT|'i' # define KEY_INTF_HIDE KEY_MODIFIER_SHIFT|'i'
...@@ -2245,7 +2258,9 @@ vlc_module_begin () ...@@ -2245,7 +2258,9 @@ vlc_module_begin ()
# define KEY_SUBTITLE_TRACK 'v' # define KEY_SUBTITLE_TRACK 'v'
# define KEY_ASPECT_RATIO 'a' # define KEY_ASPECT_RATIO 'a'
# define KEY_CROP 'c' # 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_DEINTERLACE 'd'
# define KEY_INTF_SHOW 'i' # define KEY_INTF_SHOW 'i'
# define KEY_INTF_HIDE KEY_MODIFIER_SHIFT|'i' # define KEY_INTF_HIDE KEY_MODIFIER_SHIFT|'i'
...@@ -2403,8 +2418,12 @@ vlc_module_begin () ...@@ -2403,8 +2418,12 @@ vlc_module_begin ()
ASPECT_RATIO_KEY_TEXT, ASPECT_RATIO_KEY_LONGTEXT, false ) ASPECT_RATIO_KEY_TEXT, ASPECT_RATIO_KEY_LONGTEXT, false )
add_key( "key-crop", KEY_CROP, NULL, add_key( "key-crop", KEY_CROP, NULL,
CROP_KEY_TEXT, CROP_KEY_LONGTEXT, false ) CROP_KEY_TEXT, CROP_KEY_LONGTEXT, false )
add_key( "key-toggle-scaling", KEY_TOGGLE_SCALING, NULL, add_key( "key-toggle-autoscale", KEY_TOGGLE_AUTOSCALE, NULL,
TOGGLE_SCALING_KEY_TEXT, TOGGLE_SCALING_KEY_LONGTEXT, false ) 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, add_key( "key-deinterlace", KEY_DEINTERLACE, NULL,
DEINTERLACE_KEY_TEXT, DEINTERLACE_KEY_LONGTEXT, false ) DEINTERLACE_KEY_TEXT, DEINTERLACE_KEY_LONGTEXT, false )
add_key( "key-intf-show", KEY_INTF_SHOW, NULL, add_key( "key-intf-show", KEY_INTF_SHOW, NULL,
...@@ -2744,7 +2763,9 @@ const struct hotkey libvlc_hotkeys[] = ...@@ -2744,7 +2763,9 @@ const struct hotkey libvlc_hotkeys[] =
{ "key-menu-down", ACTIONID_MENU_DOWN, 0, }, { "key-menu-down", ACTIONID_MENU_DOWN, 0, },
{ "key-menu-select", ACTIONID_MENU_SELECT, 0, }, { "key-menu-select", ACTIONID_MENU_SELECT, 0, },
{ "key-audiodevice-cycle", ACTIONID_AUDIODEVICE_CYCLE, 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, } { NULL, 0, 0, }
}; };
......
...@@ -374,7 +374,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) ...@@ -374,7 +374,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
/* Initialize misc stuff */ /* Initialize misc stuff */
p_vout->i_changes = 0; 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->b_fullscreen = 0;
p_vout->i_alignment = 0; p_vout->i_alignment = 0;
p_vout->p->render_time = 10; p_vout->p->render_time = 10;
......
...@@ -400,14 +400,20 @@ void vout_IntfInit( vout_thread_t *p_vout ) ...@@ -400,14 +400,20 @@ void vout_IntfInit( vout_thread_t *p_vout )
var_TriggerCallback( p_vout, "aspect-ratio" ); var_TriggerCallback( p_vout, "aspect-ratio" );
free( old_val.psz_string ); free( old_val.psz_string );
/* Add a variable to indicate if scaling video is activated or not */ /* Add variables to manage scaling video */
var_Create( p_vout, "scaling", VLC_VAR_BOOL | VLC_VAR_DOINHERIT var_Create( p_vout, "autoscale", VLC_VAR_BOOL | VLC_VAR_DOINHERIT
| VLC_VAR_ISCOMMAND ); | VLC_VAR_ISCOMMAND );
text.psz_string = _("Scaling video"); text.psz_string = _("Autoscale video");
var_Change( p_vout, "scaling", VLC_VAR_SETTEXT, &text, NULL ); var_Change( p_vout, "autoscale", VLC_VAR_SETTEXT, &text, NULL );
var_AddCallback( p_vout, "scaling", ScalingCallback, NULL ); var_AddCallback( p_vout, "autoscale", ScalingCallback, NULL );
var_Get( p_vout, "scaling", &val ); p_vout->b_autoscale = var_GetBool( p_vout, "autoscale" );
p_vout->b_scale = val.b_bool;
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 */ /* Initialize the dimensions of the video window */
InitWindowSize( p_vout, &p_vout->i_window_width, InitWindowSize( p_vout, &p_vout->i_window_width,
...@@ -1215,11 +1221,18 @@ static int ScalingCallback( vlc_object_t *p_this, char const *psz_cmd, ...@@ -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 ) vlc_value_t oldval, vlc_value_t newval, void *p_data )
{ {
vout_thread_t *p_vout = (vout_thread_t *)p_this; vout_thread_t *p_vout = (vout_thread_t *)p_this;
(void)oldval; (void)newval; (void)p_data;
vlc_mutex_lock( &p_vout->change_lock ); vlc_mutex_lock( &p_vout->change_lock );
p_vout->b_scale = newval.b_bool; if( !strcmp( psz_cmd, "autoscale" ) )
p_vout->i_changes |= VOUT_SIZE_CHANGE; {
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 ); vlc_mutex_unlock( &p_vout->change_lock );
......
...@@ -461,16 +461,30 @@ void vout_PlacePicture( const vout_thread_t *p_vout, ...@@ -461,16 +461,30 @@ void vout_PlacePicture( const vout_thread_t *p_vout,
return; 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_width = i_width;
*pi_height = i_height; *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_width = __MIN( i_width, p_vout->fmt_in.i_visible_width );
*pi_height = __MIN( i_height, p_vout->fmt_in.i_visible_height ); *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 * 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; *pi_height / p_vout->fmt_in.i_visible_height / p_vout->fmt_in.i_sar_den;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment