Commit | Line | Data |
---|---|---|
064698d3 GM |
1 | /* |
2 | * HEVC video decoder | |
3 | * | |
4 | * Copyright (C) 2012 - 2013 Guillaume Martres | |
5 | * | |
6 | * This file is part of Libav. | |
7 | * | |
8 | * Libav 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 | * Libav 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 Libav; if not, write to the Free Software | |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 | */ | |
22 | ||
7398e051 | 23 | #include "hevcdsp.h" |
064698d3 GM |
24 | |
25 | static const int8_t transform[32][32] = { | |
26 | { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | |
27 | 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 }, | |
28 | { 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4, | |
29 | -4, -13, -22, -31, -38, -46, -54, -61, -67, -73, -78, -82, -85, -88, -90, -90 }, | |
30 | { 90, 87, 80, 70, 57, 43, 25, 9, -9, -25, -43, -57, -70, -80, -87, -90, | |
31 | -90, -87, -80, -70, -57, -43, -25, -9, 9, 25, 43, 57, 70, 80, 87, 90 }, | |
32 | { 90, 82, 67, 46, 22, -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13, | |
33 | 13, 38, 61, 78, 88, 90, 85, 73, 54, 31, 4, -22, -46, -67, -82, -90 }, | |
34 | { 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89, | |
35 | 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89 }, | |
36 | { 88, 67, 31, -13, -54, -82, -90, -78, -46, -4, 38, 73, 90, 85, 61, 22, | |
37 | -22, -61, -85, -90, -73, -38, 4, 46, 78, 90, 82, 54, 13, -31, -67, -88 }, | |
38 | { 87, 57, 9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87, | |
39 | -87, -57, -9, 43, 80, 90, 70, 25, -25, -70, -90, -80, -43, 9, 57, 87 }, | |
40 | { 85, 46, -13, -67, -90, -73, -22, 38, 82, 88, 54, -4, -61, -90, -78, -31, | |
41 | 31, 78, 90, 61, 4, -54, -88, -82, -38, 22, 73, 90, 67, 13, -46, -85 }, | |
42 | { 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83, | |
43 | 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83 }, | |
44 | { 82, 22, -54, -90, -61, 13, 78, 85, 31, -46, -90, -67, 4, 73, 88, 38, | |
45 | -38, -88, -73, -4, 67, 90, 46, -31, -85, -78, -13, 61, 90, 54, -22, -82 }, | |
46 | { 80, 9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80, | |
47 | -80, -9, 70, 87, 25, -57, -90, -43, 43, 90, 57, -25, -87, -70, 9, 80 }, | |
48 | { 78, -4, -82, -73, 13, 85, 67, -22, -88, -61, 31, 90, 54, -38, -90, -46, | |
49 | 46, 90, 38, -54, -90, -31, 61, 88, 22, -67, -85, -13, 73, 82, 4, -78 }, | |
50 | { 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75, | |
51 | 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75 }, | |
52 | { 73, -31, -90, -22, 78, 67, -38, -90, -13, 82, 61, -46, -88, -4, 85, 54, | |
53 | -54, -85, 4, 88, 46, -61, -82, 13, 90, 38, -67, -78, 22, 90, 31, -73 }, | |
54 | { 70, -43, -87, 9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70, | |
55 | -70, 43, 87, -9, -90, -25, 80, 57, -57, -80, 25, 90, 9, -87, -43, 70 }, | |
56 | { 67, -54, -78, 38, 85, -22, -90, 4, 90, 13, -88, -31, 82, 46, -73, -61, | |
57 | 61, 73, -46, -82, 31, 88, -13, -90, -4, 90, 22, -85, -38, 78, 54, -67 }, | |
58 | { 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, | |
59 | 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64 }, | |
60 | { 61, -73, -46, 82, 31, -88, -13, 90, -4, -90, 22, 85, -38, -78, 54, 67, | |
61 | -67, -54, 78, 38, -85, -22, 90, 4, -90, 13, 88, -31, -82, 46, 73, -61 }, | |
62 | { 57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87, 9, -90, 25, 80, -57, | |
63 | -57, 80, 25, -90, 9, 87, -43, -70, 70, 43, -87, -9, 90, -25, -80, 57 }, | |
64 | { 54, -85, -4, 88, -46, -61, 82, 13, -90, 38, 67, -78, -22, 90, -31, -73, | |
65 | 73, 31, -90, 22, 78, -67, -38, 90, -13, -82, 61, 46, -88, 4, 85, -54 }, | |
66 | { 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50, | |
67 | 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50 }, | |
68 | { 46, -90, 38, 54, -90, 31, 61, -88, 22, 67, -85, 13, 73, -82, 4, 78, | |
69 | -78, -4, 82, -73, -13, 85, -67, -22, 88, -61, -31, 90, -54, -38, 90, -46 }, | |
70 | { 43, -90, 57, 25, -87, 70, 9, -80, 80, -9, -70, 87, -25, -57, 90, -43, | |
71 | -43, 90, -57, -25, 87, -70, -9, 80, -80, 9, 70, -87, 25, 57, -90, 43 }, | |
72 | { 38, -88, 73, -4, -67, 90, -46, -31, 85, -78, 13, 61, -90, 54, 22, -82, | |
73 | 82, -22, -54, 90, -61, -13, 78, -85, 31, 46, -90, 67, 4, -73, 88, -38 }, | |
74 | { 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36, | |
75 | 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36 }, | |
76 | { 31, -78, 90, -61, 4, 54, -88, 82, -38, -22, 73, -90, 67, -13, -46, 85, | |
77 | -85, 46, 13, -67, 90, -73, 22, 38, -82, 88, -54, -4, 61, -90, 78, -31 }, | |
78 | { 25, -70, 90, -80, 43, 9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25, | |
79 | -25, 70, -90, 80, -43, -9, 57, -87, 87, -57, 9, 43, -80, 90, -70, 25 }, | |
80 | { 22, -61, 85, -90, 73, -38, -4, 46, -78, 90, -82, 54, -13, -31, 67, -88, | |
81 | 88, -67, 31, 13, -54, 82, -90, 78, -46, 4, 38, -73, 90, -85, 61, -22 }, | |
82 | { 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18, | |
83 | 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18 }, | |
84 | { 13, -38, 61, -78, 88, -90, 85, -73, 54, -31, 4, 22, -46, 67, -82, 90, | |
85 | -90, 82, -67, 46, -22, -4, 31, -54, 73, -85, 90, -88, 78, -61, 38, -13 }, | |
86 | { 9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9, | |
87 | -9, 25, -43, 57, -70, 80, -87, 90, -90, 87, -80, 70, -57, 43, -25, 9 }, | |
88 | { 4, -13, 22, -31, 38, -46, 54, -61, 67, -73, 78, -82, 85, -88, 90, -90, | |
89 | 90, -90, 88, -85, 82, -78, 73, -67, 61, -54, 46, -38, 31, -22, 13, -4 }, | |
90 | }; | |
91 | ||
92 | DECLARE_ALIGNED(16, const int8_t, ff_hevc_epel_filters[7][16]) = { | |
93 | { -2, 58, 10, -2, -2, 58, 10, -2, -2, 58, 10, -2, -2, 58, 10, -2 }, | |
94 | { -4, 54, 16, -2, -4, 54, 16, -2, -4, 54, 16, -2, -4, 54, 16, -2 }, | |
95 | { -6, 46, 28, -4, -6, 46, 28, -4, -6, 46, 28, -4, -6, 46, 28, -4 }, | |
96 | { -4, 36, 36, -4, -4, 36, 36, -4, -4, 36, 36, -4, -4, 36, 36, -4 }, | |
97 | { -4, 28, 46, -6, -4, 28, 46, -6, -4, 28, 46, -6, -4, 28, 46, -6 }, | |
98 | { -2, 16, 54, -4, -2, 16, 54, -4, -2, 16, 54, -4, -2, 16, 54, -4 }, | |
99 | { -2, 10, 58, -2, -2, 10, 58, -2, -2, 10, 58, -2, -2, 10, 58, -2 }, | |
100 | }; | |
101 | ||
102 | #define BIT_DEPTH 8 | |
103 | #include "hevcdsp_template.c" | |
104 | #undef BIT_DEPTH | |
105 | ||
106 | #define BIT_DEPTH 9 | |
107 | #include "hevcdsp_template.c" | |
108 | #undef BIT_DEPTH | |
109 | ||
110 | #define BIT_DEPTH 10 | |
111 | #include "hevcdsp_template.c" | |
112 | #undef BIT_DEPTH | |
113 | ||
114 | void ff_hevc_dsp_init(HEVCDSPContext *hevcdsp, int bit_depth) | |
115 | { | |
116 | #undef FUNC | |
117 | #define FUNC(a, depth) a ## _ ## depth | |
118 | ||
1f821750 AK |
119 | #define QPEL_FUNC(i, width, depth) \ |
120 | hevcdsp->put_hevc_qpel[0][0][i] = FUNC(put_hevc_qpel_pixels_ ## width, depth); \ | |
121 | hevcdsp->put_hevc_qpel[0][1][i] = FUNC(put_hevc_qpel_h_ ## width, depth); \ | |
122 | hevcdsp->put_hevc_qpel[1][0][i] = FUNC(put_hevc_qpel_v_ ## width, depth); \ | |
123 | hevcdsp->put_hevc_qpel[1][1][i] = FUNC(put_hevc_qpel_hv_ ## width, depth); \ | |
124 | ||
818bfe7f AK |
125 | #define EPEL_FUNC(i, width, depth) \ |
126 | hevcdsp->put_hevc_epel[0][0][i] = FUNC(put_hevc_epel_pixels_ ## width, depth); \ | |
127 | hevcdsp->put_hevc_epel[0][1][i] = FUNC(put_hevc_epel_h_ ## width, depth); \ | |
128 | hevcdsp->put_hevc_epel[1][0][i] = FUNC(put_hevc_epel_v_ ## width, depth); \ | |
129 | hevcdsp->put_hevc_epel[1][1][i] = FUNC(put_hevc_epel_hv_ ## width, depth); \ | |
130 | ||
064698d3 GM |
131 | #define HEVC_DSP(depth) \ |
132 | hevcdsp->put_pcm = FUNC(put_pcm, depth); \ | |
133 | hevcdsp->transquant_bypass[0] = FUNC(transquant_bypass4x4, depth); \ | |
134 | hevcdsp->transquant_bypass[1] = FUNC(transquant_bypass8x8, depth); \ | |
135 | hevcdsp->transquant_bypass[2] = FUNC(transquant_bypass16x16, depth); \ | |
136 | hevcdsp->transquant_bypass[3] = FUNC(transquant_bypass32x32, depth); \ | |
137 | hevcdsp->transform_skip = FUNC(transform_skip, depth); \ | |
138 | hevcdsp->transform_4x4_luma_add = FUNC(transform_4x4_luma_add, depth); \ | |
139 | hevcdsp->transform_add[0] = FUNC(transform_4x4_add, depth); \ | |
140 | hevcdsp->transform_add[1] = FUNC(transform_8x8_add, depth); \ | |
141 | hevcdsp->transform_add[2] = FUNC(transform_16x16_add, depth); \ | |
142 | hevcdsp->transform_add[3] = FUNC(transform_32x32_add, depth); \ | |
143 | \ | |
144 | hevcdsp->sao_band_filter[0] = FUNC(sao_band_filter_0, depth); \ | |
145 | hevcdsp->sao_band_filter[1] = FUNC(sao_band_filter_1, depth); \ | |
146 | hevcdsp->sao_band_filter[2] = FUNC(sao_band_filter_2, depth); \ | |
147 | hevcdsp->sao_band_filter[3] = FUNC(sao_band_filter_3, depth); \ | |
148 | \ | |
149 | hevcdsp->sao_edge_filter[0] = FUNC(sao_edge_filter_0, depth); \ | |
150 | hevcdsp->sao_edge_filter[1] = FUNC(sao_edge_filter_1, depth); \ | |
151 | hevcdsp->sao_edge_filter[2] = FUNC(sao_edge_filter_2, depth); \ | |
152 | hevcdsp->sao_edge_filter[3] = FUNC(sao_edge_filter_3, depth); \ | |
153 | \ | |
1f821750 AK |
154 | QPEL_FUNC(0, 4, depth); \ |
155 | QPEL_FUNC(1, 8, depth); \ | |
156 | QPEL_FUNC(2, 12, depth); \ | |
157 | QPEL_FUNC(3, 16, depth); \ | |
158 | QPEL_FUNC(4, 24, depth); \ | |
159 | QPEL_FUNC(5, 32, depth); \ | |
160 | QPEL_FUNC(6, 48, depth); \ | |
161 | QPEL_FUNC(7, 64, depth); \ | |
064698d3 | 162 | \ |
818bfe7f AK |
163 | EPEL_FUNC(0, 2, depth); \ |
164 | EPEL_FUNC(1, 4, depth); \ | |
165 | EPEL_FUNC(2, 6, depth); \ | |
166 | EPEL_FUNC(3, 8, depth); \ | |
167 | EPEL_FUNC(4, 12, depth); \ | |
168 | EPEL_FUNC(5, 16, depth); \ | |
169 | EPEL_FUNC(6, 24, depth); \ | |
170 | EPEL_FUNC(7, 32, depth); \ | |
064698d3 GM |
171 | \ |
172 | hevcdsp->put_unweighted_pred = FUNC(put_unweighted_pred, depth); \ | |
d8ebb615 | 173 | hevcdsp->put_unweighted_pred_avg = FUNC(put_unweighted_pred_avg, depth); \ |
064698d3 GM |
174 | \ |
175 | hevcdsp->weighted_pred = FUNC(weighted_pred, depth); \ | |
176 | hevcdsp->weighted_pred_avg = FUNC(weighted_pred_avg, depth); \ | |
177 | \ | |
178 | hevcdsp->hevc_h_loop_filter_luma = FUNC(hevc_h_loop_filter_luma, depth); \ | |
179 | hevcdsp->hevc_v_loop_filter_luma = FUNC(hevc_v_loop_filter_luma, depth); \ | |
180 | hevcdsp->hevc_h_loop_filter_chroma = FUNC(hevc_h_loop_filter_chroma, depth); \ | |
181 | hevcdsp->hevc_v_loop_filter_chroma = FUNC(hevc_v_loop_filter_chroma, depth); \ | |
182 | hevcdsp->hevc_h_loop_filter_luma_c = FUNC(hevc_h_loop_filter_luma, depth); \ | |
183 | hevcdsp->hevc_v_loop_filter_luma_c = FUNC(hevc_v_loop_filter_luma, depth); \ | |
184 | hevcdsp->hevc_h_loop_filter_chroma_c = FUNC(hevc_h_loop_filter_chroma, depth); \ | |
185 | hevcdsp->hevc_v_loop_filter_chroma_c = FUNC(hevc_v_loop_filter_chroma, depth); | |
186 | ||
187 | switch (bit_depth) { | |
188 | case 9: | |
189 | HEVC_DSP(9); | |
190 | break; | |
191 | case 10: | |
192 | HEVC_DSP(10); | |
193 | break; | |
194 | default: | |
195 | HEVC_DSP(8); | |
196 | break; | |
197 | } | |
1a880b2f PEL |
198 | |
199 | if (ARCH_X86) | |
200 | ff_hevc_dsp_init_x86(hevcdsp, bit_depth); | |
064698d3 | 201 | } |