Libav 0.7.1
|
00001 /* 00002 * H26L/H264/AVC/JVT/14496-10/... encoder/decoder 00003 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> 00004 * 00005 * This file is part of Libav. 00006 * 00007 * Libav is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * Libav is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with Libav; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 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, //FIXME 00084 }; 00085 00086 // zigzag_scan8x8_cavlc[i] = zigzag_scan8x8[(i/4) + 16*(i%4)] 00087 static const uint8_t zigzag_scan8x8_cavlc[64]={ 00088 0+0*8, 1+1*8, 1+2*8, 2+2*8, 00089 4+1*8, 0+5*8, 3+3*8, 7+0*8, 00090 3+4*8, 1+7*8, 5+3*8, 6+3*8, 00091 2+7*8, 6+4*8, 5+6*8, 7+5*8, 00092 1+0*8, 2+0*8, 0+3*8, 3+1*8, 00093 3+2*8, 0+6*8, 4+2*8, 6+1*8, 00094 2+5*8, 2+6*8, 6+2*8, 5+4*8, 00095 3+7*8, 7+3*8, 4+7*8, 7+6*8, 00096 0+1*8, 3+0*8, 0+4*8, 4+0*8, 00097 2+3*8, 1+5*8, 5+1*8, 5+2*8, 00098 1+6*8, 3+5*8, 7+1*8, 4+5*8, 00099 4+6*8, 7+4*8, 5+7*8, 6+7*8, 00100 0+2*8, 2+1*8, 1+3*8, 5+0*8, 00101 1+4*8, 2+4*8, 6+0*8, 4+3*8, 00102 0+7*8, 4+4*8, 7+2*8, 3+6*8, 00103 5+5*8, 6+5*8, 6+6*8, 7+7*8, 00104 }; 00105 00106 static const uint8_t field_scan8x8[64]={ 00107 0+0*8, 0+1*8, 0+2*8, 1+0*8, 00108 1+1*8, 0+3*8, 0+4*8, 1+2*8, 00109 2+0*8, 1+3*8, 0+5*8, 0+6*8, 00110 0+7*8, 1+4*8, 2+1*8, 3+0*8, 00111 2+2*8, 1+5*8, 1+6*8, 1+7*8, 00112 2+3*8, 3+1*8, 4+0*8, 3+2*8, 00113 2+4*8, 2+5*8, 2+6*8, 2+7*8, 00114 3+3*8, 4+1*8, 5+0*8, 4+2*8, 00115 3+4*8, 3+5*8, 3+6*8, 3+7*8, 00116 4+3*8, 5+1*8, 6+0*8, 5+2*8, 00117 4+4*8, 4+5*8, 4+6*8, 4+7*8, 00118 5+3*8, 6+1*8, 6+2*8, 5+4*8, 00119 5+5*8, 5+6*8, 5+7*8, 6+3*8, 00120 7+0*8, 7+1*8, 6+4*8, 6+5*8, 00121 6+6*8, 6+7*8, 7+2*8, 7+3*8, 00122 7+4*8, 7+5*8, 7+6*8, 7+7*8, 00123 }; 00124 00125 static const uint8_t field_scan8x8_cavlc[64]={ 00126 0+0*8, 1+1*8, 2+0*8, 0+7*8, 00127 2+2*8, 2+3*8, 2+4*8, 3+3*8, 00128 3+4*8, 4+3*8, 4+4*8, 5+3*8, 00129 5+5*8, 7+0*8, 6+6*8, 7+4*8, 00130 0+1*8, 0+3*8, 1+3*8, 1+4*8, 00131 1+5*8, 3+1*8, 2+5*8, 4+1*8, 00132 3+5*8, 5+1*8, 4+5*8, 6+1*8, 00133 5+6*8, 7+1*8, 6+7*8, 7+5*8, 00134 0+2*8, 0+4*8, 0+5*8, 2+1*8, 00135 1+6*8, 4+0*8, 2+6*8, 5+0*8, 00136 3+6*8, 6+0*8, 4+6*8, 6+2*8, 00137 5+7*8, 6+4*8, 7+2*8, 7+6*8, 00138 1+0*8, 1+2*8, 0+6*8, 3+0*8, 00139 1+7*8, 3+2*8, 2+7*8, 4+2*8, 00140 3+7*8, 5+2*8, 4+7*8, 5+4*8, 00141 6+3*8, 6+5*8, 7+3*8, 7+7*8, 00142 }; 00143 00144 typedef struct IMbInfo{ 00145 uint16_t type; 00146 uint8_t pred_mode; 00147 uint8_t cbp; 00148 } IMbInfo; 00149 00150 static const IMbInfo i_mb_type_info[26]={ 00151 {MB_TYPE_INTRA4x4 , -1, -1}, 00152 {MB_TYPE_INTRA16x16, 2, 0}, 00153 {MB_TYPE_INTRA16x16, 1, 0}, 00154 {MB_TYPE_INTRA16x16, 0, 0}, 00155 {MB_TYPE_INTRA16x16, 3, 0}, 00156 {MB_TYPE_INTRA16x16, 2, 16}, 00157 {MB_TYPE_INTRA16x16, 1, 16}, 00158 {MB_TYPE_INTRA16x16, 0, 16}, 00159 {MB_TYPE_INTRA16x16, 3, 16}, 00160 {MB_TYPE_INTRA16x16, 2, 32}, 00161 {MB_TYPE_INTRA16x16, 1, 32}, 00162 {MB_TYPE_INTRA16x16, 0, 32}, 00163 {MB_TYPE_INTRA16x16, 3, 32}, 00164 {MB_TYPE_INTRA16x16, 2, 15+0}, 00165 {MB_TYPE_INTRA16x16, 1, 15+0}, 00166 {MB_TYPE_INTRA16x16, 0, 15+0}, 00167 {MB_TYPE_INTRA16x16, 3, 15+0}, 00168 {MB_TYPE_INTRA16x16, 2, 15+16}, 00169 {MB_TYPE_INTRA16x16, 1, 15+16}, 00170 {MB_TYPE_INTRA16x16, 0, 15+16}, 00171 {MB_TYPE_INTRA16x16, 3, 15+16}, 00172 {MB_TYPE_INTRA16x16, 2, 15+32}, 00173 {MB_TYPE_INTRA16x16, 1, 15+32}, 00174 {MB_TYPE_INTRA16x16, 0, 15+32}, 00175 {MB_TYPE_INTRA16x16, 3, 15+32}, 00176 {MB_TYPE_INTRA_PCM , -1, -1}, 00177 }; 00178 00179 typedef struct PMbInfo{ 00180 uint16_t type; 00181 uint8_t partition_count; 00182 } PMbInfo; 00183 00184 static const PMbInfo p_mb_type_info[5]={ 00185 {MB_TYPE_16x16|MB_TYPE_P0L0 , 1}, 00186 {MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P1L0, 2}, 00187 {MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P1L0, 2}, 00188 {MB_TYPE_8x8 |MB_TYPE_P0L0|MB_TYPE_P1L0, 4}, 00189 {MB_TYPE_8x8 |MB_TYPE_P0L0|MB_TYPE_P1L0|MB_TYPE_REF0, 4}, 00190 }; 00191 00192 static const PMbInfo p_sub_mb_type_info[4]={ 00193 {MB_TYPE_16x16|MB_TYPE_P0L0 , 1}, 00194 {MB_TYPE_16x8 |MB_TYPE_P0L0 , 2}, 00195 {MB_TYPE_8x16 |MB_TYPE_P0L0 , 2}, 00196 {MB_TYPE_8x8 |MB_TYPE_P0L0 , 4}, 00197 }; 00198 00199 static const PMbInfo b_mb_type_info[23]={ 00200 {MB_TYPE_DIRECT2|MB_TYPE_L0L1 , 1, }, 00201 {MB_TYPE_16x16|MB_TYPE_P0L0 , 1, }, 00202 {MB_TYPE_16x16 |MB_TYPE_P0L1 , 1, }, 00203 {MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1 , 1, }, 00204 {MB_TYPE_16x8 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 2, }, 00205 {MB_TYPE_8x16 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 2, }, 00206 {MB_TYPE_16x8 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, }, 00207 {MB_TYPE_8x16 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, }, 00208 {MB_TYPE_16x8 |MB_TYPE_P0L0 |MB_TYPE_P1L1, 2, }, 00209 {MB_TYPE_8x16 |MB_TYPE_P0L0 |MB_TYPE_P1L1, 2, }, 00210 {MB_TYPE_16x8 |MB_TYPE_P0L1|MB_TYPE_P1L0 , 2, }, 00211 {MB_TYPE_8x16 |MB_TYPE_P0L1|MB_TYPE_P1L0 , 2, }, 00212 {MB_TYPE_16x8 |MB_TYPE_P0L0 |MB_TYPE_P1L0|MB_TYPE_P1L1, 2, }, 00213 {MB_TYPE_8x16 |MB_TYPE_P0L0 |MB_TYPE_P1L0|MB_TYPE_P1L1, 2, }, 00214 {MB_TYPE_16x8 |MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, }, 00215 {MB_TYPE_8x16 |MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, }, 00216 {MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0 , 2, }, 00217 {MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0 , 2, }, 00218 {MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, }, 00219 {MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, }, 00220 {MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, }, 00221 {MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, }, 00222 {MB_TYPE_8x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 4, }, 00223 }; 00224 00225 static const PMbInfo b_sub_mb_type_info[13]={ 00226 {MB_TYPE_DIRECT2 , 1, }, 00227 {MB_TYPE_16x16|MB_TYPE_P0L0 , 1, }, 00228 {MB_TYPE_16x16 |MB_TYPE_P0L1 , 1, }, 00229 {MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1 , 1, }, 00230 {MB_TYPE_16x8 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 2, }, 00231 {MB_TYPE_8x16 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 2, }, 00232 {MB_TYPE_16x8 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, }, 00233 {MB_TYPE_8x16 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 2, }, 00234 {MB_TYPE_16x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, }, 00235 {MB_TYPE_8x16 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 2, }, 00236 {MB_TYPE_8x8 |MB_TYPE_P0L0 |MB_TYPE_P1L0 , 4, }, 00237 {MB_TYPE_8x8 |MB_TYPE_P0L1 |MB_TYPE_P1L1, 4, }, 00238 {MB_TYPE_8x8 |MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_P1L0|MB_TYPE_P1L1, 4, }, 00239 }; 00240 00241 static const uint8_t dequant4_coeff_init[6][3]={ 00242 {10,13,16}, 00243 {11,14,18}, 00244 {13,16,20}, 00245 {14,18,23}, 00246 {16,20,25}, 00247 {18,23,29}, 00248 }; 00249 00250 static const uint8_t dequant8_coeff_init_scan[16] = { 00251 0,3,4,3, 3,1,5,1, 4,5,2,5, 3,1,5,1 00252 }; 00253 static const uint8_t dequant8_coeff_init[6][6]={ 00254 {20,18,32,19,25,24}, 00255 {22,19,35,21,28,26}, 00256 {26,23,42,24,33,31}, 00257 {28,25,45,26,35,33}, 00258 {32,28,51,30,40,38}, 00259 {36,32,58,34,46,43}, 00260 }; 00261 00262 #endif /* AVCODEC_H264DATA_H */