This is an automated email from the git hooks/post-receive script.
Git pushed a commit to branch master
in repository ffmpeg.
The following commit(s) were added to refs/heads/master by this push:
new e250854ecf aarch64/h264pred: disable inefficient functions
e250854ecf is described below
commit e250854ecfa4269e5507b507375cd91581688641
Author: Zhao Zhili <[email protected]>
AuthorDate: Sun Jan 25 19:13:20 2026 +0800
Commit: Zhao Zhili <[email protected]>
CommitDate: Wed Feb 4 09:06:37 2026 +0000
aarch64/h264pred: disable inefficient functions
These assembly optimizations have been identified as "performance
regressions." Due to advancements in modern CPU micro-architectures
and compiler optimization the C implementations now consistently
outperform these handwritten routines.
Test Name A55-clang M1 A76-gcc-14
A510-clang A715-clang X3-clang
--------------------------------------------------------------------------------------------------------------------
pred8x8_dc_8_neon 55.9 ( 0.79x)! 0.2 ( 0.31x)! 35.7 ( 0.63x)!
98.3 ( 0.37x)! 35.9 ( 0.45x)! 33.6 ( 0.38x)!
pred8x8_dc_10_neon 57.0 ( 1.04x) 0.3 ( 0.36x)! 35.9 ( 0.94x)!
98.2 ( 0.53x)! 35.8 ( 0.58x)! 33.2 ( 0.50x)!
pred8x8_dc_128_8_neon 26.0 ( 0.69x)! 0.1 ( 0.43x)! 15.3 ( 0.73x)!
46.4 ( 0.36x)! 10.6 ( 0.48x)! 10.3 ( 1.09x)
pred8x8_dc_128_10_neon 25.3 ( 0.99x)! 0.1 ( 0.42x)! 19.3 ( 0.48x)!
44.5 ( 0.42x)! 10.0 ( 0.61x)! 11.0 ( 1.00x)
pred8x8_left_dc_8_neon 46.9 ( 0.72x)! 0.2 ( 0.26x)! 30.2 ( 0.49x)!
71.4 ( 0.39x)! 29.8 ( 0.35x)! 26.5 ( 0.44x)!
pred8x8_left_dc_10_neon 45.4 ( 0.82x)! 0.2 ( 0.29x)! 28.1 ( 0.67x)!
70.2 ( 0.47x)! 30.0 ( 0.38x)! 26.5 ( 0.43x)!
pred16x16_dc_8_neon 74.4 ( 1.34x) 0.3 ( 0.62x)! 44.7 ( 0.89x)!
128.0 ( 0.79x)! 48.5 ( 0.67x)! 39.4 ( 0.71x)!
pred16x16_dc_128_8_neon 37.9 ( 0.79x)! 0.1 ( 0.60x)! 20.1 ( 0.80x)!
41.8 ( 0.46x)! 16.2 ( 0.81x)! 12.8 ( 0.95x)!
pred16x16_left_dc_8_neon 69.9 ( 1.19x) 0.3 ( 0.46x)! 49.6 ( 0.54x)!
116.8 ( 0.62x)! 52.8 ( 0.45x)! 44.2 ( 0.51x)!
pred8x8_hori_8_neon 30.6 ( 1.39x) 0.1 ( 0.45x)! 19.4 ( 0.81x)!
71.0 ( 0.50x)! 15.9 ( 0.55x)! 12.2 ( 0.94x)!
pred8x8_hori_10_neon* 29.3 ( 1.82x) 0.1 ( 0.59x)! 18.5 ( 1.56x)
68.9 ( 0.64x)! 15.8 ( 0.62x)! 11.8 ( 0.97x)!
pred8x8_top_dc_8_neon 35.8 ( 0.96x)! 0.1 ( 0.59x)! 16.8 ( 0.81x)!
58.9 ( 0.44x)! 11.3 ( 0.89x)! 11.4 ( 0.99x)!
pred8x8_top_dc_10_neon 37.4 ( 1.24x) 0.1 ( 0.92x)! 20.4 ( 0.81x)!
59.5 ( 0.69x)! 10.5 ( 1.48x) 11.8 ( 1.02x)
pred8x8_vertical_8_neon 18.3 ( 1.08x) 0.1 ( 0.54x)! 12.8 ( 0.89x)!
37.2 ( 0.40x)! 8.3 ( 0.77x)! 11.2 ( 1.00x)
pred8x8_vertical_10_neon 19.0 ( 1.24x) 0.1 ( 0.55x)! 15.3 ( 0.62x)!
39.7 ( 0.50x)! 8.2 ( 0.91x)! 11.1 ( 0.99x)!
- pred8x8_horizontal_10 also underperforms on new architectures, but useful
on A55 and A76.
Signed-off-by: Zhao Zhili <[email protected]>
---
libavcodec/aarch64/h264pred_init.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/libavcodec/aarch64/h264pred_init.c
b/libavcodec/aarch64/h264pred_init.c
index 0ae8f70d23..9819f85f7d 100644
--- a/libavcodec/aarch64/h264pred_init.c
+++ b/libavcodec/aarch64/h264pred_init.c
@@ -25,6 +25,19 @@
#include "libavcodec/avcodec.h"
#include "libavcodec/h264pred.h"
+/* PERFORMANCE WARNING:
+ * These assembly optimizations have been identified as "performance
regressions."
+ * Due to advancements in modern CPU micro-architectures and compiler
optimization
+ * the C implementations now consistently outperform these handwritten
routines.
+ *
+ * Keep them here for historical reference.
+ *
+ * New optimizations are highly welcome! If you can provide an optimized
+ * implementation that demonstrably beats the current C version in rigorous
+ * benchmarks, please submit a patch.
+ */
+#define ENABLE_INEFFICIENT_ASM 0
+
void ff_pred16x16_vert_neon(uint8_t *src, ptrdiff_t stride);
void ff_pred16x16_hor_neon(uint8_t *src, ptrdiff_t stride);
void ff_pred16x16_plane_neon(uint8_t *src, ptrdiff_t stride);
@@ -69,16 +82,22 @@ static av_cold void h264_pred_init_neon(H264PredContext *h,
int codec_id,
{
if (bit_depth == 8) {
if (chroma_format_idc <= 1) {
+#if ENABLE_INEFFICIENT_ASM
h->pred8x8[VERT_PRED8x8 ] = ff_pred8x8_vert_neon;
h->pred8x8[HOR_PRED8x8 ] = ff_pred8x8_hor_neon;
+#endif
if (codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8)
h->pred8x8[PLANE_PRED8x8] = ff_pred8x8_plane_neon;
+#if ENABLE_INEFFICIENT_ASM
h->pred8x8[DC_128_PRED8x8 ] = ff_pred8x8_128_dc_neon;
+#endif
if (codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7 &&
codec_id != AV_CODEC_ID_VP8) {
+#if ENABLE_INEFFICIENT_ASM
h->pred8x8[DC_PRED8x8 ] = ff_pred8x8_dc_neon;
h->pred8x8[LEFT_DC_PRED8x8] = ff_pred8x8_left_dc_neon;
h->pred8x8[TOP_DC_PRED8x8 ] = ff_pred8x8_top_dc_neon;
+#endif
h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8] = ff_pred8x8_l0t_dc_neon;
h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8] = ff_pred8x8_0lt_dc_neon;
h->pred8x8[ALZHEIMER_DC_L00_PRED8x8] = ff_pred8x8_l00_dc_neon;
@@ -86,27 +105,37 @@ static av_cold void h264_pred_init_neon(H264PredContext
*h, int codec_id,
}
}
+#if ENABLE_INEFFICIENT_ASM
h->pred16x16[DC_PRED8x8 ] = ff_pred16x16_dc_neon;
+#endif
h->pred16x16[VERT_PRED8x8 ] = ff_pred16x16_vert_neon;
h->pred16x16[HOR_PRED8x8 ] = ff_pred16x16_hor_neon;
+#if ENABLE_INEFFICIENT_ASM
h->pred16x16[LEFT_DC_PRED8x8] = ff_pred16x16_left_dc_neon;
h->pred16x16[TOP_DC_PRED8x8 ] = ff_pred16x16_top_dc_neon;
h->pred16x16[DC_128_PRED8x8 ] = ff_pred16x16_128_dc_neon;
+#endif
if (codec_id != AV_CODEC_ID_SVQ3 && codec_id != AV_CODEC_ID_RV40 &&
codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8)
h->pred16x16[PLANE_PRED8x8 ] = ff_pred16x16_plane_neon;
}
if (bit_depth == 10) {
if (chroma_format_idc <= 1) {
+#if ENABLE_INEFFICIENT_ASM
h->pred8x8[VERT_PRED8x8 ] = ff_pred8x8_vert_neon_10;
+#endif
h->pred8x8[HOR_PRED8x8 ] = ff_pred8x8_hor_neon_10;
if (codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8)
h->pred8x8[PLANE_PRED8x8] = ff_pred8x8_plane_neon_10;
+#if ENABLE_INEFFICIENT_ASM
h->pred8x8[DC_128_PRED8x8 ] = ff_pred8x8_128_dc_neon_10;
+#endif
if (codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7 &&
codec_id != AV_CODEC_ID_VP8) {
+#if ENABLE_INEFFICIENT_ASM
h->pred8x8[DC_PRED8x8 ] = ff_pred8x8_dc_neon_10;
h->pred8x8[LEFT_DC_PRED8x8] = ff_pred8x8_left_dc_neon_10;
+#endif
h->pred8x8[TOP_DC_PRED8x8 ] = ff_pred8x8_top_dc_neon_10;
h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8] =
ff_pred8x8_l0t_dc_neon_10;
h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8] =
ff_pred8x8_0lt_dc_neon_10;
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]