History

avfilter/vf_geq: fix interpolation with 1 pixel width/height

Fixes ticket #9740.

Marton Balint committed 2 years ago

Commit b0093ab1 parent 64330e31 file · +12 −8Browse files

Unified · Split

libavfilter/vf_geq.c+12−8
@@ -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);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t