| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 | 11 |
| 12 #include <math.h> | 12 #include <math.h> |
| 13 #include <stdio.h> | 13 #include <stdio.h> |
| 14 #include <string.h> | 14 #include <string.h> |
| 15 #include <assert.h> | 15 #include <assert.h> |
| 16 #include "onyx_int.h" | 16 #include "onyx_int.h" |
| 17 #include "tokenize.h" | 17 #include "tokenize.h" |
| 18 #include "vpx_mem/vpx_mem.h" | 18 #include "vpx_mem/vpx_mem.h" |
| 19 | 19 |
| 20 /* Global event counters used for accumulating statistics across several | 20 /* Global event counters used for accumulating statistics across several |
| 21 compressions, then generating context.c = initial stats. */ | 21 compressions, then generating context.c = initial stats. */ |
| 22 | 22 |
| 23 #ifdef ENTROPY_STATS | 23 #ifdef ENTROPY_STATS |
| 24 _int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTR
OPY_TOKENS]; | 24 _int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTR
OPY_TOKENS]; |
| 25 #endif | 25 #endif |
| 26 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) ; | 26 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) ; |
| 27 void vp8_fix_contexts(MACROBLOCKD *x); | 27 void vp8_fix_contexts(MACROBLOCKD *x); |
| 28 | 28 |
| 29 #include "dct_value_tokens.h" | 29 #include "dct_value_tokens.h" |
| 30 #include "dct_value_cost.h" | 30 #include "dct_value_cost.h" |
| 31 | 31 |
| 32 const TOKENVALUE *const vp8_dct_value_tokens_ptr = dct_value_tokens + | 32 const TOKENVALUE *const vp8_dct_value_tokens_ptr = dct_value_tokens + |
| 33 DCT_MAX_VALUE; | 33 DCT_MAX_VALUE; |
| 34 const short *const vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; | 34 const short *const vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; |
| 35 | 35 |
| 36 #if 0 | 36 #if 0 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 } | 95 } |
| 96 while (++i < DCT_MAX_VALUE); | 96 while (++i < DCT_MAX_VALUE); |
| 97 | 97 |
| 98 vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE; | 98 vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE; |
| 99 vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; | 99 vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; |
| 100 } | 100 } |
| 101 */ | 101 */ |
| 102 | 102 |
| 103 static void tokenize2nd_order_b | 103 static void tokenize2nd_order_b |
| 104 ( | 104 ( |
| 105 MACROBLOCK *x, | 105 MACROBLOCKD *x, |
| 106 TOKENEXTRA **tp, | 106 TOKENEXTRA **tp, |
| 107 VP8_COMP *cpi | 107 VP8_COMP *cpi |
| 108 ) | 108 ) |
| 109 { | 109 { |
| 110 MACROBLOCKD *xd = &x->e_mbd; | |
| 111 int pt; /* near block/prev token context index */ | 110 int pt; /* near block/prev token context index */ |
| 112 int c; /* start at DC */ | 111 int c; /* start at DC */ |
| 113 TOKENEXTRA *t = *tp;/* store tokens starting here */ | 112 TOKENEXTRA *t = *tp;/* store tokens starting here */ |
| 114 const BLOCKD *b; | 113 const BLOCKD *b; |
| 115 const short *qcoeff_ptr; | 114 const short *qcoeff_ptr; |
| 116 ENTROPY_CONTEXT * a; | 115 ENTROPY_CONTEXT * a; |
| 117 ENTROPY_CONTEXT * l; | 116 ENTROPY_CONTEXT * l; |
| 118 int band, rc, v, token; | 117 int band, rc, v, token; |
| 119 int eob; | 118 int eob; |
| 120 | 119 |
| 121 b = xd->block + 24; | 120 b = x->block + 24; |
| 122 qcoeff_ptr = b->qcoeff; | 121 qcoeff_ptr = b->qcoeff; |
| 123 a = (ENTROPY_CONTEXT *)xd->above_context + 8; | 122 a = (ENTROPY_CONTEXT *)x->above_context + 8; |
| 124 l = (ENTROPY_CONTEXT *)xd->left_context + 8; | 123 l = (ENTROPY_CONTEXT *)x->left_context + 8; |
| 125 eob = xd->eobs[24]; | 124 eob = x->eobs[24]; |
| 126 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 125 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
| 127 | 126 |
| 128 if(!eob) | 127 if(!eob) |
| 129 { | 128 { |
| 130 /* c = band for this case */ | 129 /* c = band for this case */ |
| 131 t->Token = DCT_EOB_TOKEN; | 130 t->Token = DCT_EOB_TOKEN; |
| 132 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; | 131 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; |
| 133 t->skip_eob_node = 0; | 132 t->skip_eob_node = 0; |
| 134 | 133 |
| 135 ++x->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; | 134 ++cpi->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; |
| 136 t++; | 135 t++; |
| 137 *tp = t; | 136 *tp = t; |
| 138 *a = *l = 0; | 137 *a = *l = 0; |
| 139 return; | 138 return; |
| 140 } | 139 } |
| 141 | 140 |
| 142 v = qcoeff_ptr[0]; | 141 v = qcoeff_ptr[0]; |
| 143 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 142 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
| 144 token = vp8_dct_value_tokens_ptr[v].Token; | 143 token = vp8_dct_value_tokens_ptr[v].Token; |
| 145 t->Token = token; | 144 t->Token = token; |
| 146 | 145 |
| 147 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; | 146 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; |
| 148 t->skip_eob_node = 0; | 147 t->skip_eob_node = 0; |
| 149 ++x->coef_counts [1] [0] [pt] [token]; | 148 ++cpi->coef_counts [1] [0] [pt] [token]; |
| 150 pt = vp8_prev_token_class[token]; | 149 pt = vp8_prev_token_class[token]; |
| 151 t++; | 150 t++; |
| 152 c = 1; | 151 c = 1; |
| 153 | 152 |
| 154 for (; c < eob; c++) | 153 for (; c < eob; c++) |
| 155 { | 154 { |
| 156 rc = vp8_default_zig_zag1d[c]; | 155 rc = vp8_default_zig_zag1d[c]; |
| 157 band = vp8_coef_bands[c]; | 156 band = vp8_coef_bands[c]; |
| 158 v = qcoeff_ptr[rc]; | 157 v = qcoeff_ptr[rc]; |
| 159 | 158 |
| 160 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 159 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
| 161 token = vp8_dct_value_tokens_ptr[v].Token; | 160 token = vp8_dct_value_tokens_ptr[v].Token; |
| 162 | 161 |
| 163 t->Token = token; | 162 t->Token = token; |
| 164 t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; | 163 t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; |
| 165 | 164 |
| 166 t->skip_eob_node = ((pt == 0)); | 165 t->skip_eob_node = ((pt == 0)); |
| 167 | 166 |
| 168 ++x->coef_counts [1] [band] [pt] [token]; | 167 ++cpi->coef_counts [1] [band] [pt] [token]; |
| 169 | 168 |
| 170 pt = vp8_prev_token_class[token]; | 169 pt = vp8_prev_token_class[token]; |
| 171 t++; | 170 t++; |
| 172 } | 171 } |
| 173 if (c < 16) | 172 if (c < 16) |
| 174 { | 173 { |
| 175 band = vp8_coef_bands[c]; | 174 band = vp8_coef_bands[c]; |
| 176 t->Token = DCT_EOB_TOKEN; | 175 t->Token = DCT_EOB_TOKEN; |
| 177 t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; | 176 t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; |
| 178 | 177 |
| 179 t->skip_eob_node = 0; | 178 t->skip_eob_node = 0; |
| 180 | 179 |
| 181 ++x->coef_counts [1] [band] [pt] [DCT_EOB_TOKEN]; | 180 ++cpi->coef_counts [1] [band] [pt] [DCT_EOB_TOKEN]; |
| 182 | 181 |
| 183 t++; | 182 t++; |
| 184 } | 183 } |
| 185 | 184 |
| 186 *tp = t; | 185 *tp = t; |
| 187 *a = *l = 1; | 186 *a = *l = 1; |
| 188 | 187 |
| 189 } | 188 } |
| 190 | 189 |
| 191 static void tokenize1st_order_b | 190 static void tokenize1st_order_b |
| 192 ( | 191 ( |
| 193 MACROBLOCK *x, | 192 MACROBLOCKD *x, |
| 194 TOKENEXTRA **tp, | 193 TOKENEXTRA **tp, |
| 195 int type, /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */ | 194 int type, /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */ |
| 196 VP8_COMP *cpi | 195 VP8_COMP *cpi |
| 197 ) | 196 ) |
| 198 { | 197 { |
| 199 MACROBLOCKD *xd = &x->e_mbd; | |
| 200 unsigned int block; | 198 unsigned int block; |
| 201 const BLOCKD *b; | 199 const BLOCKD *b; |
| 202 int pt; /* near block/prev token context index */ | 200 int pt; /* near block/prev token context index */ |
| 203 int c; | 201 int c; |
| 204 int token; | 202 int token; |
| 205 TOKENEXTRA *t = *tp;/* store tokens starting here */ | 203 TOKENEXTRA *t = *tp;/* store tokens starting here */ |
| 206 const short *qcoeff_ptr; | 204 const short *qcoeff_ptr; |
| 207 ENTROPY_CONTEXT * a; | 205 ENTROPY_CONTEXT * a; |
| 208 ENTROPY_CONTEXT * l; | 206 ENTROPY_CONTEXT * l; |
| 209 int band, rc, v; | 207 int band, rc, v; |
| 210 int tmp1, tmp2; | 208 int tmp1, tmp2; |
| 211 | 209 |
| 212 b = xd->block; | 210 b = x->block; |
| 213 /* Luma */ | 211 /* Luma */ |
| 214 for (block = 0; block < 16; block++, b++) | 212 for (block = 0; block < 16; block++, b++) |
| 215 { | 213 { |
| 216 tmp1 = vp8_block2above[block]; | 214 tmp1 = vp8_block2above[block]; |
| 217 tmp2 = vp8_block2left[block]; | 215 tmp2 = vp8_block2left[block]; |
| 218 qcoeff_ptr = b->qcoeff; | 216 qcoeff_ptr = b->qcoeff; |
| 219 a = (ENTROPY_CONTEXT *)xd->above_context + tmp1; | 217 a = (ENTROPY_CONTEXT *)x->above_context + tmp1; |
| 220 l = (ENTROPY_CONTEXT *)xd->left_context + tmp2; | 218 l = (ENTROPY_CONTEXT *)x->left_context + tmp2; |
| 221 | 219 |
| 222 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 220 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
| 223 | 221 |
| 224 c = type ? 0 : 1; | 222 c = type ? 0 : 1; |
| 225 | 223 |
| 226 if(c >= *b->eob) | 224 if(c >= *b->eob) |
| 227 { | 225 { |
| 228 /* c = band for this case */ | 226 /* c = band for this case */ |
| 229 t->Token = DCT_EOB_TOKEN; | 227 t->Token = DCT_EOB_TOKEN; |
| 230 t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; | 228 t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; |
| 231 t->skip_eob_node = 0; | 229 t->skip_eob_node = 0; |
| 232 | 230 |
| 233 ++x->coef_counts [type] [c] [pt] [DCT_EOB_TOKEN]; | 231 ++cpi->coef_counts [type] [c] [pt] [DCT_EOB_TOKEN]; |
| 234 t++; | 232 t++; |
| 235 *tp = t; | 233 *tp = t; |
| 236 *a = *l = 0; | 234 *a = *l = 0; |
| 237 continue; | 235 continue; |
| 238 } | 236 } |
| 239 | 237 |
| 240 v = qcoeff_ptr[c]; | 238 v = qcoeff_ptr[c]; |
| 241 | 239 |
| 242 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 240 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
| 243 token = vp8_dct_value_tokens_ptr[v].Token; | 241 token = vp8_dct_value_tokens_ptr[v].Token; |
| 244 t->Token = token; | 242 t->Token = token; |
| 245 | 243 |
| 246 t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; | 244 t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; |
| 247 t->skip_eob_node = 0; | 245 t->skip_eob_node = 0; |
| 248 ++x->coef_counts [type] [c] [pt] [token]; | 246 ++cpi->coef_counts [type] [c] [pt] [token]; |
| 249 pt = vp8_prev_token_class[token]; | 247 pt = vp8_prev_token_class[token]; |
| 250 t++; | 248 t++; |
| 251 c++; | 249 c++; |
| 252 | 250 |
| 253 for (; c < *b->eob; c++) | 251 for (; c < *b->eob; c++) |
| 254 { | 252 { |
| 255 rc = vp8_default_zig_zag1d[c]; | 253 rc = vp8_default_zig_zag1d[c]; |
| 256 band = vp8_coef_bands[c]; | 254 band = vp8_coef_bands[c]; |
| 257 v = qcoeff_ptr[rc]; | 255 v = qcoeff_ptr[rc]; |
| 258 | 256 |
| 259 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 257 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
| 260 token = vp8_dct_value_tokens_ptr[v].Token; | 258 token = vp8_dct_value_tokens_ptr[v].Token; |
| 261 | 259 |
| 262 t->Token = token; | 260 t->Token = token; |
| 263 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; | 261 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; |
| 264 | 262 |
| 265 t->skip_eob_node = (pt == 0); | 263 t->skip_eob_node = (pt == 0); |
| 266 ++x->coef_counts [type] [band] [pt] [token]; | 264 ++cpi->coef_counts [type] [band] [pt] [token]; |
| 267 | 265 |
| 268 pt = vp8_prev_token_class[token]; | 266 pt = vp8_prev_token_class[token]; |
| 269 t++; | 267 t++; |
| 270 } | 268 } |
| 271 if (c < 16) | 269 if (c < 16) |
| 272 { | 270 { |
| 273 band = vp8_coef_bands[c]; | 271 band = vp8_coef_bands[c]; |
| 274 t->Token = DCT_EOB_TOKEN; | 272 t->Token = DCT_EOB_TOKEN; |
| 275 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; | 273 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; |
| 276 | 274 |
| 277 t->skip_eob_node = 0; | 275 t->skip_eob_node = 0; |
| 278 ++x->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; | 276 ++cpi->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; |
| 279 | 277 |
| 280 t++; | 278 t++; |
| 281 } | 279 } |
| 282 *tp = t; | 280 *tp = t; |
| 283 *a = *l = 1; | 281 *a = *l = 1; |
| 284 } | 282 } |
| 285 | 283 |
| 286 /* Chroma */ | 284 /* Chroma */ |
| 287 for (block = 16; block < 24; block++, b++) | 285 for (block = 16; block < 24; block++, b++) |
| 288 { | 286 { |
| 289 tmp1 = vp8_block2above[block]; | 287 tmp1 = vp8_block2above[block]; |
| 290 tmp2 = vp8_block2left[block]; | 288 tmp2 = vp8_block2left[block]; |
| 291 qcoeff_ptr = b->qcoeff; | 289 qcoeff_ptr = b->qcoeff; |
| 292 a = (ENTROPY_CONTEXT *)xd->above_context + tmp1; | 290 a = (ENTROPY_CONTEXT *)x->above_context + tmp1; |
| 293 l = (ENTROPY_CONTEXT *)xd->left_context + tmp2; | 291 l = (ENTROPY_CONTEXT *)x->left_context + tmp2; |
| 294 | 292 |
| 295 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 293 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
| 296 | 294 |
| 297 if(!(*b->eob)) | 295 if(!(*b->eob)) |
| 298 { | 296 { |
| 299 /* c = band for this case */ | 297 /* c = band for this case */ |
| 300 t->Token = DCT_EOB_TOKEN; | 298 t->Token = DCT_EOB_TOKEN; |
| 301 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; | 299 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; |
| 302 t->skip_eob_node = 0; | 300 t->skip_eob_node = 0; |
| 303 | 301 |
| 304 ++x->coef_counts [2] [0] [pt] [DCT_EOB_TOKEN]; | 302 ++cpi->coef_counts [2] [0] [pt] [DCT_EOB_TOKEN]; |
| 305 t++; | 303 t++; |
| 306 *tp = t; | 304 *tp = t; |
| 307 *a = *l = 0; | 305 *a = *l = 0; |
| 308 continue; | 306 continue; |
| 309 } | 307 } |
| 310 | 308 |
| 311 v = qcoeff_ptr[0]; | 309 v = qcoeff_ptr[0]; |
| 312 | 310 |
| 313 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 311 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
| 314 token = vp8_dct_value_tokens_ptr[v].Token; | 312 token = vp8_dct_value_tokens_ptr[v].Token; |
| 315 t->Token = token; | 313 t->Token = token; |
| 316 | 314 |
| 317 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; | 315 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; |
| 318 t->skip_eob_node = 0; | 316 t->skip_eob_node = 0; |
| 319 ++x->coef_counts [2] [0] [pt] [token]; | 317 ++cpi->coef_counts [2] [0] [pt] [token]; |
| 320 pt = vp8_prev_token_class[token]; | 318 pt = vp8_prev_token_class[token]; |
| 321 t++; | 319 t++; |
| 322 c = 1; | 320 c = 1; |
| 323 | 321 |
| 324 for (; c < *b->eob; c++) | 322 for (; c < *b->eob; c++) |
| 325 { | 323 { |
| 326 rc = vp8_default_zig_zag1d[c]; | 324 rc = vp8_default_zig_zag1d[c]; |
| 327 band = vp8_coef_bands[c]; | 325 band = vp8_coef_bands[c]; |
| 328 v = qcoeff_ptr[rc]; | 326 v = qcoeff_ptr[rc]; |
| 329 | 327 |
| 330 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 328 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
| 331 token = vp8_dct_value_tokens_ptr[v].Token; | 329 token = vp8_dct_value_tokens_ptr[v].Token; |
| 332 | 330 |
| 333 t->Token = token; | 331 t->Token = token; |
| 334 t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; | 332 t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; |
| 335 | 333 |
| 336 t->skip_eob_node = (pt == 0); | 334 t->skip_eob_node = (pt == 0); |
| 337 | 335 |
| 338 ++x->coef_counts [2] [band] [pt] [token]; | 336 ++cpi->coef_counts [2] [band] [pt] [token]; |
| 339 | 337 |
| 340 pt = vp8_prev_token_class[token]; | 338 pt = vp8_prev_token_class[token]; |
| 341 t++; | 339 t++; |
| 342 } | 340 } |
| 343 if (c < 16) | 341 if (c < 16) |
| 344 { | 342 { |
| 345 band = vp8_coef_bands[c]; | 343 band = vp8_coef_bands[c]; |
| 346 t->Token = DCT_EOB_TOKEN; | 344 t->Token = DCT_EOB_TOKEN; |
| 347 t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; | 345 t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; |
| 348 | 346 |
| 349 t->skip_eob_node = 0; | 347 t->skip_eob_node = 0; |
| 350 | 348 |
| 351 ++x->coef_counts [2] [band] [pt] [DCT_EOB_TOKEN]; | 349 ++cpi->coef_counts [2] [band] [pt] [DCT_EOB_TOKEN]; |
| 352 | 350 |
| 353 t++; | 351 t++; |
| 354 } | 352 } |
| 355 *tp = t; | 353 *tp = t; |
| 356 *a = *l = 1; | 354 *a = *l = 1; |
| 357 } | 355 } |
| 358 } | 356 } |
| 359 | 357 |
| 360 | 358 |
| 361 static int mb_is_skippable(MACROBLOCKD *x, int has_y2_block) | 359 static int mb_is_skippable(MACROBLOCKD *x, int has_y2_block) |
| 362 { | 360 { |
| 363 int skip = 1; | 361 int skip = 1; |
| 364 int i = 0; | 362 int i = 0; |
| 365 | 363 |
| 366 if (has_y2_block) | 364 if (has_y2_block) |
| 367 { | 365 { |
| 368 for (i = 0; i < 16; i++) | 366 for (i = 0; i < 16; i++) |
| 369 skip &= (x->eobs[i] < 2); | 367 skip &= (x->eobs[i] < 2); |
| 370 } | 368 } |
| 371 | 369 |
| 372 for (; i < 24 + has_y2_block; i++) | 370 for (; i < 24 + has_y2_block; i++) |
| 373 skip &= (!x->eobs[i]); | 371 skip &= (!x->eobs[i]); |
| 374 | 372 |
| 375 return skip; | 373 return skip; |
| 376 } | 374 } |
| 377 | 375 |
| 378 | 376 |
| 379 void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) | 377 void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) |
| 380 { | 378 { |
| 381 MACROBLOCKD *xd = &x->e_mbd; | |
| 382 int plane_type; | 379 int plane_type; |
| 383 int has_y2_block; | 380 int has_y2_block; |
| 384 | 381 |
| 385 has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED | 382 has_y2_block = (x->mode_info_context->mbmi.mode != B_PRED |
| 386 && xd->mode_info_context->mbmi.mode != SPLITMV); | 383 && x->mode_info_context->mbmi.mode != SPLITMV); |
| 387 | 384 |
| 388 xd->mode_info_context->mbmi.mb_skip_coeff = | 385 x->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable(x, has_y2_block); |
| 389 mb_is_skippable(xd, has_y2_block); | 386 if (x->mode_info_context->mbmi.mb_skip_coeff) |
| 390 if (xd->mode_info_context->mbmi.mb_skip_coeff) | |
| 391 { | 387 { |
| 392 if (!cpi->common.mb_no_coeff_skip) | 388 if (!cpi->common.mb_no_coeff_skip) |
| 393 { | 389 { |
| 394 vp8_stuff_mb(cpi, x, t); | 390 vp8_stuff_mb(cpi, x, t); |
| 395 } | 391 } |
| 396 else | 392 else |
| 397 { | 393 { |
| 398 vp8_fix_contexts(xd); | 394 vp8_fix_contexts(x); |
| 399 x->skip_true_count++; | 395 cpi->skip_true_count++; |
| 400 } | 396 } |
| 401 | 397 |
| 402 return; | 398 return; |
| 403 } | 399 } |
| 404 | 400 |
| 405 plane_type = 3; | 401 plane_type = 3; |
| 406 if(has_y2_block) | 402 if(has_y2_block) |
| 407 { | 403 { |
| 408 tokenize2nd_order_b(x, t, cpi); | 404 tokenize2nd_order_b(x, t, cpi); |
| 409 plane_type = 0; | 405 plane_type = 0; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 fclose(f); | 481 fclose(f); |
| 486 } | 482 } |
| 487 #endif | 483 #endif |
| 488 | 484 |
| 489 | 485 |
| 490 static void stuff2nd_order_b | 486 static void stuff2nd_order_b |
| 491 ( | 487 ( |
| 492 TOKENEXTRA **tp, | 488 TOKENEXTRA **tp, |
| 493 ENTROPY_CONTEXT *a, | 489 ENTROPY_CONTEXT *a, |
| 494 ENTROPY_CONTEXT *l, | 490 ENTROPY_CONTEXT *l, |
| 495 VP8_COMP *cpi, | 491 VP8_COMP *cpi |
| 496 MACROBLOCK *x | |
| 497 ) | 492 ) |
| 498 { | 493 { |
| 499 int pt; /* near block/prev token context index */ | 494 int pt; /* near block/prev token context index */ |
| 500 TOKENEXTRA *t = *tp; /* store tokens starting here */ | 495 TOKENEXTRA *t = *tp; /* store tokens starting here */ |
| 501 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 496 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
| 502 | 497 |
| 503 t->Token = DCT_EOB_TOKEN; | 498 t->Token = DCT_EOB_TOKEN; |
| 504 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; | 499 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; |
| 505 t->skip_eob_node = 0; | 500 t->skip_eob_node = 0; |
| 506 ++x->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; | 501 ++cpi->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; |
| 507 ++t; | 502 ++t; |
| 508 | 503 |
| 509 *tp = t; | 504 *tp = t; |
| 510 pt = 0; | 505 pt = 0; |
| 511 *a = *l = pt; | 506 *a = *l = pt; |
| 507 |
| 512 } | 508 } |
| 513 | 509 |
| 514 static void stuff1st_order_b | 510 static void stuff1st_order_b |
| 515 ( | 511 ( |
| 516 TOKENEXTRA **tp, | 512 TOKENEXTRA **tp, |
| 517 ENTROPY_CONTEXT *a, | 513 ENTROPY_CONTEXT *a, |
| 518 ENTROPY_CONTEXT *l, | 514 ENTROPY_CONTEXT *l, |
| 519 int type, | 515 int type, |
| 520 VP8_COMP *cpi, | 516 VP8_COMP *cpi |
| 521 MACROBLOCK *x | |
| 522 ) | 517 ) |
| 523 { | 518 { |
| 524 int pt; /* near block/prev token context index */ | 519 int pt; /* near block/prev token context index */ |
| 525 int band; | 520 int band; |
| 526 TOKENEXTRA *t = *tp; /* store tokens starting here */ | 521 TOKENEXTRA *t = *tp; /* store tokens starting here */ |
| 527 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 522 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
| 528 band = type ? 0 : 1; | 523 band = type ? 0 : 1; |
| 529 t->Token = DCT_EOB_TOKEN; | 524 t->Token = DCT_EOB_TOKEN; |
| 530 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; | 525 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; |
| 531 t->skip_eob_node = 0; | 526 t->skip_eob_node = 0; |
| 532 ++x->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; | 527 ++cpi->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; |
| 533 ++t; | 528 ++t; |
| 534 *tp = t; | 529 *tp = t; |
| 535 pt = 0; /* 0 <-> all coeff data is zero */ | 530 pt = 0; /* 0 <-> all coeff data is zero */ |
| 536 *a = *l = pt; | 531 *a = *l = pt; |
| 532 |
| 537 } | 533 } |
| 538 | |
| 539 static | 534 static |
| 540 void stuff1st_order_buv | 535 void stuff1st_order_buv |
| 541 ( | 536 ( |
| 542 TOKENEXTRA **tp, | 537 TOKENEXTRA **tp, |
| 543 ENTROPY_CONTEXT *a, | 538 ENTROPY_CONTEXT *a, |
| 544 ENTROPY_CONTEXT *l, | 539 ENTROPY_CONTEXT *l, |
| 545 VP8_COMP *cpi, | 540 VP8_COMP *cpi |
| 546 MACROBLOCK *x | |
| 547 ) | 541 ) |
| 548 { | 542 { |
| 549 int pt; /* near block/prev token context index */ | 543 int pt; /* near block/prev token context index */ |
| 550 TOKENEXTRA *t = *tp; /* store tokens starting here */ | 544 TOKENEXTRA *t = *tp; /* store tokens starting here */ |
| 551 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 545 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
| 552 | 546 |
| 553 t->Token = DCT_EOB_TOKEN; | 547 t->Token = DCT_EOB_TOKEN; |
| 554 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; | 548 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; |
| 555 t->skip_eob_node = 0; | 549 t->skip_eob_node = 0; |
| 556 ++x->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN]; | 550 ++cpi->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN]; |
| 557 ++t; | 551 ++t; |
| 558 *tp = t; | 552 *tp = t; |
| 559 pt = 0; /* 0 <-> all coeff data is zero */ | 553 pt = 0; /* 0 <-> all coeff data is zero */ |
| 560 *a = *l = pt; | 554 *a = *l = pt; |
| 555 |
| 561 } | 556 } |
| 562 | 557 |
| 563 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) | 558 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) |
| 564 { | 559 { |
| 565 MACROBLOCKD *xd = &x->e_mbd; | 560 ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)x->above_context; |
| 566 ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)xd->above_context; | 561 ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)x->left_context; |
| 567 ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)xd->left_context; | |
| 568 int plane_type; | 562 int plane_type; |
| 569 int b; | 563 int b; |
| 570 plane_type = 3; | 564 plane_type = 3; |
| 571 if((xd->mode_info_context->mbmi.mode != B_PRED | 565 if((x->mode_info_context->mbmi.mode != B_PRED |
| 572 && xd->mode_info_context->mbmi.mode != SPLITMV)) | 566 && x->mode_info_context->mbmi.mode != SPLITMV)) |
| 573 { | 567 { |
| 574 stuff2nd_order_b(t, | 568 stuff2nd_order_b(t, |
| 575 A + vp8_block2above[24], L + vp8_block2left[24], cpi, x); | 569 A + vp8_block2above[24], L + vp8_block2left[24], cpi); |
| 576 plane_type = 0; | 570 plane_type = 0; |
| 577 } | 571 } |
| 578 | 572 |
| 579 for (b = 0; b < 16; b++) | 573 for (b = 0; b < 16; b++) |
| 580 stuff1st_order_b(t, | 574 stuff1st_order_b(t, |
| 581 A + vp8_block2above[b], | 575 A + vp8_block2above[b], |
| 582 L + vp8_block2left[b], plane_type, cpi, x); | 576 L + vp8_block2left[b], plane_type, cpi); |
| 583 | 577 |
| 584 for (b = 16; b < 24; b++) | 578 for (b = 16; b < 24; b++) |
| 585 stuff1st_order_buv(t, | 579 stuff1st_order_buv(t, |
| 586 A + vp8_block2above[b], | 580 A + vp8_block2above[b], |
| 587 L + vp8_block2left[b], cpi, x); | 581 L + vp8_block2left[b], cpi); |
| 588 | 582 |
| 589 } | 583 } |
| 590 void vp8_fix_contexts(MACROBLOCKD *x) | 584 void vp8_fix_contexts(MACROBLOCKD *x) |
| 591 { | 585 { |
| 592 /* Clear entropy contexts for Y2 blocks */ | 586 /* Clear entropy contexts for Y2 blocks */ |
| 593 if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.
mode != SPLITMV) | 587 if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.
mode != SPLITMV) |
| 594 { | 588 { |
| 595 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); | 589 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); |
| 596 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); | 590 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); |
| 597 } | 591 } |
| 598 else | 592 else |
| 599 { | 593 { |
| 600 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); | 594 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); |
| 601 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); | 595 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); |
| 602 } | 596 } |
| 603 | 597 |
| 604 } | 598 } |
| OLD | NEW |