Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(330)

Side by Side Diff: source/libvpx/vp9/common/vp9_pred_common.c

Issue 168343002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: libvpx: Pull from upstream Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/common/vp9_pred_common.h ('k') | source/libvpx/vp9/common/vp9_prob.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/common/vp9_pred_common.h ('k') | source/libvpx/vp9/common/vp9_prob.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698