ffmpeg / libavcodec / h264data.h @ 2a1f431d
History | View | Annotate | Download (8.83 KB)
1 |
/*
|
---|---|
2 |
* H26L/H264/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 |
* H264 / AVC / MPEG4 part10 codec data table
|
26 |
* @author Michael Niedermayer <michaelni@gmx.at>
|
27 |
*/
|
28 |
|
29 |
#ifndef AVCODEC_H264DATA_H
|
30 |
#define AVCODEC_H264DATA_H
|
31 |
|
32 |
#include <stdint.h> |
33 |
#include "libavutil/rational.h" |
34 |
#include "mpegvideo.h" |
35 |
#include "h264.h" |
36 |
|
37 |
|
38 |
static const uint8_t golomb_to_pict_type[5]= |
39 |
{FF_P_TYPE, FF_B_TYPE, FF_I_TYPE, FF_SP_TYPE, FF_SI_TYPE}; |
40 |
|
41 |
static const uint8_t golomb_to_intra4x4_cbp[48]={ |
42 |
47, 31, 15, 0, 23, 27, 29, 30, 7, 11, 13, 14, 39, 43, 45, 46, |
43 |
16, 3, 5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1, 2, 4, |
44 |
8, 17, 18, 20, 24, 6, 9, 22, 25, 32, 33, 34, 36, 40, 38, 41 |
45 |
}; |
46 |
|
47 |
static const uint8_t golomb_to_inter_cbp[48]={ |
48 |
0, 16, 1, 2, 4, 8, 32, 3, 5, 10, 12, 15, 47, 7, 11, 13, |
49 |
14, 6, 9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46, |
50 |
17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41 |
51 |
}; |
52 |
|
53 |
static const uint8_t zigzag_scan[16]={ |
54 |
0+0*4, 1+0*4, 0+1*4, 0+2*4, |
55 |
1+1*4, 2+0*4, 3+0*4, 2+1*4, |
56 |
1+2*4, 0+3*4, 1+3*4, 2+2*4, |
57 |
3+1*4, 3+2*4, 2+3*4, 3+3*4, |
58 |
}; |
59 |
|
60 |
static const uint8_t field_scan[16]={ |
61 |
0+0*4, 0+1*4, 1+0*4, 0+2*4, |
62 |
0+3*4, 1+1*4, 1+2*4, 1+3*4, |
63 |
2+0*4, 2+1*4, 2+2*4, 2+3*4, |
64 |
3+0*4, 3+1*4, 3+2*4, 3+3*4, |
65 |
}; |
66 |
|
67 |
static const uint8_t luma_dc_zigzag_scan[16]={ |
68 |
0*16 + 0*64, 1*16 + 0*64, 2*16 + 0*64, 0*16 + 2*64, |
69 |
3*16 + 0*64, 0*16 + 1*64, 1*16 + 1*64, 2*16 + 1*64, |
70 |
1*16 + 2*64, 2*16 + 2*64, 3*16 + 2*64, 0*16 + 3*64, |
71 |
3*16 + 1*64, 1*16 + 3*64, 2*16 + 3*64, 3*16 + 3*64, |
72 |
}; |
73 |
|
74 |
static const uint8_t luma_dc_field_scan[16]={ |
75 |
0*16 + 0*64, 2*16 + 0*64, 1*16 + 0*64, 0*16 + 2*64, |
76 |
2*16 + 2*64, 3*16 + 0*64, 1*16 + 2*64, 3*16 + 2*64, |
77 |
0*16 + 1*64, 2*16 + 1*64, 0*16 + 3*64, 2*16 + 3*64, |
78 |
1*16 + 1*64, 3*16 + 1*64, 1*16 + 3*64, 3*16 + 3*64, |
79 |
}; |
80 |
|
81 |
static const uint8_t chroma_dc_scan[4]={ |
82 |
0,1,2,3 |
83 |
}; |
84 |
|
85 |
// zigzag_scan8x8_cavlc[i] = zigzag_scan8x8[(i/4) + 16*(i%4)]
|
86 |
static const uint8_t zigzag_scan8x8_cavlc[64]={ |
87 |
0+0*8, 1+1*8, 1+2*8, 2+2*8, |
88 |
4+1*8, 0+5*8, 3+3*8, 7+0*8, |
89 |
3+4*8, 1+7*8, 5+3*8, 6+3*8, |
90 |
2+7*8, 6+4*8, 5+6*8, 7+5*8, |
91 |
1+0*8, 2+0*8, 0+3*8, 3+1*8, |
92 |
3+2*8, 0+6*8, 4+2*8, 6+1*8, |
93 |
2+5*8, 2+6*8, 6+2*8, 5+4*8, |
94 |
3+7*8, 7+3*8, 4+7*8, 7+6*8, |
95 |
0+1*8, 3+0*8, 0+4*8, 4+0*8, |
96 |
2+3*8, 1+5*8, 5+1*8, 5+2*8, |
97 |
1+6*8, 3+5*8, 7+1*8, 4+5*8, |
98 |
4+6*8, 7+4*8, 5+7*8, 6+7*8, |
99 |
0+2*8, 2+1*8, 1+3*8, 5+0*8, |
100 |
1+4*8, 2+4*8, 6+0*8, 4+3*8, |
101 |
0+7*8, 4+4*8, 7+2*8, 3+6*8, |
102 |
5+5*8, 6+5*8, 6+6*8, 7+7*8, |
103 |
}; |
104 |
|
105 |
static const uint8_t field_scan8x8[64]={ |
106 |
0+0*8, 0+1*8, 0+2*8, 1+0*8, |
107 |
1+1*8, 0+3*8, 0+4*8, 1+2*8, |
108 |
2+0*8, 1+3*8, 0+5*8, 0+6*8, |
109 |
0+7*8, 1+4*8, 2+1*8, 3+0*8, |
110 |
2+2*8, 1+5*8, 1+6*8, 1+7*8, |
111 |
2+3*8, 3+1*8, 4+0*8, 3+2*8, |
112 |
2+4*8, 2+5*8, 2+6*8, 2+7*8, |
113 |
3+3*8, 4+1*8, 5+0*8, 4+2*8, |
114 |
3+4*8, 3+5*8, 3+6*8, 3+7*8, |
115 |
4+3*8, 5+1*8, 6+0*8, 5+2*8, |
116 |
4+4*8, 4+5*8, 4+6*8, 4+7*8, |
117 |
5+3*8, 6+1*8, 6+2*8, 5+4*8, |
118 |
5+5*8, 5+6*8, 5+7*8, 6+3*8, |
119 |
7+0*8, 7+1*8, 6+4*8, 6+5*8, |
120 |
6+6*8, 6+7*8, 7+2*8, 7+3*8, |
121 |
7+4*8, 7+5*8, 7+6*8, 7+7*8, |
122 |
}; |
123 |
|
124 |
static const uint8_t field_scan8x8_cavlc[64]={ |
125 |
0+0*8, 1+1*8, 2+0*8, 0+7*8, |
126 |
2+2*8, 2+3*8, 2+4*8, 3+3*8, |
127 |
3+4*8, 4+3*8, 4+4*8, 5+3*8, |
128 |
5+5*8, 7+0*8, 6+6*8, 7+4*8, |
129 |
0+1*8, 0+3*8, 1+3*8, 1+4*8, |
130 |
1+5*8, 3+1*8, 2+5*8, 4+1*8, |
131 |
3+5*8, 5+1*8, 4+5*8, 6+1*8, |
132 |
5+6*8, 7+1*8, 6+7*8, 7+5*8, |
133 |
0+2*8, 0+4*8, 0+5*8, 2+1*8, |
134 |
1+6*8, 4+0*8, 2+6*8, 5+0*8, |
135 |
3+6*8, 6+0*8, 4+6*8, 6+2*8, |
136 |
5+7*8, 6+4*8, 7+2*8, 7+6*8, |
137 |
1+0*8, 1+2*8, 0+6*8, 3+0*8, |
138 |
1+7*8, 3+2*8, 2+7*8, 4+2*8, |
139 |
3+7*8, 5+2*8, 4+7*8, 5+4*8, |
140 |
6+3*8, 6+5*8, 7+3*8, 7+7*8, |
141 |
}; |
142 |
|
143 |
typedef struct IMbInfo{ |
144 |
uint16_t type; |
145 |
uint8_t pred_mode; |
146 |
uint8_t cbp; |
147 |
} IMbInfo; |
148 |
|
149 |
static const IMbInfo i_mb_type_info[26]={ |
150 |
{MB_TYPE_INTRA4x4 , -1, -1}, |
151 |
{MB_TYPE_INTRA16x16, 2, 0}, |
152 |
{MB_TYPE_INTRA16x16, 1, 0}, |
153 |
{MB_TYPE_INTRA16x16, 0, 0}, |
154 |
{MB_TYPE_INTRA16x16, 3, 0}, |
155 |
{MB_TYPE_INTRA16x16, 2, 16}, |
156 |
{MB_TYPE_INTRA16x16, 1, 16}, |
157 |
{MB_TYPE_INTRA16x16, 0, 16}, |
158 |
{MB_TYPE_INTRA16x16, 3, 16}, |
159 |
{MB_TYPE_INTRA16x16, 2, 32}, |
160 |
{MB_TYPE_INTRA16x16, 1, 32}, |
161 |
{MB_TYPE_INTRA16x16, 0, 32}, |
162 |
{MB_TYPE_INTRA16x16, 3, 32}, |
163 |
{MB_TYPE_INTRA16x16, 2, 15+0}, |
164 |
{MB_TYPE_INTRA16x16, 1, 15+0}, |
165 |
{MB_TYPE_INTRA16x16, 0, 15+0}, |
166 |
{MB_TYPE_INTRA16x16, 3, 15+0}, |
167 |
{MB_TYPE_INTRA16x16, 2, 15+16}, |
168 |
{MB_TYPE_INTRA16x16, 1, 15+16}, |
169 |
{MB_TYPE_INTRA16x16, 0, 15+16}, |
170 |
{MB_TYPE_INTRA16x16, 3, 15+16}, |
171 |
{MB_TYPE_INTRA16x16, 2, 15+32}, |
172 |
{MB_TYPE_INTRA16x16, 1, 15+32}, |
173 |
{MB_TYPE_INTRA16x16, 0, 15+32}, |
174 |
{MB_TYPE_INTRA16x16, 3, 15+32}, |
175 |
{MB_TYPE_INTRA_PCM , -1, -1}, |
176 |
}; |
177 |
|
178 |
typedef struct PMbInfo{ |
179 |
uint16_t type; |
180 |
uint8_t partition_count; |
181 |
} PMbInfo; |
182 |
|
183 |
static const PMbInfo p_mb_type_info[5]={ |
184 |
{MB_TYPE_16x16|MB_TYPE_P0L0 , 1},
|
185 |
{MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P1L0, 2},
|
186 |
{MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P1L0, 2},
|
187 |
{MB_TYPE_8x8 |MB_TYPE_P0L0|MB_TYPE_P1L0, 4},
|
188 |
{MB_TYPE_8x8 |MB_TYPE_P0L0|MB_TYPE_P1L0|MB_TYPE_REF0, 4},
|
189 |
}; |
190 |
|
191 |
static const PMbInfo p_sub_mb_type_info[4]={ |
192 |
{MB_TYPE_16x16|MB_TYPE_P0L0 , 1},
|
193 |
{MB_TYPE_16x8 |MB_TYPE_P0L0 , 2},
|
194 |
{MB_TYPE_8x16 |MB_TYPE_P0L0 , 2},
|
195 |
{MB_TYPE_8x8 |MB_TYPE_P0L0 , 4},
|
196 |
}; |
197 |
|
198 |
static const PMbInfo b_mb_type_info[23]={ |
199 |
{MB_TYPE_DIRECT2|MB_TYPE_L0L1 , 1, },
|
200 |
{MB_TYPE_16x16|MB_TYPE_P0L0 , 1, },
|
201 |
{MB_TYPE_16x16 |MB_TYPE_P0L1 , 1, },
|
202 |
{MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1 , 1, },
|
203 |
{MB_TYPE_16x8 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 2, },
|
204 |
{MB_TYPE_8x16 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 2, },
|
205 |
{MB_TYPE_16x8 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, },
|
206 |
{MB_TYPE_8x16 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, },
|
207 |
{MB_TYPE_16x8 |MB_TYPE_P0L0 |MB_TYPE_P1L1, 2, },
|
208 |
{MB_TYPE_8x16 |MB_TYPE_P0L0 |MB_TYPE_P1L1, 2, },
|
209 |
{MB_TYPE_16x8 |MB_TYPE_P0L1|MB_TYPE_P1L0 , 2, },
|
210 |
{MB_TYPE_8x16 |MB_TYPE_P0L1|MB_TYPE_P1L0 , 2, },
|
211 |
{MB_TYPE_16x8 |MB_TYPE_P0L0 |MB_TYPE_P1L0|MB_TYPE_P1L1, 2, },
|
212 |
{MB_TYPE_8x16 |MB_TYPE_P0L0 |MB_TYPE_P1L0|MB_TYPE_P1L1, 2, },
|
213 |
{MB_TYPE_16x8 |MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, },
|
214 |
{MB_TYPE_8x16 |MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, },
|
215 |
{MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0 , 2, },
|
216 |
{MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0 , 2, },
|
217 |
{MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, },
|
218 |
{MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, },
|
219 |
{MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, },
|
220 |
{MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, },
|
221 |
{MB_TYPE_8x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 4, },
|
222 |
}; |
223 |
|
224 |
static const PMbInfo b_sub_mb_type_info[13]={ |
225 |
{MB_TYPE_DIRECT2 , 1, },
|
226 |
{MB_TYPE_16x16|MB_TYPE_P0L0 , 1, },
|
227 |
{MB_TYPE_16x16 |MB_TYPE_P0L1 , 1, },
|
228 |
{MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1 , 1, },
|
229 |
{MB_TYPE_16x8 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 2, },
|
230 |
{MB_TYPE_8x16 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 2, },
|
231 |
{MB_TYPE_16x8 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, },
|
232 |
{MB_TYPE_8x16 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, },
|
233 |
{MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, },
|
234 |
{MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, },
|
235 |
{MB_TYPE_8x8 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 4, },
|
236 |
{MB_TYPE_8x8 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 4, },
|
237 |
{MB_TYPE_8x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 4, },
|
238 |
}; |
239 |
|
240 |
static const uint8_t dequant4_coeff_init[6][3]={ |
241 |
{10,13,16}, |
242 |
{11,14,18}, |
243 |
{13,16,20}, |
244 |
{14,18,23}, |
245 |
{16,20,25}, |
246 |
{18,23,29}, |
247 |
}; |
248 |
|
249 |
static const uint8_t dequant8_coeff_init_scan[16] = { |
250 |
0,3,4,3, 3,1,5,1, 4,5,2,5, 3,1,5,1 |
251 |
}; |
252 |
static const uint8_t dequant8_coeff_init[6][6]={ |
253 |
{20,18,32,19,25,24}, |
254 |
{22,19,35,21,28,26}, |
255 |
{26,23,42,24,33,31}, |
256 |
{28,25,45,26,35,33}, |
257 |
{32,28,51,30,40,38}, |
258 |
{36,32,58,34,46,43}, |
259 |
}; |
260 |
|
261 |
#endif /* AVCODEC_H264DATA_H */ |