Fixes ticket #9740.
Showing the changes to libavfilter (1 of 1 file). Show all
Unified · Split
| @@ -112,8 +112,12 @@ static inline double getpix(void *priv, double x, double y, int plane) · 111 unmodified lines | |||
| 112 | return 0; | 112 | return 0; |
| 113 | 113 | ||
| 114 | if (geq->interpolation == INTERP_BILINEAR) { | 114 | if (geq->interpolation == INTERP_BILINEAR) { |
| 115 | xi = x = av_clipd(x, 0, w - 2); | 115 | int xn, yn; |
| 116 | yi = y = av_clipd(y, 0, h - 2); | 116 | |
| 117 | xi = x = av_clipd(x, 0, w - 1); | ||
| 118 | yi = y = av_clipd(y, 0, h - 1); | ||
| 119 | xn = FFMIN(xi + 1, w - 1); | ||
| 120 | yn = FFMIN(yi + 1, h - 1); | ||
| 117 | 121 | ||
| 118 | x -= xi; | 122 | x -= xi; |
| 119 | y -= yi; | 123 | y -= yi; |
| @@ -122,17 +126,17 @@ static inline double getpix(void *priv, double x, double y, int plane) · 2 unmodified lines | |||
| 122 | const uint16_t *src16 = (const uint16_t*)src; | 126 | const uint16_t *src16 = (const uint16_t*)src; |
| 123 | linesize /= 2; | 127 | linesize /= 2; |
| 124 | 128 | ||
| 125 | return (1-y)*((1-x)*src16[xi + yi * linesize] + x*src16[xi + 1 + yi * linesize]) | 129 | return (1-y)*((1-x)*src16[xi + yi * linesize] + x*src16[xn + yi * linesize]) |
| 126 | + y *((1-x)*src16[xi + (yi+1) * linesize] + x*src16[xi + 1 + (yi+1) * linesize]); | 130 | + y *((1-x)*src16[xi + yn * linesize] + x*src16[xn + yn * linesize]); |
| 127 | } else if (geq->bps == 32) { | 131 | } else if (geq->bps == 32) { |
| 128 | const float *src32 = (const float*)src; | 132 | const float *src32 = (const float*)src; |
| 129 | linesize /= 4; | 133 | linesize /= 4; |
| 130 | 134 | ||
| 131 | return (1-y)*((1-x)*src32[xi + yi * linesize] + x*src32[xi + 1 + yi * linesize]) | 135 | return (1-y)*((1-x)*src32[xi + yi * linesize] + x*src32[xn + yi * linesize]) |
| 132 | + y *((1-x)*src32[xi + (yi+1) * linesize] + x*src32[xi + 1 + (yi+1) * linesize]); | 136 | + y *((1-x)*src32[xi + yn * linesize] + x*src32[xn + yn * linesize]); |
| 133 | } else if (geq->bps == 8) { | 137 | } else if (geq->bps == 8) { |
| 134 | return (1-y)*((1-x)*src[xi + yi * linesize] + x*src[xi + 1 + yi * linesize]) | 138 | return (1-y)*((1-x)*src[xi + yi * linesize] + x*src[xn + yi * linesize]) |
| 135 | + y *((1-x)*src[xi + (yi+1) * linesize] + x*src[xi + 1 + (yi+1) * linesize]); | 139 | + y *((1-x)*src[xi + yn * linesize] + x*src[xn + yn * linesize]); |
| 136 | } | 140 | } |
| 137 | } else { | 141 | } else { |
| 138 | xi = av_clipd(x, 0, w - 1); | 142 | xi = av_clipd(x, 0, w - 1); |