[FFmpeg-devel] [PATCH v2] aarch64: Use cntvct_el0 as timer register on Android and macOS
Zhao Zhili
quinkblack at foxmail.com
Sun Jun 16 09:38:03 EEST 2024
> On Jun 14, 2024, at 19:09, Martin Storsjö <martin at martin.st> wrote:
>
> The default timer register pmccntr_el0 usually requires enabling
> access with e.g. a kernel module.
>
> On macOS, using cntvct_el0 gives measurements with the same
> magnitude as mach_absolute_time (which is used currently), but
> possibly with a little less overhead/noise.
> ---
> cntvct_el0 should have less noise than mach_absolute_time or
> clock_gettime.
>
> In one tested case, the cntvct_el0 timer has a frequency of 25 MHz
> (readable via the register cntfrq_el0).
> ---
> libavutil/aarch64/timer.h | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/libavutil/aarch64/timer.h b/libavutil/aarch64/timer.h
> index fadc9568f8..922b0c5598 100644
> --- a/libavutil/aarch64/timer.h
> +++ b/libavutil/aarch64/timer.h
> @@ -24,7 +24,7 @@
> #include <stdint.h>
> #include "config.h"
>
> -#if HAVE_INLINE_ASM && !defined(__APPLE__)
> +#if HAVE_INLINE_ASM
>
> #define AV_READ_TIME read_time
>
> @@ -33,7 +33,16 @@ static inline uint64_t read_time(void)
> uint64_t cycle_counter;
> __asm__ volatile(
> "isb \t\n"
> +#if defined(__ANDROID__) || defined(__APPLE__)
> + // cntvct_el0 has lower resolution than pmccntr_el0, but is usually
> + // accessible from user space by default.
> + "mrs %0, cntvct_el0 "
> +#else
> + // pmccntr_el0 has higher resolution, but is usually not accessible
> + // from user space by default (but access can be enabled with a custom
> + // kernel module).
> "mrs %0, pmccntr_el0 "
> +#endif
> : "=r"(cycle_counter) :: "memory" );
>
> return cycle_counter;
LGTM, thanks!
More information about the ffmpeg-devel
mailing list