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

Side by Side Diff: source/libvpx/vp9/encoder/vp9_bitstream.c

Issue 290653003: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 7 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
OLDNEW
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
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 mi_row += MI_BLOCK_SIZE) { 478 mi_row += MI_BLOCK_SIZE) {
479 vp9_zero(cpi->mb.e_mbd.left_seg_context); 479 vp9_zero(cpi->mb.e_mbd.left_seg_context);
480 for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end; 480 for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
481 mi_col += MI_BLOCK_SIZE) 481 mi_col += MI_BLOCK_SIZE)
482 write_modes_sb(cpi, tile, w, tok, tok_end, mi_row, mi_col, 482 write_modes_sb(cpi, tile, w, tok, tok_end, mi_row, mi_col,
483 BLOCK_64X64); 483 BLOCK_64X64);
484 } 484 }
485 } 485 }
486 486
487 static void build_tree_distribution(VP9_COMP *cpi, TX_SIZE tx_size, 487 static void build_tree_distribution(VP9_COMP *cpi, TX_SIZE tx_size,
488 vp9_coeff_stats *coef_branch_ct) { 488 vp9_coeff_stats *coef_branch_ct,
489 vp9_coeff_probs_model *coef_probs = cpi->frame_coef_probs[tx_size]; 489 vp9_coeff_probs_model *coef_probs) {
490 vp9_coeff_count *coef_counts = cpi->coef_counts[tx_size]; 490 vp9_coeff_count *coef_counts = cpi->coef_counts[tx_size];
491 unsigned int (*eob_branch_ct)[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS] = 491 unsigned int (*eob_branch_ct)[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS] =
492 cpi->common.counts.eob_branch[tx_size]; 492 cpi->common.counts.eob_branch[tx_size];
493 int i, j, k, l, m; 493 int i, j, k, l, m;
494 494
495 for (i = 0; i < PLANE_TYPES; ++i) { 495 for (i = 0; i < PLANE_TYPES; ++i) {
496 for (j = 0; j < REF_TYPES; ++j) { 496 for (j = 0; j < REF_TYPES; ++j) {
497 for (k = 0; k < COEF_BANDS; ++k) { 497 for (k = 0; k < COEF_BANDS; ++k) {
498 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { 498 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
499 vp9_tree_probs_from_distribution(vp9_coef_tree, 499 vp9_tree_probs_from_distribution(vp9_coef_tree,
500 coef_branch_ct[i][j][k][l], 500 coef_branch_ct[i][j][k][l],
501 coef_counts[i][j][k][l]); 501 coef_counts[i][j][k][l]);
502 coef_branch_ct[i][j][k][l][0][1] = eob_branch_ct[i][j][k][l] - 502 coef_branch_ct[i][j][k][l][0][1] = eob_branch_ct[i][j][k][l] -
503 coef_branch_ct[i][j][k][l][0][0]; 503 coef_branch_ct[i][j][k][l][0][0];
504 for (m = 0; m < UNCONSTRAINED_NODES; ++m) 504 for (m = 0; m < UNCONSTRAINED_NODES; ++m)
505 coef_probs[i][j][k][l][m] = get_binary_prob( 505 coef_probs[i][j][k][l][m] = get_binary_prob(
506 coef_branch_ct[i][j][k][l][m][0], 506 coef_branch_ct[i][j][k][l][m][0],
507 coef_branch_ct[i][j][k][l][m][1]); 507 coef_branch_ct[i][j][k][l][m][1]);
508 } 508 }
509 } 509 }
510 } 510 }
511 } 511 }
512 } 512 }
513 513
514 static void update_coef_probs_common(vp9_writer* const bc, VP9_COMP *cpi, 514 static void update_coef_probs_common(vp9_writer* const bc, VP9_COMP *cpi,
515 TX_SIZE tx_size, 515 TX_SIZE tx_size,
516 vp9_coeff_stats *frame_branch_ct) { 516 vp9_coeff_stats *frame_branch_ct,
517 vp9_coeff_probs_model *new_frame_coef_probs = cpi->frame_coef_probs[tx_size]; 517 vp9_coeff_probs_model *new_coef_probs) {
518 vp9_coeff_probs_model *old_frame_coef_probs = 518 vp9_coeff_probs_model *old_coef_probs = cpi->common.fc.coef_probs[tx_size];
519 cpi->common.fc.coef_probs[tx_size];
520 const vp9_prob upd = DIFF_UPDATE_PROB; 519 const vp9_prob upd = DIFF_UPDATE_PROB;
521 const int entropy_nodes_update = UNCONSTRAINED_NODES; 520 const int entropy_nodes_update = UNCONSTRAINED_NODES;
522 int i, j, k, l, t; 521 int i, j, k, l, t;
523 switch (cpi->sf.use_fast_coef_updates) { 522 switch (cpi->sf.use_fast_coef_updates) {
524 case TWO_LOOP: { 523 case TWO_LOOP: {
525 /* dry run to see if there is any udpate at all needed */ 524 /* dry run to see if there is any udpate at all needed */
526 int savings = 0; 525 int savings = 0;
527 int update[2] = {0, 0}; 526 int update[2] = {0, 0};
528 for (i = 0; i < PLANE_TYPES; ++i) { 527 for (i = 0; i < PLANE_TYPES; ++i) {
529 for (j = 0; j < REF_TYPES; ++j) { 528 for (j = 0; j < REF_TYPES; ++j) {
530 for (k = 0; k < COEF_BANDS; ++k) { 529 for (k = 0; k < COEF_BANDS; ++k) {
531 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { 530 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
532 for (t = 0; t < entropy_nodes_update; ++t) { 531 for (t = 0; t < entropy_nodes_update; ++t) {
533 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; 532 vp9_prob newp = new_coef_probs[i][j][k][l][t];
534 const vp9_prob oldp = old_frame_coef_probs[i][j][k][l][t]; 533 const vp9_prob oldp = old_coef_probs[i][j][k][l][t];
535 int s; 534 int s;
536 int u = 0; 535 int u = 0;
537 if (t == PIVOT_NODE) 536 if (t == PIVOT_NODE)
538 s = vp9_prob_diff_update_savings_search_model( 537 s = vp9_prob_diff_update_savings_search_model(
539 frame_branch_ct[i][j][k][l][0], 538 frame_branch_ct[i][j][k][l][0],
540 old_frame_coef_probs[i][j][k][l], &newp, upd); 539 old_coef_probs[i][j][k][l], &newp, upd);
541 else 540 else
542 s = vp9_prob_diff_update_savings_search( 541 s = vp9_prob_diff_update_savings_search(
543 frame_branch_ct[i][j][k][l][t], oldp, &newp, upd); 542 frame_branch_ct[i][j][k][l][t], oldp, &newp, upd);
544 if (s > 0 && newp != oldp) 543 if (s > 0 && newp != oldp)
545 u = 1; 544 u = 1;
546 if (u) 545 if (u)
547 savings += s - (int)(vp9_cost_zero(upd)); 546 savings += s - (int)(vp9_cost_zero(upd));
548 else 547 else
549 savings -= (int)(vp9_cost_zero(upd)); 548 savings -= (int)(vp9_cost_zero(upd));
550 update[u]++; 549 update[u]++;
551 } 550 }
552 } 551 }
553 } 552 }
554 } 553 }
555 } 554 }
556 555
557 // printf("Update %d %d, savings %d\n", update[0], update[1], savings); 556 // printf("Update %d %d, savings %d\n", update[0], update[1], savings);
558 /* Is coef updated at all */ 557 /* Is coef updated at all */
559 if (update[1] == 0 || savings < 0) { 558 if (update[1] == 0 || savings < 0) {
560 vp9_write_bit(bc, 0); 559 vp9_write_bit(bc, 0);
561 return; 560 return;
562 } 561 }
563 vp9_write_bit(bc, 1); 562 vp9_write_bit(bc, 1);
564 for (i = 0; i < PLANE_TYPES; ++i) { 563 for (i = 0; i < PLANE_TYPES; ++i) {
565 for (j = 0; j < REF_TYPES; ++j) { 564 for (j = 0; j < REF_TYPES; ++j) {
566 for (k = 0; k < COEF_BANDS; ++k) { 565 for (k = 0; k < COEF_BANDS; ++k) {
567 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { 566 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
568 // calc probs and branch cts for this frame only 567 // calc probs and branch cts for this frame only
569 for (t = 0; t < entropy_nodes_update; ++t) { 568 for (t = 0; t < entropy_nodes_update; ++t) {
570 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; 569 vp9_prob newp = new_coef_probs[i][j][k][l][t];
571 vp9_prob *oldp = old_frame_coef_probs[i][j][k][l] + t; 570 vp9_prob *oldp = old_coef_probs[i][j][k][l] + t;
572 const vp9_prob upd = DIFF_UPDATE_PROB; 571 const vp9_prob upd = DIFF_UPDATE_PROB;
573 int s; 572 int s;
574 int u = 0; 573 int u = 0;
575 if (t == PIVOT_NODE) 574 if (t == PIVOT_NODE)
576 s = vp9_prob_diff_update_savings_search_model( 575 s = vp9_prob_diff_update_savings_search_model(
577 frame_branch_ct[i][j][k][l][0], 576 frame_branch_ct[i][j][k][l][0],
578 old_frame_coef_probs[i][j][k][l], &newp, upd); 577 old_coef_probs[i][j][k][l], &newp, upd);
579 else 578 else
580 s = vp9_prob_diff_update_savings_search( 579 s = vp9_prob_diff_update_savings_search(
581 frame_branch_ct[i][j][k][l][t], 580 frame_branch_ct[i][j][k][l][t],
582 *oldp, &newp, upd); 581 *oldp, &newp, upd);
583 if (s > 0 && newp != *oldp) 582 if (s > 0 && newp != *oldp)
584 u = 1; 583 u = 1;
585 vp9_write(bc, u, upd); 584 vp9_write(bc, u, upd);
586 if (u) { 585 if (u) {
587 /* send/use new probability */ 586 /* send/use new probability */
588 vp9_write_prob_diff_update(bc, newp, *oldp); 587 vp9_write_prob_diff_update(bc, newp, *oldp);
(...skipping 16 matching lines...) Expand all
605 cpi->sf.use_fast_coef_updates == ONE_LOOP_REDUCED ? 604 cpi->sf.use_fast_coef_updates == ONE_LOOP_REDUCED ?
606 COEF_BANDS >> 1 : COEF_BANDS; 605 COEF_BANDS >> 1 : COEF_BANDS;
607 int updates = 0; 606 int updates = 0;
608 int noupdates_before_first = 0; 607 int noupdates_before_first = 0;
609 for (i = 0; i < PLANE_TYPES; ++i) { 608 for (i = 0; i < PLANE_TYPES; ++i) {
610 for (j = 0; j < REF_TYPES; ++j) { 609 for (j = 0; j < REF_TYPES; ++j) {
611 for (k = 0; k < COEF_BANDS; ++k) { 610 for (k = 0; k < COEF_BANDS; ++k) {
612 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { 611 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
613 // calc probs and branch cts for this frame only 612 // calc probs and branch cts for this frame only
614 for (t = 0; t < entropy_nodes_update; ++t) { 613 for (t = 0; t < entropy_nodes_update; ++t) {
615 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; 614 vp9_prob newp = new_coef_probs[i][j][k][l][t];
616 vp9_prob *oldp = old_frame_coef_probs[i][j][k][l] + t; 615 vp9_prob *oldp = old_coef_probs[i][j][k][l] + t;
617 int s; 616 int s;
618 int u = 0; 617 int u = 0;
619 if (l >= prev_coef_contexts_to_update || 618 if (l >= prev_coef_contexts_to_update ||
620 k >= coef_band_to_update) { 619 k >= coef_band_to_update) {
621 u = 0; 620 u = 0;
622 } else { 621 } else {
623 if (t == PIVOT_NODE) 622 if (t == PIVOT_NODE)
624 s = vp9_prob_diff_update_savings_search_model( 623 s = vp9_prob_diff_update_savings_search_model(
625 frame_branch_ct[i][j][k][l][0], 624 frame_branch_ct[i][j][k][l][0],
626 old_frame_coef_probs[i][j][k][l], &newp, upd); 625 old_coef_probs[i][j][k][l], &newp, upd);
627 else 626 else
628 s = vp9_prob_diff_update_savings_search( 627 s = vp9_prob_diff_update_savings_search(
629 frame_branch_ct[i][j][k][l][t], 628 frame_branch_ct[i][j][k][l][t],
630 *oldp, &newp, upd); 629 *oldp, &newp, upd);
631 if (s > 0 && newp != *oldp) 630 if (s > 0 && newp != *oldp)
632 u = 1; 631 u = 1;
633 } 632 }
634 updates += u; 633 updates += u;
635 if (u == 0 && updates == 0) { 634 if (u == 0 && updates == 0) {
636 noupdates_before_first++; 635 noupdates_before_first++;
(...skipping 26 matching lines...) Expand all
663 default: 662 default:
664 assert(0); 663 assert(0);
665 } 664 }
666 } 665 }
667 666
668 static void update_coef_probs(VP9_COMP *cpi, vp9_writer* w) { 667 static void update_coef_probs(VP9_COMP *cpi, vp9_writer* w) {
669 const TX_MODE tx_mode = cpi->common.tx_mode; 668 const TX_MODE tx_mode = cpi->common.tx_mode;
670 const TX_SIZE max_tx_size = tx_mode_to_biggest_tx_size[tx_mode]; 669 const TX_SIZE max_tx_size = tx_mode_to_biggest_tx_size[tx_mode];
671 TX_SIZE tx_size; 670 TX_SIZE tx_size;
672 vp9_coeff_stats frame_branch_ct[TX_SIZES][PLANE_TYPES]; 671 vp9_coeff_stats frame_branch_ct[TX_SIZES][PLANE_TYPES];
672 vp9_coeff_probs_model frame_coef_probs[TX_SIZES][PLANE_TYPES];
673 673
674 vp9_clear_system_state(); 674 vp9_clear_system_state();
675 675
676 for (tx_size = TX_4X4; tx_size <= TX_32X32; ++tx_size) 676 for (tx_size = TX_4X4; tx_size <= TX_32X32; ++tx_size)
677 build_tree_distribution(cpi, tx_size, frame_branch_ct[tx_size]); 677 build_tree_distribution(cpi, tx_size, frame_branch_ct[tx_size],
678 frame_coef_probs[tx_size]);
678 679
679 for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size) 680 for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size)
680 update_coef_probs_common(w, cpi, tx_size, frame_branch_ct[tx_size]); 681 update_coef_probs_common(w, cpi, tx_size, frame_branch_ct[tx_size],
682 frame_coef_probs[tx_size]);
681 } 683 }
682 684
683 static void encode_loopfilter(struct loopfilter *lf, 685 static void encode_loopfilter(struct loopfilter *lf,
684 struct vp9_write_bit_buffer *wb) { 686 struct vp9_write_bit_buffer *wb) {
685 int i; 687 int i;
686 688
687 // Encode the loop filter level and type 689 // Encode the loop filter level and type
688 vp9_wb_write_literal(wb, lf->filter_level, 6); 690 vp9_wb_write_literal(wb, lf->filter_level, 6);
689 vp9_wb_write_literal(wb, lf->sharpness_level, 3); 691 vp9_wb_write_literal(wb, lf->sharpness_level, 3);
690 692
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 first_part_size = write_compressed_header(cpi, data); 1216 first_part_size = write_compressed_header(cpi, data);
1215 data += first_part_size; 1217 data += first_part_size;
1216 // TODO(jbb): Figure out what to do if first_part_size > 16 bits. 1218 // TODO(jbb): Figure out what to do if first_part_size > 16 bits.
1217 vp9_wb_write_literal(&saved_wb, (int)first_part_size, 16); 1219 vp9_wb_write_literal(&saved_wb, (int)first_part_size, 16);
1218 1220
1219 data += encode_tiles(cpi, data); 1221 data += encode_tiles(cpi, data);
1220 1222
1221 *size = data - dest; 1223 *size = data - dest;
1222 } 1224 }
1223 1225
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698