libavcodec/h264data.h
Go to the documentation of this file.
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 FFmpeg.
00006  *
00007  * FFmpeg 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  * FFmpeg 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 FFmpeg; 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,
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 // zigzag_scan8x8_cavlc[i] = zigzag_scan8x8[(i/4) + 16*(i%4)]
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 /* AVCODEC_H264DATA_H */