[SCM] libav/experimental: aarch64: implement videodsp.prefetch

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Aug 10 16:02:43 UTC 2014


The following commit has been merged in the experimental branch:
commit d3789eeeed3423bd1ca9dc40030a2f7a21ea5332
Author: Janne Grunau <j at jannau.net>
Date:   Sat Apr 5 11:47:18 2014 +0200

    aarch64: implement videodsp.prefetch
    
    8% faster h264 decoding on Apple A7.

diff --git a/libavcodec/aarch64/Makefile b/libavcodec/aarch64/Makefile
index 59d1762..757b499 100644
--- a/libavcodec/aarch64/Makefile
+++ b/libavcodec/aarch64/Makefile
@@ -3,10 +3,13 @@ OBJS-$(CONFIG_H264DSP)                  += aarch64/h264dsp_init_aarch64.o
 OBJS-$(CONFIG_H264QPEL)                 += aarch64/h264qpel_init_aarch64.o
 OBJS-$(CONFIG_HPELDSP)                  += aarch64/hpeldsp_init_aarch64.o
 OBJS-$(CONFIG_NEON_CLOBBER_TEST)        += aarch64/neontest.o
+OBJS-$(CONFIG_VIDEODSP)                 += aarch64/videodsp_init.o
 
 OBJS-$(CONFIG_RV40_DECODER)             += aarch64/rv40dsp_init_aarch64.o
 OBJS-$(CONFIG_VC1_DECODER)              += aarch64/vc1dsp_init_aarch64.o
 
+ARMV8-OBJS-$(CONFIG_VIDEODSP)           += aarch64/videodsp.o
+
 NEON-OBJS-$(CONFIG_H264CHROMA)          += aarch64/h264cmc_neon.o
 NEON-OBJS-$(CONFIG_H264DSP)             += aarch64/h264dsp_neon.o              \
                                            aarch64/h264idct_neon.o
diff --git a/libavcodec/aandcttab.h b/libavcodec/aarch64/videodsp.S
similarity index 71%
copy from libavcodec/aandcttab.h
copy to libavcodec/aarch64/videodsp.S
index daccb7b..7ce5a7d 100644
--- a/libavcodec/aandcttab.h
+++ b/libavcodec/aarch64/videodsp.S
@@ -16,17 +16,13 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-/**
- * @file
- * AAN (Arai Agui Nakajima) (I)DCT tables
- */
-
-#ifndef AVCODEC_AANDCTTAB_H
-#define AVCODEC_AANDCTTAB_H
-
-#include <stdint.h>
-
-extern const uint16_t ff_aanscales[64];
-extern const uint16_t ff_inv_aanscales[64];
+#include "libavutil/aarch64/asm.S"
 
-#endif /* AVCODEC_AANDCTTAB_H */
+function ff_prefetch_aarch64, export=1
+        subs            w2,  w2,  #2
+        prfm            pldl1strm, [x0]
+        prfm            pldl1strm, [x0,  x1]
+        add             x0,  x0,  x1,  lsl #1
+        b.gt            X(ff_prefetch_aarch64)
+        ret
+endfunc
diff --git a/libavcodec/arm/videodsp_init_arm.c b/libavcodec/aarch64/videodsp_init.c
similarity index 76%
copy from libavcodec/arm/videodsp_init_arm.c
copy to libavcodec/aarch64/videodsp_init.c
index 20c6e4a..59b697d 100644
--- a/libavcodec/arm/videodsp_init_arm.c
+++ b/libavcodec/aarch64/videodsp_init.c
@@ -1,6 +1,4 @@
 /*
- * Copyright (C) 2012 Ronald S. Bultje
- *
  * This file is part of Libav.
  *
  * Libav is free software; you can redistribute it and/or
@@ -19,12 +17,16 @@
  */
 
 #include "libavutil/attributes.h"
-#include "libavutil/arm/cpu.h"
+#include "libavutil/cpu.h"
+#include "libavutil/aarch64/cpu.h"
 #include "libavcodec/videodsp.h"
-#include "videodsp_arm.h"
 
-av_cold void ff_videodsp_init_arm(VideoDSPContext *ctx, int bpc)
+void ff_prefetch_aarch64(uint8_t *mem, ptrdiff_t stride, int h);
+
+av_cold void ff_videodsp_init_aarch64(VideoDSPContext *ctx, int bpc)
 {
     int cpu_flags = av_get_cpu_flags();
-    if (have_armv5te(cpu_flags)) ff_videodsp_init_armv5te(ctx, bpc);
+
+    if (have_armv8(cpu_flags))
+        ctx->prefetch = ff_prefetch_aarch64;
 }
diff --git a/libavcodec/videodsp.c b/libavcodec/videodsp.c
index a6a1d37..e6d9303 100644
--- a/libavcodec/videodsp.c
+++ b/libavcodec/videodsp.c
@@ -43,6 +43,8 @@ av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
         ctx->emulated_edge_mc = ff_emulated_edge_mc_16;
     }
 
+    if (ARCH_AARCH64)
+        ff_videodsp_init_aarch64(ctx, bpc);
     if (ARCH_ARM)
         ff_videodsp_init_arm(ctx, bpc);
     if (ARCH_PPC)
diff --git a/libavcodec/videodsp.h b/libavcodec/videodsp.h
index 2211c5d..04c012a 100644
--- a/libavcodec/videodsp.h
+++ b/libavcodec/videodsp.h
@@ -68,6 +68,7 @@ typedef struct VideoDSPContext {
 void ff_videodsp_init(VideoDSPContext *ctx, int bpc);
 
 /* for internal use only (i.e. called by ff_videodsp_init() */
+void ff_videodsp_init_aarch64(VideoDSPContext *ctx, int bpc);
 void ff_videodsp_init_arm(VideoDSPContext *ctx, int bpc);
 void ff_videodsp_init_ppc(VideoDSPContext *ctx, int bpc);
 void ff_videodsp_init_x86(VideoDSPContext *ctx, int bpc);

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list