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