* commit 'e6bff23f1e11aefb16a2b5d6ee72bf7469c5a66e': cpu: add a function for querying maximum required data alignment Adapted to work with the arbitrary runtime cpuflag changes av_force_cpu_flags() can generate. Merged-by: James Almer <jamrial@gmail.com>tags/n3.4
@@ -15,6 +15,9 @@ libavutil: 2015-08-28 | |||||
API changes, most recent first: | API changes, most recent first: | ||||
2017-09-27 - xxxxxxx - lavu 55.77.100 / lavu 55.31.0 - cpu.h | |||||
Add av_cpu_max_align() for querying maximum required data alignment. | |||||
2017-09-26 - xxxxxxx - lavc 57.106.102 - avcodec.h | 2017-09-26 - xxxxxxx - lavc 57.106.102 - avcodec.h | ||||
Deprecate AVCodecContext.refcounted_frames. This was useful for deprecated | Deprecate AVCodecContext.refcounted_frames. This was useful for deprecated | ||||
API only (avcodec_decode_video2/avcodec_decode_audio4). The new decode APIs | API only (avcodec_decode_video2/avcodec_decode_audio4). The new decode APIs | ||||
@@ -16,9 +16,11 @@ | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
*/ | */ | ||||
#include <stddef.h> | |||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <stdatomic.h> | #include <stdatomic.h> | ||||
#include "attributes.h" | |||||
#include "cpu.h" | #include "cpu.h" | ||||
#include "cpu_internal.h" | #include "cpu_internal.h" | ||||
#include "config.h" | #include "config.h" | ||||
@@ -299,3 +301,40 @@ int av_cpu_count(void) | |||||
return nb_cpus; | return nb_cpus; | ||||
} | } | ||||
size_t av_cpu_max_align(void) | |||||
{ | |||||
int av_unused flags = av_get_cpu_flags(); | |||||
#if ARCH_ARM || ARCH_AARCH64 | |||||
if (flags & AV_CPU_FLAG_NEON) | |||||
return 16; | |||||
#elif ARCH_PPC | |||||
if (flags & (AV_CPU_FLAG_ALTIVEC | | |||||
AV_CPU_FLAG_VSX | | |||||
AV_CPU_FLAG_POWER8)) | |||||
return 16; | |||||
#elif ARCH_X86 | |||||
if (flags & (AV_CPU_FLAG_AVX2 | | |||||
AV_CPU_FLAG_AVX | | |||||
AV_CPU_FLAG_XOP | | |||||
AV_CPU_FLAG_FMA4 | | |||||
AV_CPU_FLAG_FMA3 | | |||||
AV_CPU_FLAG_AVXSLOW)) | |||||
return 32; | |||||
if (flags & (AV_CPU_FLAG_AESNI | | |||||
AV_CPU_FLAG_SSE42 | | |||||
AV_CPU_FLAG_SSE4 | | |||||
AV_CPU_FLAG_SSSE3 | | |||||
AV_CPU_FLAG_SSE3 | | |||||
AV_CPU_FLAG_SSE2 | | |||||
AV_CPU_FLAG_SSE | | |||||
AV_CPU_FLAG_ATOM | | |||||
AV_CPU_FLAG_SSSE3SLOW | | |||||
AV_CPU_FLAG_SSE3SLOW | | |||||
AV_CPU_FLAG_SSE2SLOW)) | |||||
return 16; | |||||
#endif | |||||
return 8; | |||||
} |
@@ -21,6 +21,8 @@ | |||||
#ifndef AVUTIL_CPU_H | #ifndef AVUTIL_CPU_H | ||||
#define AVUTIL_CPU_H | #define AVUTIL_CPU_H | ||||
#include <stddef.h> | |||||
#include "attributes.h" | #include "attributes.h" | ||||
#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ | #define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ | ||||
@@ -113,4 +115,15 @@ int av_parse_cpu_caps(unsigned *flags, const char *s); | |||||
*/ | */ | ||||
int av_cpu_count(void); | int av_cpu_count(void); | ||||
/** | |||||
* Get the maximum data alignment that may be required by FFmpeg. | |||||
* | |||||
* Note that this is affected by the build configuration and the CPU flags mask, | |||||
* so e.g. if the CPU supports AVX, but libavutil has been built with | |||||
* --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through | |||||
* av_set_cpu_flags_mask(), then this function will behave as if AVX is not | |||||
* present. | |||||
*/ | |||||
size_t av_cpu_max_align(void); | |||||
#endif /* AVUTIL_CPU_H */ | #endif /* AVUTIL_CPU_H */ |
@@ -80,7 +80,7 @@ | |||||
#define LIBAVUTIL_VERSION_MAJOR 55 | #define LIBAVUTIL_VERSION_MAJOR 55 | ||||
#define LIBAVUTIL_VERSION_MINOR 76 | |||||
#define LIBAVUTIL_VERSION_MINOR 77 | |||||
#define LIBAVUTIL_VERSION_MICRO 100 | #define LIBAVUTIL_VERSION_MICRO 100 | ||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||