if ((*filterPos)[i] + filterSize > srcW) {
int shift = (*filterPos)[i] + FFMIN(filterSize - srcW, 0);
+ int64_t acc = 0;
- // move filter coefficients right to compensate for filterPos
- for (j = filterSize - 2; j >= 0; j--) {
- int right = FFMIN(j + shift, filterSize - 1);
- filter[i * filterSize + right] += filter[i * filterSize + j];
- filter[i * filterSize + j] = 0;
+ for (j = filterSize - 1; j >= 0; j--) {
+ if ((*filterPos)[i] + j >= srcW) {
+ acc += filter[i * filterSize + j];
+ filter[i * filterSize + j] = 0;
+ }
}
+ for (j = filterSize - 1; j >= 0; j--) {
+ if (j < shift) {
+ filter[i * filterSize + j] = 0;
+ } else {
+ filter[i * filterSize + j] = filter[i * filterSize + j - shift];
+ }
+ }
+
(*filterPos)[i]-= shift;
+ filter[i * filterSize + srcW - 1 - (*filterPos)[i]] += acc;
+ }
+ av_assert0((*filterPos)[i] >= 0);
+ av_assert0((*filterPos)[i] < srcW);
+ if ((*filterPos)[i] + filterSize > srcW) {
+ for (j = 0; j < filterSize; j++) {
+ av_assert0((*filterPos)[i] + j < srcW || !filter[i * filterSize + j]);
+ }
}
}
c->chrDstW = FF_CEIL_RSHIFT(dstW, c->chrDstHSubSample);
c->chrDstH = FF_CEIL_RSHIFT(dstH, c->chrDstVSubSample);
- FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW*2+78, 16) * 2, fail);
+ FF_ALLOCZ_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW*2+78, 16) * 2, fail);
c->srcBpc = 1 + desc_src->comp[0].depth_minus1;
if (c->srcBpc < 8)