diff options
-rw-r--r-- | libavcodec/hevc_filter.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/libavcodec/hevc_filter.c b/libavcodec/hevc_filter.c index 9354c14300..7a0ec6d4be 100644 --- a/libavcodec/hevc_filter.c +++ b/libavcodec/hevc_filter.c @@ -139,15 +139,25 @@ static int get_qPy(HEVCContext *s, int xC, int yC) return s->qp_y_tab[x + y * s->sps->min_cb_width]; } -static void copy_CTB(uint8_t *dst, uint8_t *src, - int width, int height, int stride_dst, int stride_src) +static void copy_CTB(uint8_t *dst, uint8_t *src, int width, int height, + intptr_t stride_dst, intptr_t stride_src) { - int i; - - for (i = 0; i < height; i++) { - memcpy(dst, src, width); - dst += stride_dst; - src += stride_src; +int i, j; + + if (((intptr_t)dst | (intptr_t)src | stride_dst | stride_src) & 15) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j+=8) + AV_COPY64(dst+j, src+j); + dst += stride_dst; + src += stride_src; + } + } else { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j+=16) + AV_COPY128(dst+j, src+j); + dst += stride_dst; + src += stride_src; + } } } |