summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/interface-changes.rst2
-rw-r--r--DOCS/man/options.rst11
-rw-r--r--video/out/aspect.c34
3 files changed, 18 insertions, 29 deletions
diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst
index f884296707..ee6e135808 100644
--- a/DOCS/interface-changes.rst
+++ b/DOCS/interface-changes.rst
@@ -28,6 +28,8 @@ Interface changes
- rename --input-unix-socket to --input-ipc-server, and make it work on
Windows too
- change the exact behavior of the "video-zoom" property
+ - --video-unscaled no longer disables --video-zoom and --video-aspect
+ To force the old behavior, set --video-zoom=0 and --video-aspect=0
--- mpv 0.16.0 ---
- change --audio-channels default to stereo (use --audio-channels=auto to
get the old default)
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index 72a67c85b4..18ac7fd2f0 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -684,15 +684,12 @@ Video
``--video-unscaled``
Disable scaling of the video. If the window is larger than the video,
black bars are added. Otherwise, the video is cropped. The video still
- can be influenced by the other ``--video-...`` options. (But not all; for
- example ``--video-zoom`` does nothing if this option is enabled.)
-
- The video and monitor aspects aspect will be ignored. Aspect correction
- would require scaling the video in the X or Y direction, but this option
- disables scaling, disabling all aspect correction.
+ can be influenced by the other ``--video-...`` options.
Note that the scaler algorithm may still be used, even if the video isn't
- scaled. For example, this can influence chroma conversion.
+ scaled. For example, this can influence chroma conversion. The video will
+ also still be scaled in one dimension if the source uses non-square pixels
+ (e.g. anamorphic widescreen DVDs).
This option is disabled if the ``--no-keepaspect`` option is used.
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);