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 |