summaryrefslogtreecommitdiffstats
path: root/filters
diff options
context:
space:
mode:
Diffstat (limited to 'filters')
-rw-r--r--filters/f_autoconvert.c2
-rw-r--r--filters/f_autoconvert.h3
-rw-r--r--filters/f_swscale.c4
-rw-r--r--filters/f_swscale.h3
4 files changed, 12 insertions, 0 deletions
diff --git a/filters/f_autoconvert.c b/filters/f_autoconvert.c
index 5e0caaf321..7452a13ae8 100644
--- a/filters/f_autoconvert.c
+++ b/filters/f_autoconvert.c
@@ -244,6 +244,8 @@ static bool build_image_converter(struct mp_autoconvert *c, struct mp_log *log,
goto fail;
}
+ sws->force_scaler = c->force_scaler;
+
int out = mp_sws_find_best_out_format(sws, src_fmt, fmts, num_fmts);
if (!out) {
mp_err(log, "can't find video conversion for %s\n",
diff --git a/filters/f_autoconvert.h b/filters/f_autoconvert.h
index 7cb144aa59..6d6660c46a 100644
--- a/filters/f_autoconvert.h
+++ b/filters/f_autoconvert.h
@@ -1,6 +1,7 @@
#pragma once
#include "filter.h"
+#include "video/sws_utils.h"
struct mp_image;
struct mp_image_params;
@@ -12,6 +13,8 @@ struct mp_autoconvert {
// f->pins[0] is input, f->pins[1] is output
struct mp_filter *f;
+ enum mp_sws_scaler force_scaler;
+
// If this is set, the callback is invoked (from the process function), and
// further data flow is blocked until mp_autoconvert_format_change_continue()
// is called. The idea is that you can reselect the output parameters on
diff --git a/filters/f_swscale.c b/filters/f_swscale.c
index f9af4d18fb..614de1466c 100644
--- a/filters/f_swscale.c
+++ b/filters/f_swscale.c
@@ -43,6 +43,8 @@
int mp_sws_find_best_out_format(struct mp_sws_filter *sws, int in_format,
int *out_formats, int num_out_formats)
{
+ sws->sws->force_scaler = sws->force_scaler;
+
int best = 0;
for (int n = 0; n < num_out_formats; n++) {
int out_format = out_formats[n];
@@ -73,6 +75,8 @@ static void process(struct mp_filter *f)
if (!mp_pin_can_transfer_data(f->ppins[1], f->ppins[0]))
return;
+ s->sws->force_scaler = s->force_scaler;
+
struct mp_frame frame = mp_pin_out_read(f->ppins[0]);
if (mp_frame_is_signaling(frame)) {
mp_pin_in_write(f->ppins[1], frame);
diff --git a/filters/f_swscale.h b/filters/f_swscale.h
index 861ad029dd..3ee7455ecd 100644
--- a/filters/f_swscale.h
+++ b/filters/f_swscale.h
@@ -3,6 +3,7 @@
#include <stdbool.h>
#include "video/mp_image.h"
+#include "video/sws_utils.h"
struct mp_sws_filter {
struct mp_filter *f;
@@ -11,6 +12,8 @@ struct mp_sws_filter {
// If set, force all image params; ignores out_format.
bool use_out_params;
struct mp_image_params out_params;
+ // Other options.
+ enum mp_sws_scaler force_scaler;
// private state
struct mp_sws_context *sws;
struct mp_image_pool *pool;