diff mbox series

[FFmpeg-devel,4/4] avfilter/vf_geq: fix interpolation with 1 pixel width/height

Message ID 20240509064918.6654-4-cus@passwd.hu
State New
Headers show
Series [FFmpeg-devel,1/4] avfilter/vsrc_testsrc: do not round down width and height for color src | expand

Commit Message

Marton Balint May 9, 2024, 6:49 a.m. UTC
Fixes ticket #9740.

Signed-off-by: Marton Balint <cus@passwd.hu>
---
 libavfilter/vf_geq.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

Comments

Michael Niedermayer May 11, 2024, 1:57 a.m. UTC | #1
On Thu, May 09, 2024 at 08:49:18AM +0200, Marton Balint wrote:
> Fixes ticket #9740.
> 
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
>  libavfilter/vf_geq.c | 20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/libavfilter/vf_geq.c b/libavfilter/vf_geq.c
> index dbe50e5250..12604d44a2 100644
> --- a/libavfilter/vf_geq.c
> +++ b/libavfilter/vf_geq.c
> @@ -112,8 +112,12 @@ static inline double getpix(void *priv, double x, double y, int plane)
>          return 0;
>  
>      if (geq->interpolation == INTERP_BILINEAR) {
> -        xi = x = av_clipd(x, 0, w - 2);
> -        yi = y = av_clipd(y, 0, h - 2);
> +        int xn, yn;
> +
> +        xi = x = av_clipd(x, 0, w - 1);
> +        yi = y = av_clipd(y, 0, h - 1);
> +        xn = av_clip(xi + 1, 0, w - 1);
> +        yn = av_clip(yi + 1, 0, h - 1);

xi + 1 should not need cliping, a FFMIN() should be enough

thx

[...]
Marton Balint May 13, 2024, 7:43 p.m. UTC | #2
On Sat, 11 May 2024, Michael Niedermayer wrote:

> On Thu, May 09, 2024 at 08:49:18AM +0200, Marton Balint wrote:
>> Fixes ticket #9740.
>>
>> Signed-off-by: Marton Balint <cus@passwd.hu>
>> ---
>>  libavfilter/vf_geq.c | 20 ++++++++++++--------
>>  1 file changed, 12 insertions(+), 8 deletions(-)
>>
>> diff --git a/libavfilter/vf_geq.c b/libavfilter/vf_geq.c
>> index dbe50e5250..12604d44a2 100644
>> --- a/libavfilter/vf_geq.c
>> +++ b/libavfilter/vf_geq.c
>> @@ -112,8 +112,12 @@ static inline double getpix(void *priv, double x, double y, int plane)
>>          return 0;
>>
>>      if (geq->interpolation == INTERP_BILINEAR) {
>> -        xi = x = av_clipd(x, 0, w - 2);
>> -        yi = y = av_clipd(y, 0, h - 2);
>> +        int xn, yn;
>> +
>> +        xi = x = av_clipd(x, 0, w - 1);
>> +        yi = y = av_clipd(y, 0, h - 1);
>> +        xn = av_clip(xi + 1, 0, w - 1);
>> +        yn = av_clip(yi + 1, 0, h - 1);
>
> xi + 1 should not need cliping, a FFMIN() should be enough

Ok, will apply the series with that change.

Thanks,
Marton
diff mbox series

Patch

diff --git a/libavfilter/vf_geq.c b/libavfilter/vf_geq.c
index dbe50e5250..12604d44a2 100644
--- a/libavfilter/vf_geq.c
+++ b/libavfilter/vf_geq.c
@@ -112,8 +112,12 @@  static inline double getpix(void *priv, double x, double y, int plane)
         return 0;
 
     if (geq->interpolation == INTERP_BILINEAR) {
-        xi = x = av_clipd(x, 0, w - 2);
-        yi = y = av_clipd(y, 0, h - 2);
+        int xn, yn;
+
+        xi = x = av_clipd(x, 0, w - 1);
+        yi = y = av_clipd(y, 0, h - 1);
+        xn = av_clip(xi + 1, 0, w - 1);
+        yn = av_clip(yi + 1, 0, h - 1);
 
         x -= xi;
         y -= yi;
@@ -122,17 +126,17 @@  static inline double getpix(void *priv, double x, double y, int plane)
             const uint16_t *src16 = (const uint16_t*)src;
             linesize /= 2;
 
-            return (1-y)*((1-x)*src16[xi +  yi    * linesize] + x*src16[xi + 1 +  yi    * linesize])
-                  +   y *((1-x)*src16[xi + (yi+1) * linesize] + x*src16[xi + 1 + (yi+1) * linesize]);
+            return (1-y)*((1-x)*src16[xi + yi * linesize] + x*src16[xn + yi * linesize])
+                  +   y *((1-x)*src16[xi + yn * linesize] + x*src16[xn + yn * linesize]);
         } else if (geq->bps == 32) {
             const float *src32 = (const float*)src;
             linesize /= 4;
 
-            return (1-y)*((1-x)*src32[xi +  yi    * linesize] + x*src32[xi + 1 +  yi    * linesize])
-                  +   y *((1-x)*src32[xi + (yi+1) * linesize] + x*src32[xi + 1 + (yi+1) * linesize]);
+            return (1-y)*((1-x)*src32[xi + yi * linesize] + x*src32[xn + yi * linesize])
+                  +   y *((1-x)*src32[xi + yn * linesize] + x*src32[xn + yn * linesize]);
         } else if (geq->bps == 8) {
-            return (1-y)*((1-x)*src[xi +  yi    * linesize] + x*src[xi + 1 +  yi    * linesize])
-                  +   y *((1-x)*src[xi + (yi+1) * linesize] + x*src[xi + 1 + (yi+1) * linesize]);
+            return (1-y)*((1-x)*src[xi + yi * linesize] + x*src[xn + yi * linesize])
+                  +   y *((1-x)*src[xi + yn * linesize] + x*src[xn + yn * linesize]);
         }
     } else {
         xi = av_clipd(x, 0, w - 1);