[FFmpeg-devel] [PATCH 11/11] tools/crypto_bench: add support for multiple lavu versions by cpuflag
Rodger Combs
rodger.combs at gmail.com
Mon Oct 19 11:31:28 CEST 2015
---
tools/crypto_bench.c | 50 ++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 42 insertions(+), 8 deletions(-)
diff --git a/tools/crypto_bench.c b/tools/crypto_bench.c
index 8a468ba..b513c55 100644
--- a/tools/crypto_bench.c
+++ b/tools/crypto_bench.c
@@ -32,6 +32,7 @@
#include "libavutil/crc.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/timer.h"
+#include "libavutil/cpu.h"
#ifndef AV_READ_TIME
#define AV_READ_TIME(x) 0
@@ -65,6 +66,7 @@ struct hash_impl {
const char *name;
void (*run)(uint8_t *output, const uint8_t *input, unsigned size);
const char *output;
+ int cpu_versions;
};
/***************************************************************************
@@ -667,6 +669,16 @@ static unsigned crc32(const uint8_t *data, unsigned size)
return av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, data, size);
}
+static const struct {
+ int flag;
+ const char *name;
+} cpu_flag_tab[] = {
+#if ARCH_X86
+ { AV_CPU_FLAG_AESNI, "aesni" },
+#endif
+ { 0 }
+};
+
static void run_implementation(const uint8_t *input, uint8_t *output,
struct hash_impl *impl, unsigned size)
{
@@ -677,9 +689,31 @@ static void run_implementation(const uint8_t *input, uint8_t *output,
double mtime, ttime = 0, ttime2 = 0, stime;
uint8_t outref[MAX_OUTPUT_SIZE];
+ if (!strcmp(impl->lib, "lavu")) {
+ char lib_name[32];
+ struct hash_impl impl2 = *impl;
+ int real_flags = av_get_cpu_flags();
+ int current_flags = real_flags;
+ impl2.cpu_versions = 0;
+ impl2.lib = lib_name;
+ for (i = 0; cpu_flag_tab[i].flag; i++) {
+ if (cpu_flag_tab[i].flag & impl->cpu_versions & real_flags) {
+ snprintf(lib_name, sizeof(lib_name), "lavu_%s", cpu_flag_tab[i].name);
+ run_implementation(input, output, &impl2, size);
+ current_flags &= ~cpu_flag_tab[i].flag;
+ av_force_cpu_flags(current_flags);
+ }
+ }
+ impl2.lib = "lavu_c";
+ run_implementation(input, output, &impl2, size);
+ av_force_cpu_flags(real_flags);
+ return;
+ }
+
if (enabled_libs && !av_stristr(enabled_libs, impl->lib) ||
enabled_algos && !av_stristr(enabled_algos, impl->name))
return;
+
if (!sscanf(impl->output, "crc:%x", &outcrc)) {
outlen = strlen(impl->output) / 2;
for (i = 0; i < outlen; i++) {
@@ -718,8 +752,8 @@ static void run_implementation(const uint8_t *input, uint8_t *output,
fflush(stdout);
}
-#define IMPL_USE(lib, name, symbol, output) \
- { #lib, name, run_ ## lib ## _ ## symbol, output },
+#define IMPL_USE(lib, name, symbol, output, ...) \
+ { #lib, name, run_ ## lib ## _ ## symbol, output, __VA_ARGS__ },
#define IMPL(lib, ...) IMPL_USE_ ## lib(lib, __VA_ARGS__)
#define IMPL_ALL(...) \
IMPL(lavu, __VA_ARGS__) \
@@ -736,12 +770,12 @@ struct hash_impl implementations[] = {
IMPL(lavu, "RIPEMD-128", ripemd128, "9ab8bfba2ddccc5d99c9d4cdfb844a5f")
IMPL(tomcrypt, "RIPEMD-128", ripemd128, "9ab8bfba2ddccc5d99c9d4cdfb844a5f")
IMPL_ALL("RIPEMD-160", ripemd160, "62a5321e4fc8784903bb43ab7752c75f8b25af00")
- IMPL_ALL("AES-128-ECB",aes128, "crc:ff6bc888")
- IMPL_ALL("AES-192-ECB",aes192, "crc:1022815b")
- IMPL_ALL("AES-256-ECB",aes256, "crc:792e4e8a")
- IMPL_ALL("AES-128-CBC",aes128cbc, "crc:0efebabe")
- IMPL_ALL("AES-192-CBC",aes192cbc, "crc:ee2e34e8")
- IMPL_ALL("AES-256-CBC",aes256cbc, "crc:0c9b875c")
+ IMPL_ALL("AES-128-ECB",aes128, "crc:ff6bc888", AV_CPU_FLAG_AESNI)
+ IMPL_ALL("AES-192-ECB",aes192, "crc:1022815b", AV_CPU_FLAG_AESNI)
+ IMPL_ALL("AES-256-ECB",aes256, "crc:792e4e8a", AV_CPU_FLAG_AESNI)
+ IMPL_ALL("AES-128-CBC",aes128cbc, "crc:0efebabe", AV_CPU_FLAG_AESNI)
+ IMPL_ALL("AES-192-CBC",aes192cbc, "crc:ee2e34e8", AV_CPU_FLAG_AESNI)
+ IMPL_ALL("AES-256-CBC",aes256cbc, "crc:0c9b875c", AV_CPU_FLAG_AESNI)
IMPL_ALL("CAMELLIA", camellia, "crc:7abb59a7")
IMPL_ALL("CAST-128", cast128, "crc:456aa584")
IMPL_ALL("BLOWFISH", blowfish, "crc:33e8aa74")
--
2.6.1
More information about the ffmpeg-devel
mailing list