summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-03-01 22:31:35 +0100
committerwm4 <wm4@nowhere>2015-03-01 22:32:38 +0100
commit08199a64d2e7e9f1a9430f0258a98285cdf1c902 (patch)
tree1f8cdc615dba3a835b7914063314b3d7e3f75ff5 /video
parent1bbf1eb3ce2bdb0ef3ec3b045074bcb2f3af6a7a (diff)
downloadmpv-08199a64d2e7e9f1a9430f0258a98285cdf1c902.tar.bz2
mpv-08199a64d2e7e9f1a9430f0258a98285cdf1c902.tar.xz
vf_scale: libswscale is being stupid
This time (there are a lot of times), libswscale randomly ignores brightness/saturation/contrast settings. Looking at MPlayer code, it appears the return value of sws_setColorspaceDetails() signals if changing these settings is supported at all. (Nevermind that supporting this feature has almost 0 value, and obviously eats maintenance time.)
Diffstat (limited to 'video')
-rw-r--r--video/sws_utils.c12
-rw-r--r--video/sws_utils.h1
2 files changed, 10 insertions, 3 deletions
diff --git a/video/sws_utils.c b/video/sws_utils.c
index 7f3cd089ac..6d8329cabe 100644
--- a/video/sws_utils.c
+++ b/video/sws_utils.c
@@ -238,9 +238,11 @@ int mp_sws_reinit(struct mp_sws_context *ctx)
// This can fail even with normal operation, e.g. if a conversion path
// simply does not support these settings.
- sws_setColorspaceDetails(ctx->sws, sws_getCoefficients(s_csp), s_range,
- sws_getCoefficients(d_csp), d_range,
- ctx->brightness, ctx->contrast, ctx->saturation);
+ int r =
+ sws_setColorspaceDetails(ctx->sws, sws_getCoefficients(s_csp), s_range,
+ sws_getCoefficients(d_csp), d_range,
+ ctx->brightness, ctx->contrast, ctx->saturation);
+ ctx->supports_csp = r >= 0;
if (sws_init_context(ctx->sws, ctx->src_filter, ctx->dst_filter) < 0)
return -1;
@@ -294,6 +296,8 @@ int mp_image_sw_blur_scale(struct mp_image *dst, struct mp_image *src,
int mp_sws_get_vf_equalizer(struct mp_sws_context *sws, struct vf_seteq *eq)
{
+ if (!sws->supports_csp)
+ return 0;
if (!strcmp(eq->item, "brightness"))
eq->value = ((sws->brightness * 100) + (1 << 15)) >> 16;
else if (!strcmp(eq->item, "contrast"))
@@ -307,6 +311,8 @@ int mp_sws_get_vf_equalizer(struct mp_sws_context *sws, struct vf_seteq *eq)
int mp_sws_set_vf_equalizer(struct mp_sws_context *sws, struct vf_seteq *eq)
{
+ if (!sws->supports_csp)
+ return 0;
if (!strcmp(eq->item, "brightness"))
sws->brightness = ((eq->value << 16) + 50) / 100;
else if (!strcmp(eq->item, "contrast"))
diff --git a/video/sws_utils.h b/video/sws_utils.h
index ac643dd7cf..f8b4384e97 100644
--- a/video/sws_utils.h
+++ b/video/sws_utils.h
@@ -44,6 +44,7 @@ struct mp_sws_context {
// Cached context (if any)
struct SwsContext *sws;
+ bool supports_csp;
// Contains parameters for which sws is valid
struct mp_sws_context *cached;