1/* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12#include "vp8/common/header.h" 13#include "encodemv.h" 14#include "vp8/common/entropymode.h" 15#include "vp8/common/findnearmv.h" 16#include "mcomp.h" 17#include "vp8/common/systemdependent.h" 18#include <assert.h> 19#include <stdio.h> 20#include <limits.h> 21#include "vp8/common/pragmas.h" 22#include "vpx/vpx_encoder.h" 23#include "vpx_mem/vpx_mem.h" 24#include "bitstream.h" 25 26#include "defaultcoefcounts.h" 27#include "vp8/common/common.h" 28 29const int vp8cx_base_skip_false_prob[128] = 30{ 31 255, 255, 255, 255, 255, 255, 255, 255, 32 255, 255, 255, 255, 255, 255, 255, 255, 33 255, 255, 255, 255, 255, 255, 255, 255, 34 255, 255, 255, 255, 255, 255, 255, 255, 35 255, 255, 255, 255, 255, 255, 255, 255, 36 255, 255, 255, 255, 255, 255, 255, 255, 37 255, 255, 255, 255, 255, 255, 255, 255, 38 251, 248, 244, 240, 236, 232, 229, 225, 39 221, 217, 213, 208, 204, 199, 194, 190, 40 187, 183, 179, 175, 172, 168, 164, 160, 41 157, 153, 149, 145, 142, 138, 134, 130, 42 127, 124, 120, 117, 114, 110, 107, 104, 43 101, 98, 95, 92, 89, 86, 83, 80, 44 77, 74, 71, 68, 65, 62, 59, 56, 45 53, 50, 47, 44, 41, 38, 35, 32, 46 30, 28, 26, 24, 22, 20, 18, 16, 47}; 48 49#if defined(SECTIONBITS_OUTPUT) 50unsigned __int64 Sectionbits[500]; 51#endif 52 53#ifdef VP8_ENTROPY_STATS 54int intra_mode_stats[10][10][10]; 55static unsigned int tree_update_hist [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] [2]; 56extern unsigned int active_section; 57#endif 58 59#ifdef MODE_STATS 60int count_mb_seg[4] = { 0, 0, 0, 0 }; 61#endif 62 63 64static void update_mode( 65 vp8_writer *const w, 66 int n, 67 vp8_token tok [/* n */], 68 vp8_tree tree, 69 vp8_prob Pnew [/* n-1 */], 70 vp8_prob Pcur [/* n-1 */], 71 unsigned int bct [/* n-1 */] [2], 72 const unsigned int num_events[/* n */] 73) 74{ 75 unsigned int new_b = 0, old_b = 0; 76 int i = 0; 77 78 vp8_tree_probs_from_distribution( 79 n--, tok, tree, 80 Pnew, bct, num_events, 81 256, 1 82 ); 83 84 do 85 { 86 new_b += vp8_cost_branch(bct[i], Pnew[i]); 87 old_b += vp8_cost_branch(bct[i], Pcur[i]); 88 } 89 while (++i < n); 90 91 if (new_b + (n << 8) < old_b) 92 { 93 int j = 0; 94 95 vp8_write_bit(w, 1); 96 97 do 98 { 99 const vp8_prob p = Pnew[j]; 100 101 vp8_write_literal(w, Pcur[j] = p ? p : 1, 8); 102 } 103 while (++j < n); 104 } 105 else 106 vp8_write_bit(w, 0); 107} 108 109static void update_mbintra_mode_probs(VP8_COMP *cpi) 110{ 111 VP8_COMMON *const x = & cpi->common; 112 113 vp8_writer *const w = cpi->bc; 114 115 { 116 vp8_prob Pnew [VP8_YMODES-1]; 117 unsigned int bct [VP8_YMODES-1] [2]; 118 119 update_mode( 120 w, VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree, 121 Pnew, x->fc.ymode_prob, bct, (unsigned int *)cpi->mb.ymode_count 122 ); 123 } 124 { 125 vp8_prob Pnew [VP8_UV_MODES-1]; 126 unsigned int bct [VP8_UV_MODES-1] [2]; 127 128 update_mode( 129 w, VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree, 130 Pnew, x->fc.uv_mode_prob, bct, (unsigned int *)cpi->mb.uv_mode_count 131 ); 132 } 133} 134 135static void write_ymode(vp8_writer *bc, int m, const vp8_prob *p) 136{ 137 vp8_write_token(bc, vp8_ymode_tree, p, vp8_ymode_encodings + m); 138} 139 140static void kfwrite_ymode(vp8_writer *bc, int m, const vp8_prob *p) 141{ 142 vp8_write_token(bc, vp8_kf_ymode_tree, p, vp8_kf_ymode_encodings + m); 143} 144 145static void write_uv_mode(vp8_writer *bc, int m, const vp8_prob *p) 146{ 147 vp8_write_token(bc, vp8_uv_mode_tree, p, vp8_uv_mode_encodings + m); 148} 149 150 151static void write_bmode(vp8_writer *bc, int m, const vp8_prob *p) 152{ 153 vp8_write_token(bc, vp8_bmode_tree, p, vp8_bmode_encodings + m); 154} 155 156static void write_split(vp8_writer *bc, int x) 157{ 158 vp8_write_token( 159 bc, vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + x 160 ); 161} 162 163void vp8_pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount) 164{ 165 const TOKENEXTRA *stop = p + xcount; 166 unsigned int split; 167 unsigned int shift; 168 int count = w->count; 169 unsigned int range = w->range; 170 unsigned int lowvalue = w->lowvalue; 171 172 while (p < stop) 173 { 174 const int t = p->Token; 175 vp8_token *a = vp8_coef_encodings + t; 176 const vp8_extra_bit_struct *b = vp8_extra_bits + t; 177 int i = 0; 178 const unsigned char *pp = p->context_tree; 179 int v = a->value; 180 int n = a->Len; 181 182 if (p->skip_eob_node) 183 { 184 n--; 185 i = 2; 186 } 187 188 do 189 { 190 const int bb = (v >> --n) & 1; 191 split = 1 + (((range - 1) * pp[i>>1]) >> 8); 192 i = vp8_coef_tree[i+bb]; 193 194 if (bb) 195 { 196 lowvalue += split; 197 range = range - split; 198 } 199 else 200 { 201 range = split; 202 } 203 204 shift = vp8_norm[range]; 205 range <<= shift; 206 count += shift; 207 208 if (count >= 0) 209 { 210 int offset = shift - count; 211 212 if ((lowvalue << (offset - 1)) & 0x80000000) 213 { 214 int x = w->pos - 1; 215 216 while (x >= 0 && w->buffer[x] == 0xff) 217 { 218 w->buffer[x] = (unsigned char)0; 219 x--; 220 } 221 222 w->buffer[x] += 1; 223 } 224 225 validate_buffer(w->buffer + w->pos, 226 1, 227 w->buffer_end, 228 w->error); 229 230 w->buffer[w->pos++] = (lowvalue >> (24 - offset)); 231 lowvalue <<= offset; 232 shift = count; 233 lowvalue &= 0xffffff; 234 count -= 8 ; 235 } 236 237 lowvalue <<= shift; 238 } 239 while (n); 240 241 242 if (b->base_val) 243 { 244 const int e = p->Extra, L = b->Len; 245 246 if (L) 247 { 248 const unsigned char *proba = b->prob; 249 const int v2 = e >> 1; 250 int n2 = L; /* number of bits in v2, assumed nonzero */ 251 i = 0; 252 253 do 254 { 255 const int bb = (v2 >> --n2) & 1; 256 split = 1 + (((range - 1) * proba[i>>1]) >> 8); 257 i = b->tree[i+bb]; 258 259 if (bb) 260 { 261 lowvalue += split; 262 range = range - split; 263 } 264 else 265 { 266 range = split; 267 } 268 269 shift = vp8_norm[range]; 270 range <<= shift; 271 count += shift; 272 273 if (count >= 0) 274 { 275 int offset = shift - count; 276 277 if ((lowvalue << (offset - 1)) & 0x80000000) 278 { 279 int x = w->pos - 1; 280 281 while (x >= 0 && w->buffer[x] == 0xff) 282 { 283 w->buffer[x] = (unsigned char)0; 284 x--; 285 } 286 287 w->buffer[x] += 1; 288 } 289 290 validate_buffer(w->buffer + w->pos, 291 1, 292 w->buffer_end, 293 w->error); 294 295 w->buffer[w->pos++] = (lowvalue >> (24 - offset)); 296 lowvalue <<= offset; 297 shift = count; 298 lowvalue &= 0xffffff; 299 count -= 8 ; 300 } 301 302 lowvalue <<= shift; 303 } 304 while (n2); 305 } 306 307 308 { 309 310 split = (range + 1) >> 1; 311 312 if (e & 1) 313 { 314 lowvalue += split; 315 range = range - split; 316 } 317 else 318 { 319 range = split; 320 } 321 322 range <<= 1; 323 324 if ((lowvalue & 0x80000000)) 325 { 326 int x = w->pos - 1; 327 328 while (x >= 0 && w->buffer[x] == 0xff) 329 { 330 w->buffer[x] = (unsigned char)0; 331 x--; 332 } 333 334 w->buffer[x] += 1; 335 336 } 337 338 lowvalue <<= 1; 339 340 if (!++count) 341 { 342 count = -8; 343 344 validate_buffer(w->buffer + w->pos, 345 1, 346 w->buffer_end, 347 w->error); 348 349 w->buffer[w->pos++] = (lowvalue >> 24); 350 lowvalue &= 0xffffff; 351 } 352 } 353 354 } 355 356 ++p; 357 } 358 359 w->count = count; 360 w->lowvalue = lowvalue; 361 w->range = range; 362 363} 364 365static void write_partition_size(unsigned char *cx_data, int size) 366{ 367 signed char csize; 368 369 csize = size & 0xff; 370 *cx_data = csize; 371 csize = (size >> 8) & 0xff; 372 *(cx_data + 1) = csize; 373 csize = (size >> 16) & 0xff; 374 *(cx_data + 2) = csize; 375 376} 377 378static void pack_tokens_into_partitions_c(VP8_COMP *cpi, unsigned char *cx_data, 379 unsigned char * cx_data_end, 380 int num_part) 381{ 382 383 int i; 384 unsigned char *ptr = cx_data; 385 unsigned char *ptr_end = cx_data_end; 386 vp8_writer * w; 387 388 for (i = 0; i < num_part; i++) 389 { 390 int mb_row; 391 392 w = cpi->bc + i + 1; 393 394 vp8_start_encode(w, ptr, ptr_end); 395 396 for (mb_row = i; mb_row < cpi->common.mb_rows; mb_row += num_part) 397 { 398 const TOKENEXTRA *p = cpi->tplist[mb_row].start; 399 const TOKENEXTRA *stop = cpi->tplist[mb_row].stop; 400 int tokens = (int)(stop - p); 401 402 vp8_pack_tokens_c(w, p, tokens); 403 } 404 405 vp8_stop_encode(w); 406 ptr += w->pos; 407 } 408} 409 410 411static void pack_mb_row_tokens_c(VP8_COMP *cpi, vp8_writer *w) 412{ 413 int mb_row; 414 415 for (mb_row = 0; mb_row < cpi->common.mb_rows; mb_row++) 416 { 417 const TOKENEXTRA *p = cpi->tplist[mb_row].start; 418 const TOKENEXTRA *stop = cpi->tplist[mb_row].stop; 419 int tokens = (int)(stop - p); 420 421 vp8_pack_tokens_c(w, p, tokens); 422 } 423 424} 425 426static void write_mv_ref 427( 428 vp8_writer *w, MB_PREDICTION_MODE m, const vp8_prob *p 429) 430{ 431#if CONFIG_DEBUG 432 assert(NEARESTMV <= m && m <= SPLITMV); 433#endif 434 vp8_write_token(w, vp8_mv_ref_tree, p, 435 vp8_mv_ref_encoding_array + (m - NEARESTMV)); 436} 437 438static void write_sub_mv_ref 439( 440 vp8_writer *w, B_PREDICTION_MODE m, const vp8_prob *p 441) 442{ 443#if CONFIG_DEBUG 444 assert(LEFT4X4 <= m && m <= NEW4X4); 445#endif 446 vp8_write_token(w, vp8_sub_mv_ref_tree, p, 447 vp8_sub_mv_ref_encoding_array + (m - LEFT4X4)); 448} 449 450static void write_mv 451( 452 vp8_writer *w, const MV *mv, const int_mv *ref, const MV_CONTEXT *mvc 453) 454{ 455 MV e; 456 e.row = mv->row - ref->as_mv.row; 457 e.col = mv->col - ref->as_mv.col; 458 459 vp8_encode_motion_vector(w, &e, mvc); 460} 461 462static void write_mb_features(vp8_writer *w, const MB_MODE_INFO *mi, const MACROBLOCKD *x) 463{ 464 /* Encode the MB segment id. */ 465 if (x->segmentation_enabled && x->update_mb_segmentation_map) 466 { 467 switch (mi->segment_id) 468 { 469 case 0: 470 vp8_write(w, 0, x->mb_segment_tree_probs[0]); 471 vp8_write(w, 0, x->mb_segment_tree_probs[1]); 472 break; 473 case 1: 474 vp8_write(w, 0, x->mb_segment_tree_probs[0]); 475 vp8_write(w, 1, x->mb_segment_tree_probs[1]); 476 break; 477 case 2: 478 vp8_write(w, 1, x->mb_segment_tree_probs[0]); 479 vp8_write(w, 0, x->mb_segment_tree_probs[2]); 480 break; 481 case 3: 482 vp8_write(w, 1, x->mb_segment_tree_probs[0]); 483 vp8_write(w, 1, x->mb_segment_tree_probs[2]); 484 break; 485 486 /* TRAP.. This should not happen */ 487 default: 488 vp8_write(w, 0, x->mb_segment_tree_probs[0]); 489 vp8_write(w, 0, x->mb_segment_tree_probs[1]); 490 break; 491 } 492 } 493} 494void vp8_convert_rfct_to_prob(VP8_COMP *const cpi) 495{ 496 const int *const rfct = cpi->mb.count_mb_ref_frame_usage; 497 const int rf_intra = rfct[INTRA_FRAME]; 498 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]; 499 500 /* Calculate the probabilities used to code the ref frame based on usage */ 501 if (!(cpi->prob_intra_coded = rf_intra * 255 / (rf_intra + rf_inter))) 502 cpi->prob_intra_coded = 1; 503 504 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128; 505 506 if (!cpi->prob_last_coded) 507 cpi->prob_last_coded = 1; 508 509 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) 510 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128; 511 512 if (!cpi->prob_gf_coded) 513 cpi->prob_gf_coded = 1; 514 515} 516 517static void pack_inter_mode_mvs(VP8_COMP *const cpi) 518{ 519 VP8_COMMON *const pc = & cpi->common; 520 vp8_writer *const w = cpi->bc; 521 const MV_CONTEXT *mvc = pc->fc.mvc; 522 523 524 MODE_INFO *m = pc->mi; 525 const int mis = pc->mode_info_stride; 526 int mb_row = -1; 527 528 int prob_skip_false = 0; 529 530 cpi->mb.partition_info = cpi->mb.pi; 531 532 vp8_convert_rfct_to_prob(cpi); 533 534#ifdef VP8_ENTROPY_STATS 535 active_section = 1; 536#endif 537 538 if (pc->mb_no_coeff_skip) 539 { 540 int total_mbs = pc->mb_rows * pc->mb_cols; 541 542 prob_skip_false = (total_mbs - cpi->mb.skip_true_count ) * 256 / total_mbs; 543 544 if (prob_skip_false <= 1) 545 prob_skip_false = 1; 546 547 if (prob_skip_false > 255) 548 prob_skip_false = 255; 549 550 cpi->prob_skip_false = prob_skip_false; 551 vp8_write_literal(w, prob_skip_false, 8); 552 } 553 554 vp8_write_literal(w, cpi->prob_intra_coded, 8); 555 vp8_write_literal(w, cpi->prob_last_coded, 8); 556 vp8_write_literal(w, cpi->prob_gf_coded, 8); 557 558 update_mbintra_mode_probs(cpi); 559 560 vp8_write_mvprobs(cpi); 561 562 while (++mb_row < pc->mb_rows) 563 { 564 int mb_col = -1; 565 566 while (++mb_col < pc->mb_cols) 567 { 568 const MB_MODE_INFO *const mi = & m->mbmi; 569 const MV_REFERENCE_FRAME rf = mi->ref_frame; 570 const MB_PREDICTION_MODE mode = mi->mode; 571 572 MACROBLOCKD *xd = &cpi->mb.e_mbd; 573 574 /* Distance of Mb to the various image edges. 575 * These specified to 8th pel as they are always compared to MV 576 * values that are in 1/8th pel units 577 */ 578 xd->mb_to_left_edge = -((mb_col * 16) << 3); 579 xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 580 xd->mb_to_top_edge = -((mb_row * 16) << 3); 581 xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 582 583#ifdef VP8_ENTROPY_STATS 584 active_section = 9; 585#endif 586 587 if (cpi->mb.e_mbd.update_mb_segmentation_map) 588 write_mb_features(w, mi, &cpi->mb.e_mbd); 589 590 if (pc->mb_no_coeff_skip) 591 vp8_encode_bool(w, m->mbmi.mb_skip_coeff, prob_skip_false); 592 593 if (rf == INTRA_FRAME) 594 { 595 vp8_write(w, 0, cpi->prob_intra_coded); 596#ifdef VP8_ENTROPY_STATS 597 active_section = 6; 598#endif 599 write_ymode(w, mode, pc->fc.ymode_prob); 600 601 if (mode == B_PRED) 602 { 603 int j = 0; 604 605 do 606 write_bmode(w, m->bmi[j].as_mode, pc->fc.bmode_prob); 607 while (++j < 16); 608 } 609 610 write_uv_mode(w, mi->uv_mode, pc->fc.uv_mode_prob); 611 } 612 else /* inter coded */ 613 { 614 int_mv best_mv; 615 vp8_prob mv_ref_p [VP8_MVREFS-1]; 616 617 vp8_write(w, 1, cpi->prob_intra_coded); 618 619 if (rf == LAST_FRAME) 620 vp8_write(w, 0, cpi->prob_last_coded); 621 else 622 { 623 vp8_write(w, 1, cpi->prob_last_coded); 624 vp8_write(w, (rf == GOLDEN_FRAME) ? 0 : 1, cpi->prob_gf_coded); 625 } 626 627 { 628 int_mv n1, n2; 629 int ct[4]; 630 631 vp8_find_near_mvs(xd, m, &n1, &n2, &best_mv, ct, rf, cpi->common.ref_frame_sign_bias); 632 vp8_clamp_mv2(&best_mv, xd); 633 634 vp8_mv_ref_probs(mv_ref_p, ct); 635 636#ifdef VP8_ENTROPY_STATS 637 accum_mv_refs(mode, ct); 638#endif 639 640 } 641 642#ifdef VP8_ENTROPY_STATS 643 active_section = 3; 644#endif 645 646 write_mv_ref(w, mode, mv_ref_p); 647 648 switch (mode) /* new, split require MVs */ 649 { 650 case NEWMV: 651 652#ifdef VP8_ENTROPY_STATS 653 active_section = 5; 654#endif 655 656 write_mv(w, &mi->mv.as_mv, &best_mv, mvc); 657 break; 658 659 case SPLITMV: 660 { 661 int j = 0; 662 663#ifdef MODE_STATS 664 ++count_mb_seg [mi->partitioning]; 665#endif 666 667 write_split(w, mi->partitioning); 668 669 do 670 { 671 B_PREDICTION_MODE blockmode; 672 int_mv blockmv; 673 const int *const L = vp8_mbsplits [mi->partitioning]; 674 int k = -1; /* first block in subset j */ 675 int mv_contz; 676 int_mv leftmv, abovemv; 677 678 blockmode = cpi->mb.partition_info->bmi[j].mode; 679 blockmv = cpi->mb.partition_info->bmi[j].mv; 680#if CONFIG_DEBUG 681 while (j != L[++k]) 682 if (k >= 16) 683 assert(0); 684#else 685 while (j != L[++k]); 686#endif 687 leftmv.as_int = left_block_mv(m, k); 688 abovemv.as_int = above_block_mv(m, k, mis); 689 mv_contz = vp8_mv_cont(&leftmv, &abovemv); 690 691 write_sub_mv_ref(w, blockmode, vp8_sub_mv_ref_prob2 [mv_contz]); 692 693 if (blockmode == NEW4X4) 694 { 695#ifdef VP8_ENTROPY_STATS 696 active_section = 11; 697#endif 698 write_mv(w, &blockmv.as_mv, &best_mv, (const MV_CONTEXT *) mvc); 699 } 700 } 701 while (++j < cpi->mb.partition_info->count); 702 } 703 break; 704 default: 705 break; 706 } 707 } 708 709 ++m; 710 cpi->mb.partition_info++; 711 } 712 713 ++m; /* skip L prediction border */ 714 cpi->mb.partition_info++; 715 } 716} 717 718 719static void write_kfmodes(VP8_COMP *cpi) 720{ 721 vp8_writer *const bc = cpi->bc; 722 const VP8_COMMON *const c = & cpi->common; 723 /* const */ 724 MODE_INFO *m = c->mi; 725 726 int mb_row = -1; 727 int prob_skip_false = 0; 728 729 if (c->mb_no_coeff_skip) 730 { 731 int total_mbs = c->mb_rows * c->mb_cols; 732 733 prob_skip_false = (total_mbs - cpi->mb.skip_true_count ) * 256 / total_mbs; 734 735 if (prob_skip_false <= 1) 736 prob_skip_false = 1; 737 738 if (prob_skip_false >= 255) 739 prob_skip_false = 255; 740 741 cpi->prob_skip_false = prob_skip_false; 742 vp8_write_literal(bc, prob_skip_false, 8); 743 } 744 745 while (++mb_row < c->mb_rows) 746 { 747 int mb_col = -1; 748 749 while (++mb_col < c->mb_cols) 750 { 751 const int ym = m->mbmi.mode; 752 753 if (cpi->mb.e_mbd.update_mb_segmentation_map) 754 write_mb_features(bc, &m->mbmi, &cpi->mb.e_mbd); 755 756 if (c->mb_no_coeff_skip) 757 vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false); 758 759 kfwrite_ymode(bc, ym, vp8_kf_ymode_prob); 760 761 if (ym == B_PRED) 762 { 763 const int mis = c->mode_info_stride; 764 int i = 0; 765 766 do 767 { 768 const B_PREDICTION_MODE A = above_block_mode(m, i, mis); 769 const B_PREDICTION_MODE L = left_block_mode(m, i); 770 const int bm = m->bmi[i].as_mode; 771 772#ifdef VP8_ENTROPY_STATS 773 ++intra_mode_stats [A] [L] [bm]; 774#endif 775 776 write_bmode(bc, bm, vp8_kf_bmode_prob [A] [L]); 777 } 778 while (++i < 16); 779 } 780 781 write_uv_mode(bc, (m++)->mbmi.uv_mode, vp8_kf_uv_mode_prob); 782 } 783 784 m++; /* skip L prediction border */ 785 } 786} 787 788#if 0 789/* This function is used for debugging probability trees. */ 790static void print_prob_tree(vp8_prob 791 coef_probs[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES]) 792{ 793 /* print coef probability tree */ 794 int i,j,k,l; 795 FILE* f = fopen("enc_tree_probs.txt", "a"); 796 fprintf(f, "{\n"); 797 for (i = 0; i < BLOCK_TYPES; i++) 798 { 799 fprintf(f, " {\n"); 800 for (j = 0; j < COEF_BANDS; j++) 801 { 802 fprintf(f, " {\n"); 803 for (k = 0; k < PREV_COEF_CONTEXTS; k++) 804 { 805 fprintf(f, " {"); 806 for (l = 0; l < ENTROPY_NODES; l++) 807 { 808 fprintf(f, "%3u, ", 809 (unsigned int)(coef_probs [i][j][k][l])); 810 } 811 fprintf(f, " }\n"); 812 } 813 fprintf(f, " }\n"); 814 } 815 fprintf(f, " }\n"); 816 } 817 fprintf(f, "}\n"); 818 fclose(f); 819} 820#endif 821 822static void sum_probs_over_prev_coef_context( 823 const unsigned int probs[PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS], 824 unsigned int* out) 825{ 826 int i, j; 827 for (i=0; i < MAX_ENTROPY_TOKENS; ++i) 828 { 829 for (j=0; j < PREV_COEF_CONTEXTS; ++j) 830 { 831 const unsigned int tmp = out[i]; 832 out[i] += probs[j][i]; 833 /* check for wrap */ 834 if (out[i] < tmp) 835 out[i] = UINT_MAX; 836 } 837 } 838} 839 840static int prob_update_savings(const unsigned int *ct, 841 const vp8_prob oldp, const vp8_prob newp, 842 const vp8_prob upd) 843{ 844 const int old_b = vp8_cost_branch(ct, oldp); 845 const int new_b = vp8_cost_branch(ct, newp); 846 const int update_b = 8 + 847 ((vp8_cost_one(upd) - vp8_cost_zero(upd)) >> 8); 848 849 return old_b - new_b - update_b; 850} 851 852static int independent_coef_context_savings(VP8_COMP *cpi) 853{ 854 MACROBLOCK *const x = & cpi->mb; 855 int savings = 0; 856 int i = 0; 857 do 858 { 859 int j = 0; 860 do 861 { 862 int k = 0; 863 unsigned int prev_coef_count_sum[MAX_ENTROPY_TOKENS] = {0}; 864 int prev_coef_savings[MAX_ENTROPY_TOKENS] = {0}; 865 const unsigned int (*probs)[MAX_ENTROPY_TOKENS]; 866 /* Calculate new probabilities given the constraint that 867 * they must be equal over the prev coef contexts 868 */ 869 870 probs = (const unsigned int (*)[MAX_ENTROPY_TOKENS]) 871 x->coef_counts[i][j]; 872 873 /* Reset to default probabilities at key frames */ 874 if (cpi->common.frame_type == KEY_FRAME) 875 probs = default_coef_counts[i][j]; 876 877 sum_probs_over_prev_coef_context(probs, prev_coef_count_sum); 878 879 do 880 { 881 /* at every context */ 882 883 /* calc probs and branch cts for this frame only */ 884 int t = 0; /* token/prob index */ 885 886 vp8_tree_probs_from_distribution( 887 MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, 888 cpi->frame_coef_probs[i][j][k], 889 cpi->frame_branch_ct [i][j][k], 890 prev_coef_count_sum, 891 256, 1); 892 893 do 894 { 895 const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t]; 896 const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 897 const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t]; 898 const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 899 const int s = prob_update_savings(ct, oldp, newp, upd); 900 901 if (cpi->common.frame_type != KEY_FRAME || 902 (cpi->common.frame_type == KEY_FRAME && newp != oldp)) 903 prev_coef_savings[t] += s; 904 } 905 while (++t < ENTROPY_NODES); 906 } 907 while (++k < PREV_COEF_CONTEXTS); 908 k = 0; 909 do 910 { 911 /* We only update probabilities if we can save bits, except 912 * for key frames where we have to update all probabilities 913 * to get the equal probabilities across the prev coef 914 * contexts. 915 */ 916 if (prev_coef_savings[k] > 0 || 917 cpi->common.frame_type == KEY_FRAME) 918 savings += prev_coef_savings[k]; 919 } 920 while (++k < ENTROPY_NODES); 921 } 922 while (++j < COEF_BANDS); 923 } 924 while (++i < BLOCK_TYPES); 925 return savings; 926} 927 928static int default_coef_context_savings(VP8_COMP *cpi) 929{ 930 MACROBLOCK *const x = & cpi->mb; 931 int savings = 0; 932 int i = 0; 933 do 934 { 935 int j = 0; 936 do 937 { 938 int k = 0; 939 do 940 { 941 /* at every context */ 942 943 /* calc probs and branch cts for this frame only */ 944 int t = 0; /* token/prob index */ 945 946 vp8_tree_probs_from_distribution( 947 MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, 948 cpi->frame_coef_probs [i][j][k], 949 cpi->frame_branch_ct [i][j][k], 950 x->coef_counts [i][j][k], 951 256, 1 952 ); 953 954 do 955 { 956 const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t]; 957 const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 958 const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t]; 959 const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 960 const int s = prob_update_savings(ct, oldp, newp, upd); 961 962 if (s > 0) 963 { 964 savings += s; 965 } 966 } 967 while (++t < ENTROPY_NODES); 968 } 969 while (++k < PREV_COEF_CONTEXTS); 970 } 971 while (++j < COEF_BANDS); 972 } 973 while (++i < BLOCK_TYPES); 974 return savings; 975} 976 977void vp8_calc_ref_frame_costs(int *ref_frame_cost, 978 int prob_intra, 979 int prob_last, 980 int prob_garf 981 ) 982{ 983 assert(prob_intra >= 0); 984 assert(prob_intra <= 255); 985 assert(prob_last >= 0); 986 assert(prob_last <= 255); 987 assert(prob_garf >= 0); 988 assert(prob_garf <= 255); 989 ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(prob_intra); 990 ref_frame_cost[LAST_FRAME] = vp8_cost_one(prob_intra) 991 + vp8_cost_zero(prob_last); 992 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(prob_intra) 993 + vp8_cost_one(prob_last) 994 + vp8_cost_zero(prob_garf); 995 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(prob_intra) 996 + vp8_cost_one(prob_last) 997 + vp8_cost_one(prob_garf); 998 999} 1000 1001int vp8_estimate_entropy_savings(VP8_COMP *cpi) 1002{ 1003 int savings = 0; 1004 1005 const int *const rfct = cpi->mb.count_mb_ref_frame_usage; 1006 const int rf_intra = rfct[INTRA_FRAME]; 1007 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]; 1008 int new_intra, new_last, new_garf, oldtotal, newtotal; 1009 int ref_frame_cost[MAX_REF_FRAMES]; 1010 1011 vp8_clear_system_state(); 1012 1013 if (cpi->common.frame_type != KEY_FRAME) 1014 { 1015 if (!(new_intra = rf_intra * 255 / (rf_intra + rf_inter))) 1016 new_intra = 1; 1017 1018 new_last = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128; 1019 1020 new_garf = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) 1021 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128; 1022 1023 1024 vp8_calc_ref_frame_costs(ref_frame_cost,new_intra,new_last,new_garf); 1025 1026 newtotal = 1027 rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] + 1028 rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] + 1029 rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] + 1030 rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME]; 1031 1032 1033 /* old costs */ 1034 vp8_calc_ref_frame_costs(ref_frame_cost,cpi->prob_intra_coded, 1035 cpi->prob_last_coded,cpi->prob_gf_coded); 1036 1037 oldtotal = 1038 rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] + 1039 rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] + 1040 rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] + 1041 rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME]; 1042 1043 savings += (oldtotal - newtotal) / 256; 1044 } 1045 1046 1047 if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1048 savings += independent_coef_context_savings(cpi); 1049 else 1050 savings += default_coef_context_savings(cpi); 1051 1052 1053 return savings; 1054} 1055 1056#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1057int vp8_update_coef_context(VP8_COMP *cpi) 1058{ 1059 int savings = 0; 1060 1061 1062 if (cpi->common.frame_type == KEY_FRAME) 1063 { 1064 /* Reset to default counts/probabilities at key frames */ 1065 vp8_copy(cpi->mb.coef_counts, default_coef_counts); 1066 } 1067 1068 if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1069 savings += independent_coef_context_savings(cpi); 1070 else 1071 savings += default_coef_context_savings(cpi); 1072 1073 return savings; 1074} 1075#endif 1076 1077void vp8_update_coef_probs(VP8_COMP *cpi) 1078{ 1079 int i = 0; 1080#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1081 vp8_writer *const w = cpi->bc; 1082#endif 1083 int savings = 0; 1084 1085 vp8_clear_system_state(); 1086 1087 do 1088 { 1089 int j = 0; 1090 1091 do 1092 { 1093 int k = 0; 1094 int prev_coef_savings[ENTROPY_NODES] = {0}; 1095 if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1096 { 1097 for (k = 0; k < PREV_COEF_CONTEXTS; ++k) 1098 { 1099 int t; /* token/prob index */ 1100 for (t = 0; t < ENTROPY_NODES; ++t) 1101 { 1102 const unsigned int *ct = cpi->frame_branch_ct [i][j] 1103 [k][t]; 1104 const vp8_prob newp = cpi->frame_coef_probs[i][j][k][t]; 1105 const vp8_prob oldp = cpi->common.fc.coef_probs[i][j] 1106 [k][t]; 1107 const vp8_prob upd = vp8_coef_update_probs[i][j][k][t]; 1108 1109 prev_coef_savings[t] += 1110 prob_update_savings(ct, oldp, newp, upd); 1111 } 1112 } 1113 k = 0; 1114 } 1115 do 1116 { 1117 /* note: use result from vp8_estimate_entropy_savings, so no 1118 * need to call vp8_tree_probs_from_distribution here. 1119 */ 1120 1121 /* at every context */ 1122 1123 /* calc probs and branch cts for this frame only */ 1124 int t = 0; /* token/prob index */ 1125 1126 do 1127 { 1128 const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 1129 1130 vp8_prob *Pold = cpi->common.fc.coef_probs [i][j][k] + t; 1131 const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 1132 1133 int s = prev_coef_savings[t]; 1134 int u = 0; 1135 1136 if (!(cpi->oxcf.error_resilient_mode & 1137 VPX_ERROR_RESILIENT_PARTITIONS)) 1138 { 1139 s = prob_update_savings( 1140 cpi->frame_branch_ct [i][j][k][t], 1141 *Pold, newp, upd); 1142 } 1143 1144 if (s > 0) 1145 u = 1; 1146 1147 /* Force updates on key frames if the new is different, 1148 * so that we can be sure we end up with equal probabilities 1149 * over the prev coef contexts. 1150 */ 1151 if ((cpi->oxcf.error_resilient_mode & 1152 VPX_ERROR_RESILIENT_PARTITIONS) && 1153 cpi->common.frame_type == KEY_FRAME && newp != *Pold) 1154 u = 1; 1155 1156#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1157 cpi->update_probs[i][j][k][t] = u; 1158#else 1159 vp8_write(w, u, upd); 1160#endif 1161 1162 1163#ifdef VP8_ENTROPY_STATS 1164 ++ tree_update_hist [i][j][k][t] [u]; 1165#endif 1166 1167 if (u) 1168 { 1169 /* send/use new probability */ 1170 1171 *Pold = newp; 1172#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1173 vp8_write_literal(w, newp, 8); 1174#endif 1175 1176 savings += s; 1177 1178 } 1179 1180 } 1181 while (++t < ENTROPY_NODES); 1182 1183 /* Accum token counts for generation of default statistics */ 1184#ifdef VP8_ENTROPY_STATS 1185 t = 0; 1186 1187 do 1188 { 1189 context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t]; 1190 } 1191 while (++t < MAX_ENTROPY_TOKENS); 1192 1193#endif 1194 1195 } 1196 while (++k < PREV_COEF_CONTEXTS); 1197 } 1198 while (++j < COEF_BANDS); 1199 } 1200 while (++i < BLOCK_TYPES); 1201 1202} 1203 1204#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1205static void pack_coef_probs(VP8_COMP *cpi) 1206{ 1207 int i = 0; 1208 vp8_writer *const w = cpi->bc; 1209 1210 do 1211 { 1212 int j = 0; 1213 1214 do 1215 { 1216 int k = 0; 1217 1218 do 1219 { 1220 int t = 0; /* token/prob index */ 1221 1222 do 1223 { 1224 const vp8_prob newp = cpi->common.fc.coef_probs [i][j][k][t]; 1225 const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 1226 1227 const char u = cpi->update_probs[i][j][k][t] ; 1228 1229 vp8_write(w, u, upd); 1230 1231 if (u) 1232 { 1233 /* send/use new probability */ 1234 vp8_write_literal(w, newp, 8); 1235 } 1236 } 1237 while (++t < ENTROPY_NODES); 1238 } 1239 while (++k < PREV_COEF_CONTEXTS); 1240 } 1241 while (++j < COEF_BANDS); 1242 } 1243 while (++i < BLOCK_TYPES); 1244} 1245#endif 1246 1247#ifdef PACKET_TESTING 1248FILE *vpxlogc = 0; 1249#endif 1250 1251static void put_delta_q(vp8_writer *bc, int delta_q) 1252{ 1253 if (delta_q != 0) 1254 { 1255 vp8_write_bit(bc, 1); 1256 vp8_write_literal(bc, abs(delta_q), 4); 1257 1258 if (delta_q < 0) 1259 vp8_write_bit(bc, 1); 1260 else 1261 vp8_write_bit(bc, 0); 1262 } 1263 else 1264 vp8_write_bit(bc, 0); 1265} 1266 1267void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned char * dest_end, unsigned long *size) 1268{ 1269 int i, j; 1270 VP8_HEADER oh; 1271 VP8_COMMON *const pc = & cpi->common; 1272 vp8_writer *const bc = cpi->bc; 1273 MACROBLOCKD *const xd = & cpi->mb.e_mbd; 1274 int extra_bytes_packed = 0; 1275 1276 unsigned char *cx_data = dest; 1277 unsigned char *cx_data_end = dest_end; 1278 const int *mb_feature_data_bits; 1279 1280 oh.show_frame = (int) pc->show_frame; 1281 oh.type = (int)pc->frame_type; 1282 oh.version = pc->version; 1283 oh.first_partition_length_in_bytes = 0; 1284 1285 mb_feature_data_bits = vp8_mb_feature_data_bits; 1286 1287 bc[0].error = &pc->error; 1288 1289 validate_buffer(cx_data, 3, cx_data_end, &cpi->common.error); 1290 cx_data += 3; 1291 1292#if defined(SECTIONBITS_OUTPUT) 1293 Sectionbits[active_section = 1] += sizeof(VP8_HEADER) * 8 * 256; 1294#endif 1295 1296 /* every keyframe send startcode, width, height, scale factor, clamp 1297 * and color type 1298 */ 1299 if (oh.type == KEY_FRAME) 1300 { 1301 int v; 1302 1303 validate_buffer(cx_data, 7, cx_data_end, &cpi->common.error); 1304 1305 /* Start / synch code */ 1306 cx_data[0] = 0x9D; 1307 cx_data[1] = 0x01; 1308 cx_data[2] = 0x2a; 1309 1310 v = (pc->horiz_scale << 14) | pc->Width; 1311 cx_data[3] = v; 1312 cx_data[4] = v >> 8; 1313 1314 v = (pc->vert_scale << 14) | pc->Height; 1315 cx_data[5] = v; 1316 cx_data[6] = v >> 8; 1317 1318 1319 extra_bytes_packed = 7; 1320 cx_data += extra_bytes_packed ; 1321 1322 vp8_start_encode(bc, cx_data, cx_data_end); 1323 1324 /* signal clr type */ 1325 vp8_write_bit(bc, 0); 1326 vp8_write_bit(bc, pc->clamp_type); 1327 1328 } 1329 else 1330 vp8_start_encode(bc, cx_data, cx_data_end); 1331 1332 1333 /* Signal whether or not Segmentation is enabled */ 1334 vp8_write_bit(bc, xd->segmentation_enabled); 1335 1336 /* Indicate which features are enabled */ 1337 if (xd->segmentation_enabled) 1338 { 1339 /* Signal whether or not the segmentation map is being updated. */ 1340 vp8_write_bit(bc, xd->update_mb_segmentation_map); 1341 vp8_write_bit(bc, xd->update_mb_segmentation_data); 1342 1343 if (xd->update_mb_segmentation_data) 1344 { 1345 signed char Data; 1346 1347 vp8_write_bit(bc, xd->mb_segement_abs_delta); 1348 1349 /* For each segmentation feature (Quant and loop filter level) */ 1350 for (i = 0; i < MB_LVL_MAX; i++) 1351 { 1352 /* For each of the segments */ 1353 for (j = 0; j < MAX_MB_SEGMENTS; j++) 1354 { 1355 Data = xd->segment_feature_data[i][j]; 1356 1357 /* Frame level data */ 1358 if (Data) 1359 { 1360 vp8_write_bit(bc, 1); 1361 1362 if (Data < 0) 1363 { 1364 Data = - Data; 1365 vp8_write_literal(bc, Data, mb_feature_data_bits[i]); 1366 vp8_write_bit(bc, 1); 1367 } 1368 else 1369 { 1370 vp8_write_literal(bc, Data, mb_feature_data_bits[i]); 1371 vp8_write_bit(bc, 0); 1372 } 1373 } 1374 else 1375 vp8_write_bit(bc, 0); 1376 } 1377 } 1378 } 1379 1380 if (xd->update_mb_segmentation_map) 1381 { 1382 /* Write the probs used to decode the segment id for each mb */ 1383 for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) 1384 { 1385 int Data = xd->mb_segment_tree_probs[i]; 1386 1387 if (Data != 255) 1388 { 1389 vp8_write_bit(bc, 1); 1390 vp8_write_literal(bc, Data, 8); 1391 } 1392 else 1393 vp8_write_bit(bc, 0); 1394 } 1395 } 1396 } 1397 1398 vp8_write_bit(bc, pc->filter_type); 1399 vp8_write_literal(bc, pc->filter_level, 6); 1400 vp8_write_literal(bc, pc->sharpness_level, 3); 1401 1402 /* Write out loop filter deltas applied at the MB level based on mode 1403 * or ref frame (if they are enabled). 1404 */ 1405 vp8_write_bit(bc, xd->mode_ref_lf_delta_enabled); 1406 1407 if (xd->mode_ref_lf_delta_enabled) 1408 { 1409 /* Do the deltas need to be updated */ 1410 int send_update = xd->mode_ref_lf_delta_update 1411 || cpi->oxcf.error_resilient_mode; 1412 1413 vp8_write_bit(bc, send_update); 1414 if (send_update) 1415 { 1416 int Data; 1417 1418 /* Send update */ 1419 for (i = 0; i < MAX_REF_LF_DELTAS; i++) 1420 { 1421 Data = xd->ref_lf_deltas[i]; 1422 1423 /* Frame level data */ 1424 if (xd->ref_lf_deltas[i] != xd->last_ref_lf_deltas[i] 1425 || cpi->oxcf.error_resilient_mode) 1426 { 1427 xd->last_ref_lf_deltas[i] = xd->ref_lf_deltas[i]; 1428 vp8_write_bit(bc, 1); 1429 1430 if (Data > 0) 1431 { 1432 vp8_write_literal(bc, (Data & 0x3F), 6); 1433 vp8_write_bit(bc, 0); /* sign */ 1434 } 1435 else 1436 { 1437 Data = -Data; 1438 vp8_write_literal(bc, (Data & 0x3F), 6); 1439 vp8_write_bit(bc, 1); /* sign */ 1440 } 1441 } 1442 else 1443 vp8_write_bit(bc, 0); 1444 } 1445 1446 /* Send update */ 1447 for (i = 0; i < MAX_MODE_LF_DELTAS; i++) 1448 { 1449 Data = xd->mode_lf_deltas[i]; 1450 1451 if (xd->mode_lf_deltas[i] != xd->last_mode_lf_deltas[i] 1452 || cpi->oxcf.error_resilient_mode) 1453 { 1454 xd->last_mode_lf_deltas[i] = xd->mode_lf_deltas[i]; 1455 vp8_write_bit(bc, 1); 1456 1457 if (Data > 0) 1458 { 1459 vp8_write_literal(bc, (Data & 0x3F), 6); 1460 vp8_write_bit(bc, 0); /* sign */ 1461 } 1462 else 1463 { 1464 Data = -Data; 1465 vp8_write_literal(bc, (Data & 0x3F), 6); 1466 vp8_write_bit(bc, 1); /* sign */ 1467 } 1468 } 1469 else 1470 vp8_write_bit(bc, 0); 1471 } 1472 } 1473 } 1474 1475 /* signal here is multi token partition is enabled */ 1476 vp8_write_literal(bc, pc->multi_token_partition, 2); 1477 1478 /* Frame Qbaseline quantizer index */ 1479 vp8_write_literal(bc, pc->base_qindex, 7); 1480 1481 /* Transmit Dc, Second order and Uv quantizer delta information */ 1482 put_delta_q(bc, pc->y1dc_delta_q); 1483 put_delta_q(bc, pc->y2dc_delta_q); 1484 put_delta_q(bc, pc->y2ac_delta_q); 1485 put_delta_q(bc, pc->uvdc_delta_q); 1486 put_delta_q(bc, pc->uvac_delta_q); 1487 1488 /* When there is a key frame all reference buffers are updated using 1489 * the new key frame 1490 */ 1491 if (pc->frame_type != KEY_FRAME) 1492 { 1493 /* Should the GF or ARF be updated using the transmitted frame 1494 * or buffer 1495 */ 1496 vp8_write_bit(bc, pc->refresh_golden_frame); 1497 vp8_write_bit(bc, pc->refresh_alt_ref_frame); 1498 1499 /* If not being updated from current frame should either GF or ARF 1500 * be updated from another buffer 1501 */ 1502 if (!pc->refresh_golden_frame) 1503 vp8_write_literal(bc, pc->copy_buffer_to_gf, 2); 1504 1505 if (!pc->refresh_alt_ref_frame) 1506 vp8_write_literal(bc, pc->copy_buffer_to_arf, 2); 1507 1508 /* Indicate reference frame sign bias for Golden and ARF frames 1509 * (always 0 for last frame buffer) 1510 */ 1511 vp8_write_bit(bc, pc->ref_frame_sign_bias[GOLDEN_FRAME]); 1512 vp8_write_bit(bc, pc->ref_frame_sign_bias[ALTREF_FRAME]); 1513 } 1514 1515#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1516 if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1517 { 1518 if (pc->frame_type == KEY_FRAME) 1519 pc->refresh_entropy_probs = 1; 1520 else 1521 pc->refresh_entropy_probs = 0; 1522 } 1523#endif 1524 1525 vp8_write_bit(bc, pc->refresh_entropy_probs); 1526 1527 if (pc->frame_type != KEY_FRAME) 1528 vp8_write_bit(bc, pc->refresh_last_frame); 1529 1530#ifdef VP8_ENTROPY_STATS 1531 1532 if (pc->frame_type == INTER_FRAME) 1533 active_section = 0; 1534 else 1535 active_section = 7; 1536 1537#endif 1538 1539 vp8_clear_system_state(); 1540 1541#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1542 pack_coef_probs(cpi); 1543#else 1544 if (pc->refresh_entropy_probs == 0) 1545 { 1546 /* save a copy for later refresh */ 1547 vpx_memcpy(&cpi->common.lfc, &cpi->common.fc, sizeof(cpi->common.fc)); 1548 } 1549 1550 vp8_update_coef_probs(cpi); 1551#endif 1552 1553#ifdef VP8_ENTROPY_STATS 1554 active_section = 2; 1555#endif 1556 1557 /* Write out the mb_no_coeff_skip flag */ 1558 vp8_write_bit(bc, pc->mb_no_coeff_skip); 1559 1560 if (pc->frame_type == KEY_FRAME) 1561 { 1562 write_kfmodes(cpi); 1563 1564#ifdef VP8_ENTROPY_STATS 1565 active_section = 8; 1566#endif 1567 } 1568 else 1569 { 1570 pack_inter_mode_mvs(cpi); 1571 1572#ifdef VP8_ENTROPY_STATS 1573 active_section = 1; 1574#endif 1575 } 1576 1577 vp8_stop_encode(bc); 1578 1579 cx_data += bc->pos; 1580 1581 oh.first_partition_length_in_bytes = cpi->bc->pos; 1582 1583 /* update frame tag */ 1584 { 1585 int v = (oh.first_partition_length_in_bytes << 5) | 1586 (oh.show_frame << 4) | 1587 (oh.version << 1) | 1588 oh.type; 1589 1590 dest[0] = v; 1591 dest[1] = v >> 8; 1592 dest[2] = v >> 16; 1593 } 1594 1595 *size = VP8_HEADER_SIZE + extra_bytes_packed + cpi->bc->pos; 1596 1597 cpi->partition_sz[0] = *size; 1598 1599#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1600 { 1601 const int num_part = (1 << pc->multi_token_partition); 1602 unsigned char * dp = cpi->partition_d[0] + cpi->partition_sz[0]; 1603 1604 if (num_part > 1) 1605 { 1606 /* write token part sizes (all but last) if more than 1 */ 1607 validate_buffer(dp, 3 * (num_part - 1), cpi->partition_d_end[0], 1608 &pc->error); 1609 1610 cpi->partition_sz[0] += 3*(num_part-1); 1611 1612 for(i = 1; i < num_part; i++) 1613 { 1614 write_partition_size(dp, cpi->partition_sz[i]); 1615 dp += 3; 1616 } 1617 } 1618 1619 if (!cpi->output_partition) 1620 { 1621 /* concatenate partition buffers */ 1622 for(i = 0; i < num_part; i++) 1623 { 1624 vpx_memmove(dp, cpi->partition_d[i+1], cpi->partition_sz[i+1]); 1625 cpi->partition_d[i+1] = dp; 1626 dp += cpi->partition_sz[i+1]; 1627 } 1628 } 1629 1630 /* update total size */ 1631 *size = 0; 1632 for(i = 0; i < num_part+1; i++) 1633 { 1634 *size += cpi->partition_sz[i]; 1635 } 1636 } 1637#else 1638 if (pc->multi_token_partition != ONE_PARTITION) 1639 { 1640 int num_part = 1 << pc->multi_token_partition; 1641 1642 /* partition size table at the end of first partition */ 1643 cpi->partition_sz[0] += 3 * (num_part - 1); 1644 *size += 3 * (num_part - 1); 1645 1646 validate_buffer(cx_data, 3 * (num_part - 1), cx_data_end, 1647 &pc->error); 1648 1649 for(i = 1; i < num_part + 1; i++) 1650 { 1651 cpi->bc[i].error = &pc->error; 1652 } 1653 1654 pack_tokens_into_partitions(cpi, cx_data + 3 * (num_part - 1), 1655 cx_data_end, num_part); 1656 1657 for(i = 1; i < num_part; i++) 1658 { 1659 cpi->partition_sz[i] = cpi->bc[i].pos; 1660 write_partition_size(cx_data, cpi->partition_sz[i]); 1661 cx_data += 3; 1662 *size += cpi->partition_sz[i]; /* add to total */ 1663 } 1664 1665 /* add last partition to total size */ 1666 cpi->partition_sz[i] = cpi->bc[i].pos; 1667 *size += cpi->partition_sz[i]; 1668 } 1669 else 1670 { 1671 bc[1].error = &pc->error; 1672 1673 vp8_start_encode(&cpi->bc[1], cx_data, cx_data_end); 1674 1675#if CONFIG_MULTITHREAD 1676 if (cpi->b_multi_threaded) 1677 pack_mb_row_tokens(cpi, &cpi->bc[1]); 1678 else 1679#endif 1680 pack_tokens(&cpi->bc[1], cpi->tok, cpi->tok_count); 1681 1682 vp8_stop_encode(&cpi->bc[1]); 1683 1684 *size += cpi->bc[1].pos; 1685 cpi->partition_sz[1] = cpi->bc[1].pos; 1686 } 1687#endif 1688} 1689 1690#ifdef VP8_ENTROPY_STATS 1691void print_tree_update_probs() 1692{ 1693 int i, j, k, l; 1694 FILE *f = fopen("context.c", "a"); 1695 int Sum; 1696 fprintf(f, "\n/* Update probabilities for token entropy tree. */\n\n"); 1697 fprintf(f, "const vp8_prob tree_update_probs[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] = {\n"); 1698 1699 for (i = 0; i < BLOCK_TYPES; i++) 1700 { 1701 fprintf(f, " { \n"); 1702 1703 for (j = 0; j < COEF_BANDS; j++) 1704 { 1705 fprintf(f, " {\n"); 1706 1707 for (k = 0; k < PREV_COEF_CONTEXTS; k++) 1708 { 1709 fprintf(f, " {"); 1710 1711 for (l = 0; l < ENTROPY_NODES; l++) 1712 { 1713 Sum = tree_update_hist[i][j][k][l][0] + tree_update_hist[i][j][k][l][1]; 1714 1715 if (Sum > 0) 1716 { 1717 if (((tree_update_hist[i][j][k][l][0] * 255) / Sum) > 0) 1718 fprintf(f, "%3ld, ", (tree_update_hist[i][j][k][l][0] * 255) / Sum); 1719 else 1720 fprintf(f, "%3ld, ", 1); 1721 } 1722 else 1723 fprintf(f, "%3ld, ", 128); 1724 } 1725 1726 fprintf(f, "},\n"); 1727 } 1728 1729 fprintf(f, " },\n"); 1730 } 1731 1732 fprintf(f, " },\n"); 1733 } 1734 1735 fprintf(f, "};\n"); 1736 fclose(f); 1737} 1738#endif 1739