libavcodec/h264_cabac.c
Go to the documentation of this file.
00001 /*
00002  * H.26L/H.264/AVC/JVT/14496-10/... cabac decoding
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 
00028 #define CABAC 1
00029 #define UNCHECKED_BITSTREAM_READER 1
00030 
00031 #include "config.h"
00032 #include "cabac.h"
00033 #include "cabac_functions.h"
00034 #include "internal.h"
00035 #include "dsputil.h"
00036 #include "avcodec.h"
00037 #include "h264.h"
00038 #include "h264data.h"
00039 #include "h264_mvpred.h"
00040 #include "golomb.h"
00041 
00042 #if ARCH_X86
00043 #include "x86/h264_i386.h"
00044 #endif
00045 
00046 //#undef NDEBUG
00047 #include <assert.h>
00048 
00049 /* Cabac pre state table */
00050 
00051 static const int8_t cabac_context_init_I[1024][2] =
00052 {
00053     /* 0 - 10 */
00054     { 20, -15 }, {  2, 54 },  {  3,  74 }, { 20, -15 },
00055     {  2,  54 }, {  3, 74 },  { -28,127 }, { -23, 104 },
00056     { -6,  53 }, { -1, 54 },  {  7,  51 },
00057 
00058     /* 11 - 23 unsused for I */
00059     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00060     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00061     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00062     { 0, 0 },
00063 
00064     /* 24- 39 */
00065     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00066     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00067     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00068     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00069 
00070     /* 40 - 53 */
00071     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00072     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00073     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00074     { 0, 0 },    { 0, 0 },
00075 
00076     /* 54 - 59 */
00077     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
00078     { 0, 0 },    { 0, 0 },
00079 
00080     /* 60 - 69 */
00081     { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
00082     { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
00083     { 13, 41 },  { 3, 62 },
00084 
00085     /* 70 -> 87 */
00086     { 0, 11 },   { 1, 55 },   { 0, 69 },     { -17, 127 },
00087     { -13, 102 },{ 0, 82 },   { -7, 74 },    { -21, 107 },
00088     { -27, 127 },{ -31, 127 },{ -24, 127 },  { -18, 95 },
00089     { -27, 127 },{ -21, 114 },{ -30, 127 },  { -17, 123 },
00090     { -12, 115 },{ -16, 122 },
00091 
00092     /* 88 -> 104 */
00093     { -11, 115 },{ -12, 63 }, { -2, 68 },    { -15, 84 },
00094     { -13, 104 },{ -3, 70 },  { -8, 93 },    { -10, 90 },
00095     { -30, 127 },{ -1, 74 },  { -6, 97 },    { -7, 91 },
00096     { -20, 127 },{ -4, 56 },  { -5, 82 },    { -7, 76 },
00097     { -22, 125 },
00098 
00099     /* 105 -> 135 */
00100     { -7, 93 },  { -11, 87 }, { -3, 77 },    { -5, 71 },
00101     { -4, 63 },  { -4, 68 },  { -12, 84 },   { -7, 62 },
00102     { -7, 65 },  { 8, 61 },   { 5, 56 },     { -2, 66 },
00103     { 1, 64 },   { 0, 61 },   { -2, 78 },    { 1, 50 },
00104     { 7, 52 },   { 10, 35 },  { 0, 44 },     { 11, 38 },
00105     { 1, 45 },   { 0, 46 },   { 5, 44 },     { 31, 17 },
00106     { 1, 51 },   { 7, 50 },   { 28, 19 },    { 16, 33 },
00107     { 14, 62 },  { -13, 108 },{ -15, 100 },
00108 
00109     /* 136 -> 165 */
00110     { -13, 101 },{ -13, 91 }, { -12, 94 },   { -10, 88 },
00111     { -16, 84 }, { -10, 86 }, { -7, 83 },    { -13, 87 },
00112     { -19, 94 }, { 1, 70 },   { 0, 72 },     { -5, 74 },
00113     { 18, 59 },  { -8, 102 }, { -15, 100 },  { 0, 95 },
00114     { -4, 75 },  { 2, 72 },   { -11, 75 },   { -3, 71 },
00115     { 15, 46 },  { -13, 69 }, { 0, 62 },     { 0, 65 },
00116     { 21, 37 },  { -15, 72 }, { 9, 57 },     { 16, 54 },
00117     { 0, 62 },   { 12, 72 },
00118 
00119     /* 166 -> 196 */
00120     { 24, 0 },   { 15, 9 },   { 8, 25 },     { 13, 18 },
00121     { 15, 9 },   { 13, 19 },  { 10, 37 },    { 12, 18 },
00122     { 6, 29 },   { 20, 33 },  { 15, 30 },    { 4, 45 },
00123     { 1, 58 },   { 0, 62 },   { 7, 61 },     { 12, 38 },
00124     { 11, 45 },  { 15, 39 },  { 11, 42 },    { 13, 44 },
00125     { 16, 45 },  { 12, 41 },  { 10, 49 },    { 30, 34 },
00126     { 18, 42 },  { 10, 55 },  { 17, 51 },    { 17, 46 },
00127     { 0, 89 },   { 26, -19 }, { 22, -17 },
00128 
00129     /* 197 -> 226 */
00130     { 26, -17 }, { 30, -25 }, { 28, -20 },   { 33, -23 },
00131     { 37, -27 }, { 33, -23 }, { 40, -28 },   { 38, -17 },
00132     { 33, -11 }, { 40, -15 }, { 41, -6 },    { 38, 1 },
00133     { 41, 17 },  { 30, -6 },  { 27, 3 },     { 26, 22 },
00134     { 37, -16 }, { 35, -4 },  { 38, -8 },    { 38, -3 },
00135     { 37, 3 },   { 38, 5 },   { 42, 0 },     { 35, 16 },
00136     { 39, 22 },  { 14, 48 },  { 27, 37 },    { 21, 60 },
00137     { 12, 68 },  { 2, 97 },
00138 
00139     /* 227 -> 251 */
00140     { -3, 71 },  { -6, 42 },  { -5, 50 },    { -3, 54 },
00141     { -2, 62 },  { 0, 58 },   { 1, 63 },     { -2, 72 },
00142     { -1, 74 },  { -9, 91 },  { -5, 67 },    { -5, 27 },
00143     { -3, 39 },  { -2, 44 },  { 0, 46 },     { -16, 64 },
00144     { -8, 68 },  { -10, 78 }, { -6, 77 },    { -10, 86 },
00145     { -12, 92 }, { -15, 55 }, { -10, 60 },   { -6, 62 },
00146     { -4, 65 },
00147 
00148     /* 252 -> 275 */
00149     { -12, 73 }, { -8, 76 },  { -7, 80 },    { -9, 88 },
00150     { -17, 110 },{ -11, 97 }, { -20, 84 },   { -11, 79 },
00151     { -6, 73 },  { -4, 74 },  { -13, 86 },   { -13, 96 },
00152     { -11, 97 }, { -19, 117 },{ -8, 78 },    { -5, 33 },
00153     { -4, 48 },  { -2, 53 },  { -3, 62 },    { -13, 71 },
00154     { -10, 79 }, { -12, 86 }, { -13, 90 },   { -14, 97 },
00155 
00156     /* 276 a bit special (not used, bypass is used instead) */
00157     { 0, 0 },
00158 
00159     /* 277 -> 307 */
00160     { -6, 93 },  { -6, 84 },  { -8, 79 },    { 0, 66 },
00161     { -1, 71 },  { 0, 62 },   { -2, 60 },    { -2, 59 },
00162     { -5, 75 },  { -3, 62 },  { -4, 58 },    { -9, 66 },
00163     { -1, 79 },  { 0, 71 },   { 3, 68 },     { 10, 44 },
00164     { -7, 62 },  { 15, 36 },  { 14, 40 },    { 16, 27 },
00165     { 12, 29 },  { 1, 44 },   { 20, 36 },    { 18, 32 },
00166     { 5, 42 },   { 1, 48 },   { 10, 62 },    { 17, 46 },
00167     { 9, 64 },   { -12, 104 },{ -11, 97 },
00168 
00169     /* 308 -> 337 */
00170     { -16, 96 }, { -7, 88 },  { -8, 85 },    { -7, 85 },
00171     { -9, 85 },  { -13, 88 }, { 4, 66 },     { -3, 77 },
00172     { -3, 76 },  { -6, 76 },  { 10, 58 },    { -1, 76 },
00173     { -1, 83 },  { -7, 99 },  { -14, 95 },   { 2, 95 },
00174     { 0, 76 },   { -5, 74 },  { 0, 70 },     { -11, 75 },
00175     { 1, 68 },   { 0, 65 },   { -14, 73 },   { 3, 62 },
00176     { 4, 62 },   { -1, 68 },  { -13, 75 },   { 11, 55 },
00177     { 5, 64 },   { 12, 70 },
00178 
00179     /* 338 -> 368 */
00180     { 15, 6 },   { 6, 19 },   { 7, 16 },     { 12, 14 },
00181     { 18, 13 },  { 13, 11 },  { 13, 15 },    { 15, 16 },
00182     { 12, 23 },  { 13, 23 },  { 15, 20 },    { 14, 26 },
00183     { 14, 44 },  { 17, 40 },  { 17, 47 },    { 24, 17 },
00184     { 21, 21 },  { 25, 22 },  { 31, 27 },    { 22, 29 },
00185     { 19, 35 },  { 14, 50 },  { 10, 57 },    { 7, 63 },
00186     { -2, 77 },  { -4, 82 },  { -3, 94 },    { 9, 69 },
00187     { -12, 109 },{ 36, -35 }, { 36, -34 },
00188 
00189     /* 369 -> 398 */
00190     { 32, -26 }, { 37, -30 }, { 44, -32 },   { 34, -18 },
00191     { 34, -15 }, { 40, -15 }, { 33, -7 },    { 35, -5 },
00192     { 33, 0 },   { 38, 2 },   { 33, 13 },    { 23, 35 },
00193     { 13, 58 },  { 29, -3 },  { 26, 0 },     { 22, 30 },
00194     { 31, -7 },  { 35, -15 }, { 34, -3 },    { 34, 3 },
00195     { 36, -1 },  { 34, 5 },   { 32, 11 },    { 35, 5 },
00196     { 34, 12 },  { 39, 11 },  { 30, 29 },    { 34, 26 },
00197     { 29, 39 },  { 19, 66 },
00198 
00199     /* 399 -> 435 */
00200     {  31,  21 }, {  31,  31 }, {  25,  50 },
00201     { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11,  85 },
00202     { -15,  92 }, { -14,  89 }, { -26,  71 }, { -15,  81 },
00203     { -14,  80 }, {   0,  68 }, { -14,  70 }, { -24,  56 },
00204     { -23,  68 }, { -24,  50 }, { -11,  74 }, {  23, -13 },
00205     {  26, -13 }, {  40, -15 }, {  49, -14 }, {  44,   3 },
00206     {  45,   6 }, {  44,  34 }, {  33,  54 }, {  19,  82 },
00207     {  -3,  75 }, {  -1,  23 }, {   1,  34 }, {   1,  43 },
00208     {   0,  54 }, {  -2,  55 }, {   0,  61 }, {   1,  64 },
00209     {   0,  68 }, {  -9,  92 },
00210 
00211     /* 436 -> 459 */
00212     { -14, 106 }, { -13,  97 }, { -15,  90 }, { -12,  90 },
00213     { -18,  88 }, { -10,  73 }, {  -9,  79 }, { -14,  86 },
00214     { -10,  73 }, { -10,  70 }, { -10,  69 }, {  -5,  66 },
00215     {  -9,  64 }, {  -5,  58 }, {   2,  59 }, {  21, -10 },
00216     {  24, -11 }, {  28,  -8 }, {  28,  -1 }, {  29,   3 },
00217     {  29,   9 }, {  35,  20 }, {  29,  36 }, {  14,  67 },
00218 
00219     /* 460 -> 1024 */
00220     { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
00221     { -12,  63 }, {  -2,  68 }, { -15,  84 }, { -13, 104 },
00222     {  -3,  70 }, {  -8,  93 }, { -10,  90 }, { -30, 127 },
00223     { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
00224     { -12,  63 }, {  -2,  68 }, { -15,  84 }, { -13, 104 },
00225     {  -3,  70 }, {  -8,  93 }, { -10,  90 }, { -30, 127 },
00226     {  -7,  93 }, { -11,  87 }, {  -3,  77 }, {  -5,  71 },
00227     {  -4,  63 }, {  -4,  68 }, { -12,  84 }, {  -7,  62 },
00228     {  -7,  65 }, {   8,  61 }, {   5,  56 }, {  -2,  66 },
00229     {   1,  64 }, {   0,  61 }, {  -2,  78 }, {   1,  50 },
00230     {   7,  52 }, {  10,  35 }, {   0,  44 }, {  11,  38 },
00231     {   1,  45 }, {   0,  46 }, {   5,  44 }, {  31,  17 },
00232     {   1,  51 }, {   7,  50 }, {  28,  19 }, {  16,  33 },
00233     {  14,  62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
00234     { -13,  91 }, { -12,  94 }, { -10,  88 }, { -16,  84 },
00235     { -10,  86 }, {  -7,  83 }, { -13,  87 }, { -19,  94 },
00236     {   1,  70 }, {   0,  72 }, {  -5,  74 }, {  18,  59 },
00237     {  -7,  93 }, { -11,  87 }, {  -3,  77 }, {  -5,  71 },
00238     {  -4,  63 }, {  -4,  68 }, { -12,  84 }, {  -7,  62 },
00239     {  -7,  65 }, {   8,  61 }, {   5,  56 }, {  -2,  66 },
00240     {   1,  64 }, {   0,  61 }, {  -2,  78 }, {   1,  50 },
00241     {   7,  52 }, {  10,  35 }, {   0,  44 }, {  11,  38 },
00242     {   1,  45 }, {   0,  46 }, {   5,  44 }, {  31,  17 },
00243     {   1,  51 }, {   7,  50 }, {  28,  19 }, {  16,  33 },
00244     {  14,  62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
00245     { -13,  91 }, { -12,  94 }, { -10,  88 }, { -16,  84 },
00246     { -10,  86 }, {  -7,  83 }, { -13,  87 }, { -19,  94 },
00247     {   1,  70 }, {   0,  72 }, {  -5,  74 }, {  18,  59 },
00248     {  24,   0 }, {  15,   9 }, {   8,  25 }, {  13,  18 },
00249     {  15,   9 }, {  13,  19 }, {  10,  37 }, {  12,  18 },
00250     {   6,  29 }, {  20,  33 }, {  15,  30 }, {   4,  45 },
00251     {   1,  58 }, {   0,  62 }, {   7,  61 }, {  12,  38 },
00252     {  11,  45 }, {  15,  39 }, {  11,  42 }, {  13,  44 },
00253     {  16,  45 }, {  12,  41 }, {  10,  49 }, {  30,  34 },
00254     {  18,  42 }, {  10,  55 }, {  17,  51 }, {  17,  46 },
00255     {   0,  89 }, {  26, -19 }, {  22, -17 }, {  26, -17 },
00256     {  30, -25 }, {  28, -20 }, {  33, -23 }, {  37, -27 },
00257     {  33, -23 }, {  40, -28 }, {  38, -17 }, {  33, -11 },
00258     {  40, -15 }, {  41,  -6 }, {  38,   1 }, {  41,  17 },
00259     {  24,   0 }, {  15,   9 }, {   8,  25 }, {  13,  18 },
00260     {  15,   9 }, {  13,  19 }, {  10,  37 }, {  12,  18 },
00261     {   6,  29 }, {  20,  33 }, {  15,  30 }, {   4,  45 },
00262     {   1,  58 }, {   0,  62 }, {   7,  61 }, {  12,  38 },
00263     {  11,  45 }, {  15,  39 }, {  11,  42 }, {  13,  44 },
00264     {  16,  45 }, {  12,  41 }, {  10,  49 }, {  30,  34 },
00265     {  18,  42 }, {  10,  55 }, {  17,  51 }, {  17,  46 },
00266     {   0,  89 }, {  26, -19 }, {  22, -17 }, {  26, -17 },
00267     {  30, -25 }, {  28, -20 }, {  33, -23 }, {  37, -27 },
00268     {  33, -23 }, {  40, -28 }, {  38, -17 }, {  33, -11 },
00269     {  40, -15 }, {  41,  -6 }, {  38,   1 }, {  41,  17 },
00270     { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11,  85 },
00271     { -15,  92 }, { -14,  89 }, { -26,  71 }, { -15,  81 },
00272     { -14,  80 }, {   0,  68 }, { -14,  70 }, { -24,  56 },
00273     { -23,  68 }, { -24,  50 }, { -11,  74 }, { -14, 106 },
00274     { -13,  97 }, { -15,  90 }, { -12,  90 }, { -18,  88 },
00275     { -10,  73 }, {  -9,  79 }, { -14,  86 }, { -10,  73 },
00276     { -10,  70 }, { -10,  69 }, {  -5,  66 }, {  -9,  64 },
00277     {  -5,  58 }, {   2,  59 }, {  23, -13 }, {  26, -13 },
00278     {  40, -15 }, {  49, -14 }, {  44,   3 }, {  45,   6 },
00279     {  44,  34 }, {  33,  54 }, {  19,  82 }, {  21, -10 },
00280     {  24, -11 }, {  28,  -8 }, {  28,  -1 }, {  29,   3 },
00281     {  29,   9 }, {  35,  20 }, {  29,  36 }, {  14,  67 },
00282     {  -3,  75 }, {  -1,  23 }, {   1,  34 }, {   1,  43 },
00283     {   0,  54 }, {  -2,  55 }, {   0,  61 }, {   1,  64 },
00284     {   0,  68 }, {  -9,  92 }, { -17, 120 }, { -20, 112 },
00285     { -18, 114 }, { -11,  85 }, { -15,  92 }, { -14,  89 },
00286     { -26,  71 }, { -15,  81 }, { -14,  80 }, {   0,  68 },
00287     { -14,  70 }, { -24,  56 }, { -23,  68 }, { -24,  50 },
00288     { -11,  74 }, { -14, 106 }, { -13,  97 }, { -15,  90 },
00289     { -12,  90 }, { -18,  88 }, { -10,  73 }, {  -9,  79 },
00290     { -14,  86 }, { -10,  73 }, { -10,  70 }, { -10,  69 },
00291     {  -5,  66 }, {  -9,  64 }, {  -5,  58 }, {   2,  59 },
00292     {  23, -13 }, {  26, -13 }, {  40, -15 }, {  49, -14 },
00293     {  44,   3 }, {  45,   6 }, {  44,  34 }, {  33,  54 },
00294     {  19,  82 }, {  21, -10 }, {  24, -11 }, {  28,  -8 },
00295     {  28,  -1 }, {  29,   3 }, {  29,   9 }, {  35,  20 },
00296     {  29,  36 }, {  14,  67 }, {  -3,  75 }, {  -1,  23 },
00297     {   1,  34 }, {   1,  43 }, {   0,  54 }, {  -2,  55 },
00298     {   0,  61 }, {   1,  64 }, {   0,  68 }, {  -9,  92 },
00299     {  -6,  93 }, {  -6,  84 }, {  -8,  79 }, {   0,  66 },
00300     {  -1,  71 }, {   0,  62 }, {  -2,  60 }, {  -2,  59 },
00301     {  -5,  75 }, {  -3,  62 }, {  -4,  58 }, {  -9,  66 },
00302     {  -1,  79 }, {   0,  71 }, {   3,  68 }, {  10,  44 },
00303     {  -7,  62 }, {  15,  36 }, {  14,  40 }, {  16,  27 },
00304     {  12,  29 }, {   1,  44 }, {  20,  36 }, {  18,  32 },
00305     {   5,  42 }, {   1,  48 }, {  10,  62 }, {  17,  46 },
00306     {   9,  64 }, { -12, 104 }, { -11,  97 }, { -16,  96 },
00307     {  -7,  88 }, {  -8,  85 }, {  -7,  85 }, {  -9,  85 },
00308     { -13,  88 }, {   4,  66 }, {  -3,  77 }, {  -3,  76 },
00309     {  -6,  76 }, {  10,  58 }, {  -1,  76 }, {  -1,  83 },
00310     {  -6,  93 }, {  -6,  84 }, {  -8,  79 }, {   0,  66 },
00311     {  -1,  71 }, {   0,  62 }, {  -2,  60 }, {  -2,  59 },
00312     {  -5,  75 }, {  -3,  62 }, {  -4,  58 }, {  -9,  66 },
00313     {  -1,  79 }, {   0,  71 }, {   3,  68 }, {  10,  44 },
00314     {  -7,  62 }, {  15,  36 }, {  14,  40 }, {  16,  27 },
00315     {  12,  29 }, {   1,  44 }, {  20,  36 }, {  18,  32 },
00316     {   5,  42 }, {   1,  48 }, {  10,  62 }, {  17,  46 },
00317     {   9,  64 }, { -12, 104 }, { -11,  97 }, { -16,  96 },
00318     {  -7,  88 }, {  -8,  85 }, {  -7,  85 }, {  -9,  85 },
00319     { -13,  88 }, {   4,  66 }, {  -3,  77 }, {  -3,  76 },
00320     {  -6,  76 }, {  10,  58 }, {  -1,  76 }, {  -1,  83 },
00321     {  15,   6 }, {   6,  19 }, {   7,  16 }, {  12,  14 },
00322     {  18,  13 }, {  13,  11 }, {  13,  15 }, {  15,  16 },
00323     {  12,  23 }, {  13,  23 }, {  15,  20 }, {  14,  26 },
00324     {  14,  44 }, {  17,  40 }, {  17,  47 }, {  24,  17 },
00325     {  21,  21 }, {  25,  22 }, {  31,  27 }, {  22,  29 },
00326     {  19,  35 }, {  14,  50 }, {  10,  57 }, {   7,  63 },
00327     {  -2,  77 }, {  -4,  82 }, {  -3,  94 }, {   9,  69 },
00328     { -12, 109 }, {  36, -35 }, {  36, -34 }, {  32, -26 },
00329     {  37, -30 }, {  44, -32 }, {  34, -18 }, {  34, -15 },
00330     {  40, -15 }, {  33,  -7 }, {  35,  -5 }, {  33,   0 },
00331     {  38,   2 }, {  33,  13 }, {  23,  35 }, {  13,  58 },
00332     {  15,   6 }, {   6,  19 }, {   7,  16 }, {  12,  14 },
00333     {  18,  13 }, {  13,  11 }, {  13,  15 }, {  15,  16 },
00334     {  12,  23 }, {  13,  23 }, {  15,  20 }, {  14,  26 },
00335     {  14,  44 }, {  17,  40 }, {  17,  47 }, {  24,  17 },
00336     {  21,  21 }, {  25,  22 }, {  31,  27 }, {  22,  29 },
00337     {  19,  35 }, {  14,  50 }, {  10,  57 }, {   7,  63 },
00338     {  -2,  77 }, {  -4,  82 }, {  -3,  94 }, {   9,  69 },
00339     { -12, 109 }, {  36, -35 }, {  36, -34 }, {  32, -26 },
00340     {  37, -30 }, {  44, -32 }, {  34, -18 }, {  34, -15 },
00341     {  40, -15 }, {  33,  -7 }, {  35,  -5 }, {  33,   0 },
00342     {  38,   2 }, {  33,  13 }, {  23,  35 }, {  13,  58 },
00343     {  -3,  71 }, {  -6,  42 }, {  -5,  50 }, {  -3,  54 },
00344     {  -2,  62 }, {   0,  58 }, {   1,  63 }, {  -2,  72 },
00345     {  -1,  74 }, {  -9,  91 }, {  -5,  67 }, {  -5,  27 },
00346     {  -3,  39 }, {  -2,  44 }, {   0,  46 }, { -16,  64 },
00347     {  -8,  68 }, { -10,  78 }, {  -6,  77 }, { -10,  86 },
00348     { -12,  92 }, { -15,  55 }, { -10,  60 }, {  -6,  62 },
00349     {  -4,  65 }, { -12,  73 }, {  -8,  76 }, {  -7,  80 },
00350     {  -9,  88 }, { -17, 110 }, {  -3,  71 }, {  -6,  42 },
00351     {  -5,  50 }, {  -3,  54 }, {  -2,  62 }, {   0,  58 },
00352     {   1,  63 }, {  -2,  72 }, {  -1,  74 }, {  -9,  91 },
00353     {  -5,  67 }, {  -5,  27 }, {  -3,  39 }, {  -2,  44 },
00354     {   0,  46 }, { -16,  64 }, {  -8,  68 }, { -10,  78 },
00355     {  -6,  77 }, { -10,  86 }, { -12,  92 }, { -15,  55 },
00356     { -10,  60 }, {  -6,  62 }, {  -4,  65 }, { -12,  73 },
00357     {  -8,  76 }, {  -7,  80 }, {  -9,  88 }, { -17, 110 },
00358     {  -3,  70 }, {  -8,  93 }, { -10,  90 }, { -30, 127 },
00359     {  -3,  70 }, {  -8,  93 }, { -10,  90 }, { -30, 127 },
00360     {  -3,  70 }, {  -8,  93 }, { -10,  90 }, { -30, 127 }
00361 };
00362 
00363 static const int8_t cabac_context_init_PB[3][1024][2] =
00364 {
00365     /* i_cabac_init_idc == 0 */
00366     {
00367         /* 0 - 10 */
00368         {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
00369         {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
00370         {  -6,  53 }, {  -1,  54 }, {   7,  51 },
00371 
00372         /* 11 - 23 */
00373         {  23,  33 }, {  23,   2 }, {  21,   0 }, {   1,   9 },
00374         {   0,  49 }, { -37, 118 }, {   5,  57 }, { -13,  78 },
00375         { -11,  65 }, {   1,  62 }, {  12,  49 }, {  -4,  73 },
00376         {  17,  50 },
00377 
00378         /* 24 - 39 */
00379         {  18,  64 }, {   9,  43 }, {  29,   0 }, {  26,  67 },
00380         {  16,  90 }, {   9, 104 }, { -46, 127 }, { -20, 104 },
00381         {   1,  67 }, { -13,  78 }, { -11,  65 }, {   1,  62 },
00382         {  -6,  86 }, { -17,  95 }, {  -6,  61 }, {   9,  45 },
00383 
00384         /* 40 - 53 */
00385         {  -3,  69 }, {  -6,  81 }, { -11,  96 }, {   6,  55 },
00386         {   7,  67 }, {  -5,  86 }, {   2,  88 }, {   0,  58 },
00387         {  -3,  76 }, { -10,  94 }, {   5,  54 }, {   4,  69 },
00388         {  -3,  81 }, {   0,  88 },
00389 
00390         /* 54 - 59 */
00391         {  -7,  67 }, {  -5,  74 }, {  -4,  74 }, {  -5,  80 },
00392         {  -7,  72 }, {   1,  58 },
00393 
00394         /* 60 - 69 */
00395         {   0,  41 }, {   0,  63 }, {   0,  63 }, { 0, 63 },
00396         {  -9,  83 }, {   4,  86 }, {   0,  97 }, { -7, 72 },
00397         {  13,  41 }, {   3,  62 },
00398 
00399         /* 70 - 87 */
00400         {   0,  45 }, {  -4,  78 }, {  -3,  96 }, { -27,  126 },
00401         { -28,  98 }, { -25, 101 }, { -23,  67 }, { -28,  82 },
00402         { -20,  94 }, { -16,  83 }, { -22, 110 }, { -21,  91 },
00403         { -18, 102 }, { -13,  93 }, { -29, 127 }, {  -7,  92 },
00404         {  -5,  89 }, {  -7,  96 }, { -13, 108 }, {  -3,  46 },
00405         {  -1,  65 }, {  -1,  57 }, {  -9,  93 }, {  -3,  74 },
00406         {  -9,  92 }, {  -8,  87 }, { -23, 126 }, {   5,  54 },
00407         {   6,  60 }, {   6,  59 }, {   6,  69 }, {  -1,  48 },
00408         {   0,  68 }, {  -4,  69 }, {  -8,  88 },
00409 
00410         /* 105 -> 165 */
00411         {  -2,  85 }, {  -6,  78 }, {  -1,  75 }, {  -7,  77 },
00412         {   2,  54 }, {   5,  50 }, {  -3,  68 }, {   1,  50 },
00413         {   6,  42 }, {  -4,  81 }, {   1,  63 }, {  -4,  70 },
00414         {   0,  67 }, {   2,  57 }, {  -2,  76 }, {  11,  35 },
00415         {   4,  64 }, {   1,  61 }, {  11,  35 }, {  18,  25 },
00416         {  12,  24 }, {  13,  29 }, {  13,  36 }, { -10,  93 },
00417         {  -7,  73 }, {  -2,  73 }, {  13,  46 }, {   9,  49 },
00418         {  -7, 100 }, {   9,  53 }, {   2,  53 }, {   5,  53 },
00419         {  -2,  61 }, {   0,  56 }, {   0,  56 }, { -13,  63 },
00420         {  -5,  60 }, {  -1,  62 }, {   4,  57 }, {  -6,  69 },
00421         {   4,  57 }, {  14,  39 }, {   4,  51 }, {  13,  68 },
00422         {   3,  64 }, {   1,  61 }, {   9,  63 }, {   7,  50 },
00423         {  16,  39 }, {   5,  44 }, {   4,  52 }, {  11,  48 },
00424         {  -5,  60 }, {  -1,  59 }, {   0,  59 }, {  22,  33 },
00425         {   5,  44 }, {  14,  43 }, {  -1,  78 }, {   0,  60 },
00426         {   9,  69 },
00427 
00428         /* 166 - 226 */
00429         {  11,  28 }, {   2,  40 }, {   3,  44 }, {   0,  49 },
00430         {   0,  46 }, {   2,  44 }, {   2,  51 }, {   0,  47 },
00431         {   4,  39 }, {   2,  62 }, {   6,  46 }, {   0,  54 },
00432         {   3,  54 }, {   2,  58 }, {   4,  63 }, {   6,  51 },
00433         {   6,  57 }, {   7,  53 }, {   6,  52 }, {   6,  55 },
00434         {  11,  45 }, {  14,  36 }, {   8,  53 }, {  -1,  82 },
00435         {   7,  55 }, {  -3,  78 }, {  15,  46 }, {  22,  31 },
00436         {  -1,  84 }, {  25,   7 }, {  30,  -7 }, {  28,   3 },
00437         {  28,   4 }, {  32,   0 }, {  34,  -1 }, {  30,   6 },
00438         {  30,   6 }, {  32,   9 }, {  31,  19 }, {  26,  27 },
00439         {  26,  30 }, {  37,  20 }, {  28,  34 }, {  17,  70 },
00440         {   1,  67 }, {   5,  59 }, {   9,  67 }, {  16,  30 },
00441         {  18,  32 }, {  18,  35 }, {  22,  29 }, {  24,  31 },
00442         {  23,  38 }, {  18,  43 }, {  20,  41 }, {  11,  63 },
00443         {   9,  59 }, {   9,  64 }, {  -1,  94 }, {  -2,  89 },
00444         {  -9, 108 },
00445 
00446         /* 227 - 275 */
00447         {  -6,  76 }, {  -2,  44 }, {   0,  45 }, {   0,  52 },
00448         {  -3,  64 }, {  -2,  59 }, {  -4,  70 }, {  -4,  75 },
00449         {  -8,  82 }, { -17, 102 }, {  -9,  77 }, {   3,  24 },
00450         {   0,  42 }, {   0,  48 }, {   0,  55 }, {  -6,  59 },
00451         {  -7,  71 }, { -12,  83 }, { -11,  87 }, { -30, 119 },
00452         {   1,  58 }, {  -3,  29 }, {  -1,  36 }, {   1,  38 },
00453         {   2,  43 }, {  -6,  55 }, {   0,  58 }, {   0,  64 },
00454         {  -3,  74 }, { -10,  90 }, {   0,  70 }, {  -4,  29 },
00455         {   5,  31 }, {   7,  42 }, {   1,  59 }, {  -2,  58 },
00456         {  -3,  72 }, {  -3,  81 }, { -11,  97 }, {   0,  58 },
00457         {   8,   5 }, {  10,  14 }, {  14,  18 }, {  13,  27 },
00458         {   2,  40 }, {   0,  58 }, {  -3,  70 }, {  -6,  79 },
00459         {  -8,  85 },
00460 
00461         /* 276 a bit special (not used, bypass is used instead) */
00462         { 0, 0 },
00463 
00464         /* 277 - 337 */
00465         { -13, 106 }, { -16, 106 }, { -10,  87 }, { -21, 114 },
00466         { -18, 110 }, { -14,  98 }, { -22, 110 }, { -21, 106 },
00467         { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
00468         { -10,  96 }, { -12,  95 }, {  -5,  91 }, {  -9,  93 },
00469         { -22,  94 }, {  -5,  86 }, {   9,  67 }, {  -4,  80 },
00470         { -10,  85 }, {  -1,  70 }, {   7,  60 }, {   9,  58 },
00471         {   5,  61 }, {  12,  50 }, {  15,  50 }, {  18,  49 },
00472         {  17,  54 }, {  10,  41 }, {   7,  46 }, {  -1,  51 },
00473         {   7,  49 }, {   8,  52 }, {   9,  41 }, {   6,  47 },
00474         {   2,  55 }, {  13,  41 }, {  10,  44 }, {   6,  50 },
00475         {   5,  53 }, {  13,  49 }, {   4,  63 }, {   6,  64 },
00476         {  -2,  69 }, {  -2,  59 }, {   6,  70 }, {  10,  44 },
00477         {   9,  31 }, {  12,  43 }, {   3,  53 }, {  14,  34 },
00478         {  10,  38 }, {  -3,  52 }, {  13,  40 }, {  17,  32 },
00479         {   7,  44 }, {   7,  38 }, {  13,  50 }, {  10,  57 },
00480         {  26,  43 },
00481 
00482         /* 338 - 398 */
00483         {  14,  11 }, {  11,  14 }, {   9,  11 }, {  18,  11 },
00484         {  21,   9 }, {  23,  -2 }, {  32, -15 }, {  32, -15 },
00485         {  34, -21 }, {  39, -23 }, {  42, -33 }, {  41, -31 },
00486         {  46, -28 }, {  38, -12 }, {  21,  29 }, {  45, -24 },
00487         {  53, -45 }, {  48, -26 }, {  65, -43 }, {  43, -19 },
00488         {  39, -10 }, {  30,   9 }, {  18,  26 }, {  20,  27 },
00489         {   0,  57 }, { -14,  82 }, {  -5,  75 }, { -19,  97 },
00490         { -35, 125 }, {  27,   0 }, {  28,   0 }, {  31,  -4 },
00491         {  27,   6 }, {  34,   8 }, {  30,  10 }, {  24,  22 },
00492         {  33,  19 }, {  22,  32 }, {  26,  31 }, {  21,  41 },
00493         {  26,  44 }, {  23,  47 }, {  16,  65 }, {  14,  71 },
00494         {   8,  60 }, {   6,  63 }, {  17,  65 }, {  21,  24 },
00495         {  23,  20 }, {  26,  23 }, {  27,  32 }, {  28,  23 },
00496         {  28,  24 }, {  23,  40 }, {  24,  32 }, {  28,  29 },
00497         {  23,  42 }, {  19,  57 }, {  22,  53 }, {  22,  61 },
00498         {  11,  86 },
00499 
00500         /* 399 - 435 */
00501         {  12,  40 }, {  11,  51 }, {  14,  59 },
00502         {  -4,  79 }, {  -7,  71 }, {  -5,  69 }, {  -9,  70 },
00503         {  -8,  66 }, { -10,  68 }, { -19,  73 }, { -12,  69 },
00504         { -16,  70 }, { -15,  67 }, { -20,  62 }, { -19,  70 },
00505         { -16,  66 }, { -22,  65 }, { -20,  63 }, {   9,  -2 },
00506         {  26,  -9 }, {  33,  -9 }, {  39,  -7 }, {  41,  -2 },
00507         {  45,   3 }, {  49,   9 }, {  45,  27 }, {  36,  59 },
00508         {  -6,  66 }, {  -7,  35 }, {  -7,  42 }, {  -8,  45 },
00509         {  -5,  48 }, { -12,  56 }, {  -6,  60 }, {  -5,  62 },
00510         {  -8,  66 }, {  -8,  76 },
00511 
00512         /* 436 - 459 */
00513         {  -5,  85 }, {  -6,  81 }, { -10,  77 }, {  -7,  81 },
00514         { -17,  80 }, { -18,  73 }, {  -4,  74 }, { -10,  83 },
00515         {  -9,  71 }, {  -9,  67 }, {  -1,  61 }, {  -8,  66 },
00516         { -14,  66 }, {   0,  59 }, {   2,  59 }, {  21, -13 },
00517         {  33, -14 }, {  39,  -7 }, {  46,  -2 }, {  51,   2 },
00518         {  60,   6 }, {  61,  17 }, {  55,  34 }, {  42,  62 },
00519 
00520         /* 460 - 1024 */
00521         {  -7,  92 }, {  -5,  89 }, {  -7,  96 }, { -13, 108 },
00522         {  -3,  46 }, {  -1,  65 }, {  -1,  57 }, {  -9,  93 },
00523         {  -3,  74 }, {  -9,  92 }, {  -8,  87 }, { -23, 126 },
00524         {  -7,  92 }, {  -5,  89 }, {  -7,  96 }, { -13, 108 },
00525         {  -3,  46 }, {  -1,  65 }, {  -1,  57 }, {  -9,  93 },
00526         {  -3,  74 }, {  -9,  92 }, {  -8,  87 }, { -23, 126 },
00527         {  -2,  85 }, {  -6,  78 }, {  -1,  75 }, {  -7,  77 },
00528         {   2,  54 }, {   5,  50 }, {  -3,  68 }, {   1,  50 },
00529         {   6,  42 }, {  -4,  81 }, {   1,  63 }, {  -4,  70 },
00530         {   0,  67 }, {   2,  57 }, {  -2,  76 }, {  11,  35 },
00531         {   4,  64 }, {   1,  61 }, {  11,  35 }, {  18,  25 },
00532         {  12,  24 }, {  13,  29 }, {  13,  36 }, { -10,  93 },
00533         {  -7,  73 }, {  -2,  73 }, {  13,  46 }, {   9,  49 },
00534         {  -7, 100 }, {   9,  53 }, {   2,  53 }, {   5,  53 },
00535         {  -2,  61 }, {   0,  56 }, {   0,  56 }, { -13,  63 },
00536         {  -5,  60 }, {  -1,  62 }, {   4,  57 }, {  -6,  69 },
00537         {   4,  57 }, {  14,  39 }, {   4,  51 }, {  13,  68 },
00538         {  -2,  85 }, {  -6,  78 }, {  -1,  75 }, {  -7,  77 },
00539         {   2,  54 }, {   5,  50 }, {  -3,  68 }, {   1,  50 },
00540         {   6,  42 }, {  -4,  81 }, {   1,  63 }, {  -4,  70 },
00541         {   0,  67 }, {   2,  57 }, {  -2,  76 }, {  11,  35 },
00542         {   4,  64 }, {   1,  61 }, {  11,  35 }, {  18,  25 },
00543         {  12,  24 }, {  13,  29 }, {  13,  36 }, { -10,  93 },
00544         {  -7,  73 }, {  -2,  73 }, {  13,  46 }, {   9,  49 },
00545         {  -7, 100 }, {   9,  53 }, {   2,  53 }, {   5,  53 },
00546         {  -2,  61 }, {   0,  56 }, {   0,  56 }, { -13,  63 },
00547         {  -5,  60 }, {  -1,  62 }, {   4,  57 }, {  -6,  69 },
00548         {   4,  57 }, {  14,  39 }, {   4,  51 }, {  13,  68 },
00549         {  11,  28 }, {   2,  40 }, {   3,  44 }, {   0,  49 },
00550         {   0,  46 }, {   2,  44 }, {   2,  51 }, {   0,  47 },
00551         {   4,  39 }, {   2,  62 }, {   6,  46 }, {   0,  54 },
00552         {   3,  54 }, {   2,  58 }, {   4,  63 }, {   6,  51 },
00553         {   6,  57 }, {   7,  53 }, {   6,  52 }, {   6,  55 },
00554         {  11,  45 }, {  14,  36 }, {   8,  53 }, {  -1,  82 },
00555         {   7,  55 }, {  -3,  78 }, {  15,  46 }, {  22,  31 },
00556         {  -1,  84 }, {  25,   7 }, {  30,  -7 }, {  28,   3 },
00557         {  28,   4 }, {  32,   0 }, {  34,  -1 }, {  30,   6 },
00558         {  30,   6 }, {  32,   9 }, {  31,  19 }, {  26,  27 },
00559         {  26,  30 }, {  37,  20 }, {  28,  34 }, {  17,  70 },
00560         {  11,  28 }, {   2,  40 }, {   3,  44 }, {   0,  49 },
00561         {   0,  46 }, {   2,  44 }, {   2,  51 }, {   0,  47 },
00562         {   4,  39 }, {   2,  62 }, {   6,  46 }, {   0,  54 },
00563         {   3,  54 }, {   2,  58 }, {   4,  63 }, {   6,  51 },
00564         {   6,  57 }, {   7,  53 }, {   6,  52 }, {   6,  55 },
00565         {  11,  45 }, {  14,  36 }, {   8,  53 }, {  -1,  82 },
00566         {   7,  55 }, {  -3,  78 }, {  15,  46 }, {  22,  31 },
00567         {  -1,  84 }, {  25,   7 }, {  30,  -7 }, {  28,   3 },
00568         {  28,   4 }, {  32,   0 }, {  34,  -1 }, {  30,   6 },
00569         {  30,   6 }, {  32,   9 }, {  31,  19 }, {  26,  27 },
00570         {  26,  30 }, {  37,  20 }, {  28,  34 }, {  17,  70 },
00571         {  -4,  79 }, {  -7,  71 }, {  -5,  69 }, {  -9,  70 },
00572         {  -8,  66 }, { -10,  68 }, { -19,  73 }, { -12,  69 },
00573         { -16,  70 }, { -15,  67 }, { -20,  62 }, { -19,  70 },
00574         { -16,  66 }, { -22,  65 }, { -20,  63 }, {  -5,  85 },
00575         {  -6,  81 }, { -10,  77 }, {  -7,  81 }, { -17,  80 },
00576         { -18,  73 }, {  -4,  74 }, { -10,  83 }, {  -9,  71 },
00577         {  -9,  67 }, {  -1,  61 }, {  -8,  66 }, { -14,  66 },
00578         {   0,  59 }, {   2,  59 }, {   9,  -2 }, {  26,  -9 },
00579         {  33,  -9 }, {  39,  -7 }, {  41,  -2 }, {  45,   3 },
00580         {  49,   9 }, {  45,  27 }, {  36,  59 }, {  21, -13 },
00581         {  33, -14 }, {  39,  -7 }, {  46,  -2 }, {  51,   2 },
00582         {  60,   6 }, {  61,  17 }, {  55,  34 }, {  42,  62 },
00583         {  -6,  66 }, {  -7,  35 }, {  -7,  42 }, {  -8,  45 },
00584         {  -5,  48 }, { -12,  56 }, {  -6,  60 }, {  -5,  62 },
00585         {  -8,  66 }, {  -8,  76 }, {  -4,  79 }, {  -7,  71 },
00586         {  -5,  69 }, {  -9,  70 }, {  -8,  66 }, { -10,  68 },
00587         { -19,  73 }, { -12,  69 }, { -16,  70 }, { -15,  67 },
00588         { -20,  62 }, { -19,  70 }, { -16,  66 }, { -22,  65 },
00589         { -20,  63 }, {  -5,  85 }, {  -6,  81 }, { -10,  77 },
00590         {  -7,  81 }, { -17,  80 }, { -18,  73 }, {  -4,  74 },
00591         { -10,  83 }, {  -9,  71 }, {  -9,  67 }, {  -1,  61 },
00592         {  -8,  66 }, { -14,  66 }, {   0,  59 }, {   2,  59 },
00593         {   9,  -2 }, {  26,  -9 }, {  33,  -9 }, {  39,  -7 },
00594         {  41,  -2 }, {  45,   3 }, {  49,   9 }, {  45,  27 },
00595         {  36,  59 }, {  21, -13 }, {  33, -14 }, {  39,  -7 },
00596         {  46,  -2 }, {  51,   2 }, {  60,   6 }, {  61,  17 },
00597         {  55,  34 }, {  42,  62 }, {  -6,  66 }, {  -7,  35 },
00598         {  -7,  42 }, {  -8,  45 }, {  -5,  48 }, { -12,  56 },
00599         {  -6,  60 }, {  -5,  62 }, {  -8,  66 }, {  -8,  76 },
00600         { -13, 106 }, { -16, 106 }, { -10,  87 }, { -21, 114 },
00601         { -18, 110 }, { -14,  98 }, { -22, 110 }, { -21, 106 },
00602         { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
00603         { -10,  96 }, { -12,  95 }, {  -5,  91 }, {  -9,  93 },
00604         { -22,  94 }, {  -5,  86 }, {   9,  67 }, {  -4,  80 },
00605         { -10,  85 }, {  -1,  70 }, {   7,  60 }, {   9,  58 },
00606         {   5,  61 }, {  12,  50 }, {  15,  50 }, {  18,  49 },
00607         {  17,  54 }, {  10,  41 }, {   7,  46 }, {  -1,  51 },
00608         {   7,  49 }, {   8,  52 }, {   9,  41 }, {   6,  47 },
00609         {   2,  55 }, {  13,  41 }, {  10,  44 }, {   6,  50 },
00610         {   5,  53 }, {  13,  49 }, {   4,  63 }, {   6,  64 },
00611         { -13, 106 }, { -16, 106 }, { -10,  87 }, { -21, 114 },
00612         { -18, 110 }, { -14,  98 }, { -22, 110 }, { -21, 106 },
00613         { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
00614         { -10,  96 }, { -12,  95 }, {  -5,  91 }, {  -9,  93 },
00615         { -22,  94 }, {  -5,  86 }, {   9,  67 }, {  -4,  80 },
00616         { -10,  85 }, {  -1,  70 }, {   7,  60 }, {   9,  58 },
00617         {   5,  61 }, {  12,  50 }, {  15,  50 }, {  18,  49 },
00618         {  17,  54 }, {  10,  41 }, {   7,  46 }, {  -1,  51 },
00619         {   7,  49 }, {   8,  52 }, {   9,  41 }, {   6,  47 },
00620         {   2,  55 }, {  13,  41 }, {  10,  44 }, {   6,  50 },
00621         {   5,  53 }, {  13,  49 }, {   4,  63 }, {   6,  64 },
00622         {  14,  11 }, {  11,  14 }, {   9,  11 }, {  18,  11 },
00623         {  21,   9 }, {  23,  -2 }, {  32, -15 }, {  32, -15 },
00624         {  34, -21 }, {  39, -23 }, {  42, -33 }, {  41, -31 },
00625         {  46, -28 }, {  38, -12 }, {  21,  29 }, {  45, -24 },
00626         {  53, -45 }, {  48, -26 }, {  65, -43 }, {  43, -19 },
00627         {  39, -10 }, {  30,   9 }, {  18,  26 }, {  20,  27 },
00628         {   0,  57 }, { -14,  82 }, {  -5,  75 }, { -19,  97 },
00629         { -35, 125 }, {  27,   0 }, {  28,   0 }, {  31,  -4 },
00630         {  27,   6 }, {  34,   8 }, {  30,  10 }, {  24,  22 },
00631         {  33,  19 }, {  22,  32 }, {  26,  31 }, {  21,  41 },
00632         {  26,  44 }, {  23,  47 }, {  16,  65 }, {  14,  71 },
00633         {  14,  11 }, {  11,  14 }, {   9,  11 }, {  18,  11 },
00634         {  21,   9 }, {  23,  -2 }, {  32, -15 }, {  32, -15 },
00635         {  34, -21 }, {  39, -23 }, {  42, -33 }, {  41, -31 },
00636         {  46, -28 }, {  38, -12 }, {  21,  29 }, {  45, -24 },
00637         {  53, -45 }, {  48, -26 }, {  65, -43 }, {  43, -19 },
00638         {  39, -10 }, {  30,   9 }, {  18,  26 }, {  20,  27 },
00639         {   0,  57 }, { -14,  82 }, {  -5,  75 }, { -19,  97 },
00640         { -35, 125 }, {  27,   0 }, {  28,   0 }, {  31,  -4 },
00641         {  27,   6 }, {  34,   8 }, {  30,  10 }, {  24,  22 },
00642         {  33,  19 }, {  22,  32 }, {  26,  31 }, {  21,  41 },
00643         {  26,  44 }, {  23,  47 }, {  16,  65 }, {  14,  71 },
00644         {  -6,  76 }, {  -2,  44 }, {   0,  45 }, {   0,  52 },
00645         {  -3,  64 }, {  -2,  59 }, {  -4,  70 }, {  -4,  75 },
00646         {  -8,  82 }, { -17, 102 }, {  -9,  77 }, {   3,  24 },
00647         {   0,  42 }, {   0,  48 }, {   0,  55 }, {  -6,  59 },
00648         {  -7,  71 }, { -12,  83 }, { -11,  87 }, { -30, 119 },
00649         {   1,  58 }, {  -3,  29 }, {  -1,  36 }, {   1,  38 },
00650         {   2,  43 }, {  -6,  55 }, {   0,  58 }, {   0,  64 },
00651         {  -3,  74 }, { -10,  90 }, {  -6,  76 }, {  -2,  44 },
00652         {   0,  45 }, {   0,  52 }, {  -3,  64 }, {  -2,  59 },
00653         {  -4,  70 }, {  -4,  75 }, {  -8,  82 }, { -17, 102 },
00654         {  -9,  77 }, {   3,  24 }, {   0,  42 }, {   0,  48 },
00655         {   0,  55 }, {  -6,  59 }, {  -7,  71 }, { -12,  83 },
00656         { -11,  87 }, { -30, 119 }, {   1,  58 }, {  -3,  29 },
00657         {  -1,  36 }, {   1,  38 }, {   2,  43 }, {  -6,  55 },
00658         {   0,  58 }, {   0,  64 }, {  -3,  74 }, { -10,  90 },
00659         {  -3,  74 }, {  -9,  92 }, {  -8,  87 }, { -23, 126 },
00660         {  -3,  74 }, {  -9,  92 }, {  -8,  87 }, { -23, 126 },
00661         {  -3,  74 }, {  -9,  92 }, {  -8,  87 }, { -23, 126 }
00662     },
00663 
00664     /* i_cabac_init_idc == 1 */
00665     {
00666         /* 0 - 10 */
00667         {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
00668         {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
00669         {  -6,  53 }, {  -1,  54 }, {   7,  51 },
00670 
00671         /* 11 - 23 */
00672         {  22,  25 }, {  34,   0 }, {  16,   0 }, {  -2,   9 },
00673         {   4,  41 }, { -29, 118 }, {   2,  65 }, {  -6,  71 },
00674         { -13,  79 }, {   5,  52 }, {   9,  50 }, {  -3,  70 },
00675         {  10,  54 },
00676 
00677         /* 24 - 39 */
00678         {  26,  34 }, {  19,  22 }, {  40,   0 }, {  57,   2 },
00679         {  41,  36 }, {  26,  69 }, { -45, 127 }, { -15, 101 },
00680         {  -4,  76 }, {  -6,  71 }, { -13,  79 }, {   5,  52 },
00681         {   6,  69 }, { -13,  90 }, {   0,  52 }, {   8,  43 },
00682 
00683         /* 40 - 53 */
00684         {  -2,  69 },{  -5,  82 },{ -10,  96 },{   2,  59 },
00685         {   2,  75 },{  -3,  87 },{  -3,  100 },{   1,  56 },
00686         {  -3,  74 },{  -6,  85 },{   0,  59 },{  -3,  81 },
00687         {  -7,  86 },{  -5,  95 },
00688 
00689         /* 54 - 59 */
00690         {  -1,  66 },{  -1,  77 },{   1,  70 },{  -2,  86 },
00691         {  -5,  72 },{   0,  61 },
00692 
00693         /* 60 - 69 */
00694         { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
00695         { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
00696         { 13, 41 },  { 3, 62 },
00697 
00698         /* 70 - 104 */
00699         {  13,  15 }, {   7,  51 }, {   2,  80 }, { -39, 127 },
00700         { -18,  91 }, { -17,  96 }, { -26,  81 }, { -35,  98 },
00701         { -24, 102 }, { -23,  97 }, { -27, 119 }, { -24,  99 },
00702         { -21, 110 }, { -18, 102 }, { -36, 127 }, {   0,  80 },
00703         {  -5,  89 }, {  -7,  94 }, {  -4,  92 }, {   0,  39 },
00704         {   0,  65 }, { -15,  84 }, { -35, 127 }, {  -2,  73 },
00705         { -12, 104 }, {  -9,  91 }, { -31, 127 }, {   3,  55 },
00706         {   7,  56 }, {   7,  55 }, {   8,  61 }, {  -3,  53 },
00707         {   0,  68 }, {  -7,  74 }, {  -9,  88 },
00708 
00709         /* 105 -> 165 */
00710         { -13, 103 }, { -13,  91 }, {  -9,  89 }, { -14,  92 },
00711         {  -8,  76 }, { -12,  87 }, { -23, 110 }, { -24, 105 },
00712         { -10,  78 }, { -20, 112 }, { -17,  99 }, { -78, 127 },
00713         { -70, 127 }, { -50, 127 }, { -46, 127 }, {  -4,  66 },
00714         {  -5,  78 }, {  -4,  71 }, {  -8,  72 }, {   2,  59 },
00715         {  -1,  55 }, {  -7,  70 }, {  -6,  75 }, {  -8,  89 },
00716         { -34, 119 }, {  -3,  75 }, {  32,  20 }, {  30,  22 },
00717         { -44, 127 }, {   0,  54 }, {  -5,  61 }, {   0,  58 },
00718         {  -1,  60 }, {  -3,  61 }, {  -8,  67 }, { -25,  84 },
00719         { -14,  74 }, {  -5,  65 }, {   5,  52 }, {   2,  57 },
00720         {   0,  61 }, {  -9,  69 }, { -11,  70 }, {  18,  55 },
00721         {  -4,  71 }, {   0,  58 }, {   7,  61 }, {   9,  41 },
00722         {  18,  25 }, {   9,  32 }, {   5,  43 }, {   9,  47 },
00723         {   0,  44 }, {   0,  51 }, {   2,  46 }, {  19,  38 },
00724         {  -4,  66 }, {  15,  38 }, {  12,  42 }, {   9,  34 },
00725         {   0,  89 },
00726 
00727         /* 166 - 226 */
00728         {   4,  45 }, {  10,  28 }, {  10,  31 }, {  33, -11 },
00729         {  52, -43 }, {  18,  15 }, {  28,   0 }, {  35, -22 },
00730         {  38, -25 }, {  34,   0 }, {  39, -18 }, {  32, -12 },
00731         { 102, -94 }, {   0,   0 }, {  56, -15 }, {  33,  -4 },
00732         {  29,  10 }, {  37,  -5 }, {  51, -29 }, {  39,  -9 },
00733         {  52, -34 }, {  69, -58 }, {  67, -63 }, {  44,  -5 },
00734         {  32,   7 }, {  55, -29 }, {  32,   1 }, {   0,   0 },
00735         {  27,  36 }, {  33, -25 }, {  34, -30 }, {  36, -28 },
00736         {  38, -28 }, {  38, -27 }, {  34, -18 }, {  35, -16 },
00737         {  34, -14 }, {  32,  -8 }, {  37,  -6 }, {  35,   0 },
00738         {  30,  10 }, {  28,  18 }, {  26,  25 }, {  29,  41 },
00739         {   0,  75 }, {   2,  72 }, {   8,  77 }, {  14,  35 },
00740         {  18,  31 }, {  17,  35 }, {  21,  30 }, {  17,  45 },
00741         {  20,  42 }, {  18,  45 }, {  27,  26 }, {  16,  54 },
00742         {   7,  66 }, {  16,  56 }, {  11,  73 }, {  10,  67 },
00743         { -10, 116 },
00744 
00745         /* 227 - 275 */
00746         { -23, 112 }, { -15,  71 }, {  -7,  61 }, {   0,  53 },
00747         {  -5,  66 }, { -11,  77 }, {  -9,  80 }, {  -9,  84 },
00748         { -10,  87 }, { -34, 127 }, { -21, 101 }, {  -3,  39 },
00749         {  -5,  53 }, {  -7,  61 }, { -11,  75 }, { -15,  77 },
00750         { -17,  91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
00751         { -11,  76 }, { -10,  44 }, { -10,  52 }, { -10,  57 },
00752         {  -9,  58 }, { -16,  72 }, {  -7,  69 }, {  -4,  69 },
00753         {  -5,  74 }, {  -9,  86 }, {   2,  66 }, {  -9,  34 },
00754         {   1,  32 }, {  11,  31 }, {   5,  52 }, {  -2,  55 },
00755         {  -2,  67 }, {   0,  73 }, {  -8,  89 }, {   3,  52 },
00756         {   7,   4 }, {  10,   8 }, {  17,   8 }, {  16,  19 },
00757         {   3,  37 }, {  -1,  61 }, {  -5,  73 }, {  -1,  70 },
00758         {  -4,  78 },
00759 
00760         /* 276 a bit special (not used, bypass is used instead) */
00761         { 0, 0 },
00762 
00763         /* 277 - 337 */
00764         { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
00765         { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
00766         { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
00767         { -10,  95 }, { -14, 100 }, {  -8,  95 }, { -17, 111 },
00768         { -28, 114 }, {  -6,  89 }, {  -2,  80 }, {  -4,  82 },
00769         {  -9,  85 }, {  -8,  81 }, {  -1,  72 }, {   5,  64 },
00770         {   1,  67 }, {   9,  56 }, {   0,  69 }, {   1,  69 },
00771         {   7,  69 }, {  -7,  69 }, {  -6,  67 }, { -16,  77 },
00772         {  -2,  64 }, {   2,  61 }, {  -6,  67 }, {  -3,  64 },
00773         {   2,  57 }, {  -3,  65 }, {  -3,  66 }, {   0,  62 },
00774         {   9,  51 }, {  -1,  66 }, {  -2,  71 }, {  -2,  75 },
00775         {  -1,  70 }, {  -9,  72 }, {  14,  60 }, {  16,  37 },
00776         {   0,  47 }, {  18,  35 }, {  11,  37 }, {  12,  41 },
00777         {  10,  41 }, {   2,  48 }, {  12,  41 }, {  13,  41 },
00778         {   0,  59 }, {   3,  50 }, {  19,  40 }, {   3,  66 },
00779         {  18,  50 },
00780 
00781         /* 338 - 398 */
00782         {  19,  -6 }, {  18,  -6 }, {  14,   0 }, {  26, -12 },
00783         {  31, -16 }, {  33, -25 }, {  33, -22 }, {  37, -28 },
00784         {  39, -30 }, {  42, -30 }, {  47, -42 }, {  45, -36 },
00785         {  49, -34 }, {  41, -17 }, {  32,   9 }, {  69, -71 },
00786         {  63, -63 }, {  66, -64 }, {  77, -74 }, {  54, -39 },
00787         {  52, -35 }, {  41, -10 }, {  36,   0 }, {  40,  -1 },
00788         {  30,  14 }, {  28,  26 }, {  23,  37 }, {  12,  55 },
00789         {  11,  65 }, {  37, -33 }, {  39, -36 }, {  40, -37 },
00790         {  38, -30 }, {  46, -33 }, {  42, -30 }, {  40, -24 },
00791         {  49, -29 }, {  38, -12 }, {  40, -10 }, {  38,  -3 },
00792         {  46,  -5 }, {  31,  20 }, {  29,  30 }, {  25,  44 },
00793         {  12,  48 }, {  11,  49 }, {  26,  45 }, {  22,  22 },
00794         {  23,  22 }, {  27,  21 }, {  33,  20 }, {  26,  28 },
00795         {  30,  24 }, {  27,  34 }, {  18,  42 }, {  25,  39 },
00796         {  18,  50 }, {  12,  70 }, {  21,  54 }, {  14,  71 },
00797         {  11,  83 },
00798 
00799         /* 399 - 435 */
00800         {  25,  32 }, {  21,  49 }, {  21,  54 },
00801         {  -5,  85 }, {  -6,  81 }, { -10,  77 }, {  -7,  81 },
00802         { -17,  80 }, { -18,  73 }, {  -4,  74 }, { -10,  83 },
00803         {  -9,  71 }, {  -9,  67 }, {  -1,  61 }, {  -8,  66 },
00804         { -14,  66 }, {   0,  59 }, {   2,  59 }, {  17, -10 },
00805         {  32, -13 }, {  42,  -9 }, {  49,  -5 }, {  53,   0 },
00806         {  64,   3 }, {  68,  10 }, {  66,  27 }, {  47,  57 },
00807         {  -5,  71 }, {   0,  24 }, {  -1,  36 }, {  -2,  42 },
00808         {  -2,  52 }, {  -9,  57 }, {  -6,  63 }, {  -4,  65 },
00809         {  -4,  67 }, {  -7,  82 },
00810 
00811         /* 436 - 459 */
00812         {  -3,  81 }, {  -3,  76 }, {  -7,  72 }, {  -6,  78 },
00813         { -12,  72 }, { -14,  68 }, {  -3,  70 }, {  -6,  76 },
00814         {  -5,  66 }, {  -5,  62 }, {   0,  57 }, {  -4,  61 },
00815         {  -9,  60 }, {   1,  54 }, {   2,  58 }, {  17, -10 },
00816         {  32, -13 }, {  42,  -9 }, {  49,  -5 }, {  53,   0 },
00817         {  64,   3 }, {  68,  10 }, {  66,  27 }, {  47,  57 },
00818 
00819         /* 460 - 1024 */
00820         {   0,  80 }, {  -5,  89 }, {  -7,  94 }, {  -4,  92 },
00821         {   0,  39 }, {   0,  65 }, { -15,  84 }, { -35, 127 },
00822         {  -2,  73 }, { -12, 104 }, {  -9,  91 }, { -31, 127 },
00823         {   0,  80 }, {  -5,  89 }, {  -7,  94 }, {  -4,  92 },
00824         {   0,  39 }, {   0,  65 }, { -15,  84 }, { -35, 127 },
00825         {  -2,  73 }, { -12, 104 }, {  -9,  91 }, { -31, 127 },
00826         { -13, 103 }, { -13,  91 }, {  -9,  89 }, { -14,  92 },
00827         {  -8,  76 }, { -12,  87 }, { -23, 110 }, { -24, 105 },
00828         { -10,  78 }, { -20, 112 }, { -17,  99 }, { -78, 127 },
00829         { -70, 127 }, { -50, 127 }, { -46, 127 }, {  -4,  66 },
00830         {  -5,  78 }, {  -4,  71 }, {  -8,  72 }, {   2,  59 },
00831         {  -1,  55 }, {  -7,  70 }, {  -6,  75 }, {  -8,  89 },
00832         { -34, 119 }, {  -3,  75 }, {  32,  20 }, {  30,  22 },
00833         { -44, 127 }, {   0,  54 }, {  -5,  61 }, {   0,  58 },
00834         {  -1,  60 }, {  -3,  61 }, {  -8,  67 }, { -25,  84 },
00835         { -14,  74 }, {  -5,  65 }, {   5,  52 }, {   2,  57 },
00836         {   0,  61 }, {  -9,  69 }, { -11,  70 }, {  18,  55 },
00837         { -13, 103 }, { -13,  91 }, {  -9,  89 }, { -14,  92 },
00838         {  -8,  76 }, { -12,  87 }, { -23, 110 }, { -24, 105 },
00839         { -10,  78 }, { -20, 112 }, { -17,  99 }, { -78, 127 },
00840         { -70, 127 }, { -50, 127 }, { -46, 127 }, {  -4,  66 },
00841         {  -5,  78 }, {  -4,  71 }, {  -8,  72 }, {   2,  59 },
00842         {  -1,  55 }, {  -7,  70 }, {  -6,  75 }, {  -8,  89 },
00843         { -34, 119 }, {  -3,  75 }, {  32,  20 }, {  30,  22 },
00844         { -44, 127 }, {   0,  54 }, {  -5,  61 }, {   0,  58 },
00845         {  -1,  60 }, {  -3,  61 }, {  -8,  67 }, { -25,  84 },
00846         { -14,  74 }, {  -5,  65 }, {   5,  52 }, {   2,  57 },
00847         {   0,  61 }, {  -9,  69 }, { -11,  70 }, {  18,  55 },
00848         {   4,  45 }, {  10,  28 }, {  10,  31 }, {  33, -11 },
00849         {  52, -43 }, {  18,  15 }, {  28,   0 }, {  35, -22 },
00850         {  38, -25 }, {  34,   0 }, {  39, -18 }, {  32, -12 },
00851         { 102, -94 }, {   0,   0 }, {  56, -15 }, {  33,  -4 },
00852         {  29,  10 }, {  37,  -5 }, {  51, -29 }, {  39,  -9 },
00853         {  52, -34 }, {  69, -58 }, {  67, -63 }, {  44,  -5 },
00854         {  32,   7 }, {  55, -29 }, {  32,   1 }, {   0,   0 },
00855         {  27,  36 }, {  33, -25 }, {  34, -30 }, {  36, -28 },
00856         {  38, -28 }, {  38, -27 }, {  34, -18 }, {  35, -16 },
00857         {  34, -14 }, {  32,  -8 }, {  37,  -6 }, {  35,   0 },
00858         {  30,  10 }, {  28,  18 }, {  26,  25 }, {  29,  41 },
00859         {   4,  45 }, {  10,  28 }, {  10,  31 }, {  33, -11 },
00860         {  52, -43 }, {  18,  15 }, {  28,   0 }, {  35, -22 },
00861         {  38, -25 }, {  34,   0 }, {  39, -18 }, {  32, -12 },
00862         { 102, -94 }, {   0,   0 }, {  56, -15 }, {  33,  -4 },
00863         {  29,  10 }, {  37,  -5 }, {  51, -29 }, {  39,  -9 },
00864         {  52, -34 }, {  69, -58 }, {  67, -63 }, {  44,  -5 },
00865         {  32,   7 }, {  55, -29 }, {  32,   1 }, {   0,   0 },
00866         {  27,  36 }, {  33, -25 }, {  34, -30 }, {  36, -28 },
00867         {  38, -28 }, {  38, -27 }, {  34, -18 }, {  35, -16 },
00868         {  34, -14 }, {  32,  -8 }, {  37,  -6 }, {  35,   0 },
00869         {  30,  10 }, {  28,  18 }, {  26,  25 }, {  29,  41 },
00870         {  -5,  85 }, {  -6,  81 }, { -10,  77 }, {  -7,  81 },
00871         { -17,  80 }, { -18,  73 }, {  -4,  74 }, { -10,  83 },
00872         {  -9,  71 }, {  -9,  67 }, {  -1,  61 }, {  -8,  66 },
00873         { -14,  66 }, {   0,  59 }, {   2,  59 }, {  -3,  81 },
00874         {  -3,  76 }, {  -7,  72 }, {  -6,  78 }, { -12,  72 },
00875         { -14,  68 }, {  -3,  70 }, {  -6,  76 }, {  -5,  66 },
00876         {  -5,  62 }, {   0,  57 }, {  -4,  61 }, {  -9,  60 },
00877         {   1,  54 }, {   2,  58 }, {  17, -10 }, {  32, -13 },
00878         {  42,  -9 }, {  49,  -5 }, {  53,   0 }, {  64,   3 },
00879         {  68,  10 }, {  66,  27 }, {  47,  57 }, {  17, -10 },
00880         {  32, -13 }, {  42,  -9 }, {  49,  -5 }, {  53,   0 },
00881         {  64,   3 }, {  68,  10 }, {  66,  27 }, {  47,  57 },
00882         {  -5,  71 }, {   0,  24 }, {  -1,  36 }, {  -2,  42 },
00883         {  -2,  52 }, {  -9,  57 }, {  -6,  63 }, {  -4,  65 },
00884         {  -4,  67 }, {  -7,  82 }, {  -5,  85 }, {  -6,  81 },
00885         { -10,  77 }, {  -7,  81 }, { -17,  80 }, { -18,  73 },
00886         {  -4,  74 }, { -10,  83 }, {  -9,  71 }, {  -9,  67 },
00887         {  -1,  61 }, {  -8,  66 }, { -14,  66 }, {   0,  59 },
00888         {   2,  59 }, {  -3,  81 }, {  -3,  76 }, {  -7,  72 },
00889         {  -6,  78 }, { -12,  72 }, { -14,  68 }, {  -3,  70 },
00890         {  -6,  76 }, {  -5,  66 }, {  -5,  62 }, {   0,  57 },
00891         {  -4,  61 }, {  -9,  60 }, {   1,  54 }, {   2,  58 },
00892         {  17, -10 }, {  32, -13 }, {  42,  -9 }, {  49,  -5 },
00893         {  53,   0 }, {  64,   3 }, {  68,  10 }, {  66,  27 },
00894         {  47,  57 }, {  17, -10 }, {  32, -13 }, {  42,  -9 },
00895         {  49,  -5 }, {  53,   0 }, {  64,   3 }, {  68,  10 },
00896         {  66,  27 }, {  47,  57 }, {  -5,  71 }, {   0,  24 },
00897         {  -1,  36 }, {  -2,  42 }, {  -2,  52 }, {  -9,  57 },
00898         {  -6,  63 }, {  -4,  65 }, {  -4,  67 }, {  -7,  82 },
00899         { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
00900         { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
00901         { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
00902         { -10,  95 }, { -14, 100 }, {  -8,  95 }, { -17, 111 },
00903         { -28, 114 }, {  -6,  89 }, {  -2,  80 }, {  -4,  82 },
00904         {  -9,  85 }, {  -8,  81 }, {  -1,  72 }, {   5,  64 },
00905         {   1,  67 }, {   9,  56 }, {   0,  69 }, {   1,  69 },
00906         {   7,  69 }, {  -7,  69 }, {  -6,  67 }, { -16,  77 },
00907         {  -2,  64 }, {   2,  61 }, {  -6,  67 }, {  -3,  64 },
00908         {   2,  57 }, {  -3,  65 }, {  -3,  66 }, {   0,  62 },
00909         {   9,  51 }, {  -1,  66 }, {  -2,  71 }, {  -2,  75 },
00910         { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
00911         { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
00912         { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
00913         { -10,  95 }, { -14, 100 }, {  -8,  95 }, { -17, 111 },
00914         { -28, 114 }, {  -6,  89 }, {  -2,  80 }, {  -4,  82 },
00915         {  -9,  85 }, {  -8,  81 }, {  -1,  72 }, {   5,  64 },
00916         {   1,  67 }, {   9,  56 }, {   0,  69 }, {   1,  69 },
00917         {   7,  69 }, {  -7,  69 }, {  -6,  67 }, { -16,  77 },
00918         {  -2,  64 }, {   2,  61 }, {  -6,  67 }, {  -3,  64 },
00919         {   2,  57 }, {  -3,  65 }, {  -3,  66 }, {   0,  62 },
00920         {   9,  51 }, {  -1,  66 }, {  -2,  71 }, {  -2,  75 },
00921         {  19,  -6 }, {  18,  -6 }, {  14,   0 }, {  26, -12 },
00922         {  31, -16 }, {  33, -25 }, {  33, -22 }, {  37, -28 },
00923         {  39, -30 }, {  42, -30 }, {  47, -42 }, {  45, -36 },
00924         {  49, -34 }, {  41, -17 }, {  32,   9 }, {  69, -71 },
00925         {  63, -63 }, {  66, -64 }, {  77, -74 }, {  54, -39 },
00926         {  52, -35 }, {  41, -10 }, {  36,   0 }, {  40,  -1 },
00927         {  30,  14 }, {  28,  26 }, {  23,  37 }, {  12,  55 },
00928         {  11,  65 }, {  37, -33 }, {  39, -36 }, {  40, -37 },
00929         {  38, -30 }, {  46, -33 }, {  42, -30 }, {  40, -24 },
00930         {  49, -29 }, {  38, -12 }, {  40, -10 }, {  38,  -3 },
00931         {  46,  -5 }, {  31,  20 }, {  29,  30 }, {  25,  44 },
00932         {  19,  -6 }, {  18,  -6 }, {  14,   0 }, {  26, -12 },
00933         {  31, -16 }, {  33, -25 }, {  33, -22 }, {  37, -28 },
00934         {  39, -30 }, {  42, -30 }, {  47, -42 }, {  45, -36 },
00935         {  49, -34 }, {  41, -17 }, {  32,   9 }, {  69, -71 },
00936         {  63, -63 }, {  66, -64 }, {  77, -74 }, {  54, -39 },
00937         {  52, -35 }, {  41, -10 }, {  36,   0 }, {  40,  -1 },
00938         {  30,  14 }, {  28,  26 }, {  23,  37 }, {  12,  55 },
00939         {  11,  65 }, {  37, -33 }, {  39, -36 }, {  40, -37 },
00940         {  38, -30 }, {  46, -33 }, {  42, -30 }, {  40, -24 },
00941         {  49, -29 }, {  38, -12 }, {  40, -10 }, {  38,  -3 },
00942         {  46,  -5 }, {  31,  20 }, {  29,  30 }, {  25,  44 },
00943         { -23, 112 }, { -15,  71 }, {  -7,  61 }, {   0,  53 },
00944         {  -5,  66 }, { -11,  77 }, {  -9,  80 }, {  -9,  84 },
00945         { -10,  87 }, { -34, 127 }, { -21, 101 }, {  -3,  39 },
00946         {  -5,  53 }, {  -7,  61 }, { -11,  75 }, { -15,  77 },
00947         { -17,  91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
00948         { -11,  76 }, { -10,  44 }, { -10,  52 }, { -10,  57 },
00949         {  -9,  58 }, { -16,  72 }, {  -7,  69 }, {  -4,  69 },
00950         {  -5,  74 }, {  -9,  86 }, { -23, 112 }, { -15,  71 },
00951         {  -7,  61 }, {   0,  53 }, {  -5,  66 }, { -11,  77 },
00952         {  -9,  80 }, {  -9,  84 }, { -10,  87 }, { -34, 127 },
00953         { -21, 101 }, {  -3,  39 }, {  -5,  53 }, {  -7,  61 },
00954         { -11,  75 }, { -15,  77 }, { -17,  91 }, { -25, 107 },
00955         { -25, 111 }, { -28, 122 }, { -11,  76 }, { -10,  44 },
00956         { -10,  52 }, { -10,  57 }, {  -9,  58 }, { -16,  72 },
00957         {  -7,  69 }, {  -4,  69 }, {  -5,  74 }, {  -9,  86 },
00958         {  -2,  73 }, { -12, 104 }, {  -9,  91 }, { -31, 127 },
00959         {  -2,  73 }, { -12, 104 }, {  -9,  91 }, { -31, 127 },
00960         {  -2,  73 }, { -12, 104 }, {  -9,  91 }, { -31, 127 }
00961     },
00962 
00963     /* i_cabac_init_idc == 2 */
00964     {
00965         /* 0 - 10 */
00966         {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
00967         {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
00968         {  -6,  53 }, {  -1,  54 }, {   7,  51 },
00969 
00970         /* 11 - 23 */
00971         {  29,  16 }, {  25,   0 }, {  14,   0 }, { -10,  51 },
00972         {  -3,  62 }, { -27,  99 }, {  26,  16 }, {  -4,  85 },
00973         { -24, 102 }, {   5,  57 }, {   6,  57 }, { -17,  73 },
00974         {  14,  57 },
00975 
00976         /* 24 - 39 */
00977         {  20,  40 }, {  20,  10 }, {  29,   0 }, {  54,   0 },
00978         {  37,  42 }, {  12,  97 }, { -32, 127 }, { -22, 117 },
00979         {  -2,  74 }, {  -4,  85 }, { -24, 102 }, {   5,  57 },
00980         {  -6,  93 }, { -14,  88 }, {  -6,  44 }, {   4,  55 },
00981 
00982         /* 40 - 53 */
00983         { -11,  89 },{ -15,  103 },{ -21,  116 },{  19,  57 },
00984         {  20,  58 },{   4,  84 },{   6,  96 },{   1,  63 },
00985         {  -5,  85 },{ -13,  106 },{   5,  63 },{   6,  75 },
00986         {  -3,  90 },{  -1,  101 },
00987 
00988         /* 54 - 59 */
00989         {   3,  55 },{  -4,  79 },{  -2,  75 },{ -12,  97 },
00990         {  -7,  50 },{   1,  60 },
00991 
00992         /* 60 - 69 */
00993         { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
00994         { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
00995         { 13, 41 },  { 3, 62 },
00996 
00997         /* 70 - 104 */
00998         {   7,  34 }, {  -9,  88 }, { -20, 127 }, { -36, 127 },
00999         { -17,  91 }, { -14,  95 }, { -25,  84 }, { -25,  86 },
01000         { -12,  89 }, { -17,  91 }, { -31, 127 }, { -14,  76 },
01001         { -18, 103 }, { -13,  90 }, { -37, 127 }, {  11,  80 },
01002         {   5,  76 }, {   2,  84 }, {   5,  78 }, {  -6,  55 },
01003         {   4,  61 }, { -14,  83 }, { -37, 127 }, {  -5,  79 },
01004         { -11, 104 }, { -11,  91 }, { -30, 127 }, {   0,  65 },
01005         {  -2,  79 }, {   0,  72 }, {  -4,  92 }, {  -6,  56 },
01006         {   3,  68 }, {  -8,  71 }, { -13,  98 },
01007 
01008         /* 105 -> 165 */
01009         {  -4,  86 }, { -12,  88 }, {  -5,  82 }, {  -3,  72 },
01010         {  -4,  67 }, {  -8,  72 }, { -16,  89 }, {  -9,  69 },
01011         {  -1,  59 }, {   5,  66 }, {   4,  57 }, {  -4,  71 },
01012         {  -2,  71 }, {   2,  58 }, {  -1,  74 }, {  -4,  44 },
01013         {  -1,  69 }, {   0,  62 }, {  -7,  51 }, {  -4,  47 },
01014         {  -6,  42 }, {  -3,  41 }, {  -6,  53 }, {   8,  76 },
01015         {  -9,  78 }, { -11,  83 }, {   9,  52 }, {   0,  67 },
01016         {  -5,  90 }, {   1,  67 }, { -15,  72 }, {  -5,  75 },
01017         {  -8,  80 }, { -21,  83 }, { -21,  64 }, { -13,  31 },
01018         { -25,  64 }, { -29,  94 }, {   9,  75 }, {  17,  63 },
01019         {  -8,  74 }, {  -5,  35 }, {  -2,  27 }, {  13,  91 },
01020         {   3,  65 }, {  -7,  69 }, {   8,  77 }, { -10,  66 },
01021         {   3,  62 }, {  -3,  68 }, { -20,  81 }, {   0,  30 },
01022         {   1,   7 }, {  -3,  23 }, { -21,  74 }, {  16,  66 },
01023         { -23, 124 }, {  17,  37 }, {  44, -18 }, {  50, -34 },
01024         { -22, 127 },
01025 
01026         /* 166 - 226 */
01027         {   4,  39 }, {   0,  42 }, {   7,  34 }, {  11,  29 },
01028         {   8,  31 }, {   6,  37 }, {   7,  42 }, {   3,  40 },
01029         {   8,  33 }, {  13,  43 }, {  13,  36 }, {   4,  47 },
01030         {   3,  55 }, {   2,  58 }, {   6,  60 }, {   8,  44 },
01031         {  11,  44 }, {  14,  42 }, {   7,  48 }, {   4,  56 },
01032         {   4,  52 }, {  13,  37 }, {   9,  49 }, {  19,  58 },
01033         {  10,  48 }, {  12,  45 }, {   0,  69 }, {  20,  33 },
01034         {   8,  63 }, {  35, -18 }, {  33, -25 }, {  28,  -3 },
01035         {  24,  10 }, {  27,   0 }, {  34, -14 }, {  52, -44 },
01036         {  39, -24 }, {  19,  17 }, {  31,  25 }, {  36,  29 },
01037         {  24,  33 }, {  34,  15 }, {  30,  20 }, {  22,  73 },
01038         {  20,  34 }, {  19,  31 }, {  27,  44 }, {  19,  16 },
01039         {  15,  36 }, {  15,  36 }, {  21,  28 }, {  25,  21 },
01040         {  30,  20 }, {  31,  12 }, {  27,  16 }, {  24,  42 },
01041         {   0,  93 }, {  14,  56 }, {  15,  57 }, {  26,  38 },
01042         { -24, 127 },
01043 
01044         /* 227 - 275 */
01045         { -24, 115 }, { -22,  82 }, {  -9,  62 }, {   0,  53 },
01046         {   0,  59 }, { -14,  85 }, { -13,  89 }, { -13,  94 },
01047         { -11,  92 }, { -29, 127 }, { -21, 100 }, { -14,  57 },
01048         { -12,  67 }, { -11,  71 }, { -10,  77 }, { -21,  85 },
01049         { -16,  88 }, { -23, 104 }, { -15,  98 }, { -37, 127 },
01050         { -10,  82 }, {  -8,  48 }, {  -8,  61 }, {  -8,  66 },
01051         {  -7,  70 }, { -14,  75 }, { -10,  79 }, {  -9,  83 },
01052         { -12,  92 }, { -18, 108 }, {  -4,  79 }, { -22,  69 },
01053         { -16,  75 }, {  -2,  58 }, {   1,  58 }, { -13,  78 },
01054         {  -9,  83 }, {  -4,  81 }, { -13,  99 }, { -13,  81 },
01055         {  -6,  38 }, { -13,  62 }, {  -6,  58 }, {  -2,  59 },
01056         { -16,  73 }, { -10,  76 }, { -13,  86 }, {  -9,  83 },
01057         { -10,  87 },
01058 
01059         /* 276 a bit special (not used, bypass is used instead) */
01060         { 0, 0 },
01061 
01062         /* 277 - 337 */
01063         { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
01064         { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
01065         { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
01066         { -10,  94 }, { -15, 102 }, { -10,  99 }, { -13, 106 },
01067         { -50, 127 }, {  -5,  92 }, {  17,  57 }, {  -5,  86 },
01068         { -13,  94 }, { -12,  91 }, {  -2,  77 }, {   0,  71 },
01069         {  -1,  73 }, {   4,  64 }, {  -7,  81 }, {   5,  64 },
01070         {  15,  57 }, {   1,  67 }, {   0,  68 }, { -10,  67 },
01071         {   1,  68 }, {   0,  77 }, {   2,  64 }, {   0,  68 },
01072         {  -5,  78 }, {   7,  55 }, {   5,  59 }, {   2,  65 },
01073         {  14,  54 }, {  15,  44 }, {   5,  60 }, {   2,  70 },
01074         {  -2,  76 }, { -18,  86 }, {  12,  70 }, {   5,  64 },
01075         { -12,  70 }, {  11,  55 }, {   5,  56 }, {   0,  69 },
01076         {   2,  65 }, {  -6,  74 }, {   5,  54 }, {   7,  54 },
01077         {  -6,  76 }, { -11,  82 }, {  -2,  77 }, {  -2,  77 },
01078         {  25,  42 },
01079 
01080         /* 338 - 398 */
01081         {  17, -13 }, {  16,  -9 }, {  17, -12 }, {  27, -21 },
01082         {  37, -30 }, {  41, -40 }, {  42, -41 }, {  48, -47 },
01083         {  39, -32 }, {  46, -40 }, {  52, -51 }, {  46, -41 },
01084         {  52, -39 }, {  43, -19 }, {  32,  11 }, {  61, -55 },
01085         {  56, -46 }, {  62, -50 }, {  81, -67 }, {  45, -20 },
01086         {  35,  -2 }, {  28,  15 }, {  34,   1 }, {  39,   1 },
01087         {  30,  17 }, {  20,  38 }, {  18,  45 }, {  15,  54 },
01088         {   0,  79 }, {  36, -16 }, {  37, -14 }, {  37, -17 },
01089         {  32,   1 }, {  34,  15 }, {  29,  15 }, {  24,  25 },
01090         {  34,  22 }, {  31,  16 }, {  35,  18 }, {  31,  28 },
01091         {  33,  41 }, {  36,  28 }, {  27,  47 }, {  21,  62 },
01092         {  18,  31 }, {  19,  26 }, {  36,  24 }, {  24,  23 },
01093         {  27,  16 }, {  24,  30 }, {  31,  29 }, {  22,  41 },
01094         {  22,  42 }, {  16,  60 }, {  15,  52 }, {  14,  60 },
01095         {   3,  78 }, { -16, 123 }, {  21,  53 }, {  22,  56 },
01096         {  25,  61 },
01097 
01098         /* 399 - 435 */
01099         {  21,  33 }, {  19,  50 }, {  17,  61 },
01100         {  -3,  78 }, {  -8,  74 }, {  -9,  72 }, { -10,  72 },
01101         { -18,  75 }, { -12,  71 }, { -11,  63 }, {  -5,  70 },
01102         { -17,  75 }, { -14,  72 }, { -16,  67 }, {  -8,  53 },
01103         { -14,  59 }, {  -9,  52 }, { -11,  68 }, {   9,  -2 },
01104         {  30, -10 }, {  31,  -4 }, {  33,  -1 }, {  33,   7 },
01105         {  31,  12 }, {  37,  23 }, {  31,  38 }, {  20,  64 },
01106         {  -9,  71 }, {  -7,  37 }, {  -8,  44 }, { -11,  49 },
01107         { -10,  56 }, { -12,  59 }, {  -8,  63 }, {  -9,  67 },
01108         {  -6,  68 }, { -10,  79 },
01109 
01110         /* 436 - 459 */
01111         {  -3,  78 }, {  -8,  74 }, {  -9,  72 }, { -10,  72 },
01112         { -18,  75 }, { -12,  71 }, { -11,  63 }, {  -5,  70 },
01113         { -17,  75 }, { -14,  72 }, { -16,  67 }, {  -8,  53 },
01114         { -14,  59 }, {  -9,  52 }, { -11,  68 }, {   9,  -2 },
01115         {  30, -10 }, {  31,  -4 }, {  33,  -1 }, {  33,   7 },
01116         {  31,  12 }, {  37,  23 }, {  31,  38 }, {  20,  64 },
01117 
01118         /* 460 - 1024 */
01119         {  11,  80 }, {   5,  76 }, {   2,  84 }, {   5,  78 },
01120         {  -6,  55 }, {   4,  61 }, { -14,  83 }, { -37, 127 },
01121         {  -5,  79 }, { -11, 104 }, { -11,  91 }, { -30, 127 },
01122         {  11,  80 }, {   5,  76 }, {   2,  84 }, {   5,  78 },
01123         {  -6,  55 }, {   4,  61 }, { -14,  83 }, { -37, 127 },
01124         {  -5,  79 }, { -11, 104 }, { -11,  91 }, { -30, 127 },
01125         {  -4,  86 }, { -12,  88 }, {  -5,  82 }, {  -3,  72 },
01126         {  -4,  67 }, {  -8,  72 }, { -16,  89 }, {  -9,  69 },
01127         {  -1,  59 }, {   5,  66 }, {   4,  57 }, {  -4,  71 },
01128         {  -2,  71 }, {   2,  58 }, {  -1,  74 }, {  -4,  44 },
01129         {  -1,  69 }, {   0,  62 }, {  -7,  51 }, {  -4,  47 },
01130         {  -6,  42 }, {  -3,  41 }, {  -6,  53 }, {   8,  76 },
01131         {  -9,  78 }, { -11,  83 }, {   9,  52 }, {   0,  67 },
01132         {  -5,  90 }, {   1,  67 }, { -15,  72 }, {  -5,  75 },
01133         {  -8,  80 }, { -21,  83 }, { -21,  64 }, { -13,  31 },
01134         { -25,  64 }, { -29,  94 }, {   9,  75 }, {  17,  63 },
01135         {  -8,  74 }, {  -5,  35 }, {  -2,  27 }, {  13,  91 },
01136         {  -4,  86 }, { -12,  88 }, {  -5,  82 }, {  -3,  72 },
01137         {  -4,  67 }, {  -8,  72 }, { -16,  89 }, {  -9,  69 },
01138         {  -1,  59 }, {   5,  66 }, {   4,  57 }, {  -4,  71 },
01139         {  -2,  71 }, {   2,  58 }, {  -1,  74 }, {  -4,  44 },
01140         {  -1,  69 }, {   0,  62 }, {  -7,  51 }, {  -4,  47 },
01141         {  -6,  42 }, {  -3,  41 }, {  -6,  53 }, {   8,  76 },
01142         {  -9,  78 }, { -11,  83 }, {   9,  52 }, {   0,  67 },
01143         {  -5,  90 }, {   1,  67 }, { -15,  72 }, {  -5,  75 },
01144         {  -8,  80 }, { -21,  83 }, { -21,  64 }, { -13,  31 },
01145         { -25,  64 }, { -29,  94 }, {   9,  75 }, {  17,  63 },
01146         {  -8,  74 }, {  -5,  35 }, {  -2,  27 }, {  13,  91 },
01147         {   4,  39 }, {   0,  42 }, {   7,  34 }, {  11,  29 },
01148         {   8,  31 }, {   6,  37 }, {   7,  42 }, {   3,  40 },
01149         {   8,  33 }, {  13,  43 }, {  13,  36 }, {   4,  47 },
01150         {   3,  55 }, {   2,  58 }, {   6,  60 }, {   8,  44 },
01151         {  11,  44 }, {  14,  42 }, {   7,  48 }, {   4,  56 },
01152         {   4,  52 }, {  13,  37 }, {   9,  49 }, {  19,  58 },
01153         {  10,  48 }, {  12,  45 }, {   0,  69 }, {  20,  33 },
01154         {   8,  63 }, {  35, -18 }, {  33, -25 }, {  28,  -3 },
01155         {  24,  10 }, {  27,   0 }, {  34, -14 }, {  52, -44 },
01156         {  39, -24 }, {  19,  17 }, {  31,  25 }, {  36,  29 },
01157         {  24,  33 }, {  34,  15 }, {  30,  20 }, {  22,  73 },
01158         {   4,  39 }, {   0,  42 }, {   7,  34 }, {  11,  29 },
01159         {   8,  31 }, {   6,  37 }, {   7,  42 }, {   3,  40 },
01160         {   8,  33 }, {  13,  43 }, {  13,  36 }, {   4,  47 },
01161         {   3,  55 }, {   2,  58 }, {   6,  60 }, {   8,  44 },
01162         {  11,  44 }, {  14,  42 }, {   7,  48 }, {   4,  56 },
01163         {   4,  52 }, {  13,  37 }, {   9,  49 }, {  19,  58 },
01164         {  10,  48 }, {  12,  45 }, {   0,  69 }, {  20,  33 },
01165         {   8,  63 }, {  35, -18 }, {  33, -25 }, {  28,  -3 },
01166         {  24,  10 }, {  27,   0 }, {  34, -14 }, {  52, -44 },
01167         {  39, -24 }, {  19,  17 }, {  31,  25 }, {  36,  29 },
01168         {  24,  33 }, {  34,  15 }, {  30,  20 }, {  22,  73 },
01169         {  -3,  78 }, {  -8,  74 }, {  -9,  72 }, { -10,  72 },
01170         { -18,  75 }, { -12,  71 }, { -11,  63 }, {  -5,  70 },
01171         { -17,  75 }, { -14,  72 }, { -16,  67 }, {  -8,  53 },
01172         { -14,  59 }, {  -9,  52 }, { -11,  68 }, {  -3,  78 },
01173         {  -8,  74 }, {  -9,  72 }, { -10,  72 }, { -18,  75 },
01174         { -12,  71 }, { -11,  63 }, {  -5,  70 }, { -17,  75 },
01175         { -14,  72 }, { -16,  67 }, {  -8,  53 }, { -14,  59 },
01176         {  -9,  52 }, { -11,  68 }, {   9,  -2 }, {  30, -10 },
01177         {  31,  -4 }, {  33,  -1 }, {  33,   7 }, {  31,  12 },
01178         {  37,  23 }, {  31,  38 }, {  20,  64 }, {   9,  -2 },
01179         {  30, -10 }, {  31,  -4 }, {  33,  -1 }, {  33,   7 },
01180         {  31,  12 }, {  37,  23 }, {  31,  38 }, {  20,  64 },
01181         {  -9,  71 }, {  -7,  37 }, {  -8,  44 }, { -11,  49 },
01182         { -10,  56 }, { -12,  59 }, {  -8,  63 }, {  -9,  67 },
01183         {  -6,  68 }, { -10,  79 }, {  -3,  78 }, {  -8,  74 },
01184         {  -9,  72 }, { -10,  72 }, { -18,  75 }, { -12,  71 },
01185         { -11,  63 }, {  -5,  70 }, { -17,  75 }, { -14,  72 },
01186         { -16,  67 }, {  -8,  53 }, { -14,  59 }, {  -9,  52 },
01187         { -11,  68 }, {  -3,  78 }, {  -8,  74 }, {  -9,  72 },
01188         { -10,  72 }, { -18,  75 }, { -12,  71 }, { -11,  63 },
01189         {  -5,  70 }, { -17,  75 }, { -14,  72 }, { -16,  67 },
01190         {  -8,  53 }, { -14,  59 }, {  -9,  52 }, { -11,  68 },
01191         {   9,  -2 }, {  30, -10 }, {  31,  -4 }, {  33,  -1 },
01192         {  33,   7 }, {  31,  12 }, {  37,  23 }, {  31,  38 },
01193         {  20,  64 }, {   9,  -2 }, {  30, -10 }, {  31,  -4 },
01194         {  33,  -1 }, {  33,   7 }, {  31,  12 }, {  37,  23 },
01195         {  31,  38 }, {  20,  64 }, {  -9,  71 }, {  -7,  37 },
01196         {  -8,  44 }, { -11,  49 }, { -10,  56 }, { -12,  59 },
01197         {  -8,  63 }, {  -9,  67 }, {  -6,  68 }, { -10,  79 },
01198         { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
01199         { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
01200         { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
01201         { -10,  94 }, { -15, 102 }, { -10,  99 }, { -13, 106 },
01202         { -50, 127 }, {  -5,  92 }, {  17,  57 }, {  -5,  86 },
01203         { -13,  94 }, { -12,  91 }, {  -2,  77 }, {   0,  71 },
01204         {  -1,  73 }, {   4,  64 }, {  -7,  81 }, {   5,  64 },
01205         {  15,  57 }, {   1,  67 }, {   0,  68 }, { -10,  67 },
01206         {   1,  68 }, {   0,  77 }, {   2,  64 }, {   0,  68 },
01207         {  -5,  78 }, {   7,  55 }, {   5,  59 }, {   2,  65 },
01208         {  14,  54 }, {  15,  44 }, {   5,  60 }, {   2,  70 },
01209         { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
01210         { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
01211         { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
01212         { -10,  94 }, { -15, 102 }, { -10,  99 }, { -13, 106 },
01213         { -50, 127 }, {  -5,  92 }, {  17,  57 }, {  -5,  86 },
01214         { -13,  94 }, { -12,  91 }, {  -2,  77 }, {   0,  71 },
01215         {  -1,  73 }, {   4,  64 }, {  -7,  81 }, {   5,  64 },
01216         {  15,  57 }, {   1,  67 }, {   0,  68 }, { -10,  67 },
01217         {   1,  68 }, {   0,  77 }, {   2,  64 }, {   0,  68 },
01218         {  -5,  78 }, {   7,  55 }, {   5,  59 }, {   2,  65 },
01219         {  14,  54 }, {  15,  44 }, {   5,  60 }, {   2,  70 },
01220         {  17, -13 }, {  16,  -9 }, {  17, -12 }, {  27, -21 },
01221         {  37, -30 }, {  41, -40 }, {  42, -41 }, {  48, -47 },
01222         {  39, -32 }, {  46, -40 }, {  52, -51 }, {  46, -41 },
01223         {  52, -39 }, {  43, -19 }, {  32,  11 }, {  61, -55 },
01224         {  56, -46 }, {  62, -50 }, {  81, -67 }, {  45, -20 },
01225         {  35,  -2 }, {  28,  15 }, {  34,   1 }, {  39,   1 },
01226         {  30,  17 }, {  20,  38 }, {  18,  45 }, {  15,  54 },
01227         {   0,  79 }, {  36, -16 }, {  37, -14 }, {  37, -17 },
01228         {  32,   1 }, {  34,  15 }, {  29,  15 }, {  24,  25 },
01229         {  34,  22 }, {  31,  16 }, {  35,  18 }, {  31,  28 },
01230         {  33,  41 }, {  36,  28 }, {  27,  47 }, {  21,  62 },
01231         {  17, -13 }, {  16,  -9 }, {  17, -12 }, {  27, -21 },
01232         {  37, -30 }, {  41, -40 }, {  42, -41 }, {  48, -47 },
01233         {  39, -32 }, {  46, -40 }, {  52, -51 }, {  46, -41 },
01234         {  52, -39 }, {  43, -19 }, {  32,  11 }, {  61, -55 },
01235         {  56, -46 }, {  62, -50 }, {  81, -67 }, {  45, -20 },
01236         {  35,  -2 }, {  28,  15 }, {  34,   1 }, {  39,   1 },
01237         {  30,  17 }, {  20,  38 }, {  18,  45 }, {  15,  54 },
01238         {   0,  79 }, {  36, -16 }, {  37, -14 }, {  37, -17 },
01239         {  32,   1 }, {  34,  15 }, {  29,  15 }, {  24,  25 },
01240         {  34,  22 }, {  31,  16 }, {  35,  18 }, {  31,  28 },
01241         {  33,  41 }, {  36,  28 }, {  27,  47 }, {  21,  62 },
01242         { -24, 115 }, { -22,  82 }, {  -9,  62 }, {   0,  53 },
01243         {   0,  59 }, { -14,  85 }, { -13,  89 }, { -13,  94 },
01244         { -11,  92 }, { -29, 127 }, { -21, 100 }, { -14,  57 },
01245         { -12,  67 }, { -11,  71 }, { -10,  77 }, { -21,  85 },
01246         { -16,  88 }, { -23, 104 }, { -15,  98 }, { -37, 127 },
01247         { -10,  82 }, {  -8,  48 }, {  -8,  61 }, {  -8,  66 },
01248         {  -7,  70 }, { -14,  75 }, { -10,  79 }, {  -9,  83 },
01249         { -12,  92 }, { -18, 108 }, { -24, 115 }, { -22,  82 },
01250         {  -9,  62 }, {   0,  53 }, {   0,  59 }, { -14,  85 },
01251         { -13,  89 }, { -13,  94 }, { -11,  92 }, { -29, 127 },
01252         { -21, 100 }, { -14,  57 }, { -12,  67 }, { -11,  71 },
01253         { -10,  77 }, { -21,  85 }, { -16,  88 }, { -23, 104 },
01254         { -15,  98 }, { -37, 127 }, { -10,  82 }, {  -8,  48 },
01255         {  -8,  61 }, {  -8,  66 }, {  -7,  70 }, { -14,  75 },
01256         { -10,  79 }, {  -9,  83 }, { -12,  92 }, { -18, 108 },
01257         {  -5,  79 }, { -11, 104 }, { -11,  91 }, { -30, 127 },
01258         {  -5,  79 }, { -11, 104 }, { -11,  91 }, { -30, 127 },
01259         {  -5,  79 }, { -11, 104 }, { -11,  91 }, { -30, 127 }
01260     }
01261 };
01262 
01263 void ff_h264_init_cabac_states(H264Context *h) {
01264     MpegEncContext * const s = &h->s;
01265     int i;
01266     const int8_t (*tab)[2];
01267     const int slice_qp = av_clip(s->qscale - 6*(h->sps.bit_depth_luma-8), 0, 51);
01268 
01269     if( h->slice_type_nos == AV_PICTURE_TYPE_I ) tab = cabac_context_init_I;
01270     else                                 tab = cabac_context_init_PB[h->cabac_init_idc];
01271 
01272     /* calculate pre-state */
01273     for( i= 0; i < 1024; i++ ) {
01274         int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
01275 
01276         pre^= pre>>31;
01277         if(pre > 124)
01278             pre= 124 + (pre&1);
01279 
01280         h->cabac_state[i] =  pre;
01281     }
01282 }
01283 
01284 static int decode_cabac_field_decoding_flag(H264Context *h) {
01285     MpegEncContext * const s = &h->s;
01286     const long mbb_xy = h->mb_xy - 2L*s->mb_stride;
01287 
01288     unsigned long ctx = 0;
01289 
01290     ctx += h->mb_field_decoding_flag & !!s->mb_x; //for FMO:(s->current_picture.f.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
01291     ctx += (s->current_picture.f.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == h->slice_num);
01292 
01293     return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
01294 }
01295 
01296 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) {
01297     uint8_t *state= &h->cabac_state[ctx_base];
01298     int mb_type;
01299 
01300     if(intra_slice){
01301         int ctx=0;
01302         if( h->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
01303             ctx++;
01304         if( h->top_type        & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
01305             ctx++;
01306         if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
01307             return 0;   /* I4x4 */
01308         state += 2;
01309     }else{
01310         if( get_cabac_noinline( &h->cabac, state ) == 0 )
01311             return 0;   /* I4x4 */
01312     }
01313 
01314     if( get_cabac_terminate( &h->cabac ) )
01315         return 25;  /* PCM */
01316 
01317     mb_type = 1; /* I16x16 */
01318     mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
01319     if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
01320         mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
01321     mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
01322     mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
01323     return mb_type;
01324 }
01325 
01326 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
01327     MpegEncContext * const s = &h->s;
01328     int mba_xy, mbb_xy;
01329     int ctx = 0;
01330 
01331     if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches?
01332         int mb_xy = mb_x + (mb_y&~1)*s->mb_stride;
01333         mba_xy = mb_xy - 1;
01334         if( (mb_y&1)
01335             && h->slice_table[mba_xy] == h->slice_num
01336             && MB_FIELD == !!IS_INTERLACED( s->current_picture.f.mb_type[mba_xy] ) )
01337             mba_xy += s->mb_stride;
01338         if( MB_FIELD ){
01339             mbb_xy = mb_xy - s->mb_stride;
01340             if( !(mb_y&1)
01341                 && h->slice_table[mbb_xy] == h->slice_num
01342                 && IS_INTERLACED( s->current_picture.f.mb_type[mbb_xy] ) )
01343                 mbb_xy -= s->mb_stride;
01344         }else
01345             mbb_xy = mb_x + (mb_y-1)*s->mb_stride;
01346     }else{
01347         int mb_xy = h->mb_xy;
01348         mba_xy = mb_xy - 1;
01349         mbb_xy = mb_xy - (s->mb_stride << FIELD_PICTURE);
01350     }
01351 
01352     if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP( s->current_picture.f.mb_type[mba_xy] ))
01353         ctx++;
01354     if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP( s->current_picture.f.mb_type[mbb_xy] ))
01355         ctx++;
01356 
01357     if( h->slice_type_nos == AV_PICTURE_TYPE_B )
01358         ctx += 13;
01359     return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] );
01360 }
01361 
01362 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
01363     int mode = 0;
01364 
01365     if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
01366         return pred_mode;
01367 
01368     mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
01369     mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
01370     mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
01371 
01372     return mode + ( mode >= pred_mode );
01373 }
01374 
01375 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
01376     const int mba_xy = h->left_mb_xy[0];
01377     const int mbb_xy = h->top_mb_xy;
01378 
01379     int ctx = 0;
01380 
01381     /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
01382     if( h->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0 )
01383         ctx++;
01384 
01385     if( h->top_type        && h->chroma_pred_mode_table[mbb_xy] != 0 )
01386         ctx++;
01387 
01388     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
01389         return 0;
01390 
01391     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
01392         return 1;
01393     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
01394         return 2;
01395     else
01396         return 3;
01397 }
01398 
01399 static int decode_cabac_mb_cbp_luma( H264Context *h) {
01400     int cbp_b, cbp_a, ctx, cbp = 0;
01401 
01402     cbp_a = h->left_cbp;
01403     cbp_b = h->top_cbp;
01404 
01405     ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
01406     cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
01407     ctx = !(cbp   & 0x01) + 2 * !(cbp_b & 0x08);
01408     cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
01409     ctx = !(cbp_a & 0x08) + 2 * !(cbp   & 0x01);
01410     cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
01411     ctx = !(cbp   & 0x04) + 2 * !(cbp   & 0x02);
01412     cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
01413     return cbp;
01414 }
01415 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
01416     int ctx;
01417     int cbp_a, cbp_b;
01418 
01419     cbp_a = (h->left_cbp>>4)&0x03;
01420     cbp_b = (h-> top_cbp>>4)&0x03;
01421 
01422     ctx = 0;
01423     if( cbp_a > 0 ) ctx++;
01424     if( cbp_b > 0 ) ctx += 2;
01425     if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
01426         return 0;
01427 
01428     ctx = 4;
01429     if( cbp_a == 2 ) ctx++;
01430     if( cbp_b == 2 ) ctx += 2;
01431     return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
01432 }
01433 
01434 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
01435     if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
01436         return 0;   /* 8x8 */
01437     if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
01438         return 1;   /* 8x4 */
01439     if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
01440         return 2;   /* 4x8 */
01441     return 3;       /* 4x4 */
01442 }
01443 static int decode_cabac_b_mb_sub_type( H264Context *h ) {
01444     int type;
01445     if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
01446         return 0;   /* B_Direct_8x8 */
01447     if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
01448         return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
01449     type = 3;
01450     if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
01451         if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
01452             return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
01453         type += 4;
01454     }
01455     type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
01456     type +=   get_cabac( &h->cabac, &h->cabac_state[39] );
01457     return type;
01458 }
01459 
01460 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
01461     int refa = h->ref_cache[list][scan8[n] - 1];
01462     int refb = h->ref_cache[list][scan8[n] - 8];
01463     int ref  = 0;
01464     int ctx  = 0;
01465 
01466     if( h->slice_type_nos == AV_PICTURE_TYPE_B) {
01467         if( refa > 0 && !(h->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
01468             ctx++;
01469         if( refb > 0 && !(h->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
01470             ctx += 2;
01471     } else {
01472         if( refa > 0 )
01473             ctx++;
01474         if( refb > 0 )
01475             ctx += 2;
01476     }
01477 
01478     while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
01479         ref++;
01480         ctx = (ctx>>2)+4;
01481         if(ref >= 32 /*h->ref_list[list]*/){
01482             return -1;
01483         }
01484     }
01485     return ref;
01486 }
01487 
01488 static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda) {
01489     int mvd;
01490 
01491     if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
01492 //    if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
01493         *mvda= 0;
01494         return 0;
01495     }
01496 
01497     mvd= 1;
01498     ctxbase+= 3;
01499     while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase] ) ) {
01500         if( mvd < 4 )
01501             ctxbase++;
01502         mvd++;
01503     }
01504 
01505     if( mvd >= 9 ) {
01506         int k = 3;
01507         while( get_cabac_bypass( &h->cabac ) ) {
01508             mvd += 1 << k;
01509             k++;
01510             if(k>24){
01511                 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
01512                 return INT_MIN;
01513             }
01514         }
01515         while( k-- ) {
01516             mvd += get_cabac_bypass( &h->cabac )<<k;
01517         }
01518         *mvda=mvd < 70 ? mvd : 70;
01519     }else
01520         *mvda=mvd;
01521     return get_cabac_bypass_sign( &h->cabac, -mvd );
01522 }
01523 
01524 #define DECODE_CABAC_MB_MVD( h,  list,  n )\
01525 {\
01526     int amvd0 = h->mvd_cache[list][scan8[n] - 1][0] +\
01527                 h->mvd_cache[list][scan8[n] - 8][0];\
01528     int amvd1 = h->mvd_cache[list][scan8[n] - 1][1] +\
01529                 h->mvd_cache[list][scan8[n] - 8][1];\
01530 \
01531     mx += decode_cabac_mb_mvd( h, 40, amvd0, &mpx );\
01532     my += decode_cabac_mb_mvd( h, 47, amvd1, &mpy );\
01533 }
01534 
01535 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int max_coeff, int is_dc ) {
01536     int nza, nzb;
01537     int ctx = 0;
01538     static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
01539 
01540     if( is_dc ) {
01541         if( cat == 3 ) {
01542             idx -= CHROMA_DC_BLOCK_INDEX;
01543             nza = (h->left_cbp>>(6+idx))&0x01;
01544             nzb = (h-> top_cbp>>(6+idx))&0x01;
01545         } else {
01546             idx -= LUMA_DC_BLOCK_INDEX;
01547             nza = h->left_cbp&(0x100<<idx);
01548             nzb = h-> top_cbp&(0x100<<idx);
01549         }
01550     } else {
01551         nza = h->non_zero_count_cache[scan8[idx] - 1];
01552         nzb = h->non_zero_count_cache[scan8[idx] - 8];
01553     }
01554 
01555     if( nza > 0 )
01556         ctx++;
01557 
01558     if( nzb > 0 )
01559         ctx += 2;
01560 
01561     return base_ctx[cat] + ctx;
01562 }
01563 
01564 DECLARE_ASM_CONST(1, uint8_t, last_coeff_flag_offset_8x8)[63] = {
01565     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
01566     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
01567     3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
01568     5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
01569 };
01570 
01571 static av_always_inline void
01572 decode_cabac_residual_internal(H264Context *h, DCTELEM *block,
01573                                int cat, int n, const uint8_t *scantable,
01574                                const uint32_t *qmul, int max_coeff,
01575                                int is_dc, int chroma422)
01576 {
01577     static const int significant_coeff_flag_offset[2][14] = {
01578       { 105+0, 105+15, 105+29, 105+44, 105+47, 402, 484+0, 484+15, 484+29, 660, 528+0, 528+15, 528+29, 718 },
01579       { 277+0, 277+15, 277+29, 277+44, 277+47, 436, 776+0, 776+15, 776+29, 675, 820+0, 820+15, 820+29, 733 }
01580     };
01581     static const int last_coeff_flag_offset[2][14] = {
01582       { 166+0, 166+15, 166+29, 166+44, 166+47, 417, 572+0, 572+15, 572+29, 690, 616+0, 616+15, 616+29, 748 },
01583       { 338+0, 338+15, 338+29, 338+44, 338+47, 451, 864+0, 864+15, 864+29, 699, 908+0, 908+15, 908+29, 757 }
01584     };
01585     static const int coeff_abs_level_m1_offset[14] = {
01586         227+0, 227+10, 227+20, 227+30, 227+39, 426, 952+0, 952+10, 952+20, 708, 982+0, 982+10, 982+20, 766
01587     };
01588     static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
01589       { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
01590         4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
01591         7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
01592        12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
01593       { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
01594         6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
01595         9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
01596         9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
01597     };
01598     static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
01599     /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
01600      * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
01601      * map node ctx => cabac ctx for level=1 */
01602     static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
01603     /* map node ctx => cabac ctx for level>1 */
01604     static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
01605         { 5, 5, 5, 5, 6, 7, 8, 9 },
01606         { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
01607     };
01608     static const uint8_t coeff_abs_level_transition[2][8] = {
01609     /* update node ctx after decoding a level=1 */
01610         { 1, 2, 3, 3, 4, 5, 6, 7 },
01611     /* update node ctx after decoding a level>1 */
01612         { 4, 4, 4, 4, 5, 6, 7, 7 }
01613     };
01614 
01615     int index[64];
01616 
01617     int av_unused last;
01618     int coeff_count = 0;
01619     int node_ctx = 0;
01620 
01621     uint8_t *significant_coeff_ctx_base;
01622     uint8_t *last_coeff_ctx_base;
01623     uint8_t *abs_level_m1_ctx_base;
01624 
01625 #if !ARCH_X86
01626 #define CABAC_ON_STACK
01627 #endif
01628 #ifdef CABAC_ON_STACK
01629 #define CC &cc
01630     CABACContext cc;
01631     cc.range     = h->cabac.range;
01632     cc.low       = h->cabac.low;
01633     cc.bytestream= h->cabac.bytestream;
01634 #else
01635 #define CC &h->cabac
01636 #endif
01637 
01638     significant_coeff_ctx_base = h->cabac_state
01639         + significant_coeff_flag_offset[MB_FIELD][cat];
01640     last_coeff_ctx_base = h->cabac_state
01641         + last_coeff_flag_offset[MB_FIELD][cat];
01642     abs_level_m1_ctx_base = h->cabac_state
01643         + coeff_abs_level_m1_offset[cat];
01644 
01645     if( !is_dc && max_coeff == 64 ) {
01646 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
01647         for(last= 0; last < coefs; last++) { \
01648             uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
01649             if( get_cabac( CC, sig_ctx )) { \
01650                 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
01651                 index[coeff_count++] = last; \
01652                 if( get_cabac( CC, last_ctx ) ) { \
01653                     last= max_coeff; \
01654                     break; \
01655                 } \
01656             } \
01657         }\
01658         if( last == max_coeff -1 ) {\
01659             index[coeff_count++] = last;\
01660         }
01661         const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
01662 #if ARCH_X86 && HAVE_7REGS && !defined(BROKEN_RELOCATIONS)
01663         coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index,
01664                                                  last_coeff_ctx_base, sig_off);
01665     } else {
01666         if (is_dc && chroma422) { // dc 422
01667             DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
01668         } else {
01669             coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index,
01670                                                  last_coeff_ctx_base-significant_coeff_ctx_base);
01671         }
01672 #else
01673         DECODE_SIGNIFICANCE( 63, sig_off[last], last_coeff_flag_offset_8x8[last] );
01674     } else {
01675         if (is_dc && chroma422) { // dc 422
01676             DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
01677         } else {
01678             DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
01679         }
01680 #endif
01681     }
01682     assert(coeff_count > 0);
01683 
01684     if( is_dc ) {
01685         if( cat == 3 )
01686             h->cbp_table[h->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
01687         else
01688             h->cbp_table[h->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
01689         h->non_zero_count_cache[scan8[n]] = coeff_count;
01690     } else {
01691         if( max_coeff == 64 )
01692             fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
01693         else {
01694             assert( cat == 1 || cat ==  2 || cat ==  4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
01695             h->non_zero_count_cache[scan8[n]] = coeff_count;
01696         }
01697     }
01698 
01699 
01700 #define STORE_BLOCK(type) \
01701     do { \
01702         uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
01703  \
01704         int j= scantable[index[--coeff_count]]; \
01705  \
01706         if( get_cabac( CC, ctx ) == 0 ) { \
01707             node_ctx = coeff_abs_level_transition[0][node_ctx]; \
01708             if( is_dc ) { \
01709                 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
01710             }else{ \
01711                 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
01712             } \
01713         } else { \
01714             int coeff_abs = 2; \
01715             ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
01716             node_ctx = coeff_abs_level_transition[1][node_ctx]; \
01717 \
01718             while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
01719                 coeff_abs++; \
01720             } \
01721 \
01722             if( coeff_abs >= 15 ) { \
01723                 int j = 0; \
01724                 while( get_cabac_bypass( CC ) ) { \
01725                     j++; \
01726                 } \
01727 \
01728                 coeff_abs=1; \
01729                 while( j-- ) { \
01730                     coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
01731                 } \
01732                 coeff_abs+= 14; \
01733             } \
01734 \
01735             if( is_dc ) { \
01736                 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
01737             }else{ \
01738                 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
01739             } \
01740         } \
01741     } while ( coeff_count );
01742 
01743         if (h->pixel_shift) {
01744             STORE_BLOCK(int32_t)
01745         } else {
01746             STORE_BLOCK(int16_t)
01747         }
01748 #ifdef CABAC_ON_STACK
01749             h->cabac.range     = cc.range     ;
01750             h->cabac.low       = cc.low       ;
01751             h->cabac.bytestream= cc.bytestream;
01752 #endif
01753 
01754 }
01755 
01756 static void decode_cabac_residual_dc_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int max_coeff ) {
01757     decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 0);
01758 }
01759 
01760 static void decode_cabac_residual_dc_internal_422(H264Context *h, DCTELEM *block,
01761                                                   int cat, int n, const uint8_t *scantable,
01762                                                   int max_coeff)
01763 {
01764     decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 1);
01765 }
01766 
01767 static void decode_cabac_residual_nondc_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
01768     decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 0, 0);
01769 }
01770 
01771 /* cat: 0-> DC 16x16  n = 0
01772  *      1-> AC 16x16  n = luma4x4idx
01773  *      2-> Luma4x4   n = luma4x4idx
01774  *      3-> DC Chroma n = iCbCr
01775  *      4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
01776  *      5-> Luma8x8   n = 4 * luma8x8idx */
01777 
01778 /* Partially inline the CABAC residual decode: inline the coded block flag.
01779  * This has very little impact on binary size and improves performance
01780  * because it allows improved constant propagation into get_cabac_cbf_ctx,
01781  * as well as because most blocks have zero CBFs. */
01782 
01783 static av_always_inline void decode_cabac_residual_dc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int max_coeff ) {
01784     /* read coded block flag */
01785     if( get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 1 ) ] ) == 0 ) {
01786         h->non_zero_count_cache[scan8[n]] = 0;
01787         return;
01788     }
01789     decode_cabac_residual_dc_internal( h, block, cat, n, scantable, max_coeff );
01790 }
01791 
01792 static av_always_inline void
01793 decode_cabac_residual_dc_422(H264Context *h, DCTELEM *block,
01794                              int cat, int n, const uint8_t *scantable,
01795                              int max_coeff)
01796 {
01797     /* read coded block flag */
01798     if (get_cabac(&h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, cat, n, max_coeff, 1)]) == 0) {
01799         h->non_zero_count_cache[scan8[n]] = 0;
01800         return;
01801     }
01802     decode_cabac_residual_dc_internal_422(h, block, cat, n, scantable, max_coeff);
01803 }
01804 
01805 static av_always_inline void decode_cabac_residual_nondc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
01806     /* read coded block flag */
01807     if( (cat != 5 || CHROMA444) && get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 0 ) ] ) == 0 ) {
01808         if( max_coeff == 64 ) {
01809             fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
01810         } else {
01811             h->non_zero_count_cache[scan8[n]] = 0;
01812         }
01813         return;
01814     }
01815     decode_cabac_residual_nondc_internal( h, block, cat, n, scantable, qmul, max_coeff );
01816 }
01817 
01818 static av_always_inline void decode_cabac_luma_residual( H264Context *h, const uint8_t *scan, const uint8_t *scan8x8, int pixel_shift, int mb_type, int cbp, int p )
01819 {
01820     static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
01821     const uint32_t *qmul;
01822     int i8x8, i4x4;
01823     MpegEncContext * const s = &h->s;
01824     int qscale = p == 0 ? s->qscale : h->chroma_qp[p-1];
01825     if( IS_INTRA16x16( mb_type ) ) {
01826         //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
01827         AV_ZERO128(h->mb_luma_dc[p]+0);
01828         AV_ZERO128(h->mb_luma_dc[p]+8);
01829         AV_ZERO128(h->mb_luma_dc[p]+16);
01830         AV_ZERO128(h->mb_luma_dc[p]+24);
01831         decode_cabac_residual_dc(h, h->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
01832 
01833         if( cbp&15 ) {
01834             qmul = h->dequant4_coeff[p][qscale];
01835             for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
01836                 const int index = 16*p + i4x4;
01837                 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", index );
01838                 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
01839             }
01840         } else {
01841             fill_rectangle(&h->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
01842         }
01843     } else {
01844         int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
01845         for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
01846             if( cbp & (1<<i8x8) ) {
01847                 if( IS_8x8DCT(mb_type) ) {
01848                     const int index = 16*p + 4*i8x8;
01849                     decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
01850                                                 scan8x8, h->dequant8_coeff[cqm][qscale], 64);
01851                 } else {
01852                     qmul = h->dequant4_coeff[cqm][qscale];
01853                     for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
01854                         const int index = 16*p + 4*i8x8 + i4x4;
01855                         //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %d\n", index );
01856 //START_TIMER
01857                         decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
01858 //STOP_TIMER("decode_residual")
01859                     }
01860                 }
01861             } else {
01862                 fill_rectangle(&h->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
01863             }
01864         }
01865     }
01866 }
01867 
01872 int ff_h264_decode_mb_cabac(H264Context *h) {
01873     MpegEncContext * const s = &h->s;
01874     int mb_xy;
01875     int mb_type, partition_count, cbp = 0;
01876     int dct8x8_allowed= h->pps.transform_8x8_mode;
01877     int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2;
01878     const int pixel_shift = h->pixel_shift;
01879 
01880     mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
01881 
01882     tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
01883     if( h->slice_type_nos != AV_PICTURE_TYPE_I ) {
01884         int skip;
01885         /* a skipped mb needs the aff flag from the following mb */
01886         if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped )
01887             skip = h->next_mb_skipped;
01888         else
01889             skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y );
01890         /* read skip flags */
01891         if( skip ) {
01892             if( FRAME_MBAFF && (s->mb_y&1)==0 ){
01893                 s->current_picture.f.mb_type[mb_xy] = MB_TYPE_SKIP;
01894                 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 );
01895                 if(!h->next_mb_skipped)
01896                     h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
01897             }
01898 
01899             decode_mb_skip(h);
01900 
01901             h->cbp_table[mb_xy] = 0;
01902             h->chroma_pred_mode_table[mb_xy] = 0;
01903             h->last_qscale_diff = 0;
01904 
01905             return 0;
01906 
01907         }
01908     }
01909     if(FRAME_MBAFF){
01910         if( (s->mb_y&1) == 0 )
01911             h->mb_mbaff =
01912             h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
01913     }
01914 
01915     h->prev_mb_skipped = 0;
01916 
01917     fill_decode_neighbors(h, -(MB_FIELD));
01918 
01919     if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
01920         int ctx = 0;
01921         assert(h->slice_type_nos == AV_PICTURE_TYPE_B);
01922 
01923         if( !IS_DIRECT( h->left_type[LTOP]-1 ) )
01924             ctx++;
01925         if( !IS_DIRECT( h->top_type-1 ) )
01926             ctx++;
01927 
01928         if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
01929             mb_type= 0; /* B_Direct_16x16 */
01930         }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
01931             mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
01932         }else{
01933             int bits;
01934             bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
01935             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
01936             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
01937             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
01938             if( bits < 8 ){
01939                 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
01940             }else if( bits == 13 ){
01941                 mb_type= decode_cabac_intra_mb_type(h, 32, 0);
01942                 goto decode_intra_mb;
01943             }else if( bits == 14 ){
01944                 mb_type= 11; /* B_L1_L0_8x16 */
01945             }else if( bits == 15 ){
01946                 mb_type= 22; /* B_8x8 */
01947             }else{
01948                 bits= ( bits<<1 ) + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
01949                 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
01950             }
01951         }
01952             partition_count= b_mb_type_info[mb_type].partition_count;
01953             mb_type=         b_mb_type_info[mb_type].type;
01954     } else if( h->slice_type_nos == AV_PICTURE_TYPE_P ) {
01955         if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
01956             /* P-type */
01957             if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
01958                 /* P_L0_D16x16, P_8x8 */
01959                 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
01960             } else {
01961                 /* P_L0_D8x16, P_L0_D16x8 */
01962                 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
01963             }
01964             partition_count= p_mb_type_info[mb_type].partition_count;
01965             mb_type=         p_mb_type_info[mb_type].type;
01966         } else {
01967             mb_type= decode_cabac_intra_mb_type(h, 17, 0);
01968             goto decode_intra_mb;
01969         }
01970     } else {
01971         mb_type= decode_cabac_intra_mb_type(h, 3, 1);
01972         if(h->slice_type == AV_PICTURE_TYPE_SI && mb_type)
01973             mb_type--;
01974         assert(h->slice_type_nos == AV_PICTURE_TYPE_I);
01975 decode_intra_mb:
01976         partition_count = 0;
01977         cbp= i_mb_type_info[mb_type].cbp;
01978         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
01979         mb_type= i_mb_type_info[mb_type].type;
01980     }
01981     if(MB_FIELD)
01982         mb_type |= MB_TYPE_INTERLACED;
01983 
01984     h->slice_table[ mb_xy ]= h->slice_num;
01985 
01986     if(IS_INTRA_PCM(mb_type)) {
01987         static const uint16_t mb_sizes[4] = {256,384,512,768};
01988         const int mb_size = mb_sizes[h->sps.chroma_format_idc]*h->sps.bit_depth_luma >> 3;
01989         const uint8_t *ptr;
01990 
01991         // We assume these blocks are very rare so we do not optimize it.
01992         // FIXME The two following lines get the bitstream position in the cabac
01993         // decode, I think it should be done by a function in cabac.h (or cabac.c).
01994         ptr= h->cabac.bytestream;
01995         if(h->cabac.low&0x1) ptr--;
01996         if(CABAC_BITS==16){
01997             if(h->cabac.low&0x1FF) ptr--;
01998         }
01999 
02000         // The pixels are stored in the same order as levels in h->mb array.
02001         if ((int) (h->cabac.bytestream_end - ptr) < mb_size)
02002             return -1;
02003         memcpy(h->mb, ptr, mb_size); ptr+=mb_size;
02004 
02005         ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
02006 
02007         // All blocks are present
02008         h->cbp_table[mb_xy] = 0xf7ef;
02009         h->chroma_pred_mode_table[mb_xy] = 0;
02010         // In deblocking, the quantizer is 0
02011         s->current_picture.f.qscale_table[mb_xy] = 0;
02012         // All coeffs are present
02013         memset(h->non_zero_count[mb_xy], 16, 48);
02014         s->current_picture.f.mb_type[mb_xy] = mb_type;
02015         h->last_qscale_diff = 0;
02016         return 0;
02017     }
02018 
02019     if(MB_MBAFF){
02020         h->ref_count[0] <<= 1;
02021         h->ref_count[1] <<= 1;
02022     }
02023 
02024     fill_decode_caches(h, mb_type);
02025 
02026     if( IS_INTRA( mb_type ) ) {
02027         int i, pred_mode;
02028         if( IS_INTRA4x4( mb_type ) ) {
02029             if( dct8x8_allowed && get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ) ) {
02030                 mb_type |= MB_TYPE_8x8DCT;
02031                 for( i = 0; i < 16; i+=4 ) {
02032                     int pred = pred_intra_mode( h, i );
02033                     int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
02034                     fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
02035                 }
02036             } else {
02037                 for( i = 0; i < 16; i++ ) {
02038                     int pred = pred_intra_mode( h, i );
02039                     h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
02040 
02041                 //av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%d\n", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] );
02042                 }
02043             }
02044             write_back_intra_pred_mode(h);
02045             if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
02046         } else {
02047             h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode, 0 );
02048             if( h->intra16x16_pred_mode < 0 ) return -1;
02049         }
02050         if(decode_chroma){
02051             h->chroma_pred_mode_table[mb_xy] =
02052             pred_mode                        = decode_cabac_mb_chroma_pre_mode( h );
02053 
02054             pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode, 1 );
02055             if( pred_mode < 0 ) return -1;
02056             h->chroma_pred_mode= pred_mode;
02057         } else {
02058             h->chroma_pred_mode= DC_128_PRED8x8;
02059         }
02060     } else if( partition_count == 4 ) {
02061         int i, j, sub_partition_count[4], list, ref[2][4];
02062 
02063         if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
02064             for( i = 0; i < 4; i++ ) {
02065                 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
02066                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
02067                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
02068             }
02069             if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
02070                           h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
02071                 ff_h264_pred_direct_motion(h, &mb_type);
02072                 h->ref_cache[0][scan8[4]] =
02073                 h->ref_cache[1][scan8[4]] =
02074                 h->ref_cache[0][scan8[12]] =
02075                 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
02076                     for( i = 0; i < 4; i++ )
02077                         fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, (h->sub_mb_type[i]>>1)&0xFF, 1 );
02078             }
02079         } else {
02080             for( i = 0; i < 4; i++ ) {
02081                 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
02082                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
02083                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
02084             }
02085         }
02086 
02087         for( list = 0; list < h->list_count; list++ ) {
02088                 for( i = 0; i < 4; i++ ) {
02089                     if(IS_DIRECT(h->sub_mb_type[i])) continue;
02090                     if(IS_DIR(h->sub_mb_type[i], 0, list)){
02091                         if( h->ref_count[list] > 1 ){
02092                             ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
02093                             if(ref[list][i] >= (unsigned)h->ref_count[list]){
02094                                 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], h->ref_count[list]);
02095                                 return -1;
02096                             }
02097                         }else
02098                             ref[list][i] = 0;
02099                     } else {
02100                         ref[list][i] = -1;
02101                     }
02102                                                        h->ref_cache[list][ scan8[4*i]+1 ]=
02103                     h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
02104                 }
02105         }
02106 
02107         if(dct8x8_allowed)
02108             dct8x8_allowed = get_dct8x8_allowed(h);
02109 
02110         for(list=0; list<h->list_count; list++){
02111             for(i=0; i<4; i++){
02112                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ];
02113                 if(IS_DIRECT(h->sub_mb_type[i])){
02114                     fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
02115                     continue;
02116                 }
02117 
02118                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
02119                     const int sub_mb_type= h->sub_mb_type[i];
02120                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
02121                     for(j=0; j<sub_partition_count[i]; j++){
02122                         int mpx, mpy;
02123                         int mx, my;
02124                         const int index= 4*i + block_width*j;
02125                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
02126                         uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
02127                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
02128                         DECODE_CABAC_MB_MVD( h, list, index)
02129                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
02130 
02131                         if(IS_SUB_8X8(sub_mb_type)){
02132                             mv_cache[ 1 ][0]=
02133                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
02134                             mv_cache[ 1 ][1]=
02135                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
02136 
02137                             mvd_cache[ 1 ][0]=
02138                             mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
02139                             mvd_cache[ 1 ][1]=
02140                             mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
02141                         }else if(IS_SUB_8X4(sub_mb_type)){
02142                             mv_cache[ 1 ][0]= mx;
02143                             mv_cache[ 1 ][1]= my;
02144 
02145                             mvd_cache[ 1 ][0]=  mpx;
02146                             mvd_cache[ 1 ][1]= mpy;
02147                         }else if(IS_SUB_4X8(sub_mb_type)){
02148                             mv_cache[ 8 ][0]= mx;
02149                             mv_cache[ 8 ][1]= my;
02150 
02151                             mvd_cache[ 8 ][0]= mpx;
02152                             mvd_cache[ 8 ][1]= mpy;
02153                         }
02154                         mv_cache[ 0 ][0]= mx;
02155                         mv_cache[ 0 ][1]= my;
02156 
02157                         mvd_cache[ 0 ][0]= mpx;
02158                         mvd_cache[ 0 ][1]= mpy;
02159                     }
02160                 }else{
02161                     fill_rectangle(h->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
02162                     fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
02163                 }
02164             }
02165         }
02166     } else if( IS_DIRECT(mb_type) ) {
02167         ff_h264_pred_direct_motion(h, &mb_type);
02168         fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
02169         fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
02170         dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
02171     } else {
02172         int list, i;
02173         if(IS_16X16(mb_type)){
02174             for(list=0; list<h->list_count; list++){
02175                 if(IS_DIR(mb_type, 0, list)){
02176                     int ref;
02177                     if(h->ref_count[list] > 1){
02178                         ref= decode_cabac_mb_ref(h, list, 0);
02179                         if(ref >= (unsigned)h->ref_count[list]){
02180                             av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
02181                             return -1;
02182                         }
02183                     }else
02184                         ref=0;
02185                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
02186                 }
02187             }
02188             for(list=0; list<h->list_count; list++){
02189                 if(IS_DIR(mb_type, 0, list)){
02190                     int mx,my,mpx,mpy;
02191                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
02192                     DECODE_CABAC_MB_MVD( h, list, 0)
02193                     tprintf(s->avctx, "final mv:%d %d\n", mx, my);
02194 
02195                     fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
02196                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
02197                 }
02198             }
02199         }
02200         else if(IS_16X8(mb_type)){
02201             for(list=0; list<h->list_count; list++){
02202                     for(i=0; i<2; i++){
02203                         if(IS_DIR(mb_type, i, list)){
02204                             int ref;
02205                             if(h->ref_count[list] > 1){
02206                                 ref= decode_cabac_mb_ref( h, list, 8*i );
02207                                 if(ref >= (unsigned)h->ref_count[list]){
02208                                     av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
02209                                     return -1;
02210                                 }
02211                             }else
02212                                 ref=0;
02213                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
02214                         }else
02215                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
02216                     }
02217             }
02218             for(list=0; list<h->list_count; list++){
02219                 for(i=0; i<2; i++){
02220                     if(IS_DIR(mb_type, i, list)){
02221                         int mx,my,mpx,mpy;
02222                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
02223                         DECODE_CABAC_MB_MVD( h, list, 8*i)
02224                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
02225 
02226                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
02227                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
02228                     }else{
02229                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
02230                         fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
02231                     }
02232                 }
02233             }
02234         }else{
02235             assert(IS_8X16(mb_type));
02236             for(list=0; list<h->list_count; list++){
02237                     for(i=0; i<2; i++){
02238                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
02239                             int ref;
02240                             if(h->ref_count[list] > 1){
02241                                 ref= decode_cabac_mb_ref( h, list, 4*i );
02242                                 if(ref >= (unsigned)h->ref_count[list]){
02243                                     av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
02244                                     return -1;
02245                                 }
02246                             }else
02247                                 ref=0;
02248                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
02249                         }else
02250                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
02251                     }
02252             }
02253             for(list=0; list<h->list_count; list++){
02254                 for(i=0; i<2; i++){
02255                     if(IS_DIR(mb_type, i, list)){
02256                         int mx,my,mpx,mpy;
02257                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
02258                         DECODE_CABAC_MB_MVD( h, list, 4*i)
02259 
02260                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
02261                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
02262                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
02263                     }else{
02264                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
02265                         fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
02266                     }
02267                 }
02268             }
02269         }
02270     }
02271 
02272    if( IS_INTER( mb_type ) ) {
02273         h->chroma_pred_mode_table[mb_xy] = 0;
02274         write_back_motion( h, mb_type );
02275    }
02276 
02277     if( !IS_INTRA16x16( mb_type ) ) {
02278         cbp  = decode_cabac_mb_cbp_luma( h );
02279         if(decode_chroma)
02280             cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
02281     }
02282 
02283     h->cbp_table[mb_xy] = h->cbp = cbp;
02284 
02285     if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
02286         mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
02287     }
02288 
02289     /* It would be better to do this in fill_decode_caches, but we don't know
02290      * the transform mode of the current macroblock there. */
02291     if (CHROMA444 && IS_8x8DCT(mb_type)){
02292         int i;
02293         uint8_t *nnz_cache = h->non_zero_count_cache;
02294         for (i = 0; i < 2; i++){
02295             if (h->left_type[LEFT(i)] && !IS_8x8DCT(h->left_type[LEFT(i)])){
02296                 nnz_cache[3+8* 1 + 2*8*i]=
02297                 nnz_cache[3+8* 2 + 2*8*i]=
02298                 nnz_cache[3+8* 6 + 2*8*i]=
02299                 nnz_cache[3+8* 7 + 2*8*i]=
02300                 nnz_cache[3+8*11 + 2*8*i]=
02301                 nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
02302             }
02303         }
02304         if (h->top_type && !IS_8x8DCT(h->top_type)){
02305             uint32_t top_empty = CABAC && !IS_INTRA(mb_type) ? 0 : 0x40404040;
02306             AV_WN32A(&nnz_cache[4+8* 0], top_empty);
02307             AV_WN32A(&nnz_cache[4+8* 5], top_empty);
02308             AV_WN32A(&nnz_cache[4+8*10], top_empty);
02309         }
02310     }
02311     s->current_picture.f.mb_type[mb_xy] = mb_type;
02312 
02313     if( cbp || IS_INTRA16x16( mb_type ) ) {
02314         const uint8_t *scan, *scan8x8;
02315         const uint32_t *qmul;
02316 
02317         if(IS_INTERLACED(mb_type)){
02318             scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
02319             scan= s->qscale ? h->field_scan : h->field_scan_q0;
02320         }else{
02321             scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
02322             scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
02323         }
02324 
02325         // decode_cabac_mb_dqp
02326         if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
02327             int val = 1;
02328             int ctx= 2;
02329             const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
02330 
02331             while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
02332                 ctx= 3;
02333                 val++;
02334                 if(val > 2*max_qp){ //prevent infinite loop
02335                     av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
02336                     return -1;
02337                 }
02338             }
02339 
02340             if( val&0x01 )
02341                 val=   (val + 1)>>1 ;
02342             else
02343                 val= -((val + 1)>>1);
02344             h->last_qscale_diff = val;
02345             s->qscale += val;
02346             if(((unsigned)s->qscale) > max_qp){
02347                 if(s->qscale<0) s->qscale+= max_qp+1;
02348                 else            s->qscale-= max_qp+1;
02349             }
02350             h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
02351             h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
02352         }else
02353             h->last_qscale_diff=0;
02354 
02355         decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
02356         if(CHROMA444){
02357             decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
02358             decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
02359         } else if (CHROMA422) {
02360             if( cbp&0x30 ){
02361                 int c;
02362                 for( c = 0; c < 2; c++ ) {
02363                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
02364                     decode_cabac_residual_dc_422(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3,
02365                                                  CHROMA_DC_BLOCK_INDEX + c,
02366                                                  chroma422_dc_scan, 8);
02367                 }
02368             }
02369 
02370             if( cbp&0x20 ) {
02371                 int c, i, i8x8;
02372                 for( c = 0; c < 2; c++ ) {
02373                     DCTELEM *mb = h->mb + (16*(16 + 16*c) << pixel_shift);
02374                     qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
02375                     for (i8x8 = 0; i8x8 < 2; i8x8++) {
02376                         for (i = 0; i < 4; i++) {
02377                             const int index = 16 + 16 * c + 8*i8x8 + i;
02378                             //av_log(s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16);
02379                             decode_cabac_residual_nondc(h, mb, 4, index, scan + 1, qmul, 15);
02380                             mb += 16<<pixel_shift;
02381                         }
02382                     }
02383                 }
02384             } else {
02385                 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
02386                 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
02387             }
02388         } else /* yuv420 */ {
02389             if( cbp&0x30 ){
02390                 int c;
02391                 for( c = 0; c < 2; c++ ) {
02392                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
02393                     decode_cabac_residual_dc(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3, CHROMA_DC_BLOCK_INDEX+c, chroma_dc_scan, 4);
02394                 }
02395             }
02396 
02397             if( cbp&0x20 ) {
02398                 int c, i;
02399                 for( c = 0; c < 2; c++ ) {
02400                     qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
02401                     for( i = 0; i < 4; i++ ) {
02402                         const int index = 16 + 16 * c + i;
02403                         //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 );
02404                         decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
02405                     }
02406                 }
02407             } else {
02408                 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
02409                 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
02410             }
02411         }
02412     } else {
02413         fill_rectangle(&h->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
02414         fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
02415         fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
02416         h->last_qscale_diff = 0;
02417     }
02418 
02419     s->current_picture.f.qscale_table[mb_xy] = s->qscale;
02420     write_back_non_zero_count(h);
02421 
02422     if(MB_MBAFF){
02423         h->ref_count[0] >>= 1;
02424         h->ref_count[1] >>= 1;
02425     }
02426 
02427     return 0;
02428 }