| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright (c) 2012 The WebM project authors. All Rights Reserved. | 3 * Copyright (c) 2012 The WebM project authors. All Rights Reserved. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license | 5 * Use of this source code is governed by a BSD-style license |
| 6 * that can be found in the LICENSE file in the root of the source | 6 * that can be found in the LICENSE file in the root of the source |
| 7 * tree. An additional intellectual property rights grant can be found | 7 * tree. An additional intellectual property rights grant can be found |
| 8 * in the file PATENTS. All contributing project authors may | 8 * in the file PATENTS. All contributing project authors may |
| 9 * be found in the AUTHORS file in the root of the source tree. | 9 * be found in the AUTHORS file in the root of the source tree. |
| 10 */ | 10 */ |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 } else if (above_intra || left_intra) { // intra/inter or inter/intra | 211 } else if (above_intra || left_intra) { // intra/inter or inter/intra |
| 212 const MB_MODE_INFO *edge_mbmi = above_intra ? left_mbmi : above_mbmi; | 212 const MB_MODE_INFO *edge_mbmi = above_intra ? left_mbmi : above_mbmi; |
| 213 if (!has_second_ref(edge_mbmi)) | 213 if (!has_second_ref(edge_mbmi)) |
| 214 pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME); | 214 pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME); |
| 215 else | 215 else |
| 216 pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME || | 216 pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME || |
| 217 edge_mbmi->ref_frame[1] == LAST_FRAME); | 217 edge_mbmi->ref_frame[1] == LAST_FRAME); |
| 218 } else { // inter/inter | 218 } else { // inter/inter |
| 219 const int above_has_second = has_second_ref(above_mbmi); | 219 const int above_has_second = has_second_ref(above_mbmi); |
| 220 const int left_has_second = has_second_ref(left_mbmi); | 220 const int left_has_second = has_second_ref(left_mbmi); |
| 221 const MV_REFERENCE_FRAME above0 = above_mbmi->ref_frame[0]; |
| 222 const MV_REFERENCE_FRAME above1 = above_mbmi->ref_frame[1]; |
| 223 const MV_REFERENCE_FRAME left0 = left_mbmi->ref_frame[0]; |
| 224 const MV_REFERENCE_FRAME left1 = left_mbmi->ref_frame[1]; |
| 221 | 225 |
| 222 if (above_has_second && left_has_second) { | 226 if (above_has_second && left_has_second) { |
| 223 pred_context = 1 + (above_mbmi->ref_frame[0] == LAST_FRAME || | 227 pred_context = 1 + (above0 == LAST_FRAME || above1 == LAST_FRAME || |
| 224 above_mbmi->ref_frame[1] == LAST_FRAME || | 228 left0 == LAST_FRAME || left1 == LAST_FRAME); |
| 225 left_mbmi->ref_frame[0] == LAST_FRAME || | |
| 226 left_mbmi->ref_frame[1] == LAST_FRAME); | |
| 227 } else if (above_has_second || left_has_second) { | 229 } else if (above_has_second || left_has_second) { |
| 228 const MV_REFERENCE_FRAME rfs = !above_has_second ? | 230 const MV_REFERENCE_FRAME rfs = !above_has_second ? above0 : left0; |
| 229 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0]; | 231 const MV_REFERENCE_FRAME crf1 = above_has_second ? above0 : left0; |
| 230 const MV_REFERENCE_FRAME crf1 = above_has_second ? | 232 const MV_REFERENCE_FRAME crf2 = above_has_second ? above1 : left1; |
| 231 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0]; | |
| 232 const MV_REFERENCE_FRAME crf2 = above_has_second ? | |
| 233 above_mbmi->ref_frame[1] : left_mbmi->ref_frame[1]; | |
| 234 | 233 |
| 235 if (rfs == LAST_FRAME) | 234 if (rfs == LAST_FRAME) |
| 236 pred_context = 3 + (crf1 == LAST_FRAME || crf2 == LAST_FRAME); | 235 pred_context = 3 + (crf1 == LAST_FRAME || crf2 == LAST_FRAME); |
| 237 else | 236 else |
| 238 pred_context = (crf1 == LAST_FRAME || crf2 == LAST_FRAME); | 237 pred_context = (crf1 == LAST_FRAME || crf2 == LAST_FRAME); |
| 239 } else { | 238 } else { |
| 240 pred_context = 2 * (above_mbmi->ref_frame[0] == LAST_FRAME) + | 239 pred_context = 2 * (above0 == LAST_FRAME) + 2 * (left0 == LAST_FRAME); |
| 241 2 * (left_mbmi->ref_frame[0] == LAST_FRAME); | |
| 242 } | 240 } |
| 243 } | 241 } |
| 244 } else if (has_above || has_left) { // one edge available | 242 } else if (has_above || has_left) { // one edge available |
| 245 const MB_MODE_INFO *edge_mbmi = has_above ? above_mbmi : left_mbmi; | 243 const MB_MODE_INFO *edge_mbmi = has_above ? above_mbmi : left_mbmi; |
| 246 if (!is_inter_block(edge_mbmi)) { // intra | 244 if (!is_inter_block(edge_mbmi)) { // intra |
| 247 pred_context = 2; | 245 pred_context = 2; |
| 248 } else { // inter | 246 } else { // inter |
| 249 if (!has_second_ref(edge_mbmi)) | 247 if (!has_second_ref(edge_mbmi)) |
| 250 pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME); | 248 pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME); |
| 251 else | 249 else |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 pred_context = 3; | 282 pred_context = 3; |
| 285 else | 283 else |
| 286 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME); | 284 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME); |
| 287 } else { | 285 } else { |
| 288 pred_context = 1 + 2 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME || | 286 pred_context = 1 + 2 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME || |
| 289 edge_mbmi->ref_frame[1] == GOLDEN_FRAME); | 287 edge_mbmi->ref_frame[1] == GOLDEN_FRAME); |
| 290 } | 288 } |
| 291 } else { // inter/inter | 289 } else { // inter/inter |
| 292 const int above_has_second = has_second_ref(above_mbmi); | 290 const int above_has_second = has_second_ref(above_mbmi); |
| 293 const int left_has_second = has_second_ref(left_mbmi); | 291 const int left_has_second = has_second_ref(left_mbmi); |
| 292 const MV_REFERENCE_FRAME above0 = above_mbmi->ref_frame[0]; |
| 293 const MV_REFERENCE_FRAME above1 = above_mbmi->ref_frame[1]; |
| 294 const MV_REFERENCE_FRAME left0 = left_mbmi->ref_frame[0]; |
| 295 const MV_REFERENCE_FRAME left1 = left_mbmi->ref_frame[1]; |
| 294 | 296 |
| 295 if (above_has_second && left_has_second) { | 297 if (above_has_second && left_has_second) { |
| 296 if (above_mbmi->ref_frame[0] == left_mbmi->ref_frame[0] && | 298 if (above0 == left0 && above1 == left1) |
| 297 above_mbmi->ref_frame[1] == left_mbmi->ref_frame[1]) | 299 pred_context = 3 * (above0 == GOLDEN_FRAME || |
| 298 pred_context = 3 * (above_mbmi->ref_frame[0] == GOLDEN_FRAME || | 300 above1 == GOLDEN_FRAME || |
| 299 above_mbmi->ref_frame[1] == GOLDEN_FRAME || | 301 left0 == GOLDEN_FRAME || |
| 300 left_mbmi->ref_frame[0] == GOLDEN_FRAME || | 302 left1 == GOLDEN_FRAME); |
| 301 left_mbmi->ref_frame[1] == GOLDEN_FRAME); | |
| 302 else | 303 else |
| 303 pred_context = 2; | 304 pred_context = 2; |
| 304 } else if (above_has_second || left_has_second) { | 305 } else if (above_has_second || left_has_second) { |
| 305 const MV_REFERENCE_FRAME rfs = !above_has_second ? | 306 const MV_REFERENCE_FRAME rfs = !above_has_second ? above0 : left0; |
| 306 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0]; | 307 const MV_REFERENCE_FRAME crf1 = above_has_second ? above0 : left0; |
| 307 const MV_REFERENCE_FRAME crf1 = above_has_second ? | 308 const MV_REFERENCE_FRAME crf2 = above_has_second ? above1 : left1; |
| 308 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0]; | |
| 309 const MV_REFERENCE_FRAME crf2 = above_has_second ? | |
| 310 above_mbmi->ref_frame[1] : left_mbmi->ref_frame[1]; | |
| 311 | 309 |
| 312 if (rfs == GOLDEN_FRAME) | 310 if (rfs == GOLDEN_FRAME) |
| 313 pred_context = 3 + (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME); | 311 pred_context = 3 + (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME); |
| 314 else if (rfs == ALTREF_FRAME) | 312 else if (rfs == ALTREF_FRAME) |
| 315 pred_context = crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME; | 313 pred_context = crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME; |
| 316 else | 314 else |
| 317 pred_context = 1 + 2 * (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME); | 315 pred_context = 1 + 2 * (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME); |
| 318 } else { | 316 } else { |
| 319 if (above_mbmi->ref_frame[0] == LAST_FRAME && | 317 if (above0 == LAST_FRAME && left0 == LAST_FRAME) { |
| 320 left_mbmi->ref_frame[0] == LAST_FRAME) { | |
| 321 pred_context = 3; | 318 pred_context = 3; |
| 322 } else if (above_mbmi->ref_frame[0] == LAST_FRAME || | 319 } else if (above0 == LAST_FRAME || left0 == LAST_FRAME) { |
| 323 left_mbmi->ref_frame[0] == LAST_FRAME) { | 320 const MV_REFERENCE_FRAME edge0 = (above0 == LAST_FRAME) ? left0 |
| 324 const MB_MODE_INFO *edge_mbmi = | 321 : above0; |
| 325 above_mbmi->ref_frame[0] == LAST_FRAME ? left_mbmi : above_mbmi; | 322 pred_context = 4 * (edge0 == GOLDEN_FRAME); |
| 326 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME); | |
| 327 } else { | 323 } else { |
| 328 pred_context = 2 * (above_mbmi->ref_frame[0] == GOLDEN_FRAME) + | 324 pred_context = 2 * (above0 == GOLDEN_FRAME) + |
| 329 2 * (left_mbmi->ref_frame[0] == GOLDEN_FRAME); | 325 2 * (left0 == GOLDEN_FRAME); |
| 330 } | 326 } |
| 331 } | 327 } |
| 332 } | 328 } |
| 333 } else if (has_above || has_left) { // one edge available | 329 } else if (has_above || has_left) { // one edge available |
| 334 const MB_MODE_INFO *edge_mbmi = has_above ? above_mbmi : left_mbmi; | 330 const MB_MODE_INFO *edge_mbmi = has_above ? above_mbmi : left_mbmi; |
| 335 | 331 |
| 336 if (!is_inter_block(edge_mbmi) || | 332 if (!is_inter_block(edge_mbmi) || |
| 337 (edge_mbmi->ref_frame[0] == LAST_FRAME && !has_second_ref(edge_mbmi))) | 333 (edge_mbmi->ref_frame[0] == LAST_FRAME && !has_second_ref(edge_mbmi))) |
| 338 pred_context = 2; | 334 pred_context = 2; |
| 339 else if (!has_second_ref(edge_mbmi)) | 335 else if (!has_second_ref(edge_mbmi)) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 350 // Returns a context number for the given MB prediction signal | 346 // Returns a context number for the given MB prediction signal |
| 351 // The mode info data structure has a one element border above and to the | 347 // The mode info data structure has a one element border above and to the |
| 352 // left of the entries corresponding to real blocks. | 348 // left of the entries corresponding to real blocks. |
| 353 // The prediction flags in these dummy entries are initialized to 0. | 349 // The prediction flags in these dummy entries are initialized to 0. |
| 354 int vp9_get_tx_size_context(const MACROBLOCKD *xd) { | 350 int vp9_get_tx_size_context(const MACROBLOCKD *xd) { |
| 355 const int max_tx_size = max_txsize_lookup[xd->mi_8x8[0]->mbmi.sb_type]; | 351 const int max_tx_size = max_txsize_lookup[xd->mi_8x8[0]->mbmi.sb_type]; |
| 356 const MB_MODE_INFO *const above_mbmi = get_mbmi(get_above_mi(xd)); | 352 const MB_MODE_INFO *const above_mbmi = get_mbmi(get_above_mi(xd)); |
| 357 const MB_MODE_INFO *const left_mbmi = get_mbmi(get_left_mi(xd)); | 353 const MB_MODE_INFO *const left_mbmi = get_mbmi(get_left_mi(xd)); |
| 358 const int has_above = above_mbmi != NULL; | 354 const int has_above = above_mbmi != NULL; |
| 359 const int has_left = left_mbmi != NULL; | 355 const int has_left = left_mbmi != NULL; |
| 360 int above_ctx = (has_above && !above_mbmi->skip_coeff) ? above_mbmi->tx_size | 356 int above_ctx = (has_above && !above_mbmi->skip) ? above_mbmi->tx_size |
| 361 : max_tx_size; | 357 : max_tx_size; |
| 362 int left_ctx = (has_left && !left_mbmi->skip_coeff) ? left_mbmi->tx_size | 358 int left_ctx = (has_left && !left_mbmi->skip) ? left_mbmi->tx_size |
| 363 : max_tx_size; | 359 : max_tx_size; |
| 364 if (!has_left) | 360 if (!has_left) |
| 365 left_ctx = above_ctx; | 361 left_ctx = above_ctx; |
| 366 | 362 |
| 367 if (!has_above) | 363 if (!has_above) |
| 368 above_ctx = left_ctx; | 364 above_ctx = left_ctx; |
| 369 | 365 |
| 370 return (above_ctx + left_ctx) > max_tx_size; | 366 return (above_ctx + left_ctx) > max_tx_size; |
| 371 } | 367 } |
| 372 | 368 |
| 373 int vp9_get_segment_id(VP9_COMMON *cm, const uint8_t *segment_ids, | 369 int vp9_get_segment_id(VP9_COMMON *cm, const uint8_t *segment_ids, |
| 374 BLOCK_SIZE bsize, int mi_row, int mi_col) { | 370 BLOCK_SIZE bsize, int mi_row, int mi_col) { |
| 375 const int mi_offset = mi_row * cm->mi_cols + mi_col; | 371 const int mi_offset = mi_row * cm->mi_cols + mi_col; |
| 376 const int bw = num_8x8_blocks_wide_lookup[bsize]; | 372 const int bw = num_8x8_blocks_wide_lookup[bsize]; |
| 377 const int bh = num_8x8_blocks_high_lookup[bsize]; | 373 const int bh = num_8x8_blocks_high_lookup[bsize]; |
| 378 const int xmis = MIN(cm->mi_cols - mi_col, bw); | 374 const int xmis = MIN(cm->mi_cols - mi_col, bw); |
| 379 const int ymis = MIN(cm->mi_rows - mi_row, bh); | 375 const int ymis = MIN(cm->mi_rows - mi_row, bh); |
| 380 int x, y, segment_id = INT_MAX; | 376 int x, y, segment_id = INT_MAX; |
| 381 | 377 |
| 382 for (y = 0; y < ymis; y++) | 378 for (y = 0; y < ymis; y++) |
| 383 for (x = 0; x < xmis; x++) | 379 for (x = 0; x < xmis; x++) |
| 384 segment_id = MIN(segment_id, | 380 segment_id = MIN(segment_id, |
| 385 segment_ids[mi_offset + y * cm->mi_cols + x]); | 381 segment_ids[mi_offset + y * cm->mi_cols + x]); |
| 386 | 382 |
| 387 assert(segment_id >= 0 && segment_id < MAX_SEGMENTS); | 383 assert(segment_id >= 0 && segment_id < MAX_SEGMENTS); |
| 388 return segment_id; | 384 return segment_id; |
| 389 } | 385 } |
| OLD | NEW |