FFmpeg
Loading...
Searching...
No Matches
hevcpred_init_aarch64.c
Go to the documentation of this file.
1/*
2 * HEVC Intra Prediction NEON initialization
3 *
4 * Copyright (c) 2026 Jun Zhao <barryjzhao@tencent.com>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
24#include "libavutil/avassert.h"
27
28// DC prediction
29void ff_hevc_pred_dc_4x4_8_neon(uint8_t *src, const uint8_t *top,
30 const uint8_t *left, ptrdiff_t stride,
31 int c_idx);
32void ff_hevc_pred_dc_8x8_8_neon(uint8_t *src, const uint8_t *top,
33 const uint8_t *left, ptrdiff_t stride,
34 int c_idx);
35void ff_hevc_pred_dc_16x16_8_neon(uint8_t *src, const uint8_t *top,
36 const uint8_t *left, ptrdiff_t stride,
37 int c_idx);
38void ff_hevc_pred_dc_32x32_8_neon(uint8_t *src, const uint8_t *top,
39 const uint8_t *left, ptrdiff_t stride,
40 int c_idx);
41
42// Planar prediction
43void ff_hevc_pred_planar_4x4_8_neon(uint8_t *src, const uint8_t *top,
44 const uint8_t *left, ptrdiff_t stride);
45void ff_hevc_pred_planar_8x8_8_neon(uint8_t *src, const uint8_t *top,
46 const uint8_t *left, ptrdiff_t stride);
47void ff_hevc_pred_planar_16x16_8_neon(uint8_t *src, const uint8_t *top,
48 const uint8_t *left, ptrdiff_t stride);
49void ff_hevc_pred_planar_32x32_8_neon(uint8_t *src, const uint8_t *top,
50 const uint8_t *left, ptrdiff_t stride);
51
52// 3-tap reference sample filter
53void ff_hevc_ref_filter_3tap_8x8_8_neon(uint8_t *filtered_left,
54 uint8_t *filtered_top,
55 const uint8_t *left,
56 const uint8_t *top, int size);
57void ff_hevc_ref_filter_3tap_16x16_8_neon(uint8_t *filtered_left,
58 uint8_t *filtered_top,
59 const uint8_t *left,
60 const uint8_t *top, int size);
61void ff_hevc_ref_filter_3tap_32x32_8_neon(uint8_t *filtered_left,
62 uint8_t *filtered_top,
63 const uint8_t *left,
64 const uint8_t *top, int size);
65
66// Strong intra smoothing
67void ff_hevc_ref_filter_strong_8_neon(uint8_t *filtered_top, uint8_t *left,
68 const uint8_t *top);
69
70// Mode 10 and 26
71void ff_hevc_pred_angular_mode_10_8_neon(uint8_t *src, const uint8_t *top,
72 const uint8_t *left, ptrdiff_t stride,
73 int c_idx, int log2_size);
74void ff_hevc_pred_angular_mode_26_8_neon(uint8_t *src, const uint8_t *top,
75 const uint8_t *left, ptrdiff_t stride,
76 int c_idx, int log2_size);
77
78static void pred_dc_neon(uint8_t *src, const uint8_t *top,
79 const uint8_t *left, ptrdiff_t stride,
80 int log2_size, int c_idx)
81{
82 switch (log2_size) {
83 case 2:
85 break;
86 case 3:
88 break;
89 case 4:
91 break;
92 case 5:
94 break;
95 default:
96 av_unreachable("log2_size must be 2, 3, 4 or 5");
97 }
98}
99
100#define PRED_ANGULAR_NEON(IDX, LOG2) \
101static void pred_angular_##IDX##_neon(uint8_t *src, const uint8_t *top, \
102 const uint8_t *left, ptrdiff_t stride, \
103 int c_idx, int mode) \
104{ \
105 if (mode == 10) \
106 ff_hevc_pred_angular_mode_10_8_neon(src, top, left, stride, \
107 c_idx, LOG2); \
108 else if (mode == 26) \
109 ff_hevc_pred_angular_mode_26_8_neon(src, top, left, stride, \
110 c_idx, LOG2); \
111 else \
112 ff_hevc_pred_angular_##IDX##_8(src, top, left, stride, c_idx, mode); \
113}
114
119
120#undef PRED_ANGULAR_NEON
121
123{
125
126 if (!have_neon(cpu_flags))
127 return;
128
129 if (bit_depth == 8) {
130 hpc->pred_dc = pred_dc_neon;
135
140
141 hpc->pred_angular[0] = pred_angular_0_neon;
142 hpc->pred_angular[1] = pred_angular_1_neon;
143 hpc->pred_angular[2] = pred_angular_2_neon;
144 hpc->pred_angular[3] = pred_angular_3_neon;
145 }
146}
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition af_astats.c:246
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition avassert.h:109
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static void pred_dc_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int log2_size, int c_idx)
void ff_hevc_ref_filter_3tap_16x16_8_neon(uint8_t *filtered_left, uint8_t *filtered_top, const uint8_t *left, const uint8_t *top, int size)
void ff_hevc_pred_dc_16x16_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx)
void ff_hevc_pred_planar_32x32_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride)
void ff_hevc_pred_planar_8x8_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride)
void ff_hevc_pred_planar_16x16_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride)
void ff_hevc_pred_dc_32x32_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx)
void ff_hevc_pred_dc_8x8_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx)
void ff_hevc_ref_filter_3tap_8x8_8_neon(uint8_t *filtered_left, uint8_t *filtered_top, const uint8_t *left, const uint8_t *top, int size)
av_cold void ff_hevc_pred_init_aarch64(HEVCPredContext *hpc, int bit_depth)
void ff_hevc_ref_filter_strong_8_neon(uint8_t *filtered_top, uint8_t *left, const uint8_t *top)
void ff_hevc_pred_planar_4x4_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride)
void ff_hevc_pred_angular_mode_26_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx, int log2_size)
void ff_hevc_ref_filter_3tap_32x32_8_neon(uint8_t *filtered_left, uint8_t *filtered_top, const uint8_t *left, const uint8_t *top, int size)
#define PRED_ANGULAR_NEON(IDX, LOG2)
void ff_hevc_pred_angular_mode_10_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx, int log2_size)
void ff_hevc_pred_dc_4x4_8_neon(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx)
#define have_neon(flags)
Definition cpu.h:26
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
static atomic_int cpu_flags
Definition cpu.c:56
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition cpu.c:109
void(* pred_dc)(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int log2_size, int c_idx)
Definition pred.h:38
void(* ref_filter_strong)(uint8_t *filtered_top, uint8_t *left, const uint8_t *top)
Definition pred.h:47
void(* ref_filter_3tap[3])(uint8_t *filtered_left, uint8_t *filtered_top, const uint8_t *left, const uint8_t *top, int size)
Definition pred.h:44
void(* pred_planar[4])(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride)
Definition pred.h:36
void(* pred_angular[4])(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx, int mode)
Definition pred.h:40
#define stride
#define src
Definition vp8dsp.c:248
int size