/src/ffmpeg/libavcodec/h264dsp.c
Line | Count | Source |
1 | | /* |
2 | | * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder |
3 | | * Copyright (c) 2003-2010 Michael Niedermayer <michaelni@gmx.at> |
4 | | * |
5 | | * This file is part of FFmpeg. |
6 | | * |
7 | | * FFmpeg is free software; you can redistribute it and/or |
8 | | * modify it under the terms of the GNU Lesser General Public |
9 | | * License as published by the Free Software Foundation; either |
10 | | * version 2.1 of the License, or (at your option) any later version. |
11 | | * |
12 | | * FFmpeg is distributed in the hope that it will be useful, |
13 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | | * Lesser General Public License for more details. |
16 | | * |
17 | | * You should have received a copy of the GNU Lesser General Public |
18 | | * License along with FFmpeg; if not, write to the Free Software |
19 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | | */ |
21 | | |
22 | | /** |
23 | | * @file |
24 | | * H.264 / AVC / MPEG-4 part10 DSP functions. |
25 | | * @author Michael Niedermayer <michaelni@gmx.at> |
26 | | */ |
27 | | |
28 | | #include <stdint.h> |
29 | | |
30 | | #include "libavutil/attributes.h" |
31 | | #include "libavutil/avassert.h" |
32 | | |
33 | | #include "h264dsp.h" |
34 | | #include "h264idct.h" |
35 | | #include "startcode.h" |
36 | | #include "libavutil/common.h" |
37 | | |
38 | 259M | #define BIT_DEPTH 8 |
39 | | #include "h264dsp_template.c" |
40 | | #undef BIT_DEPTH |
41 | | |
42 | 2.76G | #define BIT_DEPTH 9 |
43 | | #include "h264dsp_template.c" |
44 | | #undef BIT_DEPTH |
45 | | |
46 | 5.64G | #define BIT_DEPTH 10 |
47 | | #include "h264dsp_template.c" |
48 | | #undef BIT_DEPTH |
49 | | |
50 | 850M | #define BIT_DEPTH 12 |
51 | | #include "h264dsp_template.c" |
52 | | #undef BIT_DEPTH |
53 | | |
54 | 546M | #define BIT_DEPTH 14 |
55 | | #include "h264dsp_template.c" |
56 | | #undef BIT_DEPTH |
57 | | |
58 | | #define BIT_DEPTH 8 |
59 | | #include "h264addpx_template.c" |
60 | | #undef BIT_DEPTH |
61 | | |
62 | | #define BIT_DEPTH 16 |
63 | | #include "h264addpx_template.c" |
64 | | #undef BIT_DEPTH |
65 | | |
66 | | av_cold void ff_h264dsp_init(H264DSPContext *c, const int bit_depth, |
67 | | const int chroma_format_idc) |
68 | 526k | { |
69 | 526k | #undef FUNC |
70 | 3.15M | #define FUNC(a, depth) a ## _ ## depth ## _c |
71 | | |
72 | 526k | #define SET_PIXSIZE_FUNCS(depth) \ |
73 | 526k | c->h264_luma_dc_dequant_idct= FUNC(ff_h264_luma_dc_dequant_idct, depth);\ |
74 | 526k | if (chroma_format_idc <= 1)\ |
75 | 526k | c->h264_chroma_dc_dequant_idct= FUNC(ff_h264_chroma_dc_dequant_idct, depth);\ |
76 | 526k | else\ |
77 | 526k | c->h264_chroma_dc_dequant_idct= FUNC(ff_h264_chroma422_dc_dequant_idct, depth);\ |
78 | 526k | c->h264_add_pixels4_clear = FUNC(ff_h264_add_pixels4, depth);\ |
79 | 526k | c->h264_add_pixels8_clear = FUNC(ff_h264_add_pixels8, depth) |
80 | | |
81 | 526k | if (bit_depth > 8 && bit_depth <= 16) { |
82 | 258k | SET_PIXSIZE_FUNCS(16); |
83 | 267k | } else { |
84 | 267k | SET_PIXSIZE_FUNCS(8); |
85 | 267k | } |
86 | | |
87 | 526k | #define H264_DSP(depth) \ |
88 | 526k | c->h264_idct_add= FUNC(ff_h264_idct_add, depth);\ |
89 | 526k | c->h264_idct8_add= FUNC(ff_h264_idct8_add, depth);\ |
90 | 526k | c->h264_idct_dc_add= FUNC(ff_h264_idct_dc_add, depth);\ |
91 | 526k | c->h264_idct8_dc_add= FUNC(ff_h264_idct8_dc_add, depth);\ |
92 | 526k | c->h264_idct_add16 = FUNC(ff_h264_idct_add16, depth);\ |
93 | 526k | c->h264_idct8_add4 = FUNC(ff_h264_idct8_add4, depth);\ |
94 | 526k | if (chroma_format_idc <= 1)\ |
95 | 526k | c->h264_idct_add8 = FUNC(ff_h264_idct_add8, depth);\ |
96 | 526k | else\ |
97 | 526k | c->h264_idct_add8 = FUNC(ff_h264_idct_add8_422, depth);\ |
98 | 526k | c->h264_idct_add16intra= FUNC(ff_h264_idct_add16intra, depth);\ |
99 | 526k | \ |
100 | 526k | c->weight_h264_pixels_tab[0]= FUNC(weight_h264_pixels16, depth);\ |
101 | 526k | c->weight_h264_pixels_tab[1]= FUNC(weight_h264_pixels8, depth);\ |
102 | 526k | c->weight_h264_pixels_tab[2]= FUNC(weight_h264_pixels4, depth);\ |
103 | 526k | c->weight_h264_pixels_tab[3]= FUNC(weight_h264_pixels2, depth);\ |
104 | 526k | c->biweight_h264_pixels_tab[0]= FUNC(biweight_h264_pixels16, depth);\ |
105 | 526k | c->biweight_h264_pixels_tab[1]= FUNC(biweight_h264_pixels8, depth);\ |
106 | 526k | c->biweight_h264_pixels_tab[2]= FUNC(biweight_h264_pixels4, depth);\ |
107 | 526k | c->biweight_h264_pixels_tab[3]= FUNC(biweight_h264_pixels2, depth);\ |
108 | 526k | \ |
109 | 526k | c->h264_v_loop_filter_luma= FUNC(h264_v_loop_filter_luma, depth);\ |
110 | 526k | c->h264_h_loop_filter_luma= FUNC(h264_h_loop_filter_luma, depth);\ |
111 | 526k | c->h264_h_loop_filter_luma_mbaff= FUNC(h264_h_loop_filter_luma_mbaff, depth);\ |
112 | 526k | c->h264_v_loop_filter_luma_intra= FUNC(h264_v_loop_filter_luma_intra, depth);\ |
113 | 526k | c->h264_h_loop_filter_luma_intra= FUNC(h264_h_loop_filter_luma_intra, depth);\ |
114 | 526k | c->h264_h_loop_filter_luma_mbaff_intra= FUNC(h264_h_loop_filter_luma_mbaff_intra, depth);\ |
115 | 526k | c->h264_v_loop_filter_chroma= FUNC(h264_v_loop_filter_chroma, depth);\ |
116 | 526k | if (chroma_format_idc <= 1)\ |
117 | 526k | c->h264_h_loop_filter_chroma= FUNC(h264_h_loop_filter_chroma, depth);\ |
118 | 526k | else\ |
119 | 526k | c->h264_h_loop_filter_chroma= FUNC(h264_h_loop_filter_chroma422, depth);\ |
120 | 526k | if (chroma_format_idc <= 1)\ |
121 | 526k | c->h264_h_loop_filter_chroma_mbaff= FUNC(h264_h_loop_filter_chroma_mbaff, depth);\ |
122 | 526k | else\ |
123 | 526k | c->h264_h_loop_filter_chroma_mbaff= FUNC(h264_h_loop_filter_chroma422_mbaff, depth);\ |
124 | 526k | c->h264_v_loop_filter_chroma_intra= FUNC(h264_v_loop_filter_chroma_intra, depth);\ |
125 | 526k | if (chroma_format_idc <= 1)\ |
126 | 526k | c->h264_h_loop_filter_chroma_intra= FUNC(h264_h_loop_filter_chroma_intra, depth);\ |
127 | 526k | else\ |
128 | 526k | c->h264_h_loop_filter_chroma_intra= FUNC(h264_h_loop_filter_chroma422_intra, depth);\ |
129 | 526k | if (chroma_format_idc <= 1)\ |
130 | 526k | c->h264_h_loop_filter_chroma_mbaff_intra= FUNC(h264_h_loop_filter_chroma_mbaff_intra, depth);\ |
131 | 526k | else\ |
132 | 526k | c->h264_h_loop_filter_chroma_mbaff_intra= FUNC(h264_h_loop_filter_chroma422_mbaff_intra, depth);\ |
133 | 526k | c->h264_loop_filter_strength= NULL; |
134 | | |
135 | 526k | switch (bit_depth) { |
136 | 62.9k | case 9: |
137 | 62.9k | H264_DSP(9); |
138 | 62.9k | break; |
139 | 33.3k | case 10: |
140 | 33.3k | H264_DSP(10); |
141 | 33.3k | break; |
142 | 98.9k | case 12: |
143 | 98.9k | H264_DSP(12); |
144 | 98.9k | break; |
145 | 63.5k | case 14: |
146 | 63.5k | H264_DSP(14); |
147 | 63.5k | break; |
148 | 267k | default: |
149 | 267k | av_assert0(bit_depth<=8); |
150 | 267k | H264_DSP(8); |
151 | 267k | break; |
152 | 526k | } |
153 | 526k | c->startcode_find_candidate = ff_startcode_find_candidate_c; |
154 | | |
155 | | #if ARCH_AARCH64 |
156 | | ff_h264dsp_init_aarch64(c, bit_depth, chroma_format_idc); |
157 | | #elif ARCH_ARM |
158 | | ff_h264dsp_init_arm(c, bit_depth, chroma_format_idc); |
159 | | #elif ARCH_PPC |
160 | | ff_h264dsp_init_ppc(c, bit_depth, chroma_format_idc); |
161 | | #elif ARCH_RISCV |
162 | | ff_h264dsp_init_riscv(c, bit_depth, chroma_format_idc); |
163 | | #elif ARCH_X86 && HAVE_X86ASM |
164 | | ff_h264dsp_init_x86(c, bit_depth, chroma_format_idc); |
165 | | #elif ARCH_MIPS |
166 | | ff_h264dsp_init_mips(c, bit_depth, chroma_format_idc); |
167 | | #elif ARCH_LOONGARCH |
168 | | ff_h264dsp_init_loongarch(c, bit_depth, chroma_format_idc); |
169 | | #endif |
170 | 526k | } |