summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/hevc_filter.c26
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;
+ }
}
}