Commit 97d37e89 authored by Gildas Bazin's avatar Gildas Bazin

* src/video_output/*: re-implemented InitWindowSize() using...

* src/video_output/*: re-implemented InitWindowSize() using fmt_in.i_sar_num/den and moved it to vout_intf.c where it can be called again after crop or aspect ratio changes.
parent 9bb8de34
......@@ -59,7 +59,6 @@ static void DestroyThread ( vout_thread_t * );
static void AspectRatio ( int, int *, int * );
static int BinaryLog ( uint32_t );
static void MaskToShift ( int *, int *, uint32_t );
static void InitWindowSize ( vout_thread_t *, unsigned *, unsigned * );
/* Object variables callbacks */
static int DeinterlaceCallback( vlc_object_t *, char const *,
......@@ -358,12 +357,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
else psz_plugin = strdup( p_vout->psz_filter_chain );
}
/* Initialize the dimensions of the video window */
InitWindowSize( p_vout, &p_vout->i_window_width,
&p_vout->i_window_height );
msg_Dbg( p_vout, "Window size: %dx%d", p_vout->i_window_width,
p_vout->i_window_height );
/* Create the vout thread */
p_vout->p_module = module_Need( p_vout,
( p_vout->psz_filter_chain && *p_vout->psz_filter_chain ) ?
......@@ -1228,71 +1221,6 @@ static void MaskToShift( int *pi_left, int *pi_right, uint32_t i_mask )
*pi_right = (8 - i_high + i_low);
}
/*****************************************************************************
* InitWindowSize: find the initial dimensions the video window should have.
*****************************************************************************
* This function will check the "width", "height" and "zoom" config options and
* will calculate the size that the video window should have.
*****************************************************************************/
static void InitWindowSize( vout_thread_t *p_vout, unsigned *pi_width,
unsigned *pi_height )
{
vlc_value_t val;
int i_width, i_height;
uint64_t ll_zoom;
#define FP_FACTOR 1000 /* our fixed point factor */
var_Get( p_vout, "align", &val );
p_vout->i_alignment = val.i_int;
var_Get( p_vout, "width", &val );
i_width = val.i_int;
var_Get( p_vout, "height", &val );
i_height = val.i_int;
var_Get( p_vout, "zoom", &val );
ll_zoom = (uint64_t)( FP_FACTOR * val.f_float );
if( i_width > 0 && i_height > 0)
{
*pi_width = (int)( i_width * ll_zoom / FP_FACTOR );
*pi_height = (int)( i_height * ll_zoom / FP_FACTOR );
return;
}
else if( i_width > 0 )
{
*pi_width = (int)( i_width * ll_zoom / FP_FACTOR );
*pi_height = (int)( i_width * ll_zoom * VOUT_ASPECT_FACTOR /
p_vout->fmt_in.i_aspect / FP_FACTOR );
return;
}
else if( i_height > 0 )
{
*pi_height = (int)( i_height * ll_zoom / FP_FACTOR );
*pi_width = (int)( i_height * ll_zoom * p_vout->fmt_in.i_aspect /
VOUT_ASPECT_FACTOR / FP_FACTOR );
return;
}
if( p_vout->fmt_in.i_visible_height * p_vout->fmt_in.i_aspect
>= p_vout->fmt_in.i_visible_width * VOUT_ASPECT_FACTOR )
{
*pi_width = (int)( p_vout->fmt_in.i_visible_height * ll_zoom
* p_vout->fmt_in.i_aspect / VOUT_ASPECT_FACTOR / FP_FACTOR );
*pi_height = (int)( p_vout->fmt_in.i_visible_height * ll_zoom
/ FP_FACTOR );
}
else
{
*pi_width = (int)( p_vout->fmt_in.i_visible_width * ll_zoom
/ FP_FACTOR );
*pi_height = (int)( p_vout->fmt_in.i_visible_width * ll_zoom
* VOUT_ASPECT_FACTOR / p_vout->fmt_in.i_aspect / FP_FACTOR );
}
#undef FP_FACTOR
}
/*****************************************************************************
* vout_VarCallback: generic callback for intf variables
*****************************************************************************/
......
......@@ -37,6 +37,7 @@
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static void InitWindowSize( vout_thread_t *, unsigned *, unsigned * );
/* Object variables callbacks */
static int ZoomCallback( vlc_object_t *, char const *,
......@@ -184,6 +185,9 @@ void vout_IntfInit( vout_thread_t *p_vout )
var_Create( p_vout, "width", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_vout, "height", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_vout, "align", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Get( p_vout, "align", &val );
p_vout->i_alignment = val.i_int;
var_Create( p_vout, "video-x", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_vout, "video-y", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
......@@ -301,6 +305,12 @@ void vout_IntfInit( vout_thread_t *p_vout )
var_Change( p_vout, "aspect-ratio", VLC_VAR_TRIGGER_CALLBACKS, 0, 0 );
if( old_val.psz_string ) free( old_val.psz_string );
/* Initialize the dimensions of the video window */
InitWindowSize( p_vout, &p_vout->i_window_width,
&p_vout->i_window_height );
msg_Dbg( p_vout, "window size: %dx%d", p_vout->i_window_width,
p_vout->i_window_height );
/* Add a variable to indicate if the window should be on top of others */
var_Create( p_vout, "video-on-top", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
text.psz_string = _("Always on top");
......@@ -524,6 +534,69 @@ int vout_vaControlDefault( vout_thread_t *p_vout, int i_query, va_list args )
}
}
/*****************************************************************************
* InitWindowSize: find the initial dimensions the video window should have.
*****************************************************************************
* This function will check the "width", "height" and "zoom" config options and
* will calculate the size that the video window should have.
*****************************************************************************/
static void InitWindowSize( vout_thread_t *p_vout, unsigned *pi_width,
unsigned *pi_height )
{
vlc_value_t val;
int i_width, i_height;
uint64_t ll_zoom;
#define FP_FACTOR 1000 /* our fixed point factor */
var_Get( p_vout, "width", &val );
i_width = val.i_int;
var_Get( p_vout, "height", &val );
i_height = val.i_int;
var_Get( p_vout, "zoom", &val );
ll_zoom = (uint64_t)( FP_FACTOR * val.f_float );
if( i_width > 0 && i_height > 0)
{
*pi_width = (int)( i_width * ll_zoom / FP_FACTOR );
*pi_height = (int)( i_height * ll_zoom / FP_FACTOR );
return;
}
else if( i_width > 0 )
{
*pi_width = (int)( i_width * ll_zoom / FP_FACTOR );
*pi_height = (int)( p_vout->fmt_in.i_visible_height * ll_zoom *
p_vout->fmt_in.i_sar_den * i_width / p_vout->fmt_in.i_sar_num /
FP_FACTOR / p_vout->fmt_in.i_visible_width );
return;
}
else if( i_height > 0 )
{
*pi_height = (int)( i_height * ll_zoom / FP_FACTOR );
*pi_width = (int)( p_vout->fmt_in.i_visible_width * ll_zoom *
p_vout->fmt_in.i_sar_num * i_height / p_vout->fmt_in.i_sar_den /
FP_FACTOR / p_vout->fmt_in.i_visible_height );
return;
}
if( p_vout->fmt_in.i_sar_num >= p_vout->fmt_in.i_sar_den )
{
*pi_width = (int)( p_vout->fmt_in.i_visible_width * ll_zoom *
p_vout->fmt_in.i_sar_num / p_vout->fmt_in.i_sar_den / FP_FACTOR );
*pi_height = (int)( p_vout->fmt_in.i_visible_height * ll_zoom
/ FP_FACTOR );
}
else
{
*pi_width = (int)( p_vout->fmt_in.i_visible_width * ll_zoom
/ FP_FACTOR );
*pi_height = (int)( p_vout->fmt_in.i_visible_height * ll_zoom *
p_vout->fmt_in.i_sar_den / p_vout->fmt_in.i_sar_num / FP_FACTOR );
}
#undef FP_FACTOR
}
/*****************************************************************************
* Object variables callbacks
*****************************************************************************/
......@@ -577,6 +650,9 @@ static int CropCallback( vlc_object_t *p_this, char const *psz_cmd,
}
crop_end:
InitWindowSize( p_vout, &p_vout->i_window_width,
&p_vout->i_window_height );
p_vout->i_changes |= VOUT_CROP_CHANGE;
msg_Dbg( p_vout, "cropping picture %ix%i to %i,%i,%ix%i",
......
......@@ -445,19 +445,18 @@ void vout_PlacePicture( vout_thread_t *p_vout,
}
if( 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_width )
*pi_height / p_vout->fmt_in.i_visible_height /
p_vout->fmt_in.i_sar_den > *pi_width )
{
*pi_height = p_vout->fmt_in.i_visible_height *
(int64_t)p_vout->fmt_in.i_sar_den * *pi_width /
(p_vout->fmt_in.i_visible_width * p_vout->fmt_in.i_sar_num);
p_vout->fmt_in.i_visible_width / p_vout->fmt_in.i_sar_num;
}
else
{
*pi_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);
p_vout->fmt_in.i_visible_height / p_vout->fmt_in.i_sar_den;
}
switch( p_vout->i_alignment & VOUT_ALIGN_HMASK )
......
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