vc2enc: zero padding of the coefficient buffer

Wavelet types with large amounts of overreading/writing like 9_7 would
write into the padding at high wavelet depths, which would remain and be
read by the next frame's transform and quickly cause artifacts to appear
for subsequent frames.
This fix affects all frames encoded with a non-power-of-two width, with
the artifacts varying between non-observable to very noticeable,
depending on encoder settings, so reencoding is advisable.
This commit is contained in:
Lynne 2019-12-17 14:56:33 +00:00
parent 3530fdc78e
commit 377a095dc3
No known key found for this signature in database
GPG Key ID: 21F7E7243B6F6C68
1 changed files with 2 additions and 0 deletions

View File

@ -867,6 +867,7 @@ static int dwt_plane(AVCodecContext *avctx, void *arg)
for (x = 0; x < p->width; x++) { for (x = 0; x < p->width; x++) {
buf[x] = pix[x] - s->diff_offset; buf[x] = pix[x] - s->diff_offset;
} }
memset(&buf[x], 0, (p->coef_stride - p->width)*sizeof(dwtcoef));
buf += p->coef_stride; buf += p->coef_stride;
pix += pix_stride; pix += pix_stride;
} }
@ -876,6 +877,7 @@ static int dwt_plane(AVCodecContext *avctx, void *arg)
for (x = 0; x < p->width; x++) { for (x = 0; x < p->width; x++) {
buf[x] = pix[x] - s->diff_offset; buf[x] = pix[x] - s->diff_offset;
} }
memset(&buf[x], 0, (p->coef_stride - p->width)*sizeof(dwtcoef));
buf += p->coef_stride; buf += p->coef_stride;
pix += pix_stride; pix += pix_stride;
} }