Mercurial > cgi-bin > hgwebdir.cgi > PR > Applications > VSs > VSs__H264__App
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 +}
