1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/header.h" 13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodemv.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/entropymode.h" 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/findnearmv.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "mcomp.h" 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/systemdependent.h" 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <assert.h> 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdio.h> 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <limits.h> 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx/vpx_encoder.h" 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h" 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "bitstream.h" 24167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 25167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "defaultcoefcounts.h" 265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vp8/common/common.h" 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgconst int vp8cx_base_skip_false_prob[128] = 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 255, 255, 255, 255, 255, 255, 255, 255, 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 255, 255, 255, 255, 255, 255, 255, 255, 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 255, 255, 255, 255, 255, 255, 255, 255, 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 255, 255, 255, 255, 255, 255, 255, 255, 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 255, 255, 255, 255, 255, 255, 255, 255, 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 255, 255, 255, 255, 255, 255, 255, 255, 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 255, 255, 255, 255, 255, 255, 255, 255, 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 251, 248, 244, 240, 236, 232, 229, 225, 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 221, 217, 213, 208, 204, 199, 194, 190, 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 187, 183, 179, 175, 172, 168, 164, 160, 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 157, 153, 149, 145, 142, 138, 134, 130, 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 127, 124, 120, 117, 114, 110, 107, 104, 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 101, 98, 95, 92, 89, 86, 83, 80, 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 77, 74, 71, 68, 65, 62, 59, 56, 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 53, 50, 47, 44, 41, 38, 35, 32, 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 30, 28, 26, 24, 22, 20, 18, 16, 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}; 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if defined(SECTIONBITS_OUTPUT) 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned __int64 Sectionbits[500]; 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 521cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint intra_mode_stats[10][10][10]; 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic unsigned int tree_update_hist [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] [2]; 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern unsigned int active_section; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint count_mb_seg[4] = { 0, 0, 0, 0 }; 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void update_mode( 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_writer *const w, 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int n, 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_token tok [/* n */], 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_tree tree, 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_prob Pnew [/* n-1 */], 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_prob Pcur [/* n-1 */], 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int bct [/* n-1 */] [2], 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned int num_events[/* n */] 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int new_b = 0, old_b = 0; 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i = 0; 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_tree_probs_from_distribution( 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org n--, tok, tree, 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Pnew, bct, num_events, 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 256, 1 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ); 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org new_b += vp8_cost_branch(bct[i], Pnew[i]); 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org old_b += vp8_cost_branch(bct[i], Pcur[i]); 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++i < n); 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (new_b + (n << 8) < old_b) 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 921929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org int j = 0; 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(w, 1); 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 981929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org const vp8_prob p = Pnew[j]; 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1001929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org vp8_write_literal(w, Pcur[j] = p ? p : 1, 8); 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1021929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org while (++j < n); 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(w, 0); 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void update_mbintra_mode_probs(VP8_COMP *cpi) 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *const x = & cpi->common; 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 112167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_writer *const w = cpi->bc; 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_prob Pnew [VP8_YMODES-1]; 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int bct [VP8_YMODES-1] [2]; 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org update_mode( 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w, VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree, 120d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org Pnew, x->fc.ymode_prob, bct, (unsigned int *)cpi->mb.ymode_count 121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ); 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_prob Pnew [VP8_UV_MODES-1]; 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int bct [VP8_UV_MODES-1] [2]; 126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org update_mode( 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w, VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree, 129d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org Pnew, x->fc.uv_mode_prob, bct, (unsigned int *)cpi->mb.uv_mode_count 130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ); 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_ymode(vp8_writer *bc, int m, const vp8_prob *p) 135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_token(bc, vp8_ymode_tree, p, vp8_ymode_encodings + m); 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void kfwrite_ymode(vp8_writer *bc, int m, const vp8_prob *p) 140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_token(bc, vp8_kf_ymode_tree, p, vp8_kf_ymode_encodings + m); 142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_uv_mode(vp8_writer *bc, int m, const vp8_prob *p) 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_token(bc, vp8_uv_mode_tree, p, vp8_uv_mode_encodings + m); 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_bmode(vp8_writer *bc, int m, const vp8_prob *p) 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_token(bc, vp8_bmode_tree, p, vp8_bmode_encodings + m); 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_split(vp8_writer *bc, int x) 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_token( 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bc, vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + x 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ); 160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount) 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 1645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const TOKENEXTRA *stop = p + xcount; 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int split; 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int shift; 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int count = w->count; 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int range = w->range; 169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int lowvalue = w->lowvalue; 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (p < stop) 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int t = p->Token; 174ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_token *a = vp8_coef_encodings + t; 1755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const vp8_extra_bit_struct *b = vp8_extra_bits + t; 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i = 0; 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *pp = p->context_tree; 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int v = a->value; 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int n = a->Len; 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (p->skip_eob_node) 182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org n--; 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org i = 2; 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int bb = (v >> --n) & 1; 190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org split = 1 + (((range - 1) * pp[i>>1]) >> 8); 191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org i = vp8_coef_tree[i+bb]; 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (bb) 194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue += split; 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range = range - split; 197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range = split; 201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org shift = vp8_norm[range]; 204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range <<= shift; 205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org count += shift; 206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (count >= 0) 208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int offset = shift - count; 210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if ((lowvalue << (offset - 1)) & 0x80000000) 212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int x = w->pos - 1; 214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (x >= 0 && w->buffer[x] == 0xff) 216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[x] = (unsigned char)0; 218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x--; 219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[x] += 1; 222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 224167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org validate_buffer(w->buffer + w->pos, 225167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1, 226167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org w->buffer_end, 227167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org w->error); 228167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[w->pos++] = (lowvalue >> (24 - offset)); 230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue <<= offset; 231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org shift = count; 232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue &= 0xffffff; 233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org count -= 8 ; 234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue <<= shift; 237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (n); 239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (b->base_val) 242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int e = p->Extra, L = b->Len; 244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (L) 246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 2471929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org const unsigned char *proba = b->prob; 2481929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org const int v2 = e >> 1; 2491929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org int n2 = L; /* number of bits in v2, assumed nonzero */ 2501929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org i = 0; 251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 2541929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org const int bb = (v2 >> --n2) & 1; 2551929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org split = 1 + (((range - 1) * proba[i>>1]) >> 8); 256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org i = b->tree[i+bb]; 257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (bb) 259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue += split; 261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range = range - split; 262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range = split; 266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org shift = vp8_norm[range]; 269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range <<= shift; 270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org count += shift; 271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (count >= 0) 273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int offset = shift - count; 275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if ((lowvalue << (offset - 1)) & 0x80000000) 277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int x = w->pos - 1; 279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (x >= 0 && w->buffer[x] == 0xff) 281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[x] = (unsigned char)0; 283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x--; 284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[x] += 1; 287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 289167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org validate_buffer(w->buffer + w->pos, 290167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1, 291167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org w->buffer_end, 292167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org w->error); 293167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[w->pos++] = (lowvalue >> (24 - offset)); 295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue <<= offset; 296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org shift = count; 297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue &= 0xffffff; 298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org count -= 8 ; 299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue <<= shift; 302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 3031929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org while (n2); 304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org split = (range + 1) >> 1; 310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (e & 1) 312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue += split; 314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range = range - split; 315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range = split; 319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org range <<= 1; 322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if ((lowvalue & 0x80000000)) 324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int x = w->pos - 1; 326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (x >= 0 && w->buffer[x] == 0xff) 328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[x] = (unsigned char)0; 330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x--; 331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[x] += 1; 334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue <<= 1; 338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!++count) 340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org count = -8; 342167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 343167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org validate_buffer(w->buffer + w->pos, 344167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1, 345167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org w->buffer_end, 346167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org w->error); 347167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->buffer[w->pos++] = (lowvalue >> 24); 349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lowvalue &= 0xffffff; 350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ++p; 356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->count = count; 359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->lowvalue = lowvalue; 360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org w->range = range; 361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_partition_size(unsigned char *cx_data, int size) 365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org signed char csize; 367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org csize = size & 0xff; 369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *cx_data = csize; 370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org csize = (size >> 8) & 0xff; 371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *(cx_data + 1) = csize; 372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org csize = (size >> 16) & 0xff; 373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *(cx_data + 2) = csize; 374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 377167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void pack_tokens_into_partitions_c(VP8_COMP *cpi, unsigned char *cx_data, 378167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char * cx_data_end, 379167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int num_part) 380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *ptr = cx_data; 384167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char *ptr_end = cx_data_end; 3855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_writer * w; 386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < num_part; i++) 388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 3895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int mb_row; 390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org w = cpi->bc + i + 1; 392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_start_encode(w, ptr, ptr_end); 394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_row = i; mb_row < cpi->common.mb_rows; mb_row += num_part) 3965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const TOKENEXTRA *p = cpi->tplist[mb_row].start; 3985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const TOKENEXTRA *stop = cpi->tplist[mb_row].stop; 399ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int tokens = (int)(stop - p); 400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 4015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_pack_tokens_c(w, p, tokens); 402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_stop_encode(w); 405167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ptr += w->pos; 406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void pack_mb_row_tokens_c(VP8_COMP *cpi, vp8_writer *w) 411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_row; 413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (mb_row = 0; mb_row < cpi->common.mb_rows; mb_row++) 415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 4165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const TOKENEXTRA *p = cpi->tplist[mb_row].start; 4175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const TOKENEXTRA *stop = cpi->tplist[mb_row].stop; 418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int tokens = (int)(stop - p); 419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 4205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_pack_tokens_c(w, p, tokens); 421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_mv_ref 426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_writer *w, MB_PREDICTION_MODE m, const vp8_prob *p 428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_DEBUG 431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org assert(NEARESTMV <= m && m <= SPLITMV); 432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_token(w, vp8_mv_ref_tree, p, 434085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vp8_mv_ref_encoding_array + (m - NEARESTMV)); 435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_sub_mv_ref 438474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_writer *w, B_PREDICTION_MODE m, const vp8_prob *p 440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_DEBUG 443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org assert(LEFT4X4 <= m && m <= NEW4X4); 444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 445474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_token(w, vp8_sub_mv_ref_tree, p, 446085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vp8_sub_mv_ref_encoding_array + (m - LEFT4X4)); 447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_mv 450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_writer *w, const MV *mv, const int_mv *ref, const MV_CONTEXT *mvc 452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MV e; 455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org e.row = mv->row - ref->as_mv.row; 456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org e.col = mv->col - ref->as_mv.col; 457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_encode_motion_vector(w, &e, mvc); 459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_mb_features(vp8_writer *w, const MB_MODE_INFO *mi, const MACROBLOCKD *x) 462474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 463ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Encode the MB segment id. */ 464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (x->segmentation_enabled && x->update_mb_segmentation_map) 465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org switch (mi->segment_id) 467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case 0: 469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 0, x->mb_segment_tree_probs[0]); 470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 0, x->mb_segment_tree_probs[1]); 471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case 1: 473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 0, x->mb_segment_tree_probs[0]); 474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 1, x->mb_segment_tree_probs[1]); 475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case 2: 477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 1, x->mb_segment_tree_probs[0]); 478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 0, x->mb_segment_tree_probs[2]); 479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case 3: 481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 1, x->mb_segment_tree_probs[0]); 482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 1, x->mb_segment_tree_probs[2]); 483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* TRAP.. This should not happen */ 486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org default: 487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 0, x->mb_segment_tree_probs[0]); 488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 0, x->mb_segment_tree_probs[1]); 489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 493167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_convert_rfct_to_prob(VP8_COMP *const cpi) 494167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 495d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org const int *const rfct = cpi->mb.count_mb_ref_frame_usage; 496167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const int rf_intra = rfct[INTRA_FRAME]; 497167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]; 498167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Calculate the probabilities used to code the ref frame based on usage */ 500167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (!(cpi->prob_intra_coded = rf_intra * 255 / (rf_intra + rf_inter))) 501167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->prob_intra_coded = 1; 502167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 503167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128; 504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 505167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (!cpi->prob_last_coded) 506167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->prob_last_coded = 1; 507167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 508167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) 509167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128; 510167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 511167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (!cpi->prob_gf_coded) 512167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->prob_gf_coded = 1; 513167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 514167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void pack_inter_mode_mvs(VP8_COMP *const cpi) 517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *const pc = & cpi->common; 519167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_writer *const w = cpi->bc; 520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const MV_CONTEXT *mvc = pc->fc.mvc; 521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MODE_INFO *m = pc->mi; 524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int mis = pc->mode_info_stride; 525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_row = -1; 526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 527474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int prob_skip_false = 0; 528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->mb.partition_info = cpi->mb.pi; 530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 531167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_convert_rfct_to_prob(cpi); 532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5331cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 1; 535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->mb_no_coeff_skip) 538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 5395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int total_mbs = pc->mb_rows * pc->mb_cols; 5405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 541d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org prob_skip_false = (total_mbs - cpi->mb.skip_true_count ) * 256 / total_mbs; 542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (prob_skip_false <= 1) 544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org prob_skip_false = 1; 545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (prob_skip_false > 255) 547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org prob_skip_false = 255; 548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->prob_skip_false = prob_skip_false; 550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(w, prob_skip_false, 8); 551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(w, cpi->prob_intra_coded, 8); 554167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write_literal(w, cpi->prob_last_coded, 8); 555167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write_literal(w, cpi->prob_gf_coded, 8); 556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org update_mbintra_mode_probs(cpi); 558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_mvprobs(cpi); 560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++mb_row < pc->mb_rows) 562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_col = -1; 564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++mb_col < pc->mb_cols) 566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const MB_MODE_INFO *const mi = & m->mbmi; 568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const MV_REFERENCE_FRAME rf = mi->ref_frame; 569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const MB_PREDICTION_MODE mode = mi->mode; 570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *xd = &cpi->mb.e_mbd; 572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 573ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Distance of Mb to the various image edges. 574ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * These specified to 8th pel as they are always compared to MV 575ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * values that are in 1/8th pel units 576ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mb_to_left_edge = -((mb_col * 16) << 3); 578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 579085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org xd->mb_to_top_edge = -((mb_row * 16) << 3); 580474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5821cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 9; 584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->mb.e_mbd.update_mb_segmentation_map) 587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_mb_features(w, mi, &cpi->mb.e_mbd); 588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->mb_no_coeff_skip) 590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_encode_bool(w, m->mbmi.mb_skip_coeff, prob_skip_false); 591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (rf == INTRA_FRAME) 593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 0, cpi->prob_intra_coded); 5951cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 6; 597474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 598474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_ymode(w, mode, pc->fc.ymode_prob); 599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 600474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mode == B_PRED) 601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int j = 0; 603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 604474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 605474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_bmode(w, m->bmi[j].as_mode, pc->fc.bmode_prob); 606474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++j < 16); 607474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 608474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 609474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_uv_mode(w, mi->uv_mode, pc->fc.uv_mode_prob); 610474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else /* inter coded */ 612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv best_mv; 614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_prob mv_ref_p [VP8_MVREFS-1]; 615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, 1, cpi->prob_intra_coded); 617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (rf == LAST_FRAME) 619167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write(w, 0, cpi->prob_last_coded); 620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 622167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write(w, 1, cpi->prob_last_coded); 623167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write(w, (rf == GOLDEN_FRAME) ? 0 : 1, cpi->prob_gf_coded); 624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 625474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv n1, n2; 628474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int ct[4]; 629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_find_near_mvs(xd, m, &n1, &n2, &best_mv, ct, rf, cpi->common.ref_frame_sign_bias); 631167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_clamp_mv2(&best_mv, xd); 632167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 633474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mv_ref_probs(mv_ref_p, ct); 634474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6351cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org accum_mv_refs(mode, ct); 637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6411cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 3; 643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_mv_ref(w, mode, mv_ref_p); 646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org switch (mode) /* new, split require MVs */ 648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case NEWMV: 650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6511cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 5; 653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_mv(w, &mi->mv.as_mv, &best_mv, mvc); 656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case SPLITMV: 659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int j = 0; 661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS 663474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ++count_mb_seg [mi->partitioning]; 664474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 665474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 666474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_split(w, mi->partitioning); 667474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 668474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org B_PREDICTION_MODE blockmode; 671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv blockmv; 672474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int *const L = vp8_mbsplits [mi->partitioning]; 673474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int k = -1; /* first block in subset j */ 674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mv_contz; 675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv leftmv, abovemv; 676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org blockmode = cpi->mb.partition_info->bmi[j].mode; 678474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org blockmv = cpi->mb.partition_info->bmi[j].mv; 679474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_DEBUG 680474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (j != L[++k]) 681474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (k >= 16) 682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org assert(0); 683474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else 684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (j != L[++k]); 685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 686474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org leftmv.as_int = left_block_mv(m, k); 687474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org abovemv.as_int = above_block_mv(m, k, mis); 688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mv_contz = vp8_mv_cont(&leftmv, &abovemv); 689474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_sub_mv_ref(w, blockmode, vp8_sub_mv_ref_prob2 [mv_contz]); 691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (blockmode == NEW4X4) 693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 6941cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 695474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 11; 696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 697474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_mv(w, &blockmv.as_mv, &best_mv, (const MV_CONTEXT *) mvc); 698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++j < cpi->mb.partition_info->count); 701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 703474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org default: 704474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 705474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 706474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 708474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ++m; 709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->mb.partition_info++; 710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ++m; /* skip L prediction border */ 713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->mb.partition_info++; 714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void write_kfmodes(VP8_COMP *cpi) 719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 720167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_writer *const bc = cpi->bc; 721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const VP8_COMMON *const c = & cpi->common; 722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* const */ 723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MODE_INFO *m = c->mi; 724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_row = -1; 726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int prob_skip_false = 0; 727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (c->mb_no_coeff_skip) 729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 7305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int total_mbs = c->mb_rows * c->mb_cols; 7315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 732d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org prob_skip_false = (total_mbs - cpi->mb.skip_true_count ) * 256 / total_mbs; 733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (prob_skip_false <= 1) 735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org prob_skip_false = 1; 736474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 737474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (prob_skip_false >= 255) 738474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org prob_skip_false = 255; 739474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 740474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->prob_skip_false = prob_skip_false; 741474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, prob_skip_false, 8); 742474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 743474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 744474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++mb_row < c->mb_rows) 745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_col = -1; 747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 748474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++mb_col < c->mb_cols) 749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 750474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int ym = m->mbmi.mode; 751474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 752474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->mb.e_mbd.update_mb_segmentation_map) 753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_mb_features(bc, &m->mbmi, &cpi->mb.e_mbd); 754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (c->mb_no_coeff_skip) 756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false); 757474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 758ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org kfwrite_ymode(bc, ym, vp8_kf_ymode_prob); 759474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (ym == B_PRED) 761474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 762474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int mis = c->mode_info_stride; 763474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i = 0; 764474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 767474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const B_PREDICTION_MODE A = above_block_mode(m, i, mis); 768474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const B_PREDICTION_MODE L = left_block_mode(m, i); 769474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int bm = m->bmi[i].as_mode; 770474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 7711cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 772474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ++intra_mode_stats [A] [L] [bm]; 773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 774474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 775ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org write_bmode(bc, bm, vp8_kf_bmode_prob [A] [L]); 776474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++i < 16); 778474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 779474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 780ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org write_uv_mode(bc, (m++)->mbmi.uv_mode, vp8_kf_uv_mode_prob); 781474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 782474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 783ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org m++; /* skip L prediction border */ 784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 786474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 7875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if 0 788474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* This function is used for debugging probability trees. */ 789474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void print_prob_tree(vp8_prob 790474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org coef_probs[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES]) 791474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 792474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* print coef probability tree */ 793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i,j,k,l; 794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org FILE* f = fopen("enc_tree_probs.txt", "a"); 795474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "{\n"); 796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < BLOCK_TYPES; i++) 797474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 798474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " {\n"); 799474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < COEF_BANDS; j++) 800474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 801474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " {\n"); 802474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (k = 0; k < PREV_COEF_CONTEXTS; k++) 803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " {"); 805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (l = 0; l < ENTROPY_NODES; l++) 806474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 807474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "%3u, ", 808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (unsigned int)(coef_probs [i][j][k][l])); 809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " }\n"); 811474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 812474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " }\n"); 813474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " }\n"); 815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "}\n"); 817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fclose(f); 818474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 8195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 821474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void sum_probs_over_prev_coef_context( 822474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned int probs[PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS], 823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int* out) 824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i, j; 826474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i=0; i < MAX_ENTROPY_TOKENS; ++i) 827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 828474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j=0; j < PREV_COEF_CONTEXTS; ++j) 829474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 830167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned int tmp = out[i]; 831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org out[i] += probs[j][i]; 832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* check for wrap */ 833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (out[i] < tmp) 834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org out[i] = UINT_MAX; 835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 836474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 837474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 838474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 839474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int prob_update_savings(const unsigned int *ct, 840474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob oldp, const vp8_prob newp, 841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob upd) 842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int old_b = vp8_cost_branch(ct, oldp); 844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int new_b = vp8_cost_branch(ct, newp); 845474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int update_b = 8 + 846474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((vp8_cost_one(upd) - vp8_cost_zero(upd)) >> 8); 847474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 848474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return old_b - new_b - update_b; 849474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 850474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 851474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int independent_coef_context_savings(VP8_COMP *cpi) 852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 853d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org MACROBLOCK *const x = & cpi->mb; 854474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int savings = 0; 855474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i = 0; 856474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int j = 0; 859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 860474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 861474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int k = 0; 862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int prev_coef_count_sum[MAX_ENTROPY_TOKENS] = {0}; 863474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int prev_coef_savings[MAX_ENTROPY_TOKENS] = {0}; 864167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned int (*probs)[MAX_ENTROPY_TOKENS]; 865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Calculate new probabilities given the constraint that 866474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * they must be equal over the prev coef contexts 867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 868167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 869167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org probs = (const unsigned int (*)[MAX_ENTROPY_TOKENS]) 870d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->coef_counts[i][j]; 871167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 872167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Reset to default probabilities at key frames */ 873474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->common.frame_type == KEY_FRAME) 874167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org probs = default_coef_counts[i][j]; 875167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 876167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org sum_probs_over_prev_coef_context(probs, prev_coef_count_sum); 877167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 878474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 879474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* at every context */ 881474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 882474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* calc probs and branch cts for this frame only */ 883474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int t = 0; /* token/prob index */ 884474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 885474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_tree_probs_from_distribution( 886474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, 887474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->frame_coef_probs[i][j][k], 888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->frame_branch_ct [i][j][k], 889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org prev_coef_count_sum, 890474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 256, 1); 891474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 892474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 893474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t]; 895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 896474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t]; 897474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int s = prob_update_savings(ct, oldp, newp, upd); 899474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 900474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->common.frame_type != KEY_FRAME || 901474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (cpi->common.frame_type == KEY_FRAME && newp != oldp)) 902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org prev_coef_savings[t] += s; 903474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 904474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++t < ENTROPY_NODES); 905474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 906474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++k < PREV_COEF_CONTEXTS); 907474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org k = 0; 908474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 909474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* We only update probabilities if we can save bits, except 911474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * for key frames where we have to update all probabilities 912474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * to get the equal probabilities across the prev coef 913474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * contexts. 914474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 915474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (prev_coef_savings[k] > 0 || 916474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->common.frame_type == KEY_FRAME) 917474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org savings += prev_coef_savings[k]; 918474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++k < ENTROPY_NODES); 920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 921474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++j < COEF_BANDS); 922474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 923474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++i < BLOCK_TYPES); 924474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return savings; 925474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 926474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int default_coef_context_savings(VP8_COMP *cpi) 928474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 929d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org MACROBLOCK *const x = & cpi->mb; 930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int savings = 0; 931474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i = 0; 932474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 933474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 934474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int j = 0; 935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 937474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int k = 0; 938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 939474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 940474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* at every context */ 941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 942474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* calc probs and branch cts for this frame only */ 943474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int t = 0; /* token/prob index */ 944474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 945474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_tree_probs_from_distribution( 946474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, 947474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->frame_coef_probs [i][j][k], 948474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->frame_branch_ct [i][j][k], 949d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->coef_counts [i][j][k], 950474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 256, 1 951474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ); 952474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 953474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 954474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 955474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t]; 956474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 957474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t]; 958474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 959474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int s = prob_update_savings(ct, oldp, newp, upd); 960474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 961474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (s > 0) 962474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 963474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org savings += s; 964474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 965474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 966474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++t < ENTROPY_NODES); 967474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 968474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++k < PREV_COEF_CONTEXTS); 969474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 970474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++j < COEF_BANDS); 971474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 972474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++i < BLOCK_TYPES); 973474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return savings; 974474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 975474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 976167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_calc_ref_frame_costs(int *ref_frame_cost, 977167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int prob_intra, 978167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int prob_last, 979167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int prob_garf 980167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ) 981167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 9824b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org assert(prob_intra >= 0); 9834b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org assert(prob_intra <= 255); 9844b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org assert(prob_last >= 0); 9854b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org assert(prob_last <= 255); 9864b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org assert(prob_garf >= 0); 9874b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org assert(prob_garf <= 255); 988167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(prob_intra); 989167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ref_frame_cost[LAST_FRAME] = vp8_cost_one(prob_intra) 990167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + vp8_cost_zero(prob_last); 991167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(prob_intra) 992167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + vp8_cost_one(prob_last) 993167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + vp8_cost_zero(prob_garf); 994167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(prob_intra) 995167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + vp8_cost_one(prob_last) 996167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + vp8_cost_one(prob_garf); 997167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 998167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 999167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1000474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_estimate_entropy_savings(VP8_COMP *cpi) 1001474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 1002474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int savings = 0; 1003474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1004d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org const int *const rfct = cpi->mb.count_mb_ref_frame_usage; 1005474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int rf_intra = rfct[INTRA_FRAME]; 1006474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]; 1007167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int new_intra, new_last, new_garf, oldtotal, newtotal; 1008474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int ref_frame_cost[MAX_REF_FRAMES]; 1009474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1010ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_clear_system_state(); 1011474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1012474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->common.frame_type != KEY_FRAME) 1013474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1014474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!(new_intra = rf_intra * 255 / (rf_intra + rf_inter))) 1015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org new_intra = 1; 1016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1017474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org new_last = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128; 1018474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1019167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org new_garf = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) 1020474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128; 1021474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1022167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1023167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_calc_ref_frame_costs(ref_frame_cost,new_intra,new_last,new_garf); 1024474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1025474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org newtotal = 1026474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] + 1027474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] + 1028474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] + 1029474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME]; 1030474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1031474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1032ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* old costs */ 1033167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_calc_ref_frame_costs(ref_frame_cost,cpi->prob_intra_coded, 1034167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->prob_last_coded,cpi->prob_gf_coded); 1035474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1036474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org oldtotal = 1037474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] + 1038474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] + 1039474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] + 1040474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME]; 1041474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1042474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org savings += (oldtotal - newtotal) / 256; 1043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1044474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1046474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1047474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org savings += independent_coef_context_savings(cpi); 1048474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1049474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org savings += default_coef_context_savings(cpi); 1050474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1051474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1052474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return savings; 1053474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 1054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 10555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 10565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgint vp8_update_coef_context(VP8_COMP *cpi) 10575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{ 10585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int savings = 0; 10595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 10605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 10615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (cpi->common.frame_type == KEY_FRAME) 10625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 10635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* Reset to default counts/probabilities at key frames */ 1064085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vp8_copy(cpi->mb.coef_counts, default_coef_counts); 10655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 10665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 10675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 10685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org savings += independent_coef_context_savings(cpi); 10695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 10705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org savings += default_coef_context_savings(cpi); 10715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 10725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org return savings; 10735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org} 10745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 10755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 10765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_update_coef_probs(VP8_COMP *cpi) 1077474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 1078474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i = 0; 10795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1080167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_writer *const w = cpi->bc; 10815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 1082474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int savings = 0; 1083474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1084ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_clear_system_state(); 1085474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1086474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 1087474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1088474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int j = 0; 1089474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1090474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 1091474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1092474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int k = 0; 1093474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int prev_coef_savings[ENTROPY_NODES] = {0}; 1094474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1095474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1096474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (k = 0; k < PREV_COEF_CONTEXTS; ++k) 1097474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1098474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int t; /* token/prob index */ 1099474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (t = 0; t < ENTROPY_NODES; ++t) 1100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned int *ct = cpi->frame_branch_ct [i][j] 1102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org [k][t]; 1103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob newp = cpi->frame_coef_probs[i][j][k][t]; 1104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob oldp = cpi->common.fc.coef_probs[i][j] 1105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org [k][t]; 1106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob upd = vp8_coef_update_probs[i][j][k][t]; 1107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org prev_coef_savings[t] += 1109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org prob_update_savings(ct, oldp, newp, upd); 1110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org k = 0; 1113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 1115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* note: use result from vp8_estimate_entropy_savings, so no 1117ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * need to call vp8_tree_probs_from_distribution here. 1118ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 1119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 1120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* at every context */ 1121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* calc probs and branch cts for this frame only */ 1123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int t = 0; /* token/prob index */ 1124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 1126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 1128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_prob *Pold = cpi->common.fc.coef_probs [i][j][k] + t; 1130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 1131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int s = prev_coef_savings[t]; 1133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int u = 0; 1134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!(cpi->oxcf.error_resilient_mode & 1136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPX_ERROR_RESILIENT_PARTITIONS)) 1137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org s = prob_update_savings( 1139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->frame_branch_ct [i][j][k][t], 1140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *Pold, newp, upd); 1141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (s > 0) 1144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org u = 1; 1145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Force updates on key frames if the new is different, 1147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * so that we can be sure we end up with equal probabilities 1148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * over the prev coef contexts. 1149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 1150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if ((cpi->oxcf.error_resilient_mode & 1151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPX_ERROR_RESILIENT_PARTITIONS) && 1152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->common.frame_type == KEY_FRAME && newp != *Pold) 1153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org u = 1; 1154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 11565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org cpi->update_probs[i][j][k][t] = u; 11575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#else 1158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write(w, u, upd); 11595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 1160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11621cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 1163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ++ tree_update_hist [i][j][k][t] [u]; 1164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u) 1167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* send/use new probability */ 1169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *Pold = newp; 11715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(w, newp, 8); 11735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 1174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org savings += s; 1176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++t < ENTROPY_NODES); 1181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Accum token counts for generation of default statistics */ 11831cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 1184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org t = 0; 1185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 1187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t]; 1189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++t < MAX_ENTROPY_TOKENS); 1191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++k < PREV_COEF_CONTEXTS); 1196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++j < COEF_BANDS); 1198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (++i < BLOCK_TYPES); 1200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 12025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 12045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void pack_coef_probs(VP8_COMP *cpi) 12055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{ 12065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int i = 0; 12075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_writer *const w = cpi->bc; 12085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org do 12105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 12115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int j = 0; 12125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org do 12145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 12155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int k = 0; 12165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org do 12185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 12195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int t = 0; /* token/prob index */ 12205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org do 12225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 12235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const vp8_prob newp = cpi->common.fc.coef_probs [i][j][k][t]; 12245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 12255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const char u = cpi->update_probs[i][j][k][t] ; 12275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_write(w, u, upd); 12295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (u) 12315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 12325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* send/use new probability */ 12335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_write_literal(w, newp, 8); 12345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 12355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 12365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org while (++t < ENTROPY_NODES); 12375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 12385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org while (++k < PREV_COEF_CONTEXTS); 12395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 12405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org while (++j < COEF_BANDS); 12415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 12425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org while (++i < BLOCK_TYPES); 12435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org} 12445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 12455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef PACKET_TESTING 1247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgFILE *vpxlogc = 0; 1248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void put_delta_q(vp8_writer *bc, int delta_q) 1251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 1252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (delta_q != 0) 1253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 1); 1255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, abs(delta_q), 4); 1256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (delta_q < 0) 1258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 1); 1259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 0); 1261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 0); 1264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 1265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1266167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned char * dest_end, unsigned long *size) 1267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 1268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i, j; 1269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_HEADER oh; 1270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *const pc = & cpi->common; 1271167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_writer *const bc = cpi->bc; 1272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *const xd = & cpi->mb.e_mbd; 1273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int extra_bytes_packed = 0; 1274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *cx_data = dest; 1276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char *cx_data_end = dest_end; 1277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int *mb_feature_data_bits; 1278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org oh.show_frame = (int) pc->show_frame; 1280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org oh.type = (int)pc->frame_type; 1281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org oh.version = pc->version; 1282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org oh.first_partition_length_in_bytes = 0; 1283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mb_feature_data_bits = vp8_mb_feature_data_bits; 1285167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1286167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org bc[0].error = &pc->error; 1287167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1288167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org validate_buffer(cx_data, 3, cx_data_end, &cpi->common.error); 1289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data += 3; 1290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if defined(SECTIONBITS_OUTPUT) 1292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Sectionbits[active_section = 1] += sizeof(VP8_HEADER) * 8 * 256; 1293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* every keyframe send startcode, width, height, scale factor, clamp 1296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * and color type 1297ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 1298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (oh.type == KEY_FRAME) 1299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int v; 1301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1302167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org validate_buffer(cx_data, 7, cx_data_end, &cpi->common.error); 1303167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1304ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Start / synch code */ 1305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data[0] = 0x9D; 1306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data[1] = 0x01; 1307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data[2] = 0x2a; 1308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org v = (pc->horiz_scale << 14) | pc->Width; 1310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data[3] = v; 1311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data[4] = v >> 8; 1312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org v = (pc->vert_scale << 14) | pc->Height; 1314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data[5] = v; 1315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data[6] = v >> 8; 1316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1317167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org extra_bytes_packed = 7; 1319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cx_data += extra_bytes_packed ; 1320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1321167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_start_encode(bc, cx_data, cx_data_end); 1322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1323ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* signal clr type */ 132447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org vp8_write_bit(bc, 0); 1325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->clamp_type); 1326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1329167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_start_encode(bc, cx_data, cx_data_end); 1330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Signal whether or not Segmentation is enabled */ 1333167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write_bit(bc, xd->segmentation_enabled); 1334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1335ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Indicate which features are enabled */ 1336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->segmentation_enabled) 1337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1338ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Signal whether or not the segmentation map is being updated. */ 1339167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write_bit(bc, xd->update_mb_segmentation_map); 1340167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write_bit(bc, xd->update_mb_segmentation_data); 1341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->update_mb_segmentation_data) 1343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org signed char Data; 1345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1346167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write_bit(bc, xd->mb_segement_abs_delta); 1347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1348ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* For each segmentation feature (Quant and loop filter level) */ 1349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < MB_LVL_MAX; i++) 1350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* For each of the segments */ 1352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < MAX_MB_SEGMENTS; j++) 1353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Data = xd->segment_feature_data[i][j]; 1355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1356ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Frame level data */ 1357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (Data) 1358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 1); 1360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (Data < 0) 1362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Data = - Data; 1364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, Data, mb_feature_data_bits[i]); 1365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 1); 1366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, Data, mb_feature_data_bits[i]); 1370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 0); 1371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 0); 1375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->update_mb_segmentation_map) 1380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1381ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Write the probs used to decode the segment id for each mb */ 1382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) 1383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int Data = xd->mb_segment_tree_probs[i]; 1385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (Data != 255) 1387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 1); 1389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, Data, 8); 1390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 0); 1393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->filter_type); 1398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, pc->filter_level, 6); 1399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, pc->sharpness_level, 3); 1400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1401ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Write out loop filter deltas applied at the MB level based on mode 1402ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * or ref frame (if they are enabled). 1403ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 1404167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_write_bit(bc, xd->mode_ref_lf_delta_enabled); 1405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_ref_lf_delta_enabled) 1407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1408ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Do the deltas need to be updated */ 1409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int send_update = xd->mode_ref_lf_delta_update 1410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org || cpi->oxcf.error_resilient_mode; 1411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, send_update); 1413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (send_update) 1414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int Data; 1416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Send update */ 1418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < MAX_REF_LF_DELTAS; i++) 1419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Data = xd->ref_lf_deltas[i]; 1421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Frame level data */ 1423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->ref_lf_deltas[i] != xd->last_ref_lf_deltas[i] 1424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org || cpi->oxcf.error_resilient_mode) 1425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->last_ref_lf_deltas[i] = xd->ref_lf_deltas[i]; 1427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 1); 1428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (Data > 0) 1430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, (Data & 0x3F), 6); 1432ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_write_bit(bc, 0); /* sign */ 1433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Data = -Data; 1437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, (Data & 0x3F), 6); 1438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_write_bit(bc, 1); /* sign */ 1439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 0); 1443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Send update */ 1446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < MAX_MODE_LF_DELTAS; i++) 1447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Data = xd->mode_lf_deltas[i]; 1449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_lf_deltas[i] != xd->last_mode_lf_deltas[i] 1451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org || cpi->oxcf.error_resilient_mode) 1452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->last_mode_lf_deltas[i] = xd->mode_lf_deltas[i]; 1454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 1); 1455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (Data > 0) 1457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, (Data & 0x3F), 6); 1459ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_write_bit(bc, 0); /* sign */ 1460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1462474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Data = -Data; 1464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, (Data & 0x3F), 6); 1465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_write_bit(bc, 1); /* sign */ 1466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, 0); 1470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1474ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* signal here is multi token partition is enabled */ 1475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, pc->multi_token_partition, 2); 1476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1477ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Frame Qbaseline quantizer index */ 1478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, pc->base_qindex, 7); 1479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1480ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Transmit Dc, Second order and Uv quantizer delta information */ 1481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org put_delta_q(bc, pc->y1dc_delta_q); 1482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org put_delta_q(bc, pc->y2dc_delta_q); 1483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org put_delta_q(bc, pc->y2ac_delta_q); 1484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org put_delta_q(bc, pc->uvdc_delta_q); 1485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org put_delta_q(bc, pc->uvac_delta_q); 1486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1487ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* When there is a key frame all reference buffers are updated using 1488ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * the new key frame 1489ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 1490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type != KEY_FRAME) 1491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1492ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Should the GF or ARF be updated using the transmitted frame 1493ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * or buffer 1494ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 1495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->refresh_golden_frame); 1496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->refresh_alt_ref_frame); 1497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1498ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* If not being updated from current frame should either GF or ARF 1499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * be updated from another buffer 1500ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 1501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!pc->refresh_golden_frame) 1502474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, pc->copy_buffer_to_gf, 2); 1503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!pc->refresh_alt_ref_frame) 1505474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_literal(bc, pc->copy_buffer_to_arf, 2); 1506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1507ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Indicate reference frame sign bias for Golden and ARF frames 1508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * (always 0 for last frame buffer) 1509ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 1510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->ref_frame_sign_bias[GOLDEN_FRAME]); 1511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->ref_frame_sign_bias[ALTREF_FRAME]); 1512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type == KEY_FRAME) 1518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_entropy_probs = 1; 1519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_entropy_probs = 0; 1521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 15225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 1523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->refresh_entropy_probs); 1525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type != KEY_FRAME) 1527474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->refresh_last_frame); 1528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15291cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 1530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type == INTER_FRAME) 1532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 0; 1533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 7; 1535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1538ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_clear_system_state(); 1539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 15415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pack_coef_probs(cpi); 15425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#else 1543167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (pc->refresh_entropy_probs == 0) 1544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1545ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* save a copy for later refresh */ 1546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(&cpi->common.lfc, &cpi->common.fc, sizeof(cpi->common.fc)); 1547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_update_coef_probs(cpi); 15505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 1551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15521cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 1553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 2; 1554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1556ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Write out the mb_no_coeff_skip flag */ 1557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_write_bit(bc, pc->mb_no_coeff_skip); 1558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type == KEY_FRAME) 1560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org write_kfmodes(cpi); 1562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15631cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 1564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 8; 1565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pack_inter_mode_mvs(cpi); 1570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15711cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 1572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org active_section = 1; 1573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_stop_encode(bc); 1577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1578167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cx_data += bc->pos; 1579167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1580167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org oh.first_partition_length_in_bytes = cpi->bc->pos; 1581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1582474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* update frame tag */ 1583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int v = (oh.first_partition_length_in_bytes << 5) | 1585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (oh.show_frame << 4) | 1586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (oh.version << 1) | 1587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org oh.type; 1588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest[0] = v; 1590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest[1] = v >> 8; 1591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest[2] = v >> 16; 1592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1594167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *size = VP8_HEADER_SIZE + extra_bytes_packed + cpi->bc->pos; 1595167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->partition_sz[0] = *size; 1597474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 15995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 16005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int num_part = (1 << pc->multi_token_partition); 16015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char * dp = cpi->partition_d[0] + cpi->partition_sz[0]; 16025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 16035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (num_part > 1) 16045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 16055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* write token part sizes (all but last) if more than 1 */ 16065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org validate_buffer(dp, 3 * (num_part - 1), cpi->partition_d_end[0], 16075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org &pc->error); 16085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 16095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org cpi->partition_sz[0] += 3*(num_part-1); 16105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 16115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for(i = 1; i < num_part; i++) 16125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 16135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org write_partition_size(dp, cpi->partition_sz[i]); 16145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org dp += 3; 16155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 16165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 16175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 16185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (!cpi->output_partition) 16195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 16205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* concatenate partition buffers */ 16215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for(i = 0; i < num_part; i++) 16225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 16235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memmove(dp, cpi->partition_d[i+1], cpi->partition_sz[i+1]); 16245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org cpi->partition_d[i+1] = dp; 16255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org dp += cpi->partition_sz[i+1]; 16265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 16275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 16285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 16295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* update total size */ 16305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org *size = 0; 16315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for(i = 0; i < num_part+1; i++) 16325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 16335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org *size += cpi->partition_sz[i]; 16345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 16355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 16365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#else 1637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->multi_token_partition != ONE_PARTITION) 1638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1639167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int num_part = 1 << pc->multi_token_partition; 1640167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1641167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* partition size table at the end of first partition */ 1642167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->partition_sz[0] += 3 * (num_part - 1); 1643167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *size += 3 * (num_part - 1); 1644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1645167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org validate_buffer(cx_data, 3 * (num_part - 1), cx_data_end, 1646167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &pc->error); 1647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1648167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for(i = 1; i < num_part + 1; i++) 1649167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 1650167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->bc[i].error = &pc->error; 1651167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 1652167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1653167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pack_tokens_into_partitions(cpi, cx_data + 3 * (num_part - 1), 1654167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cx_data_end, num_part); 1655167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1656167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for(i = 1; i < num_part; i++) 1657167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 1658167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->partition_sz[i] = cpi->bc[i].pos; 1659167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org write_partition_size(cx_data, cpi->partition_sz[i]); 1660167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cx_data += 3; 1661167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *size += cpi->partition_sz[i]; /* add to total */ 1662167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 1663167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1664167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* add last partition to total size */ 1665167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->partition_sz[i] = cpi->bc[i].pos; 1666167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *size += cpi->partition_sz[i]; 1667474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1668474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1670167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org bc[1].error = &pc->error; 1671167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1672167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_start_encode(&cpi->bc[1], cx_data, cx_data_end); 1673474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD 1675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->b_multi_threaded) 1676167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pack_mb_row_tokens(cpi, &cpi->bc[1]); 1677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1678474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1679167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pack_tokens(&cpi->bc[1], cpi->tok, cpi->tok_count); 1680474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1681167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_stop_encode(&cpi->bc[1]); 1682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1683167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *size += cpi->bc[1].pos; 1684167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->partition_sz[1] = cpi->bc[1].pos; 1685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 16865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 1687474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 1688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 16891cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS 1690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid print_tree_update_probs() 1691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 1692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i, j, k, l; 1693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org FILE *f = fopen("context.c", "a"); 1694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int Sum; 1695474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "\n/* Update probabilities for token entropy tree. */\n\n"); 1696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "const vp8_prob tree_update_probs[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] = {\n"); 1697474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < BLOCK_TYPES; i++) 1699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " { \n"); 1701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < COEF_BANDS; j++) 1703474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1704474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " {\n"); 1705474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1706474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (k = 0; k < PREV_COEF_CONTEXTS; k++) 1707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1708474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " {"); 1709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (l = 0; l < ENTROPY_NODES; l++) 1711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Sum = tree_update_hist[i][j][k][l][0] + tree_update_hist[i][j][k][l][1]; 1713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (Sum > 0) 1715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (((tree_update_hist[i][j][k][l][0] * 255) / Sum) > 0) 1717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "%3ld, ", (tree_update_hist[i][j][k][l][0] * 255) / Sum); 1718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "%3ld, ", 1); 1720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "%3ld, ", 128); 1723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "},\n"); 1726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " },\n"); 1729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1730474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, " },\n"); 1732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(f, "};\n"); 1735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fclose(f); 1736474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 1737474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1738