1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci/**
23cabdff1aSopenharmony_ci * @file
24cabdff1aSopenharmony_ci * @brief
25cabdff1aSopenharmony_ci *     H.264 / AVC / MPEG-4 part10 codec data table
26cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at>
27cabdff1aSopenharmony_ci */
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include <stdint.h>
30cabdff1aSopenharmony_ci
31cabdff1aSopenharmony_ci#include "libavutil/avutil.h"
32cabdff1aSopenharmony_ci
33cabdff1aSopenharmony_ci#include "h264_parse.h"
34cabdff1aSopenharmony_ci#include "h264data.h"
35cabdff1aSopenharmony_ci#include "mpegutils.h"
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ciconst uint8_t ff_h264_golomb_to_pict_type[5] = {
38cabdff1aSopenharmony_ci    AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, AV_PICTURE_TYPE_I,
39cabdff1aSopenharmony_ci    AV_PICTURE_TYPE_SP, AV_PICTURE_TYPE_SI
40cabdff1aSopenharmony_ci};
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_ciconst uint8_t ff_h264_golomb_to_intra4x4_cbp[48] = {
43cabdff1aSopenharmony_ci    47, 31, 15, 0,  23, 27, 29, 30, 7,  11, 13, 14, 39, 43, 45, 46,
44cabdff1aSopenharmony_ci    16, 3,  5,  10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1,  2,  4,
45cabdff1aSopenharmony_ci    8,  17, 18, 20, 24, 6,  9,  22, 25, 32, 33, 34, 36, 40, 38, 41
46cabdff1aSopenharmony_ci};
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ciconst uint8_t ff_h264_golomb_to_inter_cbp[48] = {
49cabdff1aSopenharmony_ci    0,  16, 1,  2,  4,  8,  32, 3,  5,  10, 12, 15, 47, 7,  11, 13,
50cabdff1aSopenharmony_ci    14, 6,  9,  31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46,
51cabdff1aSopenharmony_ci    17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41
52cabdff1aSopenharmony_ci};
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ciconst uint8_t ff_h264_chroma_dc_scan[4] = {
55cabdff1aSopenharmony_ci    (0 + 0 * 2) * 16, (1 + 0 * 2) * 16,
56cabdff1aSopenharmony_ci    (0 + 1 * 2) * 16, (1 + 1 * 2) * 16,
57cabdff1aSopenharmony_ci};
58cabdff1aSopenharmony_ci
59cabdff1aSopenharmony_ciconst uint8_t ff_h264_chroma422_dc_scan[8] = {
60cabdff1aSopenharmony_ci    (0 + 0 * 2) * 16, (0 + 1 * 2) * 16,
61cabdff1aSopenharmony_ci    (1 + 0 * 2) * 16, (0 + 2 * 2) * 16,
62cabdff1aSopenharmony_ci    (0 + 3 * 2) * 16, (1 + 1 * 2) * 16,
63cabdff1aSopenharmony_ci    (1 + 2 * 2) * 16, (1 + 3 * 2) * 16,
64cabdff1aSopenharmony_ci};
65cabdff1aSopenharmony_ci
66cabdff1aSopenharmony_ciconst IMbInfo ff_h264_i_mb_type_info[26] = {
67cabdff1aSopenharmony_ci    { MB_TYPE_INTRA4x4,  -1,  -1 },
68cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 2,   0 },
69cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 1,   0 },
70cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 0,   0 },
71cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 3,   0 },
72cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 2,  16 },
73cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 1,  16 },
74cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 0,  16 },
75cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 3,  16 },
76cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 2,  32 },
77cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 1,  32 },
78cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 0,  32 },
79cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 3,  32 },
80cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 2,  15 +  0 },
81cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 1,  15 +  0 },
82cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 0,  15 +  0 },
83cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 3,  15 +  0 },
84cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 2,  15 + 16 },
85cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 1,  15 + 16 },
86cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 0,  15 + 16 },
87cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 3,  15 + 16 },
88cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 2,  15 + 32 },
89cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 1,  15 + 32 },
90cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 0,  15 + 32 },
91cabdff1aSopenharmony_ci    { MB_TYPE_INTRA16x16, 3,  15 + 32 },
92cabdff1aSopenharmony_ci    { MB_TYPE_INTRA_PCM,  -1, -1 },
93cabdff1aSopenharmony_ci};
94cabdff1aSopenharmony_ci
95cabdff1aSopenharmony_ciconst PMbInfo ff_h264_p_mb_type_info[5] = {
96cabdff1aSopenharmony_ci    { MB_TYPE_16x16 | MB_TYPE_P0L0,                               1 },
97cabdff1aSopenharmony_ci    { MB_TYPE_16x8  | MB_TYPE_P0L0 | MB_TYPE_P1L0,                2 },
98cabdff1aSopenharmony_ci    { MB_TYPE_8x16  | MB_TYPE_P0L0 | MB_TYPE_P1L0,                2 },
99cabdff1aSopenharmony_ci    { MB_TYPE_8x8   | MB_TYPE_P0L0 | MB_TYPE_P1L0,                4 },
100cabdff1aSopenharmony_ci    { MB_TYPE_8x8   | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_REF0, 4 },
101cabdff1aSopenharmony_ci};
102cabdff1aSopenharmony_ci
103cabdff1aSopenharmony_ciconst PMbInfo ff_h264_p_sub_mb_type_info[4] = {
104cabdff1aSopenharmony_ci    { MB_TYPE_16x16 | MB_TYPE_P0L0, 1 },
105cabdff1aSopenharmony_ci    { MB_TYPE_16x8  | MB_TYPE_P0L0, 2 },
106cabdff1aSopenharmony_ci    { MB_TYPE_8x16  | MB_TYPE_P0L0, 2 },
107cabdff1aSopenharmony_ci    { MB_TYPE_8x8   | MB_TYPE_P0L0, 4 },
108cabdff1aSopenharmony_ci};
109cabdff1aSopenharmony_ci
110cabdff1aSopenharmony_ciconst PMbInfo ff_h264_b_mb_type_info[23] = {
111cabdff1aSopenharmony_ci    { MB_TYPE_DIRECT2 | MB_TYPE_L0L1,                                              1, },
112cabdff1aSopenharmony_ci    { MB_TYPE_16x16   | MB_TYPE_P0L0,                                              1, },
113cabdff1aSopenharmony_ci    { MB_TYPE_16x16   | MB_TYPE_P0L1,                                              1, },
114cabdff1aSopenharmony_ci    { MB_TYPE_16x16   | MB_TYPE_P0L0 | MB_TYPE_P0L1,                               1, },
115cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L0 | MB_TYPE_P1L0,                               2, },
116cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L0 | MB_TYPE_P1L0,                               2, },
117cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L1 | MB_TYPE_P1L1,                               2, },
118cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L1 | MB_TYPE_P1L1,                               2, },
119cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L0 | MB_TYPE_P1L1,                               2, },
120cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L0 | MB_TYPE_P1L1,                               2, },
121cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L1 | MB_TYPE_P1L0,                               2, },
122cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L1 | MB_TYPE_P1L0,                               2, },
123cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1,                2, },
124cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1,                2, },
125cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1,                2, },
126cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1,                2, },
127cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0,                2, },
128cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0,                2, },
129cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1,                2, },
130cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1,                2, },
131cabdff1aSopenharmony_ci    { MB_TYPE_16x8    | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
132cabdff1aSopenharmony_ci    { MB_TYPE_8x16    | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
133cabdff1aSopenharmony_ci    { MB_TYPE_8x8     | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, },
134cabdff1aSopenharmony_ci};
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_ciconst PMbInfo ff_h264_b_sub_mb_type_info[13] = {
137cabdff1aSopenharmony_ci    { MB_TYPE_DIRECT2,                                                           1, },
138cabdff1aSopenharmony_ci    { MB_TYPE_16x16 | MB_TYPE_P0L0,                                              1, },
139cabdff1aSopenharmony_ci    { MB_TYPE_16x16 | MB_TYPE_P0L1,                                              1, },
140cabdff1aSopenharmony_ci    { MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1,                               1, },
141cabdff1aSopenharmony_ci    { MB_TYPE_16x8  | MB_TYPE_P0L0 | MB_TYPE_P1L0,                               2, },
142cabdff1aSopenharmony_ci    { MB_TYPE_8x16  | MB_TYPE_P0L0 | MB_TYPE_P1L0,                               2, },
143cabdff1aSopenharmony_ci    { MB_TYPE_16x8  | MB_TYPE_P0L1 | MB_TYPE_P1L1,                               2, },
144cabdff1aSopenharmony_ci    { MB_TYPE_8x16  | MB_TYPE_P0L1 | MB_TYPE_P1L1,                               2, },
145cabdff1aSopenharmony_ci    { MB_TYPE_16x8  | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
146cabdff1aSopenharmony_ci    { MB_TYPE_8x16  | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
147cabdff1aSopenharmony_ci    { MB_TYPE_8x8   | MB_TYPE_P0L0 | MB_TYPE_P1L0,                               4, },
148cabdff1aSopenharmony_ci    { MB_TYPE_8x8   | MB_TYPE_P0L1 | MB_TYPE_P1L1,                               4, },
149cabdff1aSopenharmony_ci    { MB_TYPE_8x8   | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, },
150cabdff1aSopenharmony_ci};
151cabdff1aSopenharmony_ci
152cabdff1aSopenharmony_ciconst uint8_t ff_h264_dequant4_coeff_init[6][3] = {
153cabdff1aSopenharmony_ci    { 10, 13, 16 },
154cabdff1aSopenharmony_ci    { 11, 14, 18 },
155cabdff1aSopenharmony_ci    { 13, 16, 20 },
156cabdff1aSopenharmony_ci    { 14, 18, 23 },
157cabdff1aSopenharmony_ci    { 16, 20, 25 },
158cabdff1aSopenharmony_ci    { 18, 23, 29 },
159cabdff1aSopenharmony_ci};
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_ciconst uint8_t ff_h264_dequant8_coeff_init_scan[16] = {
162cabdff1aSopenharmony_ci    0, 3, 4, 3, 3, 1, 5, 1, 4, 5, 2, 5, 3, 1, 5, 1
163cabdff1aSopenharmony_ci};
164cabdff1aSopenharmony_ci
165cabdff1aSopenharmony_ciconst uint8_t ff_h264_dequant8_coeff_init[6][6] = {
166cabdff1aSopenharmony_ci    { 20, 18, 32, 19, 25, 24 },
167cabdff1aSopenharmony_ci    { 22, 19, 35, 21, 28, 26 },
168cabdff1aSopenharmony_ci    { 26, 23, 42, 24, 33, 31 },
169cabdff1aSopenharmony_ci    { 28, 25, 45, 26, 35, 33 },
170cabdff1aSopenharmony_ci    { 32, 28, 51, 30, 40, 38 },
171cabdff1aSopenharmony_ci    { 36, 32, 58, 34, 46, 43 },
172cabdff1aSopenharmony_ci};
173cabdff1aSopenharmony_ci
174cabdff1aSopenharmony_ciconst uint8_t ff_h264_quant_rem6[QP_MAX_NUM + 1] = {
175cabdff1aSopenharmony_ci    0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
176cabdff1aSopenharmony_ci    3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
177cabdff1aSopenharmony_ci    0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
178cabdff1aSopenharmony_ci    3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
179cabdff1aSopenharmony_ci    0, 1, 2, 3,
180cabdff1aSopenharmony_ci};
181cabdff1aSopenharmony_ci
182cabdff1aSopenharmony_ciconst uint8_t ff_h264_quant_div6[QP_MAX_NUM + 1] = {
183cabdff1aSopenharmony_ci    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3,  3,  3,
184cabdff1aSopenharmony_ci    3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,  6,  6,
185cabdff1aSopenharmony_ci    7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10,
186cabdff1aSopenharmony_ci   10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13, 13, 13, 13,
187cabdff1aSopenharmony_ci   14,14,14,14,
188cabdff1aSopenharmony_ci};
189cabdff1aSopenharmony_ci
190cabdff1aSopenharmony_ci#define QP(qP, depth) ((qP) + 6 * ((depth) - 8))
191cabdff1aSopenharmony_ci
192cabdff1aSopenharmony_ci#define CHROMA_QP_TABLE_END(d)                                          \
193cabdff1aSopenharmony_ci    QP(0,  d), QP(1,  d), QP(2,  d), QP(3,  d), QP(4,  d), QP(5,  d),   \
194cabdff1aSopenharmony_ci    QP(6,  d), QP(7,  d), QP(8,  d), QP(9,  d), QP(10, d), QP(11, d),   \
195cabdff1aSopenharmony_ci    QP(12, d), QP(13, d), QP(14, d), QP(15, d), QP(16, d), QP(17, d),   \
196cabdff1aSopenharmony_ci    QP(18, d), QP(19, d), QP(20, d), QP(21, d), QP(22, d), QP(23, d),   \
197cabdff1aSopenharmony_ci    QP(24, d), QP(25, d), QP(26, d), QP(27, d), QP(28, d), QP(29, d),   \
198cabdff1aSopenharmony_ci    QP(29, d), QP(30, d), QP(31, d), QP(32, d), QP(32, d), QP(33, d),   \
199cabdff1aSopenharmony_ci    QP(34, d), QP(34, d), QP(35, d), QP(35, d), QP(36, d), QP(36, d),   \
200cabdff1aSopenharmony_ci    QP(37, d), QP(37, d), QP(37, d), QP(38, d), QP(38, d), QP(38, d),   \
201cabdff1aSopenharmony_ci    QP(39, d), QP(39, d), QP(39, d), QP(39, d)
202cabdff1aSopenharmony_ci
203cabdff1aSopenharmony_ciconst uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1] = {
204cabdff1aSopenharmony_ci    { CHROMA_QP_TABLE_END(8) },
205cabdff1aSopenharmony_ci    { 0, 1, 2, 3, 4, 5,
206cabdff1aSopenharmony_ci      CHROMA_QP_TABLE_END(9) },
207cabdff1aSopenharmony_ci    { 0, 1, 2, 3,  4,  5,
208cabdff1aSopenharmony_ci      6, 7, 8, 9, 10, 11,
209cabdff1aSopenharmony_ci      CHROMA_QP_TABLE_END(10) },
210cabdff1aSopenharmony_ci    { 0,  1, 2, 3,  4,  5,
211cabdff1aSopenharmony_ci      6,  7, 8, 9, 10, 11,
212cabdff1aSopenharmony_ci      12,13,14,15, 16, 17,
213cabdff1aSopenharmony_ci      CHROMA_QP_TABLE_END(11) },
214cabdff1aSopenharmony_ci    { 0,  1, 2, 3,  4,  5,
215cabdff1aSopenharmony_ci      6,  7, 8, 9, 10, 11,
216cabdff1aSopenharmony_ci      12,13,14,15, 16, 17,
217cabdff1aSopenharmony_ci      18,19,20,21, 22, 23,
218cabdff1aSopenharmony_ci      CHROMA_QP_TABLE_END(12) },
219cabdff1aSopenharmony_ci    { 0,  1, 2, 3,  4,  5,
220cabdff1aSopenharmony_ci      6,  7, 8, 9, 10, 11,
221cabdff1aSopenharmony_ci      12,13,14,15, 16, 17,
222cabdff1aSopenharmony_ci      18,19,20,21, 22, 23,
223cabdff1aSopenharmony_ci      24,25,26,27, 28, 29,
224cabdff1aSopenharmony_ci      CHROMA_QP_TABLE_END(13) },
225cabdff1aSopenharmony_ci    { 0,  1, 2, 3,  4,  5,
226cabdff1aSopenharmony_ci      6,  7, 8, 9, 10, 11,
227cabdff1aSopenharmony_ci      12,13,14,15, 16, 17,
228cabdff1aSopenharmony_ci      18,19,20,21, 22, 23,
229cabdff1aSopenharmony_ci      24,25,26,27, 28, 29,
230cabdff1aSopenharmony_ci      30,31,32,33, 34, 35,
231cabdff1aSopenharmony_ci      CHROMA_QP_TABLE_END(14) },
232cabdff1aSopenharmony_ci};
233