blob: a4c6d93cf0b5bd64089d9928f816f1305a5876c8
1 | /* |
2 | * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder |
3 | * Copyright (c) 2003 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 | * @brief |
25 | * H.264 / AVC / MPEG-4 part10 codec data table |
26 | * @author Michael Niedermayer <michaelni@gmx.at> |
27 | */ |
28 | |
29 | #include <stdint.h> |
30 | |
31 | #include "libavutil/avutil.h" |
32 | |
33 | #include "avcodec.h" |
34 | #include "h264dec.h" |
35 | #include "h264data.h" |
36 | |
37 | const uint8_t ff_h264_golomb_to_pict_type[5] = { |
38 | AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, AV_PICTURE_TYPE_I, |
39 | AV_PICTURE_TYPE_SP, AV_PICTURE_TYPE_SI |
40 | }; |
41 | |
42 | const uint8_t ff_h264_golomb_to_intra4x4_cbp[48] = { |
43 | 47, 31, 15, 0, 23, 27, 29, 30, 7, 11, 13, 14, 39, 43, 45, 46, |
44 | 16, 3, 5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1, 2, 4, |
45 | 8, 17, 18, 20, 24, 6, 9, 22, 25, 32, 33, 34, 36, 40, 38, 41 |
46 | }; |
47 | |
48 | const uint8_t ff_h264_golomb_to_inter_cbp[48] = { |
49 | 0, 16, 1, 2, 4, 8, 32, 3, 5, 10, 12, 15, 47, 7, 11, 13, |
50 | 14, 6, 9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46, |
51 | 17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41 |
52 | }; |
53 | |
54 | const uint8_t ff_h264_chroma_dc_scan[4] = { |
55 | (0 + 0 * 2) * 16, (1 + 0 * 2) * 16, |
56 | (0 + 1 * 2) * 16, (1 + 1 * 2) * 16, |
57 | }; |
58 | |
59 | const uint8_t ff_h264_chroma422_dc_scan[8] = { |
60 | (0 + 0 * 2) * 16, (0 + 1 * 2) * 16, |
61 | (1 + 0 * 2) * 16, (0 + 2 * 2) * 16, |
62 | (0 + 3 * 2) * 16, (1 + 1 * 2) * 16, |
63 | (1 + 2 * 2) * 16, (1 + 3 * 2) * 16, |
64 | }; |
65 | |
66 | const IMbInfo ff_h264_i_mb_type_info[26] = { |
67 | { MB_TYPE_INTRA4x4, -1, -1 }, |
68 | { MB_TYPE_INTRA16x16, 2, 0 }, |
69 | { MB_TYPE_INTRA16x16, 1, 0 }, |
70 | { MB_TYPE_INTRA16x16, 0, 0 }, |
71 | { MB_TYPE_INTRA16x16, 3, 0 }, |
72 | { MB_TYPE_INTRA16x16, 2, 16 }, |
73 | { MB_TYPE_INTRA16x16, 1, 16 }, |
74 | { MB_TYPE_INTRA16x16, 0, 16 }, |
75 | { MB_TYPE_INTRA16x16, 3, 16 }, |
76 | { MB_TYPE_INTRA16x16, 2, 32 }, |
77 | { MB_TYPE_INTRA16x16, 1, 32 }, |
78 | { MB_TYPE_INTRA16x16, 0, 32 }, |
79 | { MB_TYPE_INTRA16x16, 3, 32 }, |
80 | { MB_TYPE_INTRA16x16, 2, 15 + 0 }, |
81 | { MB_TYPE_INTRA16x16, 1, 15 + 0 }, |
82 | { MB_TYPE_INTRA16x16, 0, 15 + 0 }, |
83 | { MB_TYPE_INTRA16x16, 3, 15 + 0 }, |
84 | { MB_TYPE_INTRA16x16, 2, 15 + 16 }, |
85 | { MB_TYPE_INTRA16x16, 1, 15 + 16 }, |
86 | { MB_TYPE_INTRA16x16, 0, 15 + 16 }, |
87 | { MB_TYPE_INTRA16x16, 3, 15 + 16 }, |
88 | { MB_TYPE_INTRA16x16, 2, 15 + 32 }, |
89 | { MB_TYPE_INTRA16x16, 1, 15 + 32 }, |
90 | { MB_TYPE_INTRA16x16, 0, 15 + 32 }, |
91 | { MB_TYPE_INTRA16x16, 3, 15 + 32 }, |
92 | { MB_TYPE_INTRA_PCM, -1, -1 }, |
93 | }; |
94 | |
95 | const PMbInfo ff_h264_p_mb_type_info[5] = { |
96 | { MB_TYPE_16x16 | MB_TYPE_P0L0, 1 }, |
97 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 }, |
98 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 }, |
99 | { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4 }, |
100 | { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_REF0, 4 }, |
101 | }; |
102 | |
103 | const PMbInfo ff_h264_p_sub_mb_type_info[4] = { |
104 | { MB_TYPE_16x16 | MB_TYPE_P0L0, 1 }, |
105 | { MB_TYPE_16x8 | MB_TYPE_P0L0, 2 }, |
106 | { MB_TYPE_8x16 | MB_TYPE_P0L0, 2 }, |
107 | { MB_TYPE_8x8 | MB_TYPE_P0L0, 4 }, |
108 | }; |
109 | |
110 | const PMbInfo ff_h264_b_mb_type_info[23] = { |
111 | { MB_TYPE_DIRECT2 | MB_TYPE_L0L1, 1, }, |
112 | { MB_TYPE_16x16 | MB_TYPE_P0L0, 1, }, |
113 | { MB_TYPE_16x16 | MB_TYPE_P0L1, 1, }, |
114 | { MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, }, |
115 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, }, |
116 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, }, |
117 | { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, |
118 | { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, |
119 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, }, |
120 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, }, |
121 | { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, }, |
122 | { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, }, |
123 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, |
124 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, |
125 | { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, |
126 | { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, |
127 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, }, |
128 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, }, |
129 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, |
130 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, |
131 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, |
132 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, |
133 | { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, }, |
134 | }; |
135 | |
136 | const PMbInfo ff_h264_b_sub_mb_type_info[13] = { |
137 | { MB_TYPE_DIRECT2, 1, }, |
138 | { MB_TYPE_16x16 | MB_TYPE_P0L0, 1, }, |
139 | { MB_TYPE_16x16 | MB_TYPE_P0L1, 1, }, |
140 | { MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, }, |
141 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, }, |
142 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, }, |
143 | { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, |
144 | { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, }, |
145 | { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, |
146 | { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, }, |
147 | { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4, }, |
148 | { MB_TYPE_8x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 4, }, |
149 | { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, }, |
150 | }; |
151 | |
152 | const uint8_t ff_h264_dequant4_coeff_init[6][3] = { |
153 | { 10, 13, 16 }, |
154 | { 11, 14, 18 }, |
155 | { 13, 16, 20 }, |
156 | { 14, 18, 23 }, |
157 | { 16, 20, 25 }, |
158 | { 18, 23, 29 }, |
159 | }; |
160 | |
161 | const uint8_t ff_h264_dequant8_coeff_init_scan[16] = { |
162 | 0, 3, 4, 3, 3, 1, 5, 1, 4, 5, 2, 5, 3, 1, 5, 1 |
163 | }; |
164 | |
165 | const uint8_t ff_h264_dequant8_coeff_init[6][6] = { |
166 | { 20, 18, 32, 19, 25, 24 }, |
167 | { 22, 19, 35, 21, 28, 26 }, |
168 | { 26, 23, 42, 24, 33, 31 }, |
169 | { 28, 25, 45, 26, 35, 33 }, |
170 | { 32, 28, 51, 30, 40, 38 }, |
171 | { 36, 32, 58, 34, 46, 43 }, |
172 | }; |
173 | |
174 | const uint8_t ff_h264_quant_rem6[QP_MAX_NUM + 1] = { |
175 | 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, |
176 | 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, |
177 | 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, |
178 | 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, |
179 | 0, 1, 2, 3, |
180 | }; |
181 | |
182 | const uint8_t ff_h264_quant_div6[QP_MAX_NUM + 1] = { |
183 | 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, |
184 | 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, |
185 | 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, |
186 | 10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13, 13, 13, 13, |
187 | 14,14,14,14, |
188 | }; |
189 | |
190 | #define QP(qP, depth) ((qP) + 6 * ((depth) - 8)) |
191 | |
192 | #define CHROMA_QP_TABLE_END(d) \ |
193 | QP(0, d), QP(1, d), QP(2, d), QP(3, d), QP(4, d), QP(5, d), \ |
194 | QP(6, d), QP(7, d), QP(8, d), QP(9, d), QP(10, d), QP(11, d), \ |
195 | QP(12, d), QP(13, d), QP(14, d), QP(15, d), QP(16, d), QP(17, d), \ |
196 | QP(18, d), QP(19, d), QP(20, d), QP(21, d), QP(22, d), QP(23, d), \ |
197 | QP(24, d), QP(25, d), QP(26, d), QP(27, d), QP(28, d), QP(29, d), \ |
198 | QP(29, d), QP(30, d), QP(31, d), QP(32, d), QP(32, d), QP(33, d), \ |
199 | QP(34, d), QP(34, d), QP(35, d), QP(35, d), QP(36, d), QP(36, d), \ |
200 | QP(37, d), QP(37, d), QP(37, d), QP(38, d), QP(38, d), QP(38, d), \ |
201 | QP(39, d), QP(39, d), QP(39, d), QP(39, d) |
202 | |
203 | const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1] = { |
204 | { CHROMA_QP_TABLE_END(8) }, |
205 | { 0, 1, 2, 3, 4, 5, |
206 | CHROMA_QP_TABLE_END(9) }, |
207 | { 0, 1, 2, 3, 4, 5, |
208 | 6, 7, 8, 9, 10, 11, |
209 | CHROMA_QP_TABLE_END(10) }, |
210 | { 0, 1, 2, 3, 4, 5, |
211 | 6, 7, 8, 9, 10, 11, |
212 | 12,13,14,15, 16, 17, |
213 | CHROMA_QP_TABLE_END(11) }, |
214 | { 0, 1, 2, 3, 4, 5, |
215 | 6, 7, 8, 9, 10, 11, |
216 | 12,13,14,15, 16, 17, |
217 | 18,19,20,21, 22, 23, |
218 | CHROMA_QP_TABLE_END(12) }, |
219 | { 0, 1, 2, 3, 4, 5, |
220 | 6, 7, 8, 9, 10, 11, |
221 | 12,13,14,15, 16, 17, |
222 | 18,19,20,21, 22, 23, |
223 | 24,25,26,27, 28, 29, |
224 | CHROMA_QP_TABLE_END(13) }, |
225 | { 0, 1, 2, 3, 4, 5, |
226 | 6, 7, 8, 9, 10, 11, |
227 | 12,13,14,15, 16, 17, |
228 | 18,19,20,21, 22, 23, |
229 | 24,25,26,27, 28, 29, |
230 | 30,31,32,33, 34, 35, |
231 | CHROMA_QP_TABLE_END(14) }, |
232 | }; |
233 |