diff libavcodec/h264_entropy.c @ 2:897f711a7157

rearrange to work with autoconf
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Tue, 25 Sep 2012 15:55:33 +0200
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/libavcodec/h264_entropy.c	Tue Sep 25 15:55:33 2012 +0200
     1.3 @@ -0,0 +1,2065 @@
     1.4 +/*
     1.5 + * H.26L/H.264/AVC/JVT/14496-10/... cabac decoding
     1.6 + * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
     1.7 + *
     1.8 + * This file is part of FFmpeg.
     1.9 + *
    1.10 + * FFmpeg is free software; you can redistribute it and/or
    1.11 + * modify it under the terms of the GNU Lesser General Public
    1.12 + * License as published by the Free Software Foundation; either
    1.13 + * version 2.1 of the License, or (at your option) any later version.
    1.14 + *
    1.15 + * FFmpeg is distributed in the hope that it will be useful,
    1.16 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.17 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    1.18 + * Lesser General Public License for more details.
    1.19 + *
    1.20 + * You should have received a copy of the GNU Lesser General Public
    1.21 + * License along with FFmpeg; if not, write to the Free Software
    1.22 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    1.23 + */
    1.24 +
    1.25 +/**
    1.26 + * @file
    1.27 + * H.264 / AVC / MPEG4 part10 cabac decoding.
    1.28 + * @author Michael Niedermayer <michaelni@gmx.at>
    1.29 + */
    1.30 +
    1.31 +#include "avcodec.h"
    1.32 +#include "h264_types.h"
    1.33 +#include "h264_data.h"
    1.34 +#include "cabac.h"
    1.35 +#include "rectangle.h"
    1.36 +#include "h264_misc.h"
    1.37 +
    1.38 +// #undef NDEBUG
    1.39 +#include <assert.h>
    1.40 +
    1.41 +/* Cabac pre state table */
    1.42 +
    1.43 +static const int8_t cabac_context_init_I[460][2] =
    1.44 +{
    1.45 +    /* 0 - 10 */
    1.46 +    { 20, -15 }, {  2, 54 },  {  3,  74 }, { 20, -15 },
    1.47 +    {  2,  54 }, {  3, 74 },  { -28,127 }, { -23, 104 },
    1.48 +    { -6,  53 }, { -1, 54 },  {  7,  51 },
    1.49 +
    1.50 +    /* 11 - 23 unsused for I */
    1.51 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.52 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.53 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.54 +    { 0, 0 },
    1.55 +
    1.56 +    /* 24- 39 */
    1.57 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.58 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.59 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.60 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.61 +
    1.62 +    /* 40 - 53 */
    1.63 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.64 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.65 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.66 +    { 0, 0 },    { 0, 0 },
    1.67 +
    1.68 +    /* 54 - 59 */
    1.69 +    { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
    1.70 +    { 0, 0 },    { 0, 0 },
    1.71 +
    1.72 +    /* 60 - 69 */
    1.73 +    { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
    1.74 +    { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
    1.75 +    { 13, 41 },  { 3, 62 },
    1.76 +
    1.77 +    /* 70 -> 87 */
    1.78 +    { 0, 11 },   { 1, 55 },   { 0, 69 },     { -17, 127 },
    1.79 +    { -13, 102 },{ 0, 82 },   { -7, 74 },    { -21, 107 },
    1.80 +    { -27, 127 },{ -31, 127 },{ -24, 127 },  { -18, 95 },
    1.81 +    { -27, 127 },{ -21, 114 },{ -30, 127 },  { -17, 123 },
    1.82 +    { -12, 115 },{ -16, 122 },
    1.83 +
    1.84 +    /* 88 -> 104 */
    1.85 +    { -11, 115 },{ -12, 63 }, { -2, 68 },    { -15, 84 },
    1.86 +    { -13, 104 },{ -3, 70 },  { -8, 93 },    { -10, 90 },
    1.87 +    { -30, 127 },{ -1, 74 },  { -6, 97 },    { -7, 91 },
    1.88 +    { -20, 127 },{ -4, 56 },  { -5, 82 },    { -7, 76 },
    1.89 +    { -22, 125 },
    1.90 +
    1.91 +    /* 105 -> 135 */
    1.92 +    { -7, 93 },  { -11, 87 }, { -3, 77 },    { -5, 71 },
    1.93 +    { -4, 63 },  { -4, 68 },  { -12, 84 },   { -7, 62 },
    1.94 +    { -7, 65 },  { 8, 61 },   { 5, 56 },     { -2, 66 },
    1.95 +    { 1, 64 },   { 0, 61 },   { -2, 78 },    { 1, 50 },
    1.96 +    { 7, 52 },   { 10, 35 },  { 0, 44 },     { 11, 38 },
    1.97 +    { 1, 45 },   { 0, 46 },   { 5, 44 },     { 31, 17 },
    1.98 +    { 1, 51 },   { 7, 50 },   { 28, 19 },    { 16, 33 },
    1.99 +    { 14, 62 },  { -13, 108 },{ -15, 100 },
   1.100 +
   1.101 +    /* 136 -> 165 */
   1.102 +    { -13, 101 },{ -13, 91 }, { -12, 94 },   { -10, 88 },
   1.103 +    { -16, 84 }, { -10, 86 }, { -7, 83 },    { -13, 87 },
   1.104 +    { -19, 94 }, { 1, 70 },   { 0, 72 },     { -5, 74 },
   1.105 +    { 18, 59 },  { -8, 102 }, { -15, 100 },  { 0, 95 },
   1.106 +    { -4, 75 },  { 2, 72 },   { -11, 75 },   { -3, 71 },
   1.107 +    { 15, 46 },  { -13, 69 }, { 0, 62 },     { 0, 65 },
   1.108 +    { 21, 37 },  { -15, 72 }, { 9, 57 },     { 16, 54 },
   1.109 +    { 0, 62 },   { 12, 72 },
   1.110 +
   1.111 +    /* 166 -> 196 */
   1.112 +    { 24, 0 },   { 15, 9 },   { 8, 25 },     { 13, 18 },
   1.113 +    { 15, 9 },   { 13, 19 },  { 10, 37 },    { 12, 18 },
   1.114 +    { 6, 29 },   { 20, 33 },  { 15, 30 },    { 4, 45 },
   1.115 +    { 1, 58 },   { 0, 62 },   { 7, 61 },     { 12, 38 },
   1.116 +    { 11, 45 },  { 15, 39 },  { 11, 42 },    { 13, 44 },
   1.117 +    { 16, 45 },  { 12, 41 },  { 10, 49 },    { 30, 34 },
   1.118 +    { 18, 42 },  { 10, 55 },  { 17, 51 },    { 17, 46 },
   1.119 +    { 0, 89 },   { 26, -19 }, { 22, -17 },
   1.120 +
   1.121 +    /* 197 -> 226 */
   1.122 +    { 26, -17 }, { 30, -25 }, { 28, -20 },   { 33, -23 },
   1.123 +    { 37, -27 }, { 33, -23 }, { 40, -28 },   { 38, -17 },
   1.124 +    { 33, -11 }, { 40, -15 }, { 41, -6 },    { 38, 1 },
   1.125 +    { 41, 17 },  { 30, -6 },  { 27, 3 },     { 26, 22 },
   1.126 +    { 37, -16 }, { 35, -4 },  { 38, -8 },    { 38, -3 },
   1.127 +    { 37, 3 },   { 38, 5 },   { 42, 0 },     { 35, 16 },
   1.128 +    { 39, 22 },  { 14, 48 },  { 27, 37 },    { 21, 60 },
   1.129 +    { 12, 68 },  { 2, 97 },
   1.130 +
   1.131 +    /* 227 -> 251 */
   1.132 +    { -3, 71 },  { -6, 42 },  { -5, 50 },    { -3, 54 },
   1.133 +    { -2, 62 },  { 0, 58 },   { 1, 63 },     { -2, 72 },
   1.134 +    { -1, 74 },  { -9, 91 },  { -5, 67 },    { -5, 27 },
   1.135 +    { -3, 39 },  { -2, 44 },  { 0, 46 },     { -16, 64 },
   1.136 +    { -8, 68 },  { -10, 78 }, { -6, 77 },    { -10, 86 },
   1.137 +    { -12, 92 }, { -15, 55 }, { -10, 60 },   { -6, 62 },
   1.138 +    { -4, 65 },
   1.139 +
   1.140 +    /* 252 -> 275 */
   1.141 +    { -12, 73 }, { -8, 76 },  { -7, 80 },    { -9, 88 },
   1.142 +    { -17, 110 },{ -11, 97 }, { -20, 84 },   { -11, 79 },
   1.143 +    { -6, 73 },  { -4, 74 },  { -13, 86 },   { -13, 96 },
   1.144 +    { -11, 97 }, { -19, 117 },{ -8, 78 },    { -5, 33 },
   1.145 +    { -4, 48 },  { -2, 53 },  { -3, 62 },    { -13, 71 },
   1.146 +    { -10, 79 }, { -12, 86 }, { -13, 90 },   { -14, 97 },
   1.147 +
   1.148 +    /* 276 a bit special (not used, bypass is used instead) */
   1.149 +    { 0, 0 },
   1.150 +
   1.151 +    /* 277 -> 307 */
   1.152 +    { -6, 93 },  { -6, 84 },  { -8, 79 },    { 0, 66 },
   1.153 +    { -1, 71 },  { 0, 62 },   { -2, 60 },    { -2, 59 },
   1.154 +    { -5, 75 },  { -3, 62 },  { -4, 58 },    { -9, 66 },
   1.155 +    { -1, 79 },  { 0, 71 },   { 3, 68 },     { 10, 44 },
   1.156 +    { -7, 62 },  { 15, 36 },  { 14, 40 },    { 16, 27 },
   1.157 +    { 12, 29 },  { 1, 44 },   { 20, 36 },    { 18, 32 },
   1.158 +    { 5, 42 },   { 1, 48 },   { 10, 62 },    { 17, 46 },
   1.159 +    { 9, 64 },   { -12, 104 },{ -11, 97 },
   1.160 +
   1.161 +    /* 308 -> 337 */
   1.162 +    { -16, 96 }, { -7, 88 },  { -8, 85 },    { -7, 85 },
   1.163 +    { -9, 85 },  { -13, 88 }, { 4, 66 },     { -3, 77 },
   1.164 +    { -3, 76 },  { -6, 76 },  { 10, 58 },    { -1, 76 },
   1.165 +    { -1, 83 },  { -7, 99 },  { -14, 95 },   { 2, 95 },
   1.166 +    { 0, 76 },   { -5, 74 },  { 0, 70 },     { -11, 75 },
   1.167 +    { 1, 68 },   { 0, 65 },   { -14, 73 },   { 3, 62 },
   1.168 +    { 4, 62 },   { -1, 68 },  { -13, 75 },   { 11, 55 },
   1.169 +    { 5, 64 },   { 12, 70 },
   1.170 +
   1.171 +    /* 338 -> 368 */
   1.172 +    { 15, 6 },   { 6, 19 },   { 7, 16 },     { 12, 14 },
   1.173 +    { 18, 13 },  { 13, 11 },  { 13, 15 },    { 15, 16 },
   1.174 +    { 12, 23 },  { 13, 23 },  { 15, 20 },    { 14, 26 },
   1.175 +    { 14, 44 },  { 17, 40 },  { 17, 47 },    { 24, 17 },
   1.176 +    { 21, 21 },  { 25, 22 },  { 31, 27 },    { 22, 29 },
   1.177 +    { 19, 35 },  { 14, 50 },  { 10, 57 },    { 7, 63 },
   1.178 +    { -2, 77 },  { -4, 82 },  { -3, 94 },    { 9, 69 },
   1.179 +    { -12, 109 },{ 36, -35 }, { 36, -34 },
   1.180 +
   1.181 +    /* 369 -> 398 */
   1.182 +    { 32, -26 }, { 37, -30 }, { 44, -32 },   { 34, -18 },
   1.183 +    { 34, -15 }, { 40, -15 }, { 33, -7 },    { 35, -5 },
   1.184 +    { 33, 0 },   { 38, 2 },   { 33, 13 },    { 23, 35 },
   1.185 +    { 13, 58 },  { 29, -3 },  { 26, 0 },     { 22, 30 },
   1.186 +    { 31, -7 },  { 35, -15 }, { 34, -3 },    { 34, 3 },
   1.187 +    { 36, -1 },  { 34, 5 },   { 32, 11 },    { 35, 5 },
   1.188 +    { 34, 12 },  { 39, 11 },  { 30, 29 },    { 34, 26 },
   1.189 +    { 29, 39 },  { 19, 66 },
   1.190 +
   1.191 +    /* 399 -> 435 */
   1.192 +    {  31,  21 }, {  31,  31 }, {  25,  50 },
   1.193 +    { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11,  85 },
   1.194 +    { -15,  92 }, { -14,  89 }, { -26,  71 }, { -15,  81 },
   1.195 +    { -14,  80 }, {   0,  68 }, { -14,  70 }, { -24,  56 },
   1.196 +    { -23,  68 }, { -24,  50 }, { -11,  74 }, {  23, -13 },
   1.197 +    {  26, -13 }, {  40, -15 }, {  49, -14 }, {  44,   3 },
   1.198 +    {  45,   6 }, {  44,  34 }, {  33,  54 }, {  19,  82 },
   1.199 +    {  -3,  75 }, {  -1,  23 }, {   1,  34 }, {   1,  43 },
   1.200 +    {   0,  54 }, {  -2,  55 }, {   0,  61 }, {   1,  64 },
   1.201 +    {   0,  68 }, {  -9,  92 },
   1.202 +
   1.203 +    /* 436 -> 459 */
   1.204 +    { -14, 106 }, { -13,  97 }, { -15,  90 }, { -12,  90 },
   1.205 +    { -18,  88 }, { -10,  73 }, {  -9,  79 }, { -14,  86 },
   1.206 +    { -10,  73 }, { -10,  70 }, { -10,  69 }, {  -5,  66 },
   1.207 +    {  -9,  64 }, {  -5,  58 }, {   2,  59 }, {  21, -10 },
   1.208 +    {  24, -11 }, {  28,  -8 }, {  28,  -1 }, {  29,   3 },
   1.209 +    {  29,   9 }, {  35,  20 }, {  29,  36 }, {  14,  67 }
   1.210 +};
   1.211 +
   1.212 +static const int8_t cabac_context_init_PB[3][460][2] =
   1.213 +{
   1.214 +    /* i_cabac_init_idc == 0 */
   1.215 +    {
   1.216 +        /* 0 - 10 */
   1.217 +        {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
   1.218 +        {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
   1.219 +        {  -6,  53 }, {  -1,  54 }, {   7,  51 },
   1.220 +
   1.221 +        /* 11 - 23 */
   1.222 +        {  23,  33 }, {  23,   2 }, {  21,   0 }, {   1,   9 },
   1.223 +        {   0,  49 }, { -37, 118 }, {   5,  57 }, { -13,  78 },
   1.224 +        { -11,  65 }, {   1,  62 }, {  12,  49 }, {  -4,  73 },
   1.225 +        {  17,  50 },
   1.226 +
   1.227 +        /* 24 - 39 */
   1.228 +        {  18,  64 }, {   9,  43 }, {  29,   0 }, {  26,  67 },
   1.229 +        {  16,  90 }, {   9, 104 }, { -46, 127 }, { -20, 104 },
   1.230 +        {   1,  67 }, { -13,  78 }, { -11,  65 }, {   1,  62 },
   1.231 +        {  -6,  86 }, { -17,  95 }, {  -6,  61 }, {   9,  45 },
   1.232 +
   1.233 +        /* 40 - 53 */
   1.234 +        {  -3,  69 }, {  -6,  81 }, { -11,  96 }, {   6,  55 },
   1.235 +        {   7,  67 }, {  -5,  86 }, {   2,  88 }, {   0,  58 },
   1.236 +        {  -3,  76 }, { -10,  94 }, {   5,  54 }, {   4,  69 },
   1.237 +        {  -3,  81 }, {   0,  88 },
   1.238 +
   1.239 +        /* 54 - 59 */
   1.240 +        {  -7,  67 }, {  -5,  74 }, {  -4,  74 }, {  -5,  80 },
   1.241 +        {  -7,  72 }, {   1,  58 },
   1.242 +
   1.243 +        /* 60 - 69 */
   1.244 +        {   0,  41 }, {   0,  63 }, {   0,  63 }, { 0, 63 },
   1.245 +        {  -9,  83 }, {   4,  86 }, {   0,  97 }, { -7, 72 },
   1.246 +        {  13,  41 }, {   3,  62 },
   1.247 +
   1.248 +        /* 70 - 87 */
   1.249 +        {   0,  45 }, {  -4,  78 }, {  -3,  96 }, { -27,  126 },
   1.250 +        { -28,  98 }, { -25, 101 }, { -23,  67 }, { -28,  82 },
   1.251 +        { -20,  94 }, { -16,  83 }, { -22, 110 }, { -21,  91 },
   1.252 +        { -18, 102 }, { -13,  93 }, { -29, 127 }, {  -7,  92 },
   1.253 +        {  -5,  89 }, {  -7,  96 }, { -13, 108 }, {  -3,  46 },
   1.254 +        {  -1,  65 }, {  -1,  57 }, {  -9,  93 }, {  -3,  74 },
   1.255 +        {  -9,  92 }, {  -8,  87 }, { -23, 126 }, {   5,  54 },
   1.256 +        {   6,  60 }, {   6,  59 }, {   6,  69 }, {  -1,  48 },
   1.257 +        {   0,  68 }, {  -4,  69 }, {  -8,  88 },
   1.258 +
   1.259 +        /* 105 -> 165 */
   1.260 +        {  -2,  85 }, {  -6,  78 }, {  -1,  75 }, {  -7,  77 },
   1.261 +        {   2,  54 }, {   5,  50 }, {  -3,  68 }, {   1,  50 },
   1.262 +        {   6,  42 }, {  -4,  81 }, {   1,  63 }, {  -4,  70 },
   1.263 +        {   0,  67 }, {   2,  57 }, {  -2,  76 }, {  11,  35 },
   1.264 +        {   4,  64 }, {   1,  61 }, {  11,  35 }, {  18,  25 },
   1.265 +        {  12,  24 }, {  13,  29 }, {  13,  36 }, { -10,  93 },
   1.266 +        {  -7,  73 }, {  -2,  73 }, {  13,  46 }, {   9,  49 },
   1.267 +        {  -7, 100 }, {   9,  53 }, {   2,  53 }, {   5,  53 },
   1.268 +        {  -2,  61 }, {   0,  56 }, {   0,  56 }, { -13,  63 },
   1.269 +        {  -5,  60 }, {  -1,  62 }, {   4,  57 }, {  -6,  69 },
   1.270 +        {   4,  57 }, {  14,  39 }, {   4,  51 }, {  13,  68 },
   1.271 +        {   3,  64 }, {   1,  61 }, {   9,  63 }, {   7,  50 },
   1.272 +        {  16,  39 }, {   5,  44 }, {   4,  52 }, {  11,  48 },
   1.273 +        {  -5,  60 }, {  -1,  59 }, {   0,  59 }, {  22,  33 },
   1.274 +        {   5,  44 }, {  14,  43 }, {  -1,  78 }, {   0,  60 },
   1.275 +        {   9,  69 },
   1.276 +
   1.277 +        /* 166 - 226 */
   1.278 +        {  11,  28 }, {   2,  40 }, {   3,  44 }, {   0,  49 },
   1.279 +        {   0,  46 }, {   2,  44 }, {   2,  51 }, {   0,  47 },
   1.280 +        {   4,  39 }, {   2,  62 }, {   6,  46 }, {   0,  54 },
   1.281 +        {   3,  54 }, {   2,  58 }, {   4,  63 }, {   6,  51 },
   1.282 +        {   6,  57 }, {   7,  53 }, {   6,  52 }, {   6,  55 },
   1.283 +        {  11,  45 }, {  14,  36 }, {   8,  53 }, {  -1,  82 },
   1.284 +        {   7,  55 }, {  -3,  78 }, {  15,  46 }, {  22,  31 },
   1.285 +        {  -1,  84 }, {  25,   7 }, {  30,  -7 }, {  28,   3 },
   1.286 +        {  28,   4 }, {  32,   0 }, {  34,  -1 }, {  30,   6 },
   1.287 +        {  30,   6 }, {  32,   9 }, {  31,  19 }, {  26,  27 },
   1.288 +        {  26,  30 }, {  37,  20 }, {  28,  34 }, {  17,  70 },
   1.289 +        {   1,  67 }, {   5,  59 }, {   9,  67 }, {  16,  30 },
   1.290 +        {  18,  32 }, {  18,  35 }, {  22,  29 }, {  24,  31 },
   1.291 +        {  23,  38 }, {  18,  43 }, {  20,  41 }, {  11,  63 },
   1.292 +        {   9,  59 }, {   9,  64 }, {  -1,  94 }, {  -2,  89 },
   1.293 +        {  -9, 108 },
   1.294 +
   1.295 +        /* 227 - 275 */
   1.296 +        {  -6,  76 }, {  -2,  44 }, {   0,  45 }, {   0,  52 },
   1.297 +        {  -3,  64 }, {  -2,  59 }, {  -4,  70 }, {  -4,  75 },
   1.298 +        {  -8,  82 }, { -17, 102 }, {  -9,  77 }, {   3,  24 },
   1.299 +        {   0,  42 }, {   0,  48 }, {   0,  55 }, {  -6,  59 },
   1.300 +        {  -7,  71 }, { -12,  83 }, { -11,  87 }, { -30, 119 },
   1.301 +        {   1,  58 }, {  -3,  29 }, {  -1,  36 }, {   1,  38 },
   1.302 +        {   2,  43 }, {  -6,  55 }, {   0,  58 }, {   0,  64 },
   1.303 +        {  -3,  74 }, { -10,  90 }, {   0,  70 }, {  -4,  29 },
   1.304 +        {   5,  31 }, {   7,  42 }, {   1,  59 }, {  -2,  58 },
   1.305 +        {  -3,  72 }, {  -3,  81 }, { -11,  97 }, {   0,  58 },
   1.306 +        {   8,   5 }, {  10,  14 }, {  14,  18 }, {  13,  27 },
   1.307 +        {   2,  40 }, {   0,  58 }, {  -3,  70 }, {  -6,  79 },
   1.308 +        {  -8,  85 },
   1.309 +
   1.310 +        /* 276 a bit special (not used, bypass is used instead) */
   1.311 +        { 0, 0 },
   1.312 +
   1.313 +        /* 277 - 337 */
   1.314 +        { -13, 106 }, { -16, 106 }, { -10,  87 }, { -21, 114 },
   1.315 +        { -18, 110 }, { -14,  98 }, { -22, 110 }, { -21, 106 },
   1.316 +        { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
   1.317 +        { -10,  96 }, { -12,  95 }, {  -5,  91 }, {  -9,  93 },
   1.318 +        { -22,  94 }, {  -5,  86 }, {   9,  67 }, {  -4,  80 },
   1.319 +        { -10,  85 }, {  -1,  70 }, {   7,  60 }, {   9,  58 },
   1.320 +        {   5,  61 }, {  12,  50 }, {  15,  50 }, {  18,  49 },
   1.321 +        {  17,  54 }, {  10,  41 }, {   7,  46 }, {  -1,  51 },
   1.322 +        {   7,  49 }, {   8,  52 }, {   9,  41 }, {   6,  47 },
   1.323 +        {   2,  55 }, {  13,  41 }, {  10,  44 }, {   6,  50 },
   1.324 +        {   5,  53 }, {  13,  49 }, {   4,  63 }, {   6,  64 },
   1.325 +        {  -2,  69 }, {  -2,  59 }, {   6,  70 }, {  10,  44 },
   1.326 +        {   9,  31 }, {  12,  43 }, {   3,  53 }, {  14,  34 },
   1.327 +        {  10,  38 }, {  -3,  52 }, {  13,  40 }, {  17,  32 },
   1.328 +        {   7,  44 }, {   7,  38 }, {  13,  50 }, {  10,  57 },
   1.329 +        {  26,  43 },
   1.330 +
   1.331 +        /* 338 - 398 */
   1.332 +        {  14,  11 }, {  11,  14 }, {   9,  11 }, {  18,  11 },
   1.333 +        {  21,   9 }, {  23,  -2 }, {  32, -15 }, {  32, -15 },
   1.334 +        {  34, -21 }, {  39, -23 }, {  42, -33 }, {  41, -31 },
   1.335 +        {  46, -28 }, {  38, -12 }, {  21,  29 }, {  45, -24 },
   1.336 +        {  53, -45 }, {  48, -26 }, {  65, -43 }, {  43, -19 },
   1.337 +        {  39, -10 }, {  30,   9 }, {  18,  26 }, {  20,  27 },
   1.338 +        {   0,  57 }, { -14,  82 }, {  -5,  75 }, { -19,  97 },
   1.339 +        { -35, 125 }, {  27,   0 }, {  28,   0 }, {  31,  -4 },
   1.340 +        {  27,   6 }, {  34,   8 }, {  30,  10 }, {  24,  22 },
   1.341 +        {  33,  19 }, {  22,  32 }, {  26,  31 }, {  21,  41 },
   1.342 +        {  26,  44 }, {  23,  47 }, {  16,  65 }, {  14,  71 },
   1.343 +        {   8,  60 }, {   6,  63 }, {  17,  65 }, {  21,  24 },
   1.344 +        {  23,  20 }, {  26,  23 }, {  27,  32 }, {  28,  23 },
   1.345 +        {  28,  24 }, {  23,  40 }, {  24,  32 }, {  28,  29 },
   1.346 +        {  23,  42 }, {  19,  57 }, {  22,  53 }, {  22,  61 },
   1.347 +        {  11,  86 },
   1.348 +
   1.349 +        /* 399 - 435 */
   1.350 +        {  12,  40 }, {  11,  51 }, {  14,  59 },
   1.351 +        {  -4,  79 }, {  -7,  71 }, {  -5,  69 }, {  -9,  70 },
   1.352 +        {  -8,  66 }, { -10,  68 }, { -19,  73 }, { -12,  69 },
   1.353 +        { -16,  70 }, { -15,  67 }, { -20,  62 }, { -19,  70 },
   1.354 +        { -16,  66 }, { -22,  65 }, { -20,  63 }, {   9,  -2 },
   1.355 +        {  26,  -9 }, {  33,  -9 }, {  39,  -7 }, {  41,  -2 },
   1.356 +        {  45,   3 }, {  49,   9 }, {  45,  27 }, {  36,  59 },
   1.357 +        {  -6,  66 }, {  -7,  35 }, {  -7,  42 }, {  -8,  45 },
   1.358 +        {  -5,  48 }, { -12,  56 }, {  -6,  60 }, {  -5,  62 },
   1.359 +        {  -8,  66 }, {  -8,  76 },
   1.360 +
   1.361 +        /* 436 - 459 */
   1.362 +        {  -5,  85 }, {  -6,  81 }, { -10,  77 }, {  -7,  81 },
   1.363 +        { -17,  80 }, { -18,  73 }, {  -4,  74 }, { -10,  83 },
   1.364 +        {  -9,  71 }, {  -9,  67 }, {  -1,  61 }, {  -8,  66 },
   1.365 +        { -14,  66 }, {   0,  59 }, {   2,  59 }, {  21, -13 },
   1.366 +        {  33, -14 }, {  39,  -7 }, {  46,  -2 }, {  51,   2 },
   1.367 +        {  60,   6 }, {  61,  17 }, {  55,  34 }, {  42,  62 },
   1.368 +    },
   1.369 +
   1.370 +    /* i_cabac_init_idc == 1 */
   1.371 +    {
   1.372 +        /* 0 - 10 */
   1.373 +        {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
   1.374 +        {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
   1.375 +        {  -6,  53 }, {  -1,  54 }, {   7,  51 },
   1.376 +
   1.377 +        /* 11 - 23 */
   1.378 +        {  22,  25 }, {  34,   0 }, {  16,   0 }, {  -2,   9 },
   1.379 +        {   4,  41 }, { -29, 118 }, {   2,  65 }, {  -6,  71 },
   1.380 +        { -13,  79 }, {   5,  52 }, {   9,  50 }, {  -3,  70 },
   1.381 +        {  10,  54 },
   1.382 +
   1.383 +        /* 24 - 39 */
   1.384 +        {  26,  34 }, {  19,  22 }, {  40,   0 }, {  57,   2 },
   1.385 +        {  41,  36 }, {  26,  69 }, { -45, 127 }, { -15, 101 },
   1.386 +        {  -4,  76 }, {  -6,  71 }, { -13,  79 }, {   5,  52 },
   1.387 +        {   6,  69 }, { -13,  90 }, {   0,  52 }, {   8,  43 },
   1.388 +
   1.389 +        /* 40 - 53 */
   1.390 +        {  -2,  69 },{  -5,  82 },{ -10,  96 },{   2,  59 },
   1.391 +        {   2,  75 },{  -3,  87 },{  -3,  100 },{   1,  56 },
   1.392 +        {  -3,  74 },{  -6,  85 },{   0,  59 },{  -3,  81 },
   1.393 +        {  -7,  86 },{  -5,  95 },
   1.394 +
   1.395 +        /* 54 - 59 */
   1.396 +        {  -1,  66 },{  -1,  77 },{   1,  70 },{  -2,  86 },
   1.397 +        {  -5,  72 },{   0,  61 },
   1.398 +
   1.399 +        /* 60 - 69 */
   1.400 +        { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
   1.401 +        { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
   1.402 +        { 13, 41 },  { 3, 62 },
   1.403 +
   1.404 +        /* 70 - 104 */
   1.405 +        {  13,  15 }, {   7,  51 }, {   2,  80 }, { -39, 127 },
   1.406 +        { -18,  91 }, { -17,  96 }, { -26,  81 }, { -35,  98 },
   1.407 +        { -24, 102 }, { -23,  97 }, { -27, 119 }, { -24,  99 },
   1.408 +        { -21, 110 }, { -18, 102 }, { -36, 127 }, {   0,  80 },
   1.409 +        {  -5,  89 }, {  -7,  94 }, {  -4,  92 }, {   0,  39 },
   1.410 +        {   0,  65 }, { -15,  84 }, { -35, 127 }, {  -2,  73 },
   1.411 +        { -12, 104 }, {  -9,  91 }, { -31, 127 }, {   3,  55 },
   1.412 +        {   7,  56 }, {   7,  55 }, {   8,  61 }, {  -3,  53 },
   1.413 +        {   0,  68 }, {  -7,  74 }, {  -9,  88 },
   1.414 +
   1.415 +        /* 105 -> 165 */
   1.416 +        { -13, 103 }, { -13,  91 }, {  -9,  89 }, { -14,  92 },
   1.417 +        {  -8,  76 }, { -12,  87 }, { -23, 110 }, { -24, 105 },
   1.418 +        { -10,  78 }, { -20, 112 }, { -17,  99 }, { -78, 127 },
   1.419 +        { -70, 127 }, { -50, 127 }, { -46, 127 }, {  -4,  66 },
   1.420 +        {  -5,  78 }, {  -4,  71 }, {  -8,  72 }, {   2,  59 },
   1.421 +        {  -1,  55 }, {  -7,  70 }, {  -6,  75 }, {  -8,  89 },
   1.422 +        { -34, 119 }, {  -3,  75 }, {  32,  20 }, {  30,  22 },
   1.423 +        { -44, 127 }, {   0,  54 }, {  -5,  61 }, {   0,  58 },
   1.424 +        {  -1,  60 }, {  -3,  61 }, {  -8,  67 }, { -25,  84 },
   1.425 +        { -14,  74 }, {  -5,  65 }, {   5,  52 }, {   2,  57 },
   1.426 +        {   0,  61 }, {  -9,  69 }, { -11,  70 }, {  18,  55 },
   1.427 +        {  -4,  71 }, {   0,  58 }, {   7,  61 }, {   9,  41 },
   1.428 +        {  18,  25 }, {   9,  32 }, {   5,  43 }, {   9,  47 },
   1.429 +        {   0,  44 }, {   0,  51 }, {   2,  46 }, {  19,  38 },
   1.430 +        {  -4,  66 }, {  15,  38 }, {  12,  42 }, {   9,  34 },
   1.431 +        {   0,  89 },
   1.432 +
   1.433 +        /* 166 - 226 */
   1.434 +        {   4,  45 }, {  10,  28 }, {  10,  31 }, {  33, -11 },
   1.435 +        {  52, -43 }, {  18,  15 }, {  28,   0 }, {  35, -22 },
   1.436 +        {  38, -25 }, {  34,   0 }, {  39, -18 }, {  32, -12 },
   1.437 +        { 102, -94 }, {   0,   0 }, {  56, -15 }, {  33,  -4 },
   1.438 +        {  29,  10 }, {  37,  -5 }, {  51, -29 }, {  39,  -9 },
   1.439 +        {  52, -34 }, {  69, -58 }, {  67, -63 }, {  44,  -5 },
   1.440 +        {  32,   7 }, {  55, -29 }, {  32,   1 }, {   0,   0 },
   1.441 +        {  27,  36 }, {  33, -25 }, {  34, -30 }, {  36, -28 },
   1.442 +        {  38, -28 }, {  38, -27 }, {  34, -18 }, {  35, -16 },
   1.443 +        {  34, -14 }, {  32,  -8 }, {  37,  -6 }, {  35,   0 },
   1.444 +        {  30,  10 }, {  28,  18 }, {  26,  25 }, {  29,  41 },
   1.445 +        {   0,  75 }, {   2,  72 }, {   8,  77 }, {  14,  35 },
   1.446 +        {  18,  31 }, {  17,  35 }, {  21,  30 }, {  17,  45 },
   1.447 +        {  20,  42 }, {  18,  45 }, {  27,  26 }, {  16,  54 },
   1.448 +        {   7,  66 }, {  16,  56 }, {  11,  73 }, {  10,  67 },
   1.449 +        { -10, 116 },
   1.450 +
   1.451 +        /* 227 - 275 */
   1.452 +        { -23, 112 }, { -15,  71 }, {  -7,  61 }, {   0,  53 },
   1.453 +        {  -5,  66 }, { -11,  77 }, {  -9,  80 }, {  -9,  84 },
   1.454 +        { -10,  87 }, { -34, 127 }, { -21, 101 }, {  -3,  39 },
   1.455 +        {  -5,  53 }, {  -7,  61 }, { -11,  75 }, { -15,  77 },
   1.456 +        { -17,  91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
   1.457 +        { -11,  76 }, { -10,  44 }, { -10,  52 }, { -10,  57 },
   1.458 +        {  -9,  58 }, { -16,  72 }, {  -7,  69 }, {  -4,  69 },
   1.459 +        {  -5,  74 }, {  -9,  86 }, {   2,  66 }, {  -9,  34 },
   1.460 +        {   1,  32 }, {  11,  31 }, {   5,  52 }, {  -2,  55 },
   1.461 +        {  -2,  67 }, {   0,  73 }, {  -8,  89 }, {   3,  52 },
   1.462 +        {   7,   4 }, {  10,   8 }, {  17,   8 }, {  16,  19 },
   1.463 +        {   3,  37 }, {  -1,  61 }, {  -5,  73 }, {  -1,  70 },
   1.464 +        {  -4,  78 },
   1.465 +
   1.466 +        /* 276 a bit special (not used, bypass is used instead) */
   1.467 +        { 0, 0 },
   1.468 +
   1.469 +        /* 277 - 337 */
   1.470 +        { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
   1.471 +        { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
   1.472 +        { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
   1.473 +        { -10,  95 }, { -14, 100 }, {  -8,  95 }, { -17, 111 },
   1.474 +        { -28, 114 }, {  -6,  89 }, {  -2,  80 }, {  -4,  82 },
   1.475 +        {  -9,  85 }, {  -8,  81 }, {  -1,  72 }, {   5,  64 },
   1.476 +        {   1,  67 }, {   9,  56 }, {   0,  69 }, {   1,  69 },
   1.477 +        {   7,  69 }, {  -7,  69 }, {  -6,  67 }, { -16,  77 },
   1.478 +        {  -2,  64 }, {   2,  61 }, {  -6,  67 }, {  -3,  64 },
   1.479 +        {   2,  57 }, {  -3,  65 }, {  -3,  66 }, {   0,  62 },
   1.480 +        {   9,  51 }, {  -1,  66 }, {  -2,  71 }, {  -2,  75 },
   1.481 +        {  -1,  70 }, {  -9,  72 }, {  14,  60 }, {  16,  37 },
   1.482 +        {   0,  47 }, {  18,  35 }, {  11,  37 }, {  12,  41 },
   1.483 +        {  10,  41 }, {   2,  48 }, {  12,  41 }, {  13,  41 },
   1.484 +        {   0,  59 }, {   3,  50 }, {  19,  40 }, {   3,  66 },
   1.485 +        {  18,  50 },
   1.486 +
   1.487 +        /* 338 - 398 */
   1.488 +        {  19,  -6 }, {  18,  -6 }, {  14,   0 }, {  26, -12 },
   1.489 +        {  31, -16 }, {  33, -25 }, {  33, -22 }, {  37, -28 },
   1.490 +        {  39, -30 }, {  42, -30 }, {  47, -42 }, {  45, -36 },
   1.491 +        {  49, -34 }, {  41, -17 }, {  32,   9 }, {  69, -71 },
   1.492 +        {  63, -63 }, {  66, -64 }, {  77, -74 }, {  54, -39 },
   1.493 +        {  52, -35 }, {  41, -10 }, {  36,   0 }, {  40,  -1 },
   1.494 +        {  30,  14 }, {  28,  26 }, {  23,  37 }, {  12,  55 },
   1.495 +        {  11,  65 }, {  37, -33 }, {  39, -36 }, {  40, -37 },
   1.496 +        {  38, -30 }, {  46, -33 }, {  42, -30 }, {  40, -24 },
   1.497 +        {  49, -29 }, {  38, -12 }, {  40, -10 }, {  38,  -3 },
   1.498 +        {  46,  -5 }, {  31,  20 }, {  29,  30 }, {  25,  44 },
   1.499 +        {  12,  48 }, {  11,  49 }, {  26,  45 }, {  22,  22 },
   1.500 +        {  23,  22 }, {  27,  21 }, {  33,  20 }, {  26,  28 },
   1.501 +        {  30,  24 }, {  27,  34 }, {  18,  42 }, {  25,  39 },
   1.502 +        {  18,  50 }, {  12,  70 }, {  21,  54 }, {  14,  71 },
   1.503 +        {  11,  83 },
   1.504 +
   1.505 +        /* 399 - 435 */
   1.506 +        {  25,  32 }, {  21,  49 }, {  21,  54 },
   1.507 +        {  -5,  85 }, {  -6,  81 }, { -10,  77 }, {  -7,  81 },
   1.508 +        { -17,  80 }, { -18,  73 }, {  -4,  74 }, { -10,  83 },
   1.509 +        {  -9,  71 }, {  -9,  67 }, {  -1,  61 }, {  -8,  66 },
   1.510 +        { -14,  66 }, {   0,  59 }, {   2,  59 }, {  17, -10 },
   1.511 +        {  32, -13 }, {  42,  -9 }, {  49,  -5 }, {  53,   0 },
   1.512 +        {  64,   3 }, {  68,  10 }, {  66,  27 }, {  47,  57 },
   1.513 +        {  -5,  71 }, {   0,  24 }, {  -1,  36 }, {  -2,  42 },
   1.514 +        {  -2,  52 }, {  -9,  57 }, {  -6,  63 }, {  -4,  65 },
   1.515 +        {  -4,  67 }, {  -7,  82 },
   1.516 +
   1.517 +        /* 436 - 459 */
   1.518 +        {  -3,  81 }, {  -3,  76 }, {  -7,  72 }, {  -6,  78 },
   1.519 +        { -12,  72 }, { -14,  68 }, {  -3,  70 }, {  -6,  76 },
   1.520 +        {  -5,  66 }, {  -5,  62 }, {   0,  57 }, {  -4,  61 },
   1.521 +        {  -9,  60 }, {   1,  54 }, {   2,  58 }, {  17, -10 },
   1.522 +        {  32, -13 }, {  42,  -9 }, {  49,  -5 }, {  53,   0 },
   1.523 +        {  64,   3 }, {  68,  10 }, {  66,  27 }, {  47,  57 },
   1.524 +    },
   1.525 +
   1.526 +    /* i_cabac_init_idc == 2 */
   1.527 +    {
   1.528 +        /* 0 - 10 */
   1.529 +        {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
   1.530 +        {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
   1.531 +        {  -6,  53 }, {  -1,  54 }, {   7,  51 },
   1.532 +
   1.533 +        /* 11 - 23 */
   1.534 +        {  29,  16 }, {  25,   0 }, {  14,   0 }, { -10,  51 },
   1.535 +        {  -3,  62 }, { -27,  99 }, {  26,  16 }, {  -4,  85 },
   1.536 +        { -24, 102 }, {   5,  57 }, {   6,  57 }, { -17,  73 },
   1.537 +        {  14,  57 },
   1.538 +
   1.539 +        /* 24 - 39 */
   1.540 +        {  20,  40 }, {  20,  10 }, {  29,   0 }, {  54,   0 },
   1.541 +        {  37,  42 }, {  12,  97 }, { -32, 127 }, { -22, 117 },
   1.542 +        {  -2,  74 }, {  -4,  85 }, { -24, 102 }, {   5,  57 },
   1.543 +        {  -6,  93 }, { -14,  88 }, {  -6,  44 }, {   4,  55 },
   1.544 +
   1.545 +        /* 40 - 53 */
   1.546 +        { -11,  89 },{ -15,  103 },{ -21,  116 },{  19,  57 },
   1.547 +        {  20,  58 },{   4,  84 },{   6,  96 },{   1,  63 },
   1.548 +        {  -5,  85 },{ -13,  106 },{   5,  63 },{   6,  75 },
   1.549 +        {  -3,  90 },{  -1,  101 },
   1.550 +
   1.551 +        /* 54 - 59 */
   1.552 +        {   3,  55 },{  -4,  79 },{  -2,  75 },{ -12,  97 },
   1.553 +        {  -7,  50 },{   1,  60 },
   1.554 +
   1.555 +        /* 60 - 69 */
   1.556 +        { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
   1.557 +        { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
   1.558 +        { 13, 41 },  { 3, 62 },
   1.559 +
   1.560 +        /* 70 - 104 */
   1.561 +        {   7,  34 }, {  -9,  88 }, { -20, 127 }, { -36, 127 },
   1.562 +        { -17,  91 }, { -14,  95 }, { -25,  84 }, { -25,  86 },
   1.563 +        { -12,  89 }, { -17,  91 }, { -31, 127 }, { -14,  76 },
   1.564 +        { -18, 103 }, { -13,  90 }, { -37, 127 }, {  11,  80 },
   1.565 +        {   5,  76 }, {   2,  84 }, {   5,  78 }, {  -6,  55 },
   1.566 +        {   4,  61 }, { -14,  83 }, { -37, 127 }, {  -5,  79 },
   1.567 +        { -11, 104 }, { -11,  91 }, { -30, 127 }, {   0,  65 },
   1.568 +        {  -2,  79 }, {   0,  72 }, {  -4,  92 }, {  -6,  56 },
   1.569 +        {   3,  68 }, {  -8,  71 }, { -13,  98 },
   1.570 +
   1.571 +        /* 105 -> 165 */
   1.572 +        {  -4,  86 }, { -12,  88 }, {  -5,  82 }, {  -3,  72 },
   1.573 +        {  -4,  67 }, {  -8,  72 }, { -16,  89 }, {  -9,  69 },
   1.574 +        {  -1,  59 }, {   5,  66 }, {   4,  57 }, {  -4,  71 },
   1.575 +        {  -2,  71 }, {   2,  58 }, {  -1,  74 }, {  -4,  44 },
   1.576 +        {  -1,  69 }, {   0,  62 }, {  -7,  51 }, {  -4,  47 },
   1.577 +        {  -6,  42 }, {  -3,  41 }, {  -6,  53 }, {   8,  76 },
   1.578 +        {  -9,  78 }, { -11,  83 }, {   9,  52 }, {   0,  67 },
   1.579 +        {  -5,  90 }, {   1,  67 }, { -15,  72 }, {  -5,  75 },
   1.580 +        {  -8,  80 }, { -21,  83 }, { -21,  64 }, { -13,  31 },
   1.581 +        { -25,  64 }, { -29,  94 }, {   9,  75 }, {  17,  63 },
   1.582 +        {  -8,  74 }, {  -5,  35 }, {  -2,  27 }, {  13,  91 },
   1.583 +        {   3,  65 }, {  -7,  69 }, {   8,  77 }, { -10,  66 },
   1.584 +        {   3,  62 }, {  -3,  68 }, { -20,  81 }, {   0,  30 },
   1.585 +        {   1,   7 }, {  -3,  23 }, { -21,  74 }, {  16,  66 },
   1.586 +        { -23, 124 }, {  17,  37 }, {  44, -18 }, {  50, -34 },
   1.587 +        { -22, 127 },
   1.588 +
   1.589 +        /* 166 - 226 */
   1.590 +        {   4,  39 }, {   0,  42 }, {   7,  34 }, {  11,  29 },
   1.591 +        {   8,  31 }, {   6,  37 }, {   7,  42 }, {   3,  40 },
   1.592 +        {   8,  33 }, {  13,  43 }, {  13,  36 }, {   4,  47 },
   1.593 +        {   3,  55 }, {   2,  58 }, {   6,  60 }, {   8,  44 },
   1.594 +        {  11,  44 }, {  14,  42 }, {   7,  48 }, {   4,  56 },
   1.595 +        {   4,  52 }, {  13,  37 }, {   9,  49 }, {  19,  58 },
   1.596 +        {  10,  48 }, {  12,  45 }, {   0,  69 }, {  20,  33 },
   1.597 +        {   8,  63 }, {  35, -18 }, {  33, -25 }, {  28,  -3 },
   1.598 +        {  24,  10 }, {  27,   0 }, {  34, -14 }, {  52, -44 },
   1.599 +        {  39, -24 }, {  19,  17 }, {  31,  25 }, {  36,  29 },
   1.600 +        {  24,  33 }, {  34,  15 }, {  30,  20 }, {  22,  73 },
   1.601 +        {  20,  34 }, {  19,  31 }, {  27,  44 }, {  19,  16 },
   1.602 +        {  15,  36 }, {  15,  36 }, {  21,  28 }, {  25,  21 },
   1.603 +        {  30,  20 }, {  31,  12 }, {  27,  16 }, {  24,  42 },
   1.604 +        {   0,  93 }, {  14,  56 }, {  15,  57 }, {  26,  38 },
   1.605 +        { -24, 127 },
   1.606 +
   1.607 +        /* 227 - 275 */
   1.608 +        { -24, 115 }, { -22,  82 }, {  -9,  62 }, {   0,  53 },
   1.609 +        {   0,  59 }, { -14,  85 }, { -13,  89 }, { -13,  94 },
   1.610 +        { -11,  92 }, { -29, 127 }, { -21, 100 }, { -14,  57 },
   1.611 +        { -12,  67 }, { -11,  71 }, { -10,  77 }, { -21,  85 },
   1.612 +        { -16,  88 }, { -23, 104 }, { -15,  98 }, { -37, 127 },
   1.613 +        { -10,  82 }, {  -8,  48 }, {  -8,  61 }, {  -8,  66 },
   1.614 +        {  -7,  70 }, { -14,  75 }, { -10,  79 }, {  -9,  83 },
   1.615 +        { -12,  92 }, { -18, 108 }, {  -4,  79 }, { -22,  69 },
   1.616 +        { -16,  75 }, {  -2,  58 }, {   1,  58 }, { -13,  78 },
   1.617 +        {  -9,  83 }, {  -4,  81 }, { -13,  99 }, { -13,  81 },
   1.618 +        {  -6,  38 }, { -13,  62 }, {  -6,  58 }, {  -2,  59 },
   1.619 +        { -16,  73 }, { -10,  76 }, { -13,  86 }, {  -9,  83 },
   1.620 +        { -10,  87 },
   1.621 +
   1.622 +        /* 276 a bit special (not used, bypass is used instead) */
   1.623 +        { 0, 0 },
   1.624 +
   1.625 +        /* 277 - 337 */
   1.626 +        { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
   1.627 +        { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
   1.628 +        { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
   1.629 +        { -10,  94 }, { -15, 102 }, { -10,  99 }, { -13, 106 },
   1.630 +        { -50, 127 }, {  -5,  92 }, {  17,  57 }, {  -5,  86 },
   1.631 +        { -13,  94 }, { -12,  91 }, {  -2,  77 }, {   0,  71 },
   1.632 +        {  -1,  73 }, {   4,  64 }, {  -7,  81 }, {   5,  64 },
   1.633 +        {  15,  57 }, {   1,  67 }, {   0,  68 }, { -10,  67 },
   1.634 +        {   1,  68 }, {   0,  77 }, {   2,  64 }, {   0,  68 },
   1.635 +        {  -5,  78 }, {   7,  55 }, {   5,  59 }, {   2,  65 },
   1.636 +        {  14,  54 }, {  15,  44 }, {   5,  60 }, {   2,  70 },
   1.637 +        {  -2,  76 }, { -18,  86 }, {  12,  70 }, {   5,  64 },
   1.638 +        { -12,  70 }, {  11,  55 }, {   5,  56 }, {   0,  69 },
   1.639 +        {   2,  65 }, {  -6,  74 }, {   5,  54 }, {   7,  54 },
   1.640 +        {  -6,  76 }, { -11,  82 }, {  -2,  77 }, {  -2,  77 },
   1.641 +        {  25,  42 },
   1.642 +
   1.643 +        /* 338 - 398 */
   1.644 +        {  17, -13 }, {  16,  -9 }, {  17, -12 }, {  27, -21 },
   1.645 +        {  37, -30 }, {  41, -40 }, {  42, -41 }, {  48, -47 },
   1.646 +        {  39, -32 }, {  46, -40 }, {  52, -51 }, {  46, -41 },
   1.647 +        {  52, -39 }, {  43, -19 }, {  32,  11 }, {  61, -55 },
   1.648 +        {  56, -46 }, {  62, -50 }, {  81, -67 }, {  45, -20 },
   1.649 +        {  35,  -2 }, {  28,  15 }, {  34,   1 }, {  39,   1 },
   1.650 +        {  30,  17 }, {  20,  38 }, {  18,  45 }, {  15,  54 },
   1.651 +        {   0,  79 }, {  36, -16 }, {  37, -14 }, {  37, -17 },
   1.652 +        {  32,   1 }, {  34,  15 }, {  29,  15 }, {  24,  25 },
   1.653 +        {  34,  22 }, {  31,  16 }, {  35,  18 }, {  31,  28 },
   1.654 +        {  33,  41 }, {  36,  28 }, {  27,  47 }, {  21,  62 },
   1.655 +        {  18,  31 }, {  19,  26 }, {  36,  24 }, {  24,  23 },
   1.656 +        {  27,  16 }, {  24,  30 }, {  31,  29 }, {  22,  41 },
   1.657 +        {  22,  42 }, {  16,  60 }, {  15,  52 }, {  14,  60 },
   1.658 +        {   3,  78 }, { -16, 123 }, {  21,  53 }, {  22,  56 },
   1.659 +        {  25,  61 },
   1.660 +
   1.661 +        /* 399 - 435 */
   1.662 +        {  21,  33 }, {  19,  50 }, {  17,  61 },
   1.663 +        {  -3,  78 }, {  -8,  74 }, {  -9,  72 }, { -10,  72 },
   1.664 +        { -18,  75 }, { -12,  71 }, { -11,  63 }, {  -5,  70 },
   1.665 +        { -17,  75 }, { -14,  72 }, { -16,  67 }, {  -8,  53 },
   1.666 +        { -14,  59 }, {  -9,  52 }, { -11,  68 }, {   9,  -2 },
   1.667 +        {  30, -10 }, {  31,  -4 }, {  33,  -1 }, {  33,   7 },
   1.668 +        {  31,  12 }, {  37,  23 }, {  31,  38 }, {  20,  64 },
   1.669 +        {  -9,  71 }, {  -7,  37 }, {  -8,  44 }, { -11,  49 },
   1.670 +        { -10,  56 }, { -12,  59 }, {  -8,  63 }, {  -9,  67 },
   1.671 +        {  -6,  68 }, { -10,  79 },
   1.672 +
   1.673 +        /* 436 - 459 */
   1.674 +        {  -3,  78 }, {  -8,  74 }, {  -9,  72 }, { -10,  72 },
   1.675 +        { -18,  75 }, { -12,  71 }, { -11,  63 }, {  -5,  70 },
   1.676 +        { -17,  75 }, { -14,  72 }, { -16,  67 }, {  -8,  53 },
   1.677 +        { -14,  59 }, {  -9,  52 }, { -11,  68 }, {   9,  -2 },
   1.678 +        {  30, -10 }, {  31,  -4 }, {  33,  -1 }, {  33,   7 },
   1.679 +        {  31,  12 }, {  37,  23 }, {  31,  38 }, {  20,  64 },
   1.680 +    }
   1.681 +};
   1.682 +
   1.683 +static const uint8_t left_block_options[4][16]={
   1.684 +    {0,1,2,3,7,10,8,11,7+0*8, 7+1*8, 7+2*8, 7+3*8, 2+0*8, 2+3*8, 2+1*8, 2+2*8},
   1.685 +    {2,2,3,3,8,11,8,11,7+2*8, 7+2*8, 7+3*8, 7+3*8, 2+1*8, 2+2*8, 2+1*8, 2+2*8},
   1.686 +    {0,0,1,1,7,10,7,10,7+0*8, 7+0*8, 7+1*8, 7+1*8, 2+0*8, 2+3*8, 2+0*8, 2+3*8},
   1.687 +    {0,2,0,2,7,10,7,10,7+0*8, 7+2*8, 7+0*8, 7+2*8, 2+0*8, 2+3*8, 2+0*8, 2+3*8}
   1.688 +};
   1.689 +
   1.690 +static const uint8_t rem6[52]={
   1.691 +0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
   1.692 +};
   1.693 +
   1.694 +static const uint8_t div6[52]={
   1.695 +0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
   1.696 +};
   1.697 +
   1.698 +static void init_dequant8_coeff_table(H264Slice *s, EntropyContext *ec){
   1.699 +    int i,q,x;
   1.700 +    const int transpose = HAVE_MMX | HAVE_ALTIVEC | HAVE_NEON;
   1.701 +    ec->dequant8_coeff[0] = ec->dequant8_buffer[0];
   1.702 +    ec->dequant8_coeff[1] = ec->dequant8_buffer[1];
   1.703 +
   1.704 +    for(i=0; i<2; i++){
   1.705 +        if(i && !memcmp(s->pps.scaling_matrix8[0], s->pps.scaling_matrix8[1], 64*sizeof(uint8_t))){
   1.706 +            ec->dequant8_coeff[1] = ec->dequant8_buffer[0];
   1.707 +            break;
   1.708 +        }
   1.709 +
   1.710 +        for(q=0; q<52; q++){
   1.711 +            int shift = div6[q];
   1.712 +            int idx = rem6[q];
   1.713 +            for(x=0; x<64; x++)
   1.714 +                ec->dequant8_coeff[i][q][transpose ? (x>>3)|((x&7)<<3) : x] =
   1.715 +                    ((uint32_t)dequant8_coeff_init[idx][ dequant8_coeff_init_scan[((x>>1)&12) | (x&3)] ] *
   1.716 +                    s->pps.scaling_matrix8[i][x]) << shift;
   1.717 +        }
   1.718 +    }
   1.719 +}
   1.720 +
   1.721 +static void init_dequant4_coeff_table(H264Slice *s, EntropyContext *ec){
   1.722 +    int i,j,q,x;
   1.723 +    const int transpose = HAVE_MMX | HAVE_ALTIVEC | HAVE_NEON;
   1.724 +    for(i=0; i<6; i++ ){
   1.725 +        ec->dequant4_coeff[i] = ec->dequant4_buffer[i];
   1.726 +        for(j=0; j<i; j++){
   1.727 +            if(!memcmp(s->pps.scaling_matrix4[j], s->pps.scaling_matrix4[i], 16*sizeof(uint8_t))){
   1.728 +                ec->dequant4_coeff[i] = ec->dequant4_buffer[j];
   1.729 +                break;
   1.730 +            }
   1.731 +        }
   1.732 +        if(j<i)
   1.733 +            continue;
   1.734 +
   1.735 +        for(q=0; q<52; q++){
   1.736 +            int shift = div6[q] + 2;
   1.737 +            int idx = rem6[q];
   1.738 +            for(x=0; x<16; x++)
   1.739 +                ec->dequant4_coeff[i][q][transpose ? (x>>2)|((x<<2)&0xF) : x] =
   1.740 +                    ((uint32_t)dequant4_coeff_init[idx][(x&1) + ((x>>2)&1)] *
   1.741 +                    s->pps.scaling_matrix4[i][x]) << shift;
   1.742 +        }
   1.743 +    }
   1.744 +}
   1.745 +
   1.746 +void init_dequant_tables(H264Slice *s, EntropyContext *ec){
   1.747 +    int i,x;
   1.748 +
   1.749 +    init_dequant4_coeff_table(s, ec);
   1.750 +    if(s->pps.transform_8x8_mode)
   1.751 +        init_dequant8_coeff_table(s, ec);
   1.752 +    if(s->transform_bypass){
   1.753 +        for(i=0; i<6; i++)
   1.754 +            for(x=0; x<16; x++)
   1.755 +                ec->dequant4_coeff[i][0][x] = 1<<6;
   1.756 +        if(s->pps.transform_8x8_mode)
   1.757 +            for(i=0; i<2; i++)
   1.758 +                for(x=0; x<64; x++)
   1.759 +                    ec->dequant8_coeff[i][0][x] = 1<<6;
   1.760 +    }
   1.761 +}
   1.762 +
   1.763 +void ff_h264_init_cabac_states(EntropyContext *ec, H264Slice *s, CABACContext *c) {
   1.764 +    int i;
   1.765 +    const int8_t (*tab)[2];
   1.766 +
   1.767 +    if( s->slice_type_nos == FF_I_TYPE ) tab = cabac_context_init_I;
   1.768 +    else                                 tab = cabac_context_init_PB[s->cabac_init_idc];
   1.769 +
   1.770 +    /* calculate pre-state */
   1.771 +    for( i= 0; i < 460; i++ ) {
   1.772 +        int pre = 2*(((tab[i][0] * ec->curr_qscale) >>4 ) + tab[i][1]) - 127;
   1.773 +
   1.774 +        pre^= pre>>31;
   1.775 +        if(pre > 124)
   1.776 +            pre= 124 + (pre&1);
   1.777 +
   1.778 +        c->cabac_state[i] =  pre;
   1.779 +    }
   1.780 +}
   1.781 +
   1.782 +static void fill_decode_neighbors(EntropyContext *ec, H264Slice *s){
   1.783 +    H264Mb *m = ec->m;
   1.784 +	const int mb_x = m->mb_x;
   1.785 +
   1.786 +    if (m->mb_y){
   1.787 +        ec->top_type     = ec->mb_type_top[mb_x];
   1.788 +        ec->topright_type= ec->mb_type_top[mb_x+1];
   1.789 +        ec->topleft_type = ec->mb_type_top[mb_x-1];
   1.790 +        m->qscale_top_mb_xy = ec->qscale_top[mb_x];
   1.791 +    } else {
   1.792 +        ec->top_type     = 0;
   1.793 +        ec->topright_type= 0;
   1.794 +        ec->topleft_type = 0;
   1.795 +        m->qscale_top_mb_xy = 0;
   1.796 +    }
   1.797 +
   1.798 +    ec->left_type    = ec->mb_type[mb_x-1] ;
   1.799 +    m->qscale_left_mb_xy = ec->qscale[mb_x-1];
   1.800 +
   1.801 +}
   1.802 +
   1.803 +static void fill_decode_caches(EntropyContext *ec, H264Slice *s, int mb_type){
   1.804 +    H264Mb *m = ec->m;
   1.805 +    int topleft_type, top_type, topright_type, left_type;
   1.806 +    const uint8_t * left_block= left_block_options[0];
   1.807 +	const int mb_x = m->mb_x;
   1.808 +    int i;
   1.809 +
   1.810 +    topleft_type = ec->topleft_type;
   1.811 +	top_type     = ec->top_type;
   1.812 +    topright_type= ec->topright_type;
   1.813 +	left_type    = ec->left_type;
   1.814 +
   1.815 +    if(!IS_SKIP(mb_type)){
   1.816 +        if(top_type){
   1.817 +            AV_COPY32(&ec->non_zero_count_cache[4+8*0], &ec->non_zero_count_top[mb_x][0]);
   1.818 +            ec->non_zero_count_cache[1+8*0]= ec->non_zero_count_top[mb_x][4];
   1.819 +            ec->non_zero_count_cache[2+8*0]= ec->non_zero_count_top[mb_x][5];
   1.820 +            ec->non_zero_count_cache[1+8*3]= ec->non_zero_count_top[mb_x][6];
   1.821 +            ec->non_zero_count_cache[2+8*3]= ec->non_zero_count_top[mb_x][7];
   1.822 +
   1.823 +        }else {
   1.824 +            ec->non_zero_count_cache[1+8*0]=
   1.825 +            ec->non_zero_count_cache[2+8*0]=
   1.826 +            ec->non_zero_count_cache[1+8*3]=
   1.827 +            ec->non_zero_count_cache[2+8*3]=
   1.828 +            AV_WN32A(&ec->non_zero_count_cache[4+8*0], !IS_INTRA(mb_type) ? 0 : 0x40404040);
   1.829 +        }
   1.830 +
   1.831 +        if(left_type){
   1.832 +            for (i=0; i<2; i++) {
   1.833 +                ec->non_zero_count_cache[3+8*1 + 2*8*i]= ec->non_zero_count_left[i*2+0];
   1.834 +                ec->non_zero_count_cache[3+8*2 + 2*8*i]= ec->non_zero_count_left[i*2+1];
   1.835 +                ec->non_zero_count_cache[0+8*1 + 3*8*i]= ec->non_zero_count_left[4+i*2+0];
   1.836 +                ec->non_zero_count_cache[0+8*2 + 3*8*i]= ec->non_zero_count_left[4+i*2+1];
   1.837 +            }
   1.838 +        }
   1.839 +        else{
   1.840 +            for (i=0; i<2; i++) {
   1.841 +                ec->non_zero_count_cache[3+8*1 + 2*8*i]=
   1.842 +                ec->non_zero_count_cache[3+8*2 + 2*8*i]=
   1.843 +                ec->non_zero_count_cache[0+8*1 + 3*8*i]=
   1.844 +                ec->non_zero_count_cache[0+8*2 + 3*8*i]= !IS_INTRA(mb_type) ? 0 : 64;
   1.845 +            }
   1.846 +        }
   1.847 +
   1.848 +		// top_cbp
   1.849 +		if(top_type) {
   1.850 +			ec->top_cbp = ec->cbp_top[mb_x];
   1.851 +		} else {
   1.852 +			ec->top_cbp = IS_INTRA(mb_type) ? 0x1CF : 0x00F;
   1.853 +		}
   1.854 +		// left_cbp
   1.855 +		if (left_type) {
   1.856 +			ec->left_cbp = (ec->cbp[mb_x-1] & 0x1f0)
   1.857 +			|  ((ec->cbp[mb_x-1]>>(left_block[0]&(~1)))&2)
   1.858 +			| (((ec->cbp[mb_x-1]>>(left_block[2]&(~1)))&2) << 2);
   1.859 +		} else {
   1.860 +			ec->left_cbp = IS_INTRA(mb_type) ? 0x1CF : 0x00F;
   1.861 +		}
   1.862 +    }
   1.863 +
   1.864 +    if(IS_INTER(mb_type) ||(IS_DIRECT(mb_type) && s->direct_spatial_mv_pred)){
   1.865 +        int list;
   1.866 +
   1.867 +        ec->ref_cache[0][scan8[5 ]+1] = ec->ref_cache[0][scan8[7 ]+1] = ec->ref_cache[0][scan8[13]+1] =
   1.868 +        ec->ref_cache[1][scan8[5 ]+1] = ec->ref_cache[1][scan8[7 ]+1] = ec->ref_cache[1][scan8[13]+1] = PART_NOT_AVAILABLE;
   1.869 +
   1.870 +        for(list=0; list<s->list_count; list++){
   1.871 +            if(!USES_LIST(mb_type, list)){
   1.872 +                continue;
   1.873 +            }
   1.874 +            assert(!(IS_DIRECT(mb_type) && !s->direct_spatial_mv_pred));
   1.875 +
   1.876 +            if(USES_LIST(top_type, list)){
   1.877 +                ec->ref_cache[list][scan8[0] + 0 - 1*8]=
   1.878 +                ec->ref_cache[list][scan8[0] + 1 - 1*8]= ec->ref_index_top[list][4*mb_x + 2];
   1.879 +                ec->ref_cache[list][scan8[0] + 2 - 1*8]=
   1.880 +                ec->ref_cache[list][scan8[0] + 3 - 1*8]= ec->ref_index_top[list][4*mb_x + 3];
   1.881 +            }else{
   1.882 +                AV_WN32A(&ec->ref_cache[list][scan8[0] + 0 - 1*8], ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101);
   1.883 +            }
   1.884 +
   1.885 +            if(mb_type & (MB_TYPE_16x8|MB_TYPE_8x8)){
   1.886 +                for(i=0; i<2; i++){
   1.887 +                    int cache_idx = scan8[0] - 1 + i*2*8;
   1.888 +                    if(USES_LIST(left_type, list)){
   1.889 +                        const int b8_x= 4*(mb_x-1) + 1;
   1.890 +                        ec->ref_cache[list][cache_idx  ]= ec->ref_index[list][b8_x + (left_block[0+i*2]&~1)];
   1.891 +                        ec->ref_cache[list][cache_idx+8]= ec->ref_index[list][b8_x + (left_block[1+i*2]&~1)];
   1.892 +                    }else{
   1.893 +                        ec->ref_cache[list][cache_idx  ]=
   1.894 +                        ec->ref_cache[list][cache_idx+8]= (left_type ? LIST_NOT_USED : PART_NOT_AVAILABLE);
   1.895 +                    }
   1.896 +                }
   1.897 +            }else{
   1.898 +                if(USES_LIST(left_type, list)){
   1.899 +                    const int b8_x= 4*(mb_x-1) + 1;
   1.900 +                    ec->ref_cache[list][scan8[0] - 1]= ec->ref_index[list][b8_x + (left_block[0]&~1)];
   1.901 +                }else{
   1.902 +                    ec->ref_cache[list][scan8[0] - 1]= left_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
   1.903 +                }
   1.904 +            }
   1.905 +
   1.906 +            if(USES_LIST(topright_type, list)){
   1.907 +                ec->ref_cache[list][scan8[0] + 4 - 1*8]= ec->ref_index_top[list][4*(mb_x+1) + 2];
   1.908 +            }else{
   1.909 +                ec->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
   1.910 +            }
   1.911 +            if(ec->ref_cache[list][scan8[0] + 4 - 1*8] < 0){
   1.912 +                int topleft_partition= -1;
   1.913 +                if(USES_LIST(topleft_type, list)){
   1.914 +                    const int b8_x= 4*(mb_x-1) + 1 + (topleft_partition & 2);
   1.915 +                    ec->ref_cache[list][scan8[0] - 1 - 1*8]= ec->ref_index_top[list][b8_x];
   1.916 +                }else{
   1.917 +                    ec->ref_cache[list][scan8[0] - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
   1.918 +                }
   1.919 +            }
   1.920 +
   1.921 +            if((mb_type&(MB_TYPE_SKIP|MB_TYPE_DIRECT2)))
   1.922 +                continue;
   1.923 +
   1.924 +            if(!(mb_type&(MB_TYPE_SKIP|MB_TYPE_DIRECT2))) {
   1.925 +                ec->ref_cache[list][scan8[4 ]] =
   1.926 +                ec->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE;
   1.927 +
   1.928 +				/* XXX beurk, Load mvd */
   1.929 +				if(USES_LIST(top_type, list)){
   1.930 +					AV_COPY64(ec->mvd_cache[list][scan8[0] + 0 - 1*8], ec->mvd_top[list][8*mb_x + 0]);
   1.931 +				}else{
   1.932 +					AV_ZERO64(ec->mvd_cache[list][scan8[0] + 0 - 1*8]);
   1.933 +				}
   1.934 +				if(USES_LIST(left_type, list)){
   1.935 +					AV_COPY16(ec->mvd_cache[list][scan8[0] - 1 + 0*8], ec->mvd[list][8*(mb_x-1) + 6 - left_block[0]]);
   1.936 +					AV_COPY16(ec->mvd_cache[list][scan8[0] - 1 + 1*8], ec->mvd[list][8*(mb_x-1) + 6 - left_block[1]]);
   1.937 +				}else{
   1.938 +					AV_ZERO16(ec->mvd_cache [list][scan8[0] - 1 + 0*8]);
   1.939 +					AV_ZERO16(ec->mvd_cache [list][scan8[0] - 1 + 1*8]);
   1.940 +				}
   1.941 +				if(USES_LIST(left_type, list)){
   1.942 +					AV_COPY16(ec->mvd_cache[list][scan8[0] - 1 + 2*8], ec->mvd[list][8*(mb_x-1) + 6 - left_block[2]]);
   1.943 +					AV_COPY16(ec->mvd_cache[list][scan8[0] - 1 + 3*8], ec->mvd[list][8*(mb_x-1) + 6 - left_block[3]]);
   1.944 +				}else{
   1.945 +					AV_ZERO16(ec->mvd_cache [list][scan8[0] - 1 + 2*8]);
   1.946 +					AV_ZERO16(ec->mvd_cache [list][scan8[0] - 1 + 3*8]);
   1.947 +				}
   1.948 +				AV_ZERO16(ec->mvd_cache [list][scan8[4 ]]);
   1.949 +				AV_ZERO16(ec->mvd_cache [list][scan8[12]]);
   1.950 +				if(s->slice_type_nos == FF_B_TYPE){
   1.951 +					fill_rectangle(&ec->direct_cache[scan8[0]], 4, 4, 8, MB_TYPE_16x16>>1, 1);
   1.952 +
   1.953 +					if(IS_DIRECT(top_type)){
   1.954 +						AV_WN32A(&ec->direct_cache[scan8[0] - 1*8], 0x01010101u*(MB_TYPE_DIRECT2>>1));
   1.955 +					}else if(IS_8X8(top_type)){
   1.956 +						int b8_x = 4*mb_x;
   1.957 +						ec->direct_cache[scan8[0] + 0 - 1*8]= ec->direct_top[b8_x + 2];
   1.958 +						ec->direct_cache[scan8[0] + 2 - 1*8]= ec->direct_top[b8_x + 3];
   1.959 +					}else{
   1.960 +						AV_WN32A(&ec->direct_cache[scan8[0] - 1*8], 0x01010101*(MB_TYPE_16x16>>1));
   1.961 +					}
   1.962 +
   1.963 +					if(IS_DIRECT(left_type))
   1.964 +						ec->direct_cache[scan8[0] - 1 + 0*8]= MB_TYPE_DIRECT2>>1;
   1.965 +					else if(IS_8X8(left_type))
   1.966 +						ec->direct_cache[scan8[0] - 1 + 0*8]= ec->direct[4*(mb_x-1) + 1 + (left_block[0]&~1)];
   1.967 +					else
   1.968 +						ec->direct_cache[scan8[0] - 1 + 0*8]= MB_TYPE_16x16>>1;
   1.969 +
   1.970 +					if(IS_DIRECT(left_type))
   1.971 +						ec->direct_cache[scan8[0] - 1 + 2*8]= MB_TYPE_DIRECT2>>1;
   1.972 +					else if(IS_8X8(left_type))
   1.973 +						ec->direct_cache[scan8[0] - 1 + 2*8]= ec->direct[4*(mb_x-1) + 1 + (left_block[2]&~1)];
   1.974 +					else
   1.975 +						ec->direct_cache[scan8[0] - 1 + 2*8]= MB_TYPE_16x16>>1;
   1.976 +				}
   1.977 +            }
   1.978 +        }
   1.979 +    }
   1.980 +    ec->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type);
   1.981 +}
   1.982 +
   1.983 +static inline void write_back_non_zero_count(EntropyContext *ec, H264Slice *s){
   1.984 +    H264Mb *m = ec->m;
   1.985 +    const int mb_x= m->mb_x;
   1.986 +
   1.987 +    //bottom nnz
   1.988 +    AV_COPY32(&ec->non_zero_count[mb_x][0], &ec->non_zero_count_cache[4+8*4] );
   1.989 +    ec->non_zero_count[mb_x][4] = ec->non_zero_count_cache[1+8*2];
   1.990 +    ec->non_zero_count[mb_x][5] = ec->non_zero_count_cache[2+8*2];
   1.991 +    ec->non_zero_count[mb_x][6] = ec->non_zero_count_cache[1+8*5];
   1.992 +    ec->non_zero_count[mb_x][7] = ec->non_zero_count_cache[2+8*5];
   1.993 +
   1.994 +    for (int i=0; i<2; i++) {
   1.995 +        ec->non_zero_count_left[i*2+0]   = ec->non_zero_count_cache[7+8*1 + 2*8*i];
   1.996 +        ec->non_zero_count_left[i*2+1]   = ec->non_zero_count_cache[7+8*2 + 2*8*i];
   1.997 +        ec->non_zero_count_left[4+i*2+0] = ec->non_zero_count_cache[2+8*1 + 3*8*i];
   1.998 +        ec->non_zero_count_left[4+i*2+1] = ec->non_zero_count_cache[2+8*2 + 3*8*i];
   1.999 +    }
  1.1000 +
  1.1001 +    AV_COPY32(&m->non_zero_count[ 0], &ec->non_zero_count_cache[4+8*1]);
  1.1002 +    AV_COPY32(&m->non_zero_count[ 4], &ec->non_zero_count_cache[4+8*2]);
  1.1003 +    AV_COPY32(&m->non_zero_count[ 8], &ec->non_zero_count_cache[4+8*3]);
  1.1004 +    AV_COPY32(&m->non_zero_count[12], &ec->non_zero_count_cache[4+8*4]);
  1.1005 +
  1.1006 +    for (int i=0; i<2; i++) {
  1.1007 +        m->non_zero_count[16 + i*2   ] = ec->non_zero_count_cache[8*1 + 8*i + 1];
  1.1008 +        m->non_zero_count[16 + i*2 +1] = ec->non_zero_count_cache[8*1 + 8*i + 2];
  1.1009 +        m->non_zero_count[20 + i*2   ] = ec->non_zero_count_cache[8*4 + 8*i + 1];
  1.1010 +        m->non_zero_count[20 + i*2 +1] = ec->non_zero_count_cache[8*4 + 8*i + 2];
  1.1011 +    }
  1.1012 +}
  1.1013 +
  1.1014 +static inline void write_back_motion(EntropyContext *ec, H264Slice *s, int mb_type){
  1.1015 +    H264Mb *m = ec->m;
  1.1016 +	const int mb_x = m->mb_x;
  1.1017 +    const int b_x = 4*m->mb_x; //try mb2b(8)_xy
  1.1018 +    int list;
  1.1019 +
  1.1020 +    for(list=0; list<s->list_count; list++){
  1.1021 +        if(!USES_LIST(mb_type, list))
  1.1022 +            continue;
  1.1023 +
  1.1024 +        {
  1.1025 +            uint8_t (*mvd_dst)[2] = (void *) ec->mvd[list][8*mb_x];
  1.1026 +            uint8_t (*mvd_src)[2] = &ec->mvd_cache[list][scan8[0]];
  1.1027 +            if(IS_SKIP(mb_type))
  1.1028 +                AV_ZERO128(mvd_dst);
  1.1029 +            else{
  1.1030 +				AV_COPY64(mvd_dst, mvd_src + 8*3);
  1.1031 +                AV_COPY16(mvd_dst + 3 + 3, mvd_src + 3 + 8*0);
  1.1032 +                AV_COPY16(mvd_dst + 3 + 2, mvd_src + 3 + 8*1);
  1.1033 +                AV_COPY16(mvd_dst + 3 + 1, mvd_src + 3 + 8*2);
  1.1034 +            }
  1.1035 +        }
  1.1036 +        int8_t *ref_index = &ec->ref_index[list][b_x];
  1.1037 +        {
  1.1038 +            ref_index[0+0*2]= ec->ref_cache[list][scan8[0]];
  1.1039 +            ref_index[1+0*2]= ec->ref_cache[list][scan8[4]];
  1.1040 +            ref_index[0+1*2]= ec->ref_cache[list][scan8[8]];
  1.1041 +            ref_index[1+1*2]= ec->ref_cache[list][scan8[12]];
  1.1042 +        }
  1.1043 +    }
  1.1044 +
  1.1045 +    if(s->slice_type_nos == FF_B_TYPE){
  1.1046 +        if(IS_8X8(mb_type)){
  1.1047 +            uint8_t *direct = &ec->direct[4*mb_x];
  1.1048 +            direct[1] = m->sub_mb_type[1]>>1;
  1.1049 +            direct[2] = m->sub_mb_type[2]>>1;
  1.1050 +            direct[3] = m->sub_mb_type[3]>>1;
  1.1051 +        }
  1.1052 +    }
  1.1053 +}
  1.1054 +
  1.1055 +static inline int get_dct8x8_allowed(EntropyContext *ec, H264Slice *s){
  1.1056 +    H264Mb *m = ec->m;
  1.1057 +    if(s->direct_8x8_inference_flag)
  1.1058 +        return !(AV_RN64A(m->sub_mb_type) & ((MB_TYPE_16x8|MB_TYPE_8x16|MB_TYPE_8x8                )*0x0001000100010001ULL));
  1.1059 +    else
  1.1060 +        return !(AV_RN64A(m->sub_mb_type) & ((MB_TYPE_16x8|MB_TYPE_8x16|MB_TYPE_8x8|MB_TYPE_DIRECT2)*0x0001000100010001ULL));
  1.1061 +}
  1.1062 +
  1.1063 +/**
  1.1064 + * decodes a P_SKIP or B_SKIP macroblock
  1.1065 + */
  1.1066 +static void decode_mb_skip(EntropyContext *ec, H264Slice *s){
  1.1067 +    H264Mb *m = ec->m;
  1.1068 +	const int mb_x = m->mb_x;
  1.1069 +    int mb_type;
  1.1070 +
  1.1071 +    if( s->slice_type_nos == FF_B_TYPE )
  1.1072 +        mb_type= MB_TYPE_16x16|MB_TYPE_L0L1|MB_TYPE_DIRECT2|MB_TYPE_SKIP;
  1.1073 +    else
  1.1074 +        mb_type= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0|MB_TYPE_SKIP;
  1.1075 +
  1.1076 +    fill_rectangle(&ec->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1);
  1.1077 +    write_back_motion(ec, s, mb_type);
  1.1078 +    m->mb_type = ec->mb_type[mb_x] = mb_type;
  1.1079 +    m->qscale_mb_xy = ec->qscale[mb_x]= ec->curr_qscale;
  1.1080 +
  1.1081 +    AV_ZERO64(ec->non_zero_count[mb_x]);
  1.1082 +    AV_ZERO64(ec->non_zero_count_left);
  1.1083 +    memset(m->non_zero_count, 0, 24);
  1.1084 +}
  1.1085 +
  1.1086 +static int decode_cabac_intra_mb_type(EntropyContext *ec, H264Slice *s, CABACContext *c, int ctx_base, int intra_slice) {
  1.1087 +    uint8_t *state= &c->cabac_state[ctx_base];
  1.1088 +    int mb_type;
  1.1089 +
  1.1090 +    if(intra_slice){
  1.1091 +        int ctx=0;
  1.1092 +        if( ec->left_type & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
  1.1093 +            ctx++;
  1.1094 +        if( ec->top_type     & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
  1.1095 +            ctx++;
  1.1096 +        if( get_cabac_noinline( c, &state[ctx] ) == 0 )
  1.1097 +            return 0;   /* I4x4 */
  1.1098 +        state += 2;
  1.1099 +    }else{
  1.1100 +        if( get_cabac_noinline( c, state ) == 0 )
  1.1101 +            return 0;   /* I4x4 */
  1.1102 +    }
  1.1103 +
  1.1104 +    if( get_cabac_terminate( c ) )
  1.1105 +        return 25;  /* PCM */
  1.1106 +
  1.1107 +    mb_type = 1; /* I16x16 */
  1.1108 +    mb_type += 12 * get_cabac_noinline( c, &state[1] ); /* cbp_luma != 0 */
  1.1109 +    if( get_cabac_noinline(c, &state[2] ) ) /* cbp_chroma */
  1.1110 +        mb_type += 4 + 4 * get_cabac_noinline(c, &state[2+intra_slice] );
  1.1111 +    mb_type += 2 * get_cabac_noinline(c, &state[3+intra_slice] );
  1.1112 +    mb_type += 1 * get_cabac_noinline(c, &state[3+2*intra_slice] );
  1.1113 +    return mb_type;
  1.1114 +}
  1.1115 +
  1.1116 +static int decode_cabac_mb_skip(EntropyContext *ec, H264Slice *s, H264Mb *m, CABACContext *c) {
  1.1117 +    int ctx = 0;
  1.1118 +
  1.1119 +	if( m->mb_x>0 && !IS_SKIP( ec->left_type ))
  1.1120 +        ctx++;
  1.1121 +	if( m->mb_y>0 && !IS_SKIP( ec->top_type ))
  1.1122 +        ctx++;
  1.1123 +
  1.1124 +    if( s->slice_type_nos == FF_B_TYPE )
  1.1125 +        ctx += 13;
  1.1126 +    return get_cabac_noinline(c, &c->cabac_state[11+ctx] );
  1.1127 +}
  1.1128 +
  1.1129 +static int decode_cabac_mb_intra4x4_pred_mode_delta( CABACContext *c) {
  1.1130 +    int mode = 0;
  1.1131 +
  1.1132 +    if( get_cabac(c, &c->cabac_state[68] ) )
  1.1133 +        return -1;
  1.1134 +
  1.1135 +    mode += 1 * get_cabac(c, &c->cabac_state[69] );
  1.1136 +    mode += 2 * get_cabac(c, &c->cabac_state[69] );
  1.1137 +    mode += 4 * get_cabac(c, &c->cabac_state[69] );
  1.1138 +
  1.1139 +    return mode;
  1.1140 +}
  1.1141 +
  1.1142 +static int decode_cabac_mb_chroma_pre_mode(EntropyContext *ec, H264Slice *s, CABACContext *c) {
  1.1143 +    H264Mb *m = ec->m;
  1.1144 +	const int mb_x = m->mb_x;
  1.1145 +
  1.1146 +    int ctx = 0;
  1.1147 +
  1.1148 +    /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode to 0 */
  1.1149 +    if( ec->left_type && ec->chroma_pred_mode[mb_x-1] != 0 )
  1.1150 +        ctx++;
  1.1151 +
  1.1152 +    if( ec->top_type     && ec->chroma_pred_mode_top[mb_x] != 0 )
  1.1153 +        ctx++;
  1.1154 +
  1.1155 +    if( get_cabac_noinline(c, &c->cabac_state[64+ctx] ) == 0 )
  1.1156 +        return 0;
  1.1157 +
  1.1158 +    if( get_cabac_noinline(c, &c->cabac_state[64+3] ) == 0 )
  1.1159 +        return 1;
  1.1160 +    if( get_cabac_noinline(c, &c->cabac_state[64+3] ) == 0 )
  1.1161 +        return 2;
  1.1162 +    else
  1.1163 +        return 3;
  1.1164 +}
  1.1165 +
  1.1166 +static int decode_cabac_mb_cbp_luma(EntropyContext *ec, CABACContext *c) {
  1.1167 +    int cbp_b, cbp_a, ctx, cbp = 0;
  1.1168 +
  1.1169 +    cbp_a = ec->left_cbp;
  1.1170 +    cbp_b = ec->top_cbp;
  1.1171 +
  1.1172 +    ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
  1.1173 +    cbp += get_cabac_noinline(c, &c->cabac_state[73 + ctx]);
  1.1174 +    ctx = !(cbp   & 0x01) + 2 * !(cbp_b & 0x08);
  1.1175 +    cbp += get_cabac_noinline(c, &c->cabac_state[73 + ctx]) << 1;
  1.1176 +    ctx = !(cbp_a & 0x08) + 2 * !(cbp   & 0x01);
  1.1177 +    cbp += get_cabac_noinline(c, &c->cabac_state[73 + ctx]) << 2;
  1.1178 +    ctx = !(cbp   & 0x04) + 2 * !(cbp   & 0x02);
  1.1179 +    cbp += get_cabac_noinline(c, &c->cabac_state[73 + ctx]) << 3;
  1.1180 +    return cbp;
  1.1181 +}
  1.1182 +static int decode_cabac_mb_cbp_chroma(EntropyContext *ec, CABACContext *c) {
  1.1183 +    int ctx;
  1.1184 +    int cbp_a, cbp_b;
  1.1185 +
  1.1186 +    cbp_a = (ec->left_cbp>>4)&0x03;
  1.1187 +    cbp_b = (ec-> top_cbp>>4)&0x03;
  1.1188 +
  1.1189 +    ctx = 0;
  1.1190 +    if( cbp_a > 0 ) ctx++;
  1.1191 +    if( cbp_b > 0 ) ctx += 2;
  1.1192 +    if( get_cabac_noinline(c, &c->cabac_state[77 + ctx] ) == 0 )
  1.1193 +        return 0;
  1.1194 +
  1.1195 +    ctx = 4;
  1.1196 +    if( cbp_a == 2 ) ctx++;
  1.1197 +    if( cbp_b == 2 ) ctx += 2;
  1.1198 +    return 1 + get_cabac_noinline(c, &c->cabac_state[77 + ctx] );
  1.1199 +}
  1.1200 +
  1.1201 +static int decode_cabac_p_mb_sub_type( CABACContext *c) {
  1.1202 +    if( get_cabac(c, &c->cabac_state[21] ) )
  1.1203 +        return 0;   /* 8x8 */
  1.1204 +    if( !get_cabac(c, &c->cabac_state[22] ) )
  1.1205 +        return 1;   /* 8x4 */
  1.1206 +    if( get_cabac(c, &c->cabac_state[23] ) )
  1.1207 +        return 2;   /* 4x8 */
  1.1208 +    return 3;       /* 4x4 */
  1.1209 +}
  1.1210 +static int decode_cabac_b_mb_sub_type(CABACContext *c) {
  1.1211 +    int type;
  1.1212 +    if( !get_cabac(c, &c->cabac_state[36] ) )
  1.1213 +        return 0;   /* B_Direct_8x8 */
  1.1214 +    if( !get_cabac(c, &c->cabac_state[37] ) )
  1.1215 +        return 1 + get_cabac(c, &c->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
  1.1216 +    type = 3;
  1.1217 +    if( get_cabac(c, &c->cabac_state[38] ) ) {
  1.1218 +        if( get_cabac(c, &c->cabac_state[39] ) )
  1.1219 +            return 11 + get_cabac(c, &c->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
  1.1220 +        type += 4;
  1.1221 +    }
  1.1222 +    type += 2*get_cabac(c, &c->cabac_state[39] );
  1.1223 +    type +=   get_cabac(c, &c->cabac_state[39] );
  1.1224 +    return type;
  1.1225 +}
  1.1226 +
  1.1227 +static int decode_cabac_mb_ref(EntropyContext *ec, H264Slice *s, CABACContext *c, int list, int n ) {
  1.1228 +    int refa = ec->ref_cache[list][scan8[n] - 1];
  1.1229 +    int refb = ec->ref_cache[list][scan8[n] - 8];
  1.1230 +    int ref  = 0;
  1.1231 +    int ctx  = 0;
  1.1232 +
  1.1233 +    if( s->slice_type_nos == FF_B_TYPE) {
  1.1234 +        if( refa > 0 && !(ec->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
  1.1235 +            ctx++;
  1.1236 +        if( refb > 0 && !(ec->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
  1.1237 +            ctx += 2;
  1.1238 +    } else {
  1.1239 +        if( refa > 0 )
  1.1240 +            ctx++;
  1.1241 +        if( refb > 0 )
  1.1242 +            ctx += 2;
  1.1243 +    }
  1.1244 +
  1.1245 +    while( get_cabac(c, &c->cabac_state[54+ctx] ) ) {
  1.1246 +        ref++;
  1.1247 +        ctx = (ctx>>2)+4;
  1.1248 +        if(ref >= 32 /*h->ref_list[list]*/){
  1.1249 +            return -1;
  1.1250 +        }
  1.1251 +    }
  1.1252 +    return ref;
  1.1253 +}
  1.1254 +
  1.1255 +static int decode_cabac_mb_mvd( CABACContext *c, int ctxbase, int amvd, int *mvda) {
  1.1256 +    int mvd;
  1.1257 +
  1.1258 +    if(!get_cabac(c, &c->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
  1.1259 +        *mvda= 0;
  1.1260 +        return 0;
  1.1261 +    }
  1.1262 +
  1.1263 +    mvd= 1;
  1.1264 +    ctxbase+= 3;
  1.1265 +    while( mvd < 9 && get_cabac(c, &c->cabac_state[ctxbase] ) ) {
  1.1266 +        if( mvd < 4 )
  1.1267 +            ctxbase++;
  1.1268 +        mvd++;
  1.1269 +    }
  1.1270 +
  1.1271 +    if( mvd >= 9 ) {
  1.1272 +        int k = 3;
  1.1273 +        while( get_cabac_bypass(c ) ) {
  1.1274 +            mvd += 1 << k;
  1.1275 +            k++;
  1.1276 +            if(k>24){
  1.1277 +                av_log(AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
  1.1278 +                return INT_MIN;
  1.1279 +            }
  1.1280 +        }
  1.1281 +        while( k-- ) {
  1.1282 +            mvd += get_cabac_bypass(c )<<k;
  1.1283 +        }
  1.1284 +        *mvda=mvd < 70 ? mvd : 70;
  1.1285 +    }else
  1.1286 +        *mvda=mvd;
  1.1287 +    return get_cabac_bypass_sign(c, -mvd );
  1.1288 +}
  1.1289 +
  1.1290 +#define DECODE_CABAC_MB_MVD( ec, c, list,  n )\
  1.1291 +{\
  1.1292 +    int amvd0 = ec->mvd_cache[list][scan8[n] - 1][0] +\
  1.1293 +                ec->mvd_cache[list][scan8[n] - 8][0];\
  1.1294 +    int amvd1 = ec->mvd_cache[list][scan8[n] - 1][1] +\
  1.1295 +                ec->mvd_cache[list][scan8[n] - 8][1];\
  1.1296 +\
  1.1297 +    m->mvd[list][mp][0] = decode_cabac_mb_mvd( c, 40, amvd0, &mpx ); \
  1.1298 +    m->mvd[list][mp][1] = decode_cabac_mb_mvd( c, 47, amvd1, &mpy ); \
  1.1299 +    mp++; \
  1.1300 +}
  1.1301 +
  1.1302 +static av_always_inline int get_cabac_cbf_ctx(EntropyContext *ec, H264Slice *s, int cat, int idx, int is_dc ) {
  1.1303 +    int nza, nzb;
  1.1304 +    int ctx = 0;
  1.1305 +
  1.1306 +    if( is_dc ) {
  1.1307 +        if( cat == 0 ) {
  1.1308 +            nza = ec->left_cbp&0x100;
  1.1309 +            nzb = ec-> top_cbp&0x100;
  1.1310 +        } else {
  1.1311 +            nza = (ec->left_cbp>>(6+idx))&0x01;
  1.1312 +            nzb = (ec-> top_cbp>>(6+idx))&0x01;
  1.1313 +        }
  1.1314 +    } else {
  1.1315 +        assert(cat == 1 || cat == 2 || cat == 4);
  1.1316 +        nza = ec->non_zero_count_cache[scan8[idx] - 1];
  1.1317 +        nzb = ec->non_zero_count_cache[scan8[idx] - 8];
  1.1318 +    }
  1.1319 +
  1.1320 +    if( nza > 0 )
  1.1321 +        ctx++;
  1.1322 +
  1.1323 +    if( nzb > 0 )
  1.1324 +        ctx += 2;
  1.1325 +
  1.1326 +    return ctx + 4 * cat;
  1.1327 +}
  1.1328 +
  1.1329 +DECLARE_ASM_CONST(1, uint8_t, last_coeff_flag_offset_8x8)[63] = {
  1.1330 +    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1.1331 +    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  1.1332 +    3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  1.1333 +    5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
  1.1334 +};
  1.1335 +
  1.1336 +static const int significant_coeff_flag_offset[2][6] = {
  1.1337 +    { 105+0, 105+15, 105+29, 105+44, 105+47, 402 },
  1.1338 +    { 277+0, 277+15, 277+29, 277+44, 277+47, 436 }
  1.1339 +};
  1.1340 +static const int last_coeff_flag_offset[2][6] = {
  1.1341 +    { 166+0, 166+15, 166+29, 166+44, 166+47, 417 },
  1.1342 +    { 338+0, 338+15, 338+29, 338+44, 338+47, 451 }
  1.1343 +};
  1.1344 +static const int coeff_abs_level_m1_offset[6] = {
  1.1345 +    227+0, 227+10, 227+20, 227+30, 227+39, 426
  1.1346 +};
  1.1347 +static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
  1.1348 +    { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
  1.1349 +    4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
  1.1350 +    7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
  1.1351 +    12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
  1.1352 +    { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
  1.1353 +    6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
  1.1354 +    9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
  1.1355 +    9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
  1.1356 +};
  1.1357 +/* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
  1.1358 +* 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
  1.1359 +* map node ctx => cabac ctx for level=1 */
  1.1360 +static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
  1.1361 +/* map node ctx => cabac ctx for level>1 */
  1.1362 +static const uint8_t coeff_abs_levelgt1_ctx[8] = { 5, 5, 5, 5, 6, 7, 8, 9 };
  1.1363 +static const uint8_t coeff_abs_level_transition[2][8] = {
  1.1364 +    /* update node ctx after decoding a level=1 */
  1.1365 +    { 1, 2, 3, 3, 4, 5, 6, 7 },
  1.1366 +    /* update node ctx after decoding a level>1 */
  1.1367 +    { 4, 4, 4, 4, 5, 6, 7, 7 }
  1.1368 +};
  1.1369 +
  1.1370 +static av_always_inline void decode_cabac_residual_internal(EntropyContext *ec, H264Slice *s, CABACContext *c, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff, int is_dc ) {
  1.1371 +    H264Mb *m = ec->m;
  1.1372 +	const int mb_x = m->mb_x;
  1.1373 +    int index[64];
  1.1374 +
  1.1375 +    int av_unused last;
  1.1376 +    int coeff_count = 0;
  1.1377 +    int node_ctx = 0;
  1.1378 +
  1.1379 +    uint8_t *significant_coeff_ctx_base;
  1.1380 +    uint8_t *last_coeff_ctx_base;
  1.1381 +    uint8_t *abs_level_m1_ctx_base;
  1.1382 +
  1.1383 +    /* read coded block flag */
  1.1384 +    if( is_dc || cat != 5 ) {
  1.1385 +        if( get_cabac( c, &c->cabac_state[85 + get_cabac_cbf_ctx( ec, s, cat, n, is_dc ) ] ) == 0 ) {
  1.1386 +            if( !is_dc )
  1.1387 +                ec->non_zero_count_cache[scan8[n]] = 0;
  1.1388 +            return;
  1.1389 +        }
  1.1390 +    }
  1.1391 +
  1.1392 +    significant_coeff_ctx_base = c->cabac_state
  1.1393 +        + significant_coeff_flag_offset[0][cat];
  1.1394 +    last_coeff_ctx_base = c->cabac_state
  1.1395 +        + last_coeff_flag_offset[0][cat];
  1.1396 +    abs_level_m1_ctx_base = c->cabac_state
  1.1397 +        + coeff_abs_level_m1_offset[cat];
  1.1398 +
  1.1399 +    if( !is_dc && cat == 5 ) {
  1.1400 +#define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
  1.1401 +        for(last= 0; last < coefs; last++) { \
  1.1402 +            uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
  1.1403 +            if( get_cabac( c, sig_ctx )) { \
  1.1404 +                uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
  1.1405 +                index[coeff_count++] = last; \
  1.1406 +                if( get_cabac( c, last_ctx ) ) { \
  1.1407 +                    last= max_coeff; \
  1.1408 +                    break; \
  1.1409 +                } \
  1.1410 +            } \
  1.1411 +        }\
  1.1412 +        if( last == max_coeff -1 ) {\
  1.1413 +            index[coeff_count++] = last;\
  1.1414 +        }
  1.1415 +
  1.1416 +        const uint8_t *sig_off = significant_coeff_flag_offset_8x8[0];
  1.1417 +        DECODE_SIGNIFICANCE( 63, sig_off[last], last_coeff_flag_offset_8x8[last] );
  1.1418 +    } else {
  1.1419 +        DECODE_SIGNIFICANCE( max_coeff - 1, last, last );
  1.1420 +    }
  1.1421 +    assert(coeff_count > 0);
  1.1422 +
  1.1423 +    if( is_dc ) {
  1.1424 +        if( cat == 0 )
  1.1425 +            ec->cbp[mb_x] |= 0x100;
  1.1426 +        else
  1.1427 +            ec->cbp[mb_x] |= 0x40 << n;
  1.1428 +    } else {
  1.1429 +        if( cat == 5 )
  1.1430 +            fill_rectangle(&ec->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
  1.1431 +        else {
  1.1432 +            assert( cat == 1 || cat == 2 || cat == 4 );
  1.1433 +            ec->non_zero_count_cache[scan8[n]] = coeff_count;
  1.1434 +        }
  1.1435 +    }
  1.1436 +
  1.1437 +    do {
  1.1438 +        uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base;
  1.1439 +
  1.1440 +        int j= scantable[index[--coeff_count]];
  1.1441 +
  1.1442 +        if( get_cabac( c, ctx ) == 0 ) {
  1.1443 +            node_ctx = coeff_abs_level_transition[0][node_ctx];
  1.1444 +            if( is_dc ) {
  1.1445 +                block[j] = get_cabac_bypass_sign( c, -1);
  1.1446 +            }else{
  1.1447 +                block[j] = (get_cabac_bypass_sign( c, -qmul[j]) + 32) >> 6;
  1.1448 +            }
  1.1449 +        } else {
  1.1450 +            int coeff_abs = 2;
  1.1451 +            ctx = coeff_abs_levelgt1_ctx[node_ctx] + abs_level_m1_ctx_base;
  1.1452 +            node_ctx = coeff_abs_level_transition[1][node_ctx];
  1.1453 +
  1.1454 +            while( coeff_abs < 15 && get_cabac( c, ctx ) ) {
  1.1455 +                coeff_abs++;
  1.1456 +            }
  1.1457 +
  1.1458 +            if( coeff_abs >= 15 ) {
  1.1459 +                int j = 0;
  1.1460 +                while( get_cabac_bypass( c ) ) {
  1.1461 +                    j++;
  1.1462 +                }
  1.1463 +
  1.1464 +                coeff_abs=1;
  1.1465 +                while( j-- ) {
  1.1466 +                    coeff_abs += coeff_abs + get_cabac_bypass( c );
  1.1467 +                }
  1.1468 +                coeff_abs+= 14;
  1.1469 +            }
  1.1470 +
  1.1471 +            if( is_dc ) {
  1.1472 +                block[j] = get_cabac_bypass_sign( c, -coeff_abs );
  1.1473 +            }else{
  1.1474 +                block[j] = (get_cabac_bypass_sign( c, -coeff_abs ) * qmul[j] + 32) >> 6;
  1.1475 +            }
  1.1476 +        }
  1.1477 +    } while( coeff_count );
  1.1478 +
  1.1479 +}
  1.1480 +
  1.1481 +static void decode_cabac_residual_dc( EntropyContext *ec, H264Slice *s, CABACContext *c, DCTELEM *block, int cat, int n, const uint8_t *scantable, int max_coeff ) {
  1.1482 +    decode_cabac_residual_internal( ec, s, c, block, cat, n, scantable, NULL, max_coeff, 1);
  1.1483 +}
  1.1484 +
  1.1485 +static void decode_cabac_residual_nondc( EntropyContext *ec, H264Slice *s, CABACContext *c, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
  1.1486 +    decode_cabac_residual_internal( ec, s, c, block, cat, n, scantable, qmul, max_coeff, 0);
  1.1487 +}
  1.1488 +
  1.1489 +/**
  1.1490 + * decodes a macroblock
  1.1491 + * @return 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
  1.1492 + */
  1.1493 +int ff_h264_decode_mb_cabac(EntropyContext *ec, H264Slice *s, CABACContext *c) {
  1.1494 +    H264Mb *m = ec->m;
  1.1495 +	int mb_x = m->mb_x;
  1.1496 +    int mb_type, partition_count, cbp = 0;
  1.1497 +    int dct8x8_allowed= s->pps.transform_8x8_mode;
  1.1498 +
  1.1499 +    fill_decode_neighbors(ec, s);
  1.1500 +
  1.1501 +    if( s->slice_type_nos != FF_I_TYPE ) {
  1.1502 +        int skip;
  1.1503 +        /* a skipped mb needs the aff flag from the following mb */
  1.1504 +        skip = decode_cabac_mb_skip( ec, s, m, c);
  1.1505 +
  1.1506 +        /* read skip flags */
  1.1507 +        if( skip ) {
  1.1508 +            decode_mb_skip(ec, s);
  1.1509 +            m->cbp = ec->cbp[mb_x] = 0;
  1.1510 +            ec->chroma_pred_mode[mb_x] = 0;
  1.1511 +            ec->last_qscale_diff = 0;
  1.1512 +            return 0;
  1.1513 +        }
  1.1514 +    }
  1.1515 +
  1.1516 +    if( s->slice_type_nos == FF_B_TYPE ) {
  1.1517 +        int ctx = 0;
  1.1518 +
  1.1519 +        if( !IS_DIRECT( ec->left_type-1 ) )
  1.1520 +            ctx++;
  1.1521 +        if( !IS_DIRECT( ec->top_type-1 ) )
  1.1522 +            ctx++;
  1.1523 +
  1.1524 +        if( !get_cabac_noinline(c, &c->cabac_state[27+ctx] ) ){
  1.1525 +            mb_type= 0; /* B_Direct_16x16 */
  1.1526 +        }else if( !get_cabac_noinline(c, &c->cabac_state[27+3] ) ) {
  1.1527 +            mb_type= 1 + get_cabac_noinline(c, &c->cabac_state[27+5] ); /* B_L[01]_16x16 */
  1.1528 +        }else{
  1.1529 +            int bits;
  1.1530 +            bits = get_cabac_noinline(c, &c->cabac_state[27+4] ) << 3;
  1.1531 +            bits+= get_cabac_noinline(c, &c->cabac_state[27+5] ) << 2;
  1.1532 +            bits+= get_cabac_noinline(c, &c->cabac_state[27+5] ) << 1;
  1.1533 +            bits+= get_cabac_noinline(c, &c->cabac_state[27+5] );
  1.1534 +            if( bits < 8 ){
  1.1535 +                mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
  1.1536 +            }else if( bits == 13 ){
  1.1537 +                mb_type= decode_cabac_intra_mb_type(ec, s, c, 32, 0);
  1.1538 +                goto decode_intra_mb;
  1.1539 +            }else if( bits == 14 ){
  1.1540 +                mb_type= 11; /* B_L1_L0_8x16 */
  1.1541 +            }else if( bits == 15 ){
  1.1542 +                mb_type= 22; /* B_8x8 */
  1.1543 +            }else{
  1.1544 +                bits= ( bits<<1 ) + get_cabac_noinline(c, &c->cabac_state[27+5] );
  1.1545 +                mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
  1.1546 +            }
  1.1547 +        }
  1.1548 +        partition_count= b_mb_type_info[mb_type].partition_count;
  1.1549 +        mb_type=         b_mb_type_info[mb_type].type;
  1.1550 +    } else if( s->slice_type_nos == FF_P_TYPE ) {
  1.1551 +        if( get_cabac_noinline(c, &c->cabac_state[14] ) == 0 ) {
  1.1552 +            /* P-type */
  1.1553 +            if( get_cabac_noinline(c, &c->cabac_state[15] ) == 0 ) {
  1.1554 +                /* P_L0_D16x16, P_8x8 */
  1.1555 +                mb_type= 3 * get_cabac_noinline(c, &c->cabac_state[16] );
  1.1556 +            } else {
  1.1557 +                /* P_L0_D8x16, P_L0_D16x8 */
  1.1558 +                mb_type= 2 - get_cabac_noinline(c, &c->cabac_state[17] );
  1.1559 +            }
  1.1560 +            partition_count= p_mb_type_info[mb_type].partition_count;
  1.1561 +            mb_type=         p_mb_type_info[mb_type].type;
  1.1562 +        } else {
  1.1563 +            mb_type= decode_cabac_intra_mb_type(ec, s, c, 17, 0);
  1.1564 +            goto decode_intra_mb;
  1.1565 +        }
  1.1566 +    } else {
  1.1567 +        mb_type= decode_cabac_intra_mb_type(ec, s ,c, 3, 1);
  1.1568 +        if(s->slice_type == FF_SI_TYPE && mb_type)
  1.1569 +            mb_type--;
  1.1570 +        assert(s->slice_type_nos == FF_I_TYPE);
  1.1571 +decode_intra_mb:
  1.1572 +        partition_count = 0;
  1.1573 +        cbp= i_mb_type_info[mb_type].cbp;
  1.1574 +        m->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
  1.1575 +        mb_type= i_mb_type_info[mb_type].type;
  1.1576 +    }
  1.1577 +
  1.1578 +    if(IS_INTRA_PCM(mb_type)) {
  1.1579 +        const uint8_t *ptr;
  1.1580 +        // We assume these blocks are very rare so we do not optimize it.
  1.1581 +        // FIXME The two following lines get the bitstream position in the cabac
  1.1582 +        // decode, I think it should be done by a function in cabac.h (or cabac.c).
  1.1583 +        ptr=c->bytestream;
  1.1584 +        if(c->low&0x1) ptr--;
  1.1585 +        if(CABAC_BITS==16){
  1.1586 +            if(c->low&0x1FF) ptr--;
  1.1587 +        }
  1.1588 +		//printf("pcm\n");
  1.1589 +        // The pixels are stored in the same order as levels in h->mb array.
  1.1590 +        memcpy(m->mb, ptr, 256); ptr+=256;
  1.1591 +		memcpy(m->mb+128, ptr, 128); ptr+=128;
  1.1592 +
  1.1593 +        ff_init_cabac_decoder(c, ptr, c->bytestream_end - ptr);
  1.1594 +
  1.1595 +        // All blocks are present
  1.1596 +        m->cbp= ec->cbp[mb_x] = 0x1ef;
  1.1597 +        ec->chroma_pred_mode[mb_x] = 0;
  1.1598 +        // In deblocking, the quantizer is 0
  1.1599 +        m->qscale_mb_xy = ec->qscale[mb_x]= 0;
  1.1600 +        // All coeffs are present
  1.1601 +        memset(ec->non_zero_count[mb_x], 16, 8);
  1.1602 +		m->mb_type = ec->mb_type[mb_x]=  mb_type;
  1.1603 +        ec->last_qscale_diff = 0;
  1.1604 +
  1.1605 +        return 0;
  1.1606 +    }
  1.1607 +
  1.1608 +    fill_decode_caches(ec, s, mb_type);
  1.1609 +
  1.1610 +    int mp = 0;
  1.1611 +    if( IS_INTRA( mb_type ) ) {
  1.1612 +        int i, pred_mode;
  1.1613 +        if( IS_INTRA4x4( mb_type ) ) {
  1.1614 +            if( dct8x8_allowed && get_cabac_noinline(c, &c->cabac_state[399 + ec->neighbor_transform_size] ) ) {
  1.1615 +                mb_type |= MB_TYPE_8x8DCT;
  1.1616 +                for( i = 0; i < 16; i+=4 ) {
  1.1617 +                    m->intra4x4_pred_mode[i] = decode_cabac_mb_intra4x4_pred_mode_delta(c);
  1.1618 +                }
  1.1619 +            } else {
  1.1620 +                for( i = 0; i < 16; i++ ) {
  1.1621 +                    m->intra4x4_pred_mode[i] = decode_cabac_mb_intra4x4_pred_mode_delta(c);
  1.1622 +                }
  1.1623 +            }
  1.1624 +        }
  1.1625 +
  1.1626 +        m->chroma_pred_mode= ec->chroma_pred_mode[mb_x] =
  1.1627 +		pred_mode = decode_cabac_mb_chroma_pre_mode( ec, s, c );
  1.1628 +
  1.1629 +    } else if( partition_count == 4 ) {
  1.1630 +        int i, j, sub_partition_count[4], list;
  1.1631 +
  1.1632 +        if( s->slice_type_nos == FF_B_TYPE ) {
  1.1633 +            for( i = 0; i < 4; i++ ) {
  1.1634 +                m->sub_mb_type[i] = decode_cabac_b_mb_sub_type( c );
  1.1635 +                sub_partition_count[i]= b_sub_mb_type_info[ m->sub_mb_type[i] ].partition_count;
  1.1636 +                m->sub_mb_type[i]=      b_sub_mb_type_info[ m->sub_mb_type[i] ].type;
  1.1637 +            }
  1.1638 +            if( IS_DIRECT(m->sub_mb_type[0] | m->sub_mb_type[1] |
  1.1639 +                          m->sub_mb_type[2] | m->sub_mb_type[3]) ) {
  1.1640 +                ec->ref_cache[0][scan8[4]] =
  1.1641 +                ec->ref_cache[1][scan8[4]] =
  1.1642 +                ec->ref_cache[0][scan8[12]] =
  1.1643 +                ec->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
  1.1644 +
  1.1645 +                for( i = 0; i < 4; i++ )
  1.1646 +                    fill_rectangle( &ec->direct_cache[scan8[4*i]], 2, 2, 8, (m->sub_mb_type[i]>>1)&0xFF, 1 );
  1.1647 +            }
  1.1648 +        } else {
  1.1649 +            for( i = 0; i < 4; i++ ) {
  1.1650 +                m->sub_mb_type[i] = decode_cabac_p_mb_sub_type( c );
  1.1651 +                sub_partition_count[i]= p_sub_mb_type_info[ m->sub_mb_type[i] ].partition_count;
  1.1652 +                m->sub_mb_type[i]=      p_sub_mb_type_info[ m->sub_mb_type[i] ].type;
  1.1653 +            }
  1.1654 +        }
  1.1655 +
  1.1656 +        for( list = 0; list < s->list_count; list++ ) {
  1.1657 +            for( i = 0; i < 4; i++ ) {
  1.1658 +                if(IS_DIRECT(m->sub_mb_type[i])) continue;
  1.1659 +                if(IS_DIR(m->sub_mb_type[i], 0, list)){
  1.1660 +                    if( s->ref_count[list] > 1 ){
  1.1661 +                        m->ref_index[list][i] = decode_cabac_mb_ref(ec, s, c, list, 4*i );
  1.1662 +                        if(m->ref_index[list][i] >= s->ref_count[list]){
  1.1663 +                            av_log(AV_LOG_ERROR, "Reference %d >= %d\n", m->ref_index[list][i], s->ref_count[list]);
  1.1664 +                            return -1;
  1.1665 +                        }
  1.1666 +                    }else
  1.1667 +                        m->ref_index[list][i] = 0;
  1.1668 +                } else {
  1.1669 +                    m->ref_index[list][i] = -1;
  1.1670 +                }
  1.1671 +                ec->ref_cache[list][ scan8[4*i]   ]=ec->ref_cache[list][ scan8[4*i]+1 ]=
  1.1672 +                ec->ref_cache[list][ scan8[4*i]+8 ]=ec->ref_cache[list][ scan8[4*i]+9 ]= m->ref_index[list][i];
  1.1673 +            }
  1.1674 +        }
  1.1675 +
  1.1676 +        if(dct8x8_allowed){
  1.1677 +//             assert(0);
  1.1678 +            dct8x8_allowed = get_dct8x8_allowed(ec, s);
  1.1679 +        }
  1.1680 +
  1.1681 +        for(list=0; list<s->list_count; list++){
  1.1682 +            for(i=0; i<4; i++){
  1.1683 +//                 ec->ref_cache[list][ scan8[4*i]   ]=ec->ref_cache[list][ scan8[4*i]+1 ];
  1.1684 +                if(IS_DIRECT(m->sub_mb_type[i])){
  1.1685 +                    fill_rectangle(ec->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
  1.1686 +                    continue;
  1.1687 +                }
  1.1688 +
  1.1689 +                if(IS_DIR(m->sub_mb_type[i], 0, list) && !IS_DIRECT(m->sub_mb_type[i])){
  1.1690 +                    const int sub_mb_type= m->sub_mb_type[i];
  1.1691 +                    const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
  1.1692 +                    for(j=0; j<sub_partition_count[i]; j++){
  1.1693 +                        int mpx, mpy;
  1.1694 +                        const int index= 4*i + block_width*j;
  1.1695 +                        uint8_t (* mvd_cache)[2]= &ec->mvd_cache[list][ scan8[index]];
  1.1696 +
  1.1697 +                        DECODE_CABAC_MB_MVD( ec, c, list, index)
  1.1698 +
  1.1699 +                        if(IS_SUB_8X8(sub_mb_type)){
  1.1700 +                            mvd_cache[ 1 ][0]=
  1.1701 +                            mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
  1.1702 +                            mvd_cache[ 1 ][1]=
  1.1703 +                            mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
  1.1704 +                        }else if(IS_SUB_8X4(sub_mb_type)){
  1.1705 +                            mvd_cache[ 1 ][0]=  mpx;
  1.1706 +                            mvd_cache[ 1 ][1]= mpy;
  1.1707 +                        }else if(IS_SUB_4X8(sub_mb_type)){
  1.1708 +                            mvd_cache[ 8 ][0]= mpx;
  1.1709 +                            mvd_cache[ 8 ][1]= mpy;
  1.1710 +                        }
  1.1711 +                        mvd_cache[ 0 ][0]= mpx;
  1.1712 +                        mvd_cache[ 0 ][1]= mpy;
  1.1713 +                    }
  1.1714 +                }else{
  1.1715 +                    fill_rectangle(ec->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
  1.1716 +                }
  1.1717 +            }
  1.1718 +        }
  1.1719 +    } else if( IS_DIRECT(mb_type) ) {
  1.1720 +        mb_type |= MB_TYPE_16x16;
  1.1721 +        fill_rectangle(ec->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
  1.1722 +        fill_rectangle(ec->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
  1.1723 +        dct8x8_allowed &= s->direct_8x8_inference_flag;
  1.1724 +    } else {
  1.1725 +        int list, i;
  1.1726 +        if(IS_16X16(mb_type)){
  1.1727 +            for(list=0; list<s->list_count; list++){
  1.1728 +                if(IS_DIR(mb_type, 0, list)){
  1.1729 +                    int ref;
  1.1730 +                    if(s->ref_count[list] > 1){
  1.1731 +                        ref= decode_cabac_mb_ref(ec, s, c, list, 0);
  1.1732 +                        if(ref >= s->ref_count[list]){
  1.1733 +                            av_log(AV_LOG_ERROR, "Reference %d >= %d\n", ref, s->ref_count[list]);
  1.1734 +                            return -1;
  1.1735 +                        }
  1.1736 +                    }else
  1.1737 +                        ref=0;
  1.1738 +                    m->ref_index[list][0]= ref;
  1.1739 +                    fill_rectangle(&ec->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
  1.1740 +                }
  1.1741 +            }
  1.1742 +            for(list=0; list<s->list_count; list++){
  1.1743 +                if(IS_DIR(mb_type, 0, list)){
  1.1744 +                    int mpx,mpy;
  1.1745 +                    DECODE_CABAC_MB_MVD( ec, c, list, 0)
  1.1746 +
  1.1747 +                    fill_rectangle(ec->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
  1.1748 +                }
  1.1749 +
  1.1750 +            }
  1.1751 +        }
  1.1752 +        else if(IS_16X8(mb_type)){
  1.1753 +            for(list=0; list<s->list_count; list++){
  1.1754 +                for(i=0; i<2; i++){
  1.1755 +                    if(IS_DIR(mb_type, i, list)){
  1.1756 +                        int ref;
  1.1757 +                        if(s->ref_count[list] > 1){
  1.1758 +                            ref= decode_cabac_mb_ref(ec, s, c, list, 8*i );
  1.1759 +                            if(ref >= s->ref_count[list]){
  1.1760 +                                av_log(AV_LOG_ERROR, "Reference %d >= %d\n", ref, s->ref_count[list]);
  1.1761 +                                return -1;
  1.1762 +                            }
  1.1763 +                        }else
  1.1764 +                            ref=0;
  1.1765 +                        m->ref_index[list][i]= ref;
  1.1766 +                        fill_rectangle(&ec->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
  1.1767 +                    }else{
  1.1768 +                        m->ref_index[list][i]= LIST_NOT_USED;
  1.1769 +                        fill_rectangle(&ec->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
  1.1770 +                    }
  1.1771 +                }
  1.1772 +            }
  1.1773 +            for(list=0; list<s->list_count; list++){
  1.1774 +                for(i=0; i<2; i++){
  1.1775 +                    if(IS_DIR(mb_type, i, list)){
  1.1776 +                        int mpx,mpy;
  1.1777 +                        DECODE_CABAC_MB_MVD( ec, c, list, 8*i)
  1.1778 +
  1.1779 +                        fill_rectangle(ec->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
  1.1780 +                    }else{
  1.1781 +                        fill_rectangle(ec->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
  1.1782 +                    }
  1.1783 +                }
  1.1784 +            }
  1.1785 +        }else{
  1.1786 +            assert(IS_8X16(mb_type));
  1.1787 +            for(list=0; list<s->list_count; list++){
  1.1788 +                for(i=0; i<2; i++){
  1.1789 +                    if(IS_DIR(mb_type, i, list)){ //FIXME optimize
  1.1790 +                        int ref;
  1.1791 +                        if(s->ref_count[list] > 1){
  1.1792 +                            ref= decode_cabac_mb_ref(ec, s, c, list, 4*i );
  1.1793 +                            if(ref >= s->ref_count[list]){
  1.1794 +                                av_log(AV_LOG_ERROR, "Reference %d >= %d\n", ref, s->ref_count[list]);
  1.1795 +                                return -1;
  1.1796 +                            }
  1.1797 +                        }else
  1.1798 +                            ref=0;
  1.1799 +                        m->ref_index[list][i]= ref;
  1.1800 +                        fill_rectangle(&ec->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
  1.1801 +                    }else{
  1.1802 +                        m->ref_index[list][i]= LIST_NOT_USED;
  1.1803 +                        fill_rectangle(&ec->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
  1.1804 +                    }
  1.1805 +                }
  1.1806 +            }
  1.1807 +            for(list=0; list<s->list_count; list++){
  1.1808 +                for(i=0; i<2; i++){
  1.1809 +                    if(IS_DIR(mb_type, i, list)){
  1.1810 +                        int mpx,mpy;
  1.1811 +                        DECODE_CABAC_MB_MVD( ec, c, list, 4*i)
  1.1812 +
  1.1813 +                        fill_rectangle(ec->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
  1.1814 +                    }else{
  1.1815 +                        fill_rectangle(ec->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
  1.1816 +                    }
  1.1817 +                }
  1.1818 +            }
  1.1819 +        }
  1.1820 +    }
  1.1821 +
  1.1822 +    if( IS_INTER( mb_type ) ||(IS_DIRECT(mb_type))) {
  1.1823 +        ec->chroma_pred_mode[mb_x] = 0;
  1.1824 +        write_back_motion( ec, s, mb_type );
  1.1825 +    }
  1.1826 +
  1.1827 +    if( !IS_INTRA16x16( mb_type ) ) {
  1.1828 +        cbp  = decode_cabac_mb_cbp_luma( ec, c);
  1.1829 +		cbp |= decode_cabac_mb_cbp_chroma( ec, c ) << 4;
  1.1830 +    }
  1.1831 +
  1.1832 +    ec->cbp[mb_x] = m->cbp = cbp;
  1.1833 +
  1.1834 +    if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
  1.1835 +        int t = get_cabac_noinline(c, &c->cabac_state[399 + ec->neighbor_transform_size] );
  1.1836 +        mb_type |= MB_TYPE_8x8DCT * t;
  1.1837 +    }
  1.1838 +    m->mb_type = ec->mb_type[mb_x] = mb_type;
  1.1839 +
  1.1840 +    if( cbp || IS_INTRA16x16( mb_type ) ) {
  1.1841 +        const uint8_t *scan, *scan8x8, *dc_scan;
  1.1842 +        const uint32_t *qmul;
  1.1843 +
  1.1844 +
  1.1845 +        if (s->transform_bypass && ec->curr_qscale){
  1.1846 +            scan8x8= ff_zigzag_direct;
  1.1847 +            scan= zigzag_scan;
  1.1848 +        }else{
  1.1849 +            scan8x8= ec->zigzag_scan8x8;
  1.1850 +            scan= ec->zigzag_scan;
  1.1851 +        }
  1.1852 +        dc_scan= luma_dc_zigzag_scan;
  1.1853 +
  1.1854 +        // decode_cabac_mb_dqp
  1.1855 +        if(get_cabac_noinline(c, &c->cabac_state[60 + (ec->last_qscale_diff != 0)])){
  1.1856 +            int val = 1;
  1.1857 +            int ctx= 2;
  1.1858 +
  1.1859 +            while( get_cabac_noinline(c, &c->cabac_state[60 + ctx] ) ) {
  1.1860 +                ctx= 3;
  1.1861 +                val++;
  1.1862 +                if(val > 102){ //prevent infinite loop
  1.1863 +                    av_log(AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", m->mb_x, m->mb_y);
  1.1864 +                    return -1;
  1.1865 +                }
  1.1866 +            }
  1.1867 +
  1.1868 +            if( val&0x01 )
  1.1869 +                val=   (val + 1)>>1 ;
  1.1870 +            else
  1.1871 +                val= -((val + 1)>>1);
  1.1872 +            ec->last_qscale_diff = val;
  1.1873 +            ec->curr_qscale += val;
  1.1874 +            if(((unsigned)ec->curr_qscale) > 51){
  1.1875 +                if(ec->curr_qscale<0) ec->curr_qscale+= 52;
  1.1876 +                else            ec->curr_qscale-= 52;
  1.1877 +            }
  1.1878 +            ec->chroma_qp[0] = get_chroma_qp( s, 0, ec->curr_qscale);
  1.1879 +            ec->chroma_qp[1] = get_chroma_qp( s, 1, ec->curr_qscale);
  1.1880 +        }else
  1.1881 +            ec->last_qscale_diff=0;
  1.1882 +
  1.1883 +        memset(m->mb, 0, 16*16 * sizeof(DCTELEM));
  1.1884 +        if( IS_INTRA16x16( mb_type ) ) {
  1.1885 +            int i;
  1.1886 +
  1.1887 +            //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
  1.1888 +            decode_cabac_residual_dc( ec, s, c, m->mb, 0, 0, dc_scan, 16);
  1.1889 +            qmul = ec->dequant4_coeff[0][ec->curr_qscale];
  1.1890 +            if( cbp&15 ) {
  1.1891 +                for( i = 0; i < 16; i++ ) {
  1.1892 +                    //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", i );
  1.1893 +                    decode_cabac_residual_nondc( ec, s, c, m->mb + 16*i, 1, i, scan + 1, qmul, 15);
  1.1894 +                }
  1.1895 +            } else {
  1.1896 +                fill_rectangle(&ec->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
  1.1897 +            }
  1.1898 +            h264_luma_dc_dequant_idct_c(m->mb, qmul[0]);
  1.1899 +        } else {
  1.1900 +
  1.1901 +            int i8x8, i4x4;
  1.1902 +            for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
  1.1903 +                if( cbp & (1<<i8x8) ) {
  1.1904 +                    if( IS_8x8DCT(mb_type) ) {
  1.1905 +                        decode_cabac_residual_nondc(ec, s, c, m->mb + 64*i8x8, 5, 4*i8x8,
  1.1906 +                            scan8x8, ec->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][ec->curr_qscale], 64);
  1.1907 +                    } else {
  1.1908 +                        qmul = ec->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][ec->curr_qscale];
  1.1909 +                        for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
  1.1910 +                            const int index = 4*i8x8 + i4x4;
  1.1911 +                            //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %d\n", index );
  1.1912 +//START_TIMER
  1.1913 +                            decode_cabac_residual_nondc(ec, s, c, m->mb + 16*index, 2, index, scan, qmul, 16);
  1.1914 +//STOP_TIMER("decode_residual")
  1.1915 +                        }
  1.1916 +                    }
  1.1917 +                } else {
  1.1918 +                    uint8_t * const nnz= &ec->non_zero_count_cache[ scan8[4*i8x8] ];
  1.1919 +                    nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
  1.1920 +                }
  1.1921 +            }
  1.1922 +        }
  1.1923 +
  1.1924 +        if( cbp&0x30 ){
  1.1925 +            memset(m->mb + 256, 0, 2*64 * sizeof(DCTELEM));
  1.1926 +            for( int i = 0; i < 2; i++ ) {
  1.1927 +                const uint32_t dequant4_coeff = ec->dequant4_coeff[IS_INTRA(mb_type) ? 1+i:4+i][ec->chroma_qp[i]][0];
  1.1928 +
  1.1929 +                //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
  1.1930 +                decode_cabac_residual_dc(ec, s, c, m->mb + 256 + 16*4*i, 3, i, chroma_dc_scan, 4);
  1.1931 +                chroma_dc_dequant_idct_c(m->mb + 256 + 16*4*i, dequant4_coeff);
  1.1932 +            }
  1.1933 +        }
  1.1934 +
  1.1935 +        if( cbp&0x20 ) {
  1.1936 +            int i, j;
  1.1937 +            for( i = 0; i < 2; i++ ) {
  1.1938 +                qmul = ec->dequant4_coeff[i+1+(IS_INTRA( mb_type ) ? 0:3)][ec->chroma_qp[i]];
  1.1939 +                for( j = 0; j < 4; j++ ) {
  1.1940 +                    const int index = 16 + 4 * i + j;
  1.1941 +                    //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 );
  1.1942 +                    decode_cabac_residual_nondc( ec, s, c, m->mb + 16*index, 4, index, scan + 1, qmul, 15);
  1.1943 +                }
  1.1944 +            }
  1.1945 +        } else {
  1.1946 +            uint8_t * const nnz= &ec->non_zero_count_cache[0];
  1.1947 +            nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
  1.1948 +            nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
  1.1949 +        }
  1.1950 +
  1.1951 +    } else {
  1.1952 +        uint8_t * const nnz= &ec->non_zero_count_cache[0];
  1.1953 +        fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1);
  1.1954 +        nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
  1.1955 +        nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
  1.1956 +        ec->last_qscale_diff = 0;
  1.1957 +    }
  1.1958 +
  1.1959 +    m->qscale_mb_xy = ec->qscale[mb_x]= ec->curr_qscale;
  1.1960 +    write_back_non_zero_count(ec, s);
  1.1961 +
  1.1962 +
  1.1963 +    return 0;
  1.1964 +}
  1.1965 +
  1.1966 +void free_entropy_context(EntropyContext *ec){
  1.1967 +    av_freep(&ec->non_zero_count_row[0]);
  1.1968 +    av_freep(&ec->non_zero_count_row[1]);
  1.1969 +    av_freep(&ec->mvd_table[0][0]);
  1.1970 +    av_freep(&ec->mvd_table[0][1]);
  1.1971 +    av_freep(&ec->mvd_table[1][0]);
  1.1972 +    av_freep(&ec->mvd_table[1][1]);
  1.1973 +
  1.1974 +    av_freep(&ec->direct_table[0]);
  1.1975 +    av_freep(&ec->direct_table[1]);
  1.1976 +    av_freep(&ec->chroma_pred_mode_table[0]);
  1.1977 +    av_freep(&ec->chroma_pred_mode_table[1]);
  1.1978 +    av_freep(&ec->cbp_table[0]);
  1.1979 +    av_freep(&ec->cbp_table[1]);
  1.1980 +    av_freep(&ec->qscale_table[0]);
  1.1981 +    av_freep(&ec->qscale_table[1]);
  1.1982 +
  1.1983 +    av_freep(&ec->mb_type_table[0]);
  1.1984 +    av_freep(&ec->mb_type_table[1]);
  1.1985 +    av_freep(&ec->ref_index_table[0][0]);
  1.1986 +    av_freep(&ec->ref_index_table[0][1]);
  1.1987 +    av_freep(&ec->ref_index_table[1][0]);
  1.1988 +    av_freep(&ec->ref_index_table[1][1]);
  1.1989 +
  1.1990 +
  1.1991 +    av_free(ec);
  1.1992 +}
  1.1993 +
  1.1994 +EntropyContext *get_entropy_context(H264Context *h){
  1.1995 +    const int mb_height = h->mb_height;
  1.1996 +    const int mb_width  = h->mb_width;
  1.1997 +    const int mb_stride = h->mb_stride;
  1.1998 +
  1.1999 +    EntropyContext *ec = av_mallocz(sizeof(EntropyContext));
  1.2000 +
  1.2001 +    ec->mb_width = mb_width;
  1.2002 +    ec->mb_height = mb_height;
  1.2003 +    ec->b_stride  = mb_width*4;
  1.2004 +    ec->mb_stride = mb_stride;
  1.2005 +
  1.2006 +    FF_ALLOCZ_OR_GOTO(ec->non_zero_count_row[0], mb_stride * 8 * sizeof(uint8_t), fail)
  1.2007 +    FF_ALLOCZ_OR_GOTO(ec->non_zero_count_row[1], mb_stride * 8 * sizeof(uint8_t), fail)
  1.2008 +
  1.2009 +    FF_ALLOCZ_OR_GOTO(ec->mvd_table[0][0], 16*mb_stride * sizeof(uint8_t), fail);
  1.2010 +    FF_ALLOCZ_OR_GOTO(ec->mvd_table[0][1], 16*mb_stride * sizeof(uint8_t), fail);
  1.2011 +    FF_ALLOCZ_OR_GOTO(ec->mvd_table[1][0], 16*mb_stride * sizeof(uint8_t), fail);
  1.2012 +    FF_ALLOCZ_OR_GOTO(ec->mvd_table[1][1], 16*mb_stride * sizeof(uint8_t), fail);
  1.2013 +
  1.2014 +    FF_ALLOCZ_OR_GOTO(ec->direct_table[0], 4*mb_stride * sizeof(uint8_t) , fail);
  1.2015 +    FF_ALLOCZ_OR_GOTO(ec->direct_table[1], 4*mb_stride * sizeof(uint8_t) , fail);
  1.2016 +
  1.2017 +    FF_ALLOCZ_OR_GOTO(ec->chroma_pred_mode_table[0], mb_stride * sizeof(uint8_t), fail)
  1.2018 +    FF_ALLOCZ_OR_GOTO(ec->chroma_pred_mode_table[1], mb_stride * sizeof(uint8_t), fail)
  1.2019 +
  1.2020 +    FF_ALLOCZ_OR_GOTO(ec->cbp_table[0], mb_stride * sizeof(uint16_t), fail)
  1.2021 +    FF_ALLOCZ_OR_GOTO(ec->cbp_table[1], mb_stride * sizeof(uint16_t), fail)
  1.2022 +
  1.2023 +    FF_ALLOCZ_OR_GOTO(ec->qscale_table[0], mb_stride * sizeof(uint8_t) , fail)
  1.2024 +    FF_ALLOCZ_OR_GOTO(ec->qscale_table[1], mb_stride * sizeof(uint8_t) , fail)
  1.2025 +
  1.2026 +    FF_ALLOCZ_OR_GOTO(ec->mb_type_table[0] , (mb_stride+1) * sizeof(uint32_t), fail)
  1.2027 +    FF_ALLOCZ_OR_GOTO(ec->mb_type_table[1] , (mb_stride+1) * sizeof(uint32_t), fail)
  1.2028 +
  1.2029 +    FF_ALLOCZ_OR_GOTO(ec->ref_index_table[0][0], 4*mb_stride * sizeof(int8_t), fail)
  1.2030 +    FF_ALLOCZ_OR_GOTO(ec->ref_index_table[1][0], 4*mb_stride * sizeof(int8_t), fail)
  1.2031 +    FF_ALLOCZ_OR_GOTO(ec->ref_index_table[0][1], 4*mb_stride * sizeof(int8_t), fail)
  1.2032 +    FF_ALLOCZ_OR_GOTO(ec->ref_index_table[1][1], 4*mb_stride * sizeof(int8_t), fail)
  1.2033 +
  1.2034 +    ec->zigzag_scan = h->zigzag_scan;
  1.2035 +    ec->zigzag_scan8x8 = h->zigzag_scan8x8;
  1.2036 +
  1.2037 +    return ec;
  1.2038 +fail:
  1.2039 +    free_entropy_context(ec);
  1.2040 +    return NULL;
  1.2041 +}
  1.2042 +
  1.2043 +void init_entropy_buf(EntropyContext *ec, H264Slice *s, int line){
  1.2044 +    int top = (line+1)%2;
  1.2045 +    int cur = line%2;
  1.2046 +
  1.2047 +    ec->non_zero_count_top      = ec->non_zero_count_row[top];
  1.2048 +    ec->non_zero_count          = ec->non_zero_count_row[cur];
  1.2049 +    ec->mvd_top[0]              = ec->mvd_table[0][top];
  1.2050 +    ec->mvd[0]                  = ec->mvd_table[0][cur];
  1.2051 +    ec->mvd_top[1]              = ec->mvd_table[1][top];
  1.2052 +    ec->mvd[1]                  = ec->mvd_table[1][cur];
  1.2053 +    ec->direct_top              = ec->direct_table[top];
  1.2054 +    ec->direct                  = ec->direct_table[cur];
  1.2055 +    ec->chroma_pred_mode_top    = ec->chroma_pred_mode_table[top];
  1.2056 +    ec->chroma_pred_mode        = ec->chroma_pred_mode_table[cur];
  1.2057 +    ec->cbp_top                 = ec->cbp_table[top];
  1.2058 +    ec->cbp                     = ec->cbp_table[cur];
  1.2059 +    ec->qscale_top              = ec->qscale_table[top] +1;
  1.2060 +    ec->qscale                  = ec->qscale_table[cur] +1;
  1.2061 +    ec->mb_type_top             = ec->mb_type_table[top]+1;
  1.2062 +    ec->mb_type                 = ec->mb_type_table[cur]+1;
  1.2063 +    ec->ref_index_top[0]        = ec->ref_index_table[0][top];
  1.2064 +    ec->ref_index_top[1]        = ec->ref_index_table[1][top];
  1.2065 +    ec->ref_index[0]            = ec->ref_index_table[0][cur];
  1.2066 +    ec->ref_index[1]            = ec->ref_index_table[1][cur];
  1.2067 +
  1.2068 +}