diff options
Diffstat (limited to 'libavcodec/utvideodec.c')
-rw-r--r-- | libavcodec/utvideodec.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c index 83dbae99b1..d2da825fbf 100644 --- a/libavcodec/utvideodec.c +++ b/libavcodec/utvideodec.c @@ -373,12 +373,16 @@ static void restore_median_planar(UtvideoContext *c, uint8_t *src, ptrdiff_t str C = bsrc[-stride]; bsrc[0] += C; A = bsrc[0]; - for (i = 1; i < width; i++) { + for (i = 1; i < FFMIN(width, 16); i++) { /* scalar loop (DSP need align 16) */ B = bsrc[i - stride]; bsrc[i] += mid_pred(A, B, (uint8_t)(A + B - C)); C = B; A = bsrc[i]; } + if (width > 16) + c->llviddsp.add_median_pred(bsrc + 16, bsrc - stride + 16, + bsrc + 16, width - 16, &A, &B); + bsrc += stride; // the rest of lines use continuous median prediction for (j = 2; j < slice_height; j++) { @@ -424,12 +428,16 @@ static void restore_median_planar_il(UtvideoContext *c, uint8_t *src, ptrdiff_t C = bsrc[-stride2]; bsrc[0] += C; A = bsrc[0]; - for (i = 1; i < width; i++) { + for (i = 1; i < FFMIN(width, 16); i++) { /* scalar loop (DSP need align 16) */ B = bsrc[i - stride2]; bsrc[i] += mid_pred(A, B, (uint8_t)(A + B - C)); C = B; A = bsrc[i]; } + if (width > 16) + c->llviddsp.add_median_pred(bsrc + 16, bsrc - stride2 + 16, + bsrc + 16, width - 16, &A, &B); + c->llviddsp.add_median_pred(bsrc + stride, bsrc - stride, bsrc + stride, width, &A, &B); bsrc += stride2; |