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