summaryrefslogtreecommitdiffstats
path: root/video/out/aspect.c
diff options
context:
space:
mode:
authorNiklas Haas <git@nand.wakku.to>2016-04-10 17:26:32 +0200
committerwm4 <wm4@nowhere>2016-04-10 18:29:20 +0200
commitb968d779afb9114694976792e903b0591a71a816 (patch)
tree25f128c719d098d2fd2f0611e06c8182a1cce037 /video/out/aspect.c
parentb18bfd0352cc1723ad9194a2cd31e263124e62b5 (diff)
downloadmpv-b968d779afb9114694976792e903b0591a71a816.tar.bz2
mpv-b968d779afb9114694976792e903b0591a71a816.tar.xz
aspect: rework --video-unscaled
In the past, --video-unscaled also disabled zooming and aspect ratio corrections. But this didn't make much sense in terms of being a useful option. The new behavior just sets the initial video size to be unscaled, but it's still affected by zoom commands and aspect ratio corrections. To get the old behavior back, --video-aspect=0 --video-zoom=0 need to be added as well (in the general case). Most of the time it should not make a difference though. Also, there seems to have been some additional dst_rect clamping code inside src_dst_split_scaling that didn't seem to either be necessary nor ever get triggered. (The code immediately above it already makes sure to crop the video if it's larger than the dst_rect) No idea why it was there, but I just removed it.
Diffstat (limited to 'video/out/aspect.c')
-rw-r--r--video/out/aspect.c34
1 files changed, 12 insertions, 22 deletions
diff --git a/video/out/aspect.c b/video/out/aspect.c
index 178fd28724..205ee3b89f 100644
--- a/video/out/aspect.c
+++ b/video/out/aspect.c
@@ -27,7 +27,7 @@
#include "sub/osd.h"
static void aspect_calc_panscan(struct mp_vo_opts *opts,
- int w, int h, int d_w, int d_h,
+ int w, int h, int d_w, int d_h, bool unscaled,
int window_w, int window_h, double monitor_par,
int *out_w, int *out_h)
{
@@ -44,12 +44,18 @@ static void aspect_calc_panscan(struct mp_vo_opts *opts,
int vo_panscan_area = window_h - fheight;
double f_w = fwidth / (double)fheight;
double f_h = 1;
- if (!vo_panscan_area) {
+ if (vo_panscan_area == 0) {
vo_panscan_area = window_w - fwidth;
f_w = 1;
f_h = fheight / (double)fwidth;
}
+ if (unscaled) {
+ fwidth = w * monitor_par;
+ fheight = h;
+ vo_panscan_area = 0;
+ }
+
*out_w = fwidth + vo_panscan_area * opts->panscan * f_w;
*out_h = fheight + vo_panscan_area * opts->panscan * f_h;
}
@@ -66,17 +72,12 @@ static void clamp_size(int size, int *start, int *end)
}
static void src_dst_split_scaling(int src_size, int dst_size,
- int scaled_src_size, bool unscaled,
+ int scaled_src_size,
float zoom, float align, float pan,
int *src_start, int *src_end,
int *dst_start, int *dst_end,
int *osd_margin_a, int *osd_margin_b)
{
- if (unscaled) {
- scaled_src_size = src_size;
- zoom = 0.0;
- }
-
scaled_src_size *= powf(2, zoom);
align = (align + 1) / 2;
@@ -103,17 +104,6 @@ static void src_dst_split_scaling(int src_size, int dst_size,
*dst_end = dst_size;
}
- if (unscaled) {
- // Force unscaled by reducing the range for src or dst
- int src_s = *src_end - *src_start;
- int dst_s = *dst_end - *dst_start;
- if (src_s > dst_s) {
- *src_end = *src_start + dst_s;
- } else if (src_s < dst_s) {
- *dst_end = *dst_start + src_s;
- }
- }
-
// For sanity: avoid bothering VOs with corner cases
clamp_size(src_size, src_start, src_end);
clamp_size(dst_size, dst_start, dst_end);
@@ -145,14 +135,14 @@ void mp_get_src_dst_rects(struct mp_log *log, struct mp_vo_opts *opts,
};
if (opts->keepaspect) {
int scaled_width, scaled_height;
- aspect_calc_panscan(opts, src_w, src_h, src_dw, src_dh,
+ aspect_calc_panscan(opts, src_w, src_h, src_dw, src_dh, opts->unscaled,
window_w, window_h, monitor_par,
&scaled_width, &scaled_height);
- src_dst_split_scaling(src_w, window_w, scaled_width, opts->unscaled,
+ src_dst_split_scaling(src_w, window_w, scaled_width,
opts->zoom, opts->align_x, opts->pan_x,
&src.x0, &src.x1, &dst.x0, &dst.x1,
&osd.ml, &osd.mr);
- src_dst_split_scaling(src_h, window_h, scaled_height, opts->unscaled,
+ src_dst_split_scaling(src_h, window_h, scaled_height,
opts->zoom, opts->align_y, opts->pan_y,
&src.y0, &src.y1, &dst.y0, &dst.y1,
&osd.mt, &osd.mb);