* 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, \ | ||||