This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit a1b8cbb8bc3f089716ff93152e4806d4d1129e1d
Author:     Niklas Haas <[email protected]>
AuthorDate: Wed Feb 18 18:11:59 2026 +0100
Commit:     Niklas Haas <[email protected]>
CommitDate: Thu Mar 12 22:08:07 2026 +0100

    swscale/utils: separate luma and chroma scaler selection
    
    Pre-requisite for adding support for configuring these independently.
    
    Sponsored-by: Sovereign Tech Fund
    Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/utils.c | 61 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 34 insertions(+), 27 deletions(-)

diff --git a/libswscale/utils.c b/libswscale/utils.c
index 9b9e667089..a0da6bc5b6 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -196,7 +196,7 @@ static const ScaleAlgorithm scale_algorithms[] = {
 static av_cold int initFilter(int16_t **outFilter, int32_t **filterPos,
                               int *outFilterSize, int xInc, int srcW,
                               int dstW, int filterAlign, int one,
-                              int flags, int cpu_flags,
+                              int scaler, int flags, int cpu_flags,
                               SwsVector *srcFilter, SwsVector *dstFilter,
                               double param[SWS_NUM_SCALER_PARAMS], int srcPos, 
int dstPos)
 {
@@ -225,7 +225,7 @@ static av_cold int initFilter(int16_t **outFilter, int32_t 
**filterPos,
             filter[i * filterSize] = fone;
             (*filterPos)[i]        = i;
         }
-    } else if (flags & SWS_POINT) { // lame looking point sampling mode
+    } else if (scaler == SWS_POINT) { // lame looking point sampling mode
         int i;
         int64_t xDstInSrc;
         filterSize = 1;
@@ -240,8 +240,8 @@ static av_cold int initFilter(int16_t **outFilter, int32_t 
**filterPos,
             filter[i]       = fone;
             xDstInSrc      += xInc;
         }
-    } else if ((xInc <= (1 << 16) && (flags & SWS_AREA)) ||
-               (flags & SWS_FAST_BILINEAR)) { // bilinear upscale
+    } else if ((xInc <= (1 << 16) && (scaler == SWS_AREA)) ||
+               (scaler == SWS_FAST_BILINEAR)) { // bilinear upscale
         int i;
         int64_t xDstInSrc;
         filterSize = 2;
@@ -269,12 +269,12 @@ static av_cold int initFilter(int16_t **outFilter, 
int32_t **filterPos,
         int sizeFactor = -1;
 
         for (i = 0; i < FF_ARRAY_ELEMS(scale_algorithms); i++) {
-            if (flags & scale_algorithms[i].flag && 
scale_algorithms[i].size_factor > 0) {
+            if (scaler == scale_algorithms[i].flag && 
scale_algorithms[i].size_factor > 0) {
                 sizeFactor = scale_algorithms[i].size_factor;
                 break;
             }
         }
-        if (flags & SWS_LANCZOS)
+        if (scaler == SWS_LANCZOS)
             sizeFactor = param[0] != SWS_PARAM_DEFAULT ? ceil(2 * param[0]) : 
6;
         av_assert0(sizeFactor > 0);
 
@@ -308,7 +308,7 @@ static av_cold int initFilter(int16_t **outFilter, int32_t 
**filterPos,
                     d = d * dstW / srcW;
                 floatd = d * (1.0 / (1 << 30));
 
-                if (flags & SWS_BICUBIC) {
+                if (scaler == SWS_BICUBIC) {
                     int64_t B = (param[0] != SWS_PARAM_DEFAULT ? param[0] :   
0) * (1 << 24);
                     int64_t C = (param[1] != SWS_PARAM_DEFAULT ? param[1] : 
0.6) * (1 << 24);
 
@@ -329,7 +329,7 @@ static av_cold int initFilter(int16_t **outFilter, int32_t 
**filterPos,
                                       (8 * B + 24 * C) * (1 << 30);
                     }
                     coeff /= (1LL<<54)/fone;
-                } else if (flags & SWS_X) {
+                } else if (scaler == SWS_X) {
                     double A = param[0] != SWS_PARAM_DEFAULT ? param[0] : 1.0;
                     double c;
 
@@ -342,7 +342,7 @@ static av_cold int initFilter(int16_t **outFilter, int32_t 
**filterPos,
                     else
                         c = pow(c, A);
                     coeff = (c * 0.5 + 0.5) * fone;
-                } else if (flags & SWS_AREA) {
+                } else if (scaler == SWS_AREA) {
                     int64_t d2 = d - (1 << 29);
                     if (d2 * xInc < -(1LL << (29 + 16)))
                         coeff = 1.0 * (1LL << (30 + 16));
@@ -351,23 +351,23 @@ static av_cold int initFilter(int16_t **outFilter, 
int32_t **filterPos,
                     else
                         coeff = 0.0;
                     coeff *= fone >> (30 + 16);
-                } else if (flags & SWS_GAUSS) {
+                } else if (scaler == SWS_GAUSS) {
                     double p = param[0] != SWS_PARAM_DEFAULT ? param[0] : 3.0;
                     coeff = exp2(-p * floatd * floatd) * fone;
-                } else if (flags & SWS_SINC) {
+                } else if (scaler == SWS_SINC) {
                     coeff = (d ? sin(floatd * M_PI) / (floatd * M_PI) : 1.0) * 
fone;
-                } else if (flags & SWS_LANCZOS) {
+                } else if (scaler == SWS_LANCZOS) {
                     double p = param[0] != SWS_PARAM_DEFAULT ? param[0] : 3.0;
                     coeff = (d ? sin(floatd * M_PI) * sin(floatd * M_PI / p) /
                              (floatd * floatd * M_PI * M_PI / p) : 1.0) * fone;
                     if (floatd > p)
                         coeff = 0;
-                } else if (flags & SWS_BILINEAR) {
+                } else if (scaler == SWS_BILINEAR) {
                     coeff = (1 << 30) - d;
                     if (coeff < 0)
                         coeff = 0;
                     coeff *= fone >> 30;
-                } else if (flags & SWS_SPLINE) {
+                } else if (scaler == SWS_SPLINE) {
                     double p = -2.196152422706632;
                     coeff = getSplineCoeff(1.0, 0.0, p, -p - 1.0, floatd) * 
fone;
                 } else {
@@ -1191,17 +1191,30 @@ av_cold int ff_sws_init_single_context(SwsContext *sws, 
SwsFilter *srcFilter,
     /* provide a default scaler if not set by caller */
     if (!i) {
         if (dstW < srcW && dstH < srcH)
-            flags |= SWS_BICUBIC;
+            i = SWS_BICUBIC;
         else if (dstW > srcW && dstH > srcH)
-            flags |= SWS_BICUBIC;
+            i = SWS_BICUBIC;
         else
-            flags |= SWS_BICUBIC;
+            i = SWS_BICUBIC;
+        flags |= i;
         sws->flags = flags;
     } else if (i & (i - 1)) {
         av_log(c, AV_LOG_ERROR,
                "Exactly one scaler algorithm must be chosen, got %X\n", i);
         return AVERROR(EINVAL);
     }
+
+    if (i == SWS_FAST_BILINEAR) {
+        if (srcW < 8 || dstW <= 8) {
+            i = SWS_BILINEAR;
+            flags ^= SWS_FAST_BILINEAR | i;
+            sws->flags = flags;
+        }
+    }
+
+    int lum_scaler = i == SWS_BICUBLIN ? SWS_BICUBIC  : i;
+    int chr_scaler = i == SWS_BICUBLIN ? SWS_BILINEAR : i;
+
     /* sanity check */
     if (srcW < 1 || srcH < 1 || dstW < 1 || dstH < 1) {
         /* FIXME check if these are enough and try to lower them after
@@ -1210,12 +1223,6 @@ av_cold int ff_sws_init_single_context(SwsContext *sws, 
SwsFilter *srcFilter,
                srcW, srcH, dstW, dstH);
         return AVERROR(EINVAL);
     }
-    if (flags & SWS_FAST_BILINEAR) {
-        if (srcW < 8 || dstW <= 8) {
-            flags ^= SWS_FAST_BILINEAR | SWS_BILINEAR;
-            sws->flags = flags;
-        }
-    }
 
     if (!dstFilter)
         dstFilter = &dummyFilter;
@@ -1691,7 +1698,7 @@ av_cold int ff_sws_init_single_context(SwsContext *sws, 
SwsFilter *srcFilter,
             if ((ret = initFilter(&c->hLumFilter, &c->hLumFilterPos,
                            &c->hLumFilterSize, c->lumXInc,
                            srcW, dstW, filterAlign, 1 << 14,
-                           (flags & SWS_BICUBLIN) ? (flags | SWS_BICUBIC) : 
flags,
+                           lum_scaler, flags,
                            cpu_flags, srcFilter->lumH, dstFilter->lumH,
                            sws->scaler_params,
                            get_local_pos(c, 0, 0, 0),
@@ -1702,7 +1709,7 @@ av_cold int ff_sws_init_single_context(SwsContext *sws, 
SwsFilter *srcFilter,
             if ((ret = initFilter(&c->hChrFilter, &c->hChrFilterPos,
                            &c->hChrFilterSize, c->chrXInc,
                            c->chrSrcW, c->chrDstW, filterAlign, 1 << 14,
-                           (flags & SWS_BICUBLIN) ? (flags | SWS_BILINEAR) : 
flags,
+                           chr_scaler, flags,
                            cpu_flags, srcFilter->chrH, dstFilter->chrH,
                            sws->scaler_params,
                            get_local_pos(c, c->chrSrcHSubSample, 
sws->src_h_chr_pos, 0),
@@ -1721,7 +1728,7 @@ av_cold int ff_sws_init_single_context(SwsContext *sws, 
SwsFilter *srcFilter,
 
         ret = initFilter(&c->vLumFilter, &c->vLumFilterPos, &c->vLumFilterSize,
                        c->lumYInc, srcH, dstH, filterAlign, (1 << 12),
-                       (flags & SWS_BICUBLIN) ? (flags | SWS_BICUBIC) : flags,
+                       lum_scaler, flags,
                        cpu_flags, srcFilter->lumV, dstFilter->lumV,
                        sws->scaler_params,
                        get_local_pos(c, 0, 0, 1),
@@ -1732,7 +1739,7 @@ av_cold int ff_sws_init_single_context(SwsContext *sws, 
SwsFilter *srcFilter,
         if ((ret = initFilter(&c->vChrFilter, &c->vChrFilterPos, 
&c->vChrFilterSize,
                        c->chrYInc, c->chrSrcH, c->chrDstH,
                        filterAlign, (1 << 12),
-                       (flags & SWS_BICUBLIN) ? (flags | SWS_BILINEAR) : flags,
+                       chr_scaler, flags,
                        cpu_flags, srcFilter->chrV, dstFilter->chrV,
                        sws->scaler_params,
                        get_local_pos(c, c->chrSrcVSubSample, 
sws->src_v_chr_pos, 1),

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to