00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00029 #ifndef AVCODEC_H264DATA_H
00030 #define AVCODEC_H264DATA_H
00031
00032 #include <stdint.h>
00033
00034 #include "libavutil/rational.h"
00035 #include "mpegvideo.h"
00036 #include "h264.h"
00037
00038 static const uint8_t golomb_to_pict_type[5] = {
00039 AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, AV_PICTURE_TYPE_I,
00040 AV_PICTURE_TYPE_SP, AV_PICTURE_TYPE_SI
00041 };
00042
00043 static const uint8_t golomb_to_intra4x4_cbp[48] = {
00044 47, 31, 15, 0, 23, 27, 29, 30, 7, 11, 13, 14, 39, 43, 45, 46,
00045 16, 3, 5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1, 2, 4,
00046 8, 17, 18, 20, 24, 6, 9, 22, 25, 32, 33, 34, 36, 40, 38, 41
00047 };
00048
00049 static const uint8_t golomb_to_inter_cbp[48] = {
00050 0, 16, 1, 2, 4, 8, 32, 3, 5, 10, 12, 15, 47, 7, 11, 13,
00051 14, 6, 9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46,
00052 17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41
00053 };
00054
00055 static const uint8_t zigzag_scan[16+1] = {
00056 0 + 0 * 4, 1 + 0 * 4, 0 + 1 * 4, 0 + 2 * 4,
00057 1 + 1 * 4, 2 + 0 * 4, 3 + 0 * 4, 2 + 1 * 4,
00058 1 + 2 * 4, 0 + 3 * 4, 1 + 3 * 4, 2 + 2 * 4,
00059 3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4,
00060 };
00061
00062 static const uint8_t field_scan[16+1] = {
00063 0 + 0 * 4, 0 + 1 * 4, 1 + 0 * 4, 0 + 2 * 4,
00064 0 + 3 * 4, 1 + 1 * 4, 1 + 2 * 4, 1 + 3 * 4,
00065 2 + 0 * 4, 2 + 1 * 4, 2 + 2 * 4, 2 + 3 * 4,
00066 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4, 3 + 3 * 4,
00067 };
00068
00069 static const uint8_t luma_dc_zigzag_scan[16] = {
00070 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
00071 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
00072 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
00073 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
00074 };
00075
00076 static const uint8_t luma_dc_field_scan[16] = {
00077 0 * 16 + 0 * 64, 2 * 16 + 0 * 64, 1 * 16 + 0 * 64, 0 * 16 + 2 * 64,
00078 2 * 16 + 2 * 64, 3 * 16 + 0 * 64, 1 * 16 + 2 * 64, 3 * 16 + 2 * 64,
00079 0 * 16 + 1 * 64, 2 * 16 + 1 * 64, 0 * 16 + 3 * 64, 2 * 16 + 3 * 64,
00080 1 * 16 + 1 * 64, 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 3 * 16 + 3 * 64,
00081 };
00082
00083 static const uint8_t chroma_dc_scan[4] = {
00084 (0 + 0 * 2) * 16, (1 + 0 * 2) * 16,
00085 (0 + 1 * 2) * 16, (1 + 1 * 2) * 16,
00086 };
00087
00088 static const uint8_t chroma422_dc_scan[8] = {
00089 (0 + 0 * 2) * 16, (0 + 1 * 2) * 16,
00090 (1 + 0 * 2) * 16, (0 + 2 * 2) * 16,
00091 (0 + 3 * 2) * 16, (1 + 1 * 2) * 16,
00092 (1 + 2 * 2) * 16, (1 + 3 * 2) * 16,
00093 };
00094
00095
00096 static const uint8_t zigzag_scan8x8_cavlc[64+1] = {
00097 0 + 0 * 8, 1 + 1 * 8, 1 + 2 * 8, 2 + 2 * 8,
00098 4 + 1 * 8, 0 + 5 * 8, 3 + 3 * 8, 7 + 0 * 8,
00099 3 + 4 * 8, 1 + 7 * 8, 5 + 3 * 8, 6 + 3 * 8,
00100 2 + 7 * 8, 6 + 4 * 8, 5 + 6 * 8, 7 + 5 * 8,
00101 1 + 0 * 8, 2 + 0 * 8, 0 + 3 * 8, 3 + 1 * 8,
00102 3 + 2 * 8, 0 + 6 * 8, 4 + 2 * 8, 6 + 1 * 8,
00103 2 + 5 * 8, 2 + 6 * 8, 6 + 2 * 8, 5 + 4 * 8,
00104 3 + 7 * 8, 7 + 3 * 8, 4 + 7 * 8, 7 + 6 * 8,
00105 0 + 1 * 8, 3 + 0 * 8, 0 + 4 * 8, 4 + 0 * 8,
00106 2 + 3 * 8, 1 + 5 * 8, 5 + 1 * 8, 5 + 2 * 8,
00107 1 + 6 * 8, 3 + 5 * 8, 7 + 1 * 8, 4 + 5 * 8,
00108 4 + 6 * 8, 7 + 4 * 8, 5 + 7 * 8, 6 + 7 * 8,
00109 0 + 2 * 8, 2 + 1 * 8, 1 + 3 * 8, 5 + 0 * 8,
00110 1 + 4 * 8, 2 + 4 * 8, 6 + 0 * 8, 4 + 3 * 8,
00111 0 + 7 * 8, 4 + 4 * 8, 7 + 2 * 8, 3 + 6 * 8,
00112 5 + 5 * 8, 6 + 5 * 8, 6 + 6 * 8, 7 + 7 * 8,
00113 };
00114
00115 static const uint8_t field_scan8x8[64+1] = {
00116 0 + 0 * 8, 0 + 1 * 8, 0 + 2 * 8, 1 + 0 * 8,
00117 1 + 1 * 8, 0 + 3 * 8, 0 + 4 * 8, 1 + 2 * 8,
00118 2 + 0 * 8, 1 + 3 * 8, 0 + 5 * 8, 0 + 6 * 8,
00119 0 + 7 * 8, 1 + 4 * 8, 2 + 1 * 8, 3 + 0 * 8,
00120 2 + 2 * 8, 1 + 5 * 8, 1 + 6 * 8, 1 + 7 * 8,
00121 2 + 3 * 8, 3 + 1 * 8, 4 + 0 * 8, 3 + 2 * 8,
00122 2 + 4 * 8, 2 + 5 * 8, 2 + 6 * 8, 2 + 7 * 8,
00123 3 + 3 * 8, 4 + 1 * 8, 5 + 0 * 8, 4 + 2 * 8,
00124 3 + 4 * 8, 3 + 5 * 8, 3 + 6 * 8, 3 + 7 * 8,
00125 4 + 3 * 8, 5 + 1 * 8, 6 + 0 * 8, 5 + 2 * 8,
00126 4 + 4 * 8, 4 + 5 * 8, 4 + 6 * 8, 4 + 7 * 8,
00127 5 + 3 * 8, 6 + 1 * 8, 6 + 2 * 8, 5 + 4 * 8,
00128 5 + 5 * 8, 5 + 6 * 8, 5 + 7 * 8, 6 + 3 * 8,
00129 7 + 0 * 8, 7 + 1 * 8, 6 + 4 * 8, 6 + 5 * 8,
00130 6 + 6 * 8, 6 + 7 * 8, 7 + 2 * 8, 7 + 3 * 8,
00131 7 + 4 * 8, 7 + 5 * 8, 7 + 6 * 8, 7 + 7 * 8,
00132 };
00133
00134 static const uint8_t field_scan8x8_cavlc[64+1] = {
00135 0 + 0 * 8, 1 + 1 * 8, 2 + 0 * 8, 0 + 7 * 8,
00136 2 + 2 * 8, 2 + 3 * 8, 2 + 4 * 8, 3 + 3 * 8,
00137 3 + 4 * 8, 4 + 3 * 8, 4 + 4 * 8, 5 + 3 * 8,
00138 5 + 5 * 8, 7 + 0 * 8, 6 + 6 * 8, 7 + 4 * 8,
00139 0 + 1 * 8, 0 + 3 * 8, 1 + 3 * 8, 1 + 4 * 8,
00140 1 + 5 * 8, 3 + 1 * 8, 2 + 5 * 8, 4 + 1 * 8,
00141 3 + 5 * 8, 5 + 1 * 8, 4 + 5 * 8, 6 + 1 * 8,
00142 5 + 6 * 8, 7 + 1 * 8, 6 + 7 * 8, 7 + 5 * 8,
00143 0 + 2 * 8, 0 + 4 * 8, 0 + 5 * 8, 2 + 1 * 8,
00144 1 + 6 * 8, 4 + 0 * 8, 2 + 6 * 8, 5 + 0 * 8,
00145 3 + 6 * 8, 6 + 0 * 8, 4 + 6 * 8, 6 + 2 * 8,
00146 5 + 7 * 8, 6 + 4 * 8, 7 + 2 * 8, 7 + 6 * 8,
00147 1 + 0 * 8, 1 + 2 * 8, 0 + 6 * 8, 3 + 0 * 8,
00148 1 + 7 * 8, 3 + 2 * 8, 2 + 7 * 8, 4 + 2 * 8,
00149 3 + 7 * 8, 5 + 2 * 8, 4 + 7 * 8, 5 + 4 * 8,
00150 6 + 3 * 8, 6 + 5 * 8, 7 + 3 * 8, 7 + 7 * 8,
00151 };
00152
00153 typedef struct IMbInfo {
00154 uint16_t type;
00155 uint8_t pred_mode;
00156 uint8_t cbp;
00157 } IMbInfo;
00158
00159 static const IMbInfo i_mb_type_info[26] = {
00160 { MB_TYPE_INTRA4x4, -1, -1 },
00161 { MB_TYPE_INTRA16x16, 2, 0 },
00162 { MB_TYPE_INTRA16x16, 1, 0 },
00163 { MB_TYPE_INTRA16x16, 0, 0 },
00164 { MB_TYPE_INTRA16x16, 3, 0 },
00165 { MB_TYPE_INTRA16x16, 2, 16 },
00166 { MB_TYPE_INTRA16x16, 1, 16 },
00167 { MB_TYPE_INTRA16x16, 0, 16 },
00168 { MB_TYPE_INTRA16x16, 3, 16 },
00169 { MB_TYPE_INTRA16x16, 2, 32 },
00170 { MB_TYPE_INTRA16x16, 1, 32 },
00171 { MB_TYPE_INTRA16x16, 0, 32 },
00172 { MB_TYPE_INTRA16x16, 3, 32 },
00173 { MB_TYPE_INTRA16x16, 2, 15 + 0 },
00174 { MB_TYPE_INTRA16x16, 1, 15 + 0 },
00175 { MB_TYPE_INTRA16x16, 0, 15 + 0 },
00176 { MB_TYPE_INTRA16x16, 3, 15 + 0 },
00177 { MB_TYPE_INTRA16x16, 2, 15 + 16 },
00178 { MB_TYPE_INTRA16x16, 1, 15 + 16 },
00179 { MB_TYPE_INTRA16x16, 0, 15 + 16 },
00180 { MB_TYPE_INTRA16x16, 3, 15 + 16 },
00181 { MB_TYPE_INTRA16x16, 2, 15 + 32 },
00182 { MB_TYPE_INTRA16x16, 1, 15 + 32 },
00183 { MB_TYPE_INTRA16x16, 0, 15 + 32 },
00184 { MB_TYPE_INTRA16x16, 3, 15 + 32 },
00185 { MB_TYPE_INTRA_PCM, -1, -1 },
00186 };
00187
00188 typedef struct PMbInfo {
00189 uint16_t type;
00190 uint8_t partition_count;
00191 } PMbInfo;
00192
00193 static const PMbInfo p_mb_type_info[5] = {
00194 { MB_TYPE_16x16 | MB_TYPE_P0L0, 1 },
00195 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 },
00196 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 },
00197 { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4 },
00198 { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_REF0, 4 },
00199 };
00200
00201 static const PMbInfo p_sub_mb_type_info[4] = {
00202 { MB_TYPE_16x16 | MB_TYPE_P0L0, 1 },
00203 { MB_TYPE_16x8 | MB_TYPE_P0L0, 2 },
00204 { MB_TYPE_8x16 | MB_TYPE_P0L0, 2 },
00205 { MB_TYPE_8x8 | MB_TYPE_P0L0, 4 },
00206 };
00207
00208 static const PMbInfo b_mb_type_info[23] = {
00209 { MB_TYPE_DIRECT2 | MB_TYPE_L0L1, 1, },
00210 { MB_TYPE_16x16 | MB_TYPE_P0L0, 1, },
00211 { MB_TYPE_16x16 | MB_TYPE_P0L1, 1, },
00212 { MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, },
00213 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
00214 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
00215 { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
00216 { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
00217 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, },
00218 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, },
00219 { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
00220 { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
00221 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
00222 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
00223 { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
00224 { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
00225 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
00226 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
00227 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
00228 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
00229 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
00230 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
00231 { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, },
00232 };
00233
00234 static const PMbInfo b_sub_mb_type_info[13] = {
00235 { MB_TYPE_DIRECT2, 1, },
00236 { MB_TYPE_16x16 | MB_TYPE_P0L0, 1, },
00237 { MB_TYPE_16x16 | MB_TYPE_P0L1, 1, },
00238 { MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, },
00239 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
00240 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
00241 { MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
00242 { MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
00243 { MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
00244 { MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
00245 { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4, },
00246 { MB_TYPE_8x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 4, },
00247 { MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, },
00248 };
00249
00250 static const uint8_t dequant4_coeff_init[6][3] = {
00251 { 10, 13, 16 },
00252 { 11, 14, 18 },
00253 { 13, 16, 20 },
00254 { 14, 18, 23 },
00255 { 16, 20, 25 },
00256 { 18, 23, 29 },
00257 };
00258
00259 static const uint8_t dequant8_coeff_init_scan[16] = {
00260 0, 3, 4, 3, 3, 1, 5, 1, 4, 5, 2, 5, 3, 1, 5, 1
00261 };
00262
00263 static const uint8_t dequant8_coeff_init[6][6] = {
00264 { 20, 18, 32, 19, 25, 24 },
00265 { 22, 19, 35, 21, 28, 26 },
00266 { 26, 23, 42, 24, 33, 31 },
00267 { 28, 25, 45, 26, 35, 33 },
00268 { 32, 28, 51, 30, 40, 38 },
00269 { 36, 32, 58, 34, 46, 43 },
00270 };
00271
00272 #endif