aboutsummaryrefslogtreecommitdiffstats
path: root/libswscale
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2021-05-19 10:12:15 +0200
committerAnton Khirnov <anton@khirnov.net>2021-07-03 15:29:50 +0200
commit44f12718bfba8d1dd2e0757c13ddb91ea349f996 (patch)
treecedab3a47894668c6f8f5d8367bccc84b33b1c17 /libswscale
parente355af9be9756e81e6e6d5a51cfc2853c1e5001e (diff)
downloadffmpeg-44f12718bfba8d1dd2e0757c13ddb91ea349f996.tar.gz
sws: factor out gamma-correct scaling
Diffstat (limited to 'libswscale')
-rw-r--r--libswscale/swscale.c53
1 files changed, 30 insertions, 23 deletions
diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 9743c56295..876dc05442 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -811,6 +811,34 @@ static void update_palette(SwsContext *c, const uint32_t *pal)
}
}
+static int scale_gamma(SwsContext *c,
+ const uint8_t * const srcSlice[], const int srcStride[],
+ int srcSliceY, int srcSliceH,
+ uint8_t * const dst[], const int dstStride[])
+{
+ int ret = sws_scale(c->cascaded_context[0],
+ srcSlice, srcStride, srcSliceY, srcSliceH,
+ c->cascaded_tmp, c->cascaded_tmpStride);
+
+ if (ret < 0)
+ return ret;
+
+ if (c->cascaded_context[2])
+ ret = sws_scale(c->cascaded_context[1], (const uint8_t * const *)c->cascaded_tmp, c->cascaded_tmpStride, srcSliceY, srcSliceH, c->cascaded1_tmp, c->cascaded1_tmpStride);
+ else
+ ret = sws_scale(c->cascaded_context[1], (const uint8_t * const *)c->cascaded_tmp, c->cascaded_tmpStride, srcSliceY, srcSliceH, dst, dstStride);
+
+ if (ret < 0)
+ return ret;
+
+ if (c->cascaded_context[2]) {
+ ret = sws_scale(c->cascaded_context[2],
+ (const uint8_t * const *)c->cascaded1_tmp, c->cascaded1_tmpStride, c->cascaded_context[1]->dstY - ret, c->cascaded_context[1]->dstY,
+ dst, dstStride);
+ }
+ return ret;
+}
+
/**
* swscale wrapper, so we don't need to export the SwsContext.
* Assumes planar YUV to be in YUV order instead of YVU.
@@ -848,29 +876,8 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
return AVERROR(EINVAL);
}
- if (c->gamma_flag && c->cascaded_context[0]) {
- ret = sws_scale(c->cascaded_context[0],
- srcSlice, srcStride, srcSliceY, srcSliceH,
- c->cascaded_tmp, c->cascaded_tmpStride);
-
- if (ret < 0)
- return ret;
-
- if (c->cascaded_context[2])
- ret = sws_scale(c->cascaded_context[1], (const uint8_t * const *)c->cascaded_tmp, c->cascaded_tmpStride, srcSliceY, srcSliceH, c->cascaded1_tmp, c->cascaded1_tmpStride);
- else
- ret = sws_scale(c->cascaded_context[1], (const uint8_t * const *)c->cascaded_tmp, c->cascaded_tmpStride, srcSliceY, srcSliceH, dst, dstStride);
-
- if (ret < 0)
- return ret;
-
- if (c->cascaded_context[2]) {
- ret = sws_scale(c->cascaded_context[2],
- (const uint8_t * const *)c->cascaded1_tmp, c->cascaded1_tmpStride, c->cascaded_context[1]->dstY - ret, c->cascaded_context[1]->dstY,
- dst, dstStride);
- }
- return ret;
- }
+ if (c->gamma_flag && c->cascaded_context[0])
+ return scale_gamma(c, srcSlice, srcStride, srcSliceY, srcSliceH, dst, dstStride);
if (c->cascaded_context[0] && srcSliceY == 0 && srcSliceH == c->cascaded_context[0]->srcH) {
ret = sws_scale(c->cascaded_context[0],