1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/header.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "encodemv.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/entropymode.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/findnearmv.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "mcomp.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/systemdependent.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <assert.h> 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h> 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits.h> 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/pragmas.h" 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_encoder.h" 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h" 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "bitstream.h" 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "defaultcoefcounts.h" 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/common.h" 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan 29233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst int vp8cx_base_skip_false_prob[128] = 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255, 255, 255, 255, 255, 255, 255, 255, 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255, 255, 255, 255, 255, 255, 255, 255, 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255, 255, 255, 255, 255, 255, 255, 255, 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255, 255, 255, 255, 255, 255, 255, 255, 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255, 255, 255, 255, 255, 255, 255, 255, 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255, 255, 255, 255, 255, 255, 255, 255, 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255, 255, 255, 255, 255, 255, 255, 255, 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan 251, 248, 244, 240, 236, 232, 229, 225, 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan 221, 217, 213, 208, 204, 199, 194, 190, 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan 187, 183, 179, 175, 172, 168, 164, 160, 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 157, 153, 149, 145, 142, 138, 134, 130, 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan 127, 124, 120, 117, 114, 110, 107, 104, 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan 101, 98, 95, 92, 89, 86, 83, 80, 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77, 74, 71, 68, 65, 62, 59, 56, 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan 53, 50, 47, 44, 41, 38, 35, 32, 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan 30, 28, 26, 24, 22, 20, 18, 16, 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(SECTIONBITS_OUTPUT) 50233d2500723e5594f3e7c70896ffeeef32b9c950ywanunsigned __int64 Sectionbits[500]; 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 54233d2500723e5594f3e7c70896ffeeef32b9c950ywanint intra_mode_stats[10][10][10]; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned int tree_update_hist [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] [2]; 56233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern unsigned int active_section; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef MODE_STATS 60233d2500723e5594f3e7c70896ffeeef32b9c950ywanint count_mb_seg[4] = { 0, 0, 0, 0 }; 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void update_mode( 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *const w, 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan int n, 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_token tok [/* n */], 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_tree tree, 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob Pnew [/* n-1 */], 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob Pcur [/* n-1 */], 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int bct [/* n-1 */] [2], 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int num_events[/* n */] 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan) 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int new_b = 0, old_b = 0; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i = 0; 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_tree_probs_from_distribution( 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan n--, tok, tree, 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan Pnew, bct, num_events, 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan 256, 1 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan ); 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_b += vp8_cost_branch(bct[i], Pnew[i]); 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan old_b += vp8_cost_branch(bct[i], Pcur[i]); 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++i < n); 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (new_b + (n << 8) < old_b) 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j = 0; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(w, 1); 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob p = Pnew[j]; 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(w, Pcur[j] = p ? p : 1, 8); 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++j < n); 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(w, 0); 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan 109233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void update_mbintra_mode_probs(VP8_COMP *cpi) 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMMON *const x = & cpi->common; 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *const w = cpi->bc; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob Pnew [VP8_YMODES-1]; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int bct [VP8_YMODES-1] [2]; 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan update_mode( 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan w, VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree, 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan Pnew, x->fc.ymode_prob, bct, (unsigned int *)cpi->mb.ymode_count 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan ); 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob Pnew [VP8_UV_MODES-1]; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int bct [VP8_UV_MODES-1] [2]; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan update_mode( 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan w, VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree, 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan Pnew, x->fc.uv_mode_prob, bct, (unsigned int *)cpi->mb.uv_mode_count 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan ); 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan 135233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_ymode(vp8_writer *bc, int m, const vp8_prob *p) 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_token(bc, vp8_ymode_tree, p, vp8_ymode_encodings + m); 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan 140233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void kfwrite_ymode(vp8_writer *bc, int m, const vp8_prob *p) 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_token(bc, vp8_kf_ymode_tree, p, vp8_kf_ymode_encodings + m); 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan 145233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_uv_mode(vp8_writer *bc, int m, const vp8_prob *p) 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_token(bc, vp8_uv_mode_tree, p, vp8_uv_mode_encodings + m); 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan 151233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_bmode(vp8_writer *bc, int m, const vp8_prob *p) 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_token(bc, vp8_bmode_tree, p, vp8_bmode_encodings + m); 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan 156233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_split(vp8_writer *bc, int x) 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_token( 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan bc, vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + x 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan ); 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan 163233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount) 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan const TOKENEXTRA *stop = p + xcount; 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int split; 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int shift; 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan int count = w->count; 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int range = w->range; 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int lowvalue = w->lowvalue; 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (p < stop) 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int t = p->Token; 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_token *a = vp8_coef_encodings + t; 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_extra_bit_struct *b = vp8_extra_bits + t; 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i = 0; 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned char *pp = p->context_tree; 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan int v = a->value; 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan int n = a->Len; 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (p->skip_eob_node) 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan n--; 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = 2; 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int bb = (v >> --n) & 1; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan split = 1 + (((range - 1) * pp[i>>1]) >> 8); 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = vp8_coef_tree[i+bb]; 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bb) 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue += split; 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan range = range - split; 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan range = split; 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan shift = vp8_norm[range]; 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan range <<= shift; 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan count += shift; 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (count >= 0) 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset = shift - count; 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((lowvalue << (offset - 1)) & 0x80000000) 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan int x = w->pos - 1; 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (x >= 0 && w->buffer[x] == 0xff) 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[x] = (unsigned char)0; 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan x--; 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[x] += 1; 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan validate_buffer(w->buffer + w->pos, 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1, 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer_end, 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->error); 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[w->pos++] = (lowvalue >> (24 - offset)); 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue <<= offset; 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan shift = count; 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue &= 0xffffff; 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan count -= 8 ; 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue <<= shift; 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (n); 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (b->base_val) 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int e = p->Extra, L = b->Len; 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (L) 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned char *proba = b->prob; 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int v2 = e >> 1; 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan int n2 = L; /* number of bits in v2, assumed nonzero */ 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = 0; 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int bb = (v2 >> --n2) & 1; 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan split = 1 + (((range - 1) * proba[i>>1]) >> 8); 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = b->tree[i+bb]; 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bb) 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue += split; 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan range = range - split; 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 264233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan range = split; 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 268233d2500723e5594f3e7c70896ffeeef32b9c950ywan 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan shift = vp8_norm[range]; 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan range <<= shift; 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan count += shift; 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (count >= 0) 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset = shift - count; 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((lowvalue << (offset - 1)) & 0x80000000) 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 279233d2500723e5594f3e7c70896ffeeef32b9c950ywan int x = w->pos - 1; 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (x >= 0 && w->buffer[x] == 0xff) 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[x] = (unsigned char)0; 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan x--; 285233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[x] += 1; 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan validate_buffer(w->buffer + w->pos, 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1, 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer_end, 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->error); 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[w->pos++] = (lowvalue >> (24 - offset)); 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue <<= offset; 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan shift = count; 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue &= 0xffffff; 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan count -= 8 ; 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue <<= shift; 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (n2); 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan split = (range + 1) >> 1; 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (e & 1) 313233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 314233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue += split; 315233d2500723e5594f3e7c70896ffeeef32b9c950ywan range = range - split; 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 318233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan range = split; 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan 322233d2500723e5594f3e7c70896ffeeef32b9c950ywan range <<= 1; 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((lowvalue & 0x80000000)) 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan int x = w->pos - 1; 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (x >= 0 && w->buffer[x] == 0xff) 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[x] = (unsigned char)0; 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan x--; 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[x] += 1; 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan 336233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue <<= 1; 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan 340233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!++count) 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan count = -8; 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan 344233d2500723e5594f3e7c70896ffeeef32b9c950ywan validate_buffer(w->buffer + w->pos, 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1, 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer_end, 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->error); 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan 349233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->buffer[w->pos++] = (lowvalue >> 24); 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue &= 0xffffff; 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 353233d2500723e5594f3e7c70896ffeeef32b9c950ywan 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++p; 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->count = count; 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->lowvalue = lowvalue; 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan w->range = range; 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan 363233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan 365233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_partition_size(unsigned char *cx_data, int size) 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed char csize; 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan csize = size & 0xff; 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan *cx_data = csize; 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan csize = (size >> 8) & 0xff; 372233d2500723e5594f3e7c70896ffeeef32b9c950ywan *(cx_data + 1) = csize; 373233d2500723e5594f3e7c70896ffeeef32b9c950ywan csize = (size >> 16) & 0xff; 374233d2500723e5594f3e7c70896ffeeef32b9c950ywan *(cx_data + 2) = csize; 375233d2500723e5594f3e7c70896ffeeef32b9c950ywan 376233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 377233d2500723e5594f3e7c70896ffeeef32b9c950ywan 378233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void pack_tokens_into_partitions_c(VP8_COMP *cpi, unsigned char *cx_data, 379233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char * cx_data_end, 380233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num_part) 381233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 382233d2500723e5594f3e7c70896ffeeef32b9c950ywan 383233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 384233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr = cx_data; 385233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr_end = cx_data_end; 386233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer * w; 387233d2500723e5594f3e7c70896ffeeef32b9c950ywan 388233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < num_part; i++) 389233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 390233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_row; 391233d2500723e5594f3e7c70896ffeeef32b9c950ywan 392233d2500723e5594f3e7c70896ffeeef32b9c950ywan w = cpi->bc + i + 1; 393233d2500723e5594f3e7c70896ffeeef32b9c950ywan 394233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_start_encode(w, ptr, ptr_end); 395233d2500723e5594f3e7c70896ffeeef32b9c950ywan 396233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mb_row = i; mb_row < cpi->common.mb_rows; mb_row += num_part) 397233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 398233d2500723e5594f3e7c70896ffeeef32b9c950ywan const TOKENEXTRA *p = cpi->tplist[mb_row].start; 399233d2500723e5594f3e7c70896ffeeef32b9c950ywan const TOKENEXTRA *stop = cpi->tplist[mb_row].stop; 400233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tokens = (int)(stop - p); 401233d2500723e5594f3e7c70896ffeeef32b9c950ywan 402233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_pack_tokens_c(w, p, tokens); 403233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 404233d2500723e5594f3e7c70896ffeeef32b9c950ywan 405233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_stop_encode(w); 406233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr += w->pos; 407233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 408233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 409233d2500723e5594f3e7c70896ffeeef32b9c950ywan 410233d2500723e5594f3e7c70896ffeeef32b9c950ywan 411233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void pack_mb_row_tokens_c(VP8_COMP *cpi, vp8_writer *w) 412233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 413233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_row; 414233d2500723e5594f3e7c70896ffeeef32b9c950ywan 415233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mb_row = 0; mb_row < cpi->common.mb_rows; mb_row++) 416233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 417233d2500723e5594f3e7c70896ffeeef32b9c950ywan const TOKENEXTRA *p = cpi->tplist[mb_row].start; 418233d2500723e5594f3e7c70896ffeeef32b9c950ywan const TOKENEXTRA *stop = cpi->tplist[mb_row].stop; 419233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tokens = (int)(stop - p); 420233d2500723e5594f3e7c70896ffeeef32b9c950ywan 421233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_pack_tokens_c(w, p, tokens); 422233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 423233d2500723e5594f3e7c70896ffeeef32b9c950ywan 424233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 425233d2500723e5594f3e7c70896ffeeef32b9c950ywan 426233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_mv_ref 427233d2500723e5594f3e7c70896ffeeef32b9c950ywan( 428233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *w, MB_PREDICTION_MODE m, const vp8_prob *p 429233d2500723e5594f3e7c70896ffeeef32b9c950ywan) 430233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 431233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_DEBUG 432233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(NEARESTMV <= m && m <= SPLITMV); 433233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 434233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_token(w, vp8_mv_ref_tree, p, 435233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_mv_ref_encoding_array + (m - NEARESTMV)); 436233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 437233d2500723e5594f3e7c70896ffeeef32b9c950ywan 438233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_sub_mv_ref 439233d2500723e5594f3e7c70896ffeeef32b9c950ywan( 440233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *w, B_PREDICTION_MODE m, const vp8_prob *p 441233d2500723e5594f3e7c70896ffeeef32b9c950ywan) 442233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 443233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_DEBUG 444233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(LEFT4X4 <= m && m <= NEW4X4); 445233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 446233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_token(w, vp8_sub_mv_ref_tree, p, 447233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_sub_mv_ref_encoding_array + (m - LEFT4X4)); 448233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 449233d2500723e5594f3e7c70896ffeeef32b9c950ywan 450233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_mv 451233d2500723e5594f3e7c70896ffeeef32b9c950ywan( 452233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *w, const MV *mv, const int_mv *ref, const MV_CONTEXT *mvc 453233d2500723e5594f3e7c70896ffeeef32b9c950ywan) 454233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 455233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV e; 456233d2500723e5594f3e7c70896ffeeef32b9c950ywan e.row = mv->row - ref->as_mv.row; 457233d2500723e5594f3e7c70896ffeeef32b9c950ywan e.col = mv->col - ref->as_mv.col; 458233d2500723e5594f3e7c70896ffeeef32b9c950ywan 459233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_encode_motion_vector(w, &e, mvc); 460233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 461233d2500723e5594f3e7c70896ffeeef32b9c950ywan 462233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_mb_features(vp8_writer *w, const MB_MODE_INFO *mi, const MACROBLOCKD *x) 463233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 464233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Encode the MB segment id. */ 465233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x->segmentation_enabled && x->update_mb_segmentation_map) 466233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 467233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (mi->segment_id) 468233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 469233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 0: 470233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 0, x->mb_segment_tree_probs[0]); 471233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 0, x->mb_segment_tree_probs[1]); 472233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 473233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 1: 474233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 0, x->mb_segment_tree_probs[0]); 475233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 1, x->mb_segment_tree_probs[1]); 476233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 477233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 2: 478233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 1, x->mb_segment_tree_probs[0]); 479233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 0, x->mb_segment_tree_probs[2]); 480233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 481233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 3: 482233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 1, x->mb_segment_tree_probs[0]); 483233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 1, x->mb_segment_tree_probs[2]); 484233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 485233d2500723e5594f3e7c70896ffeeef32b9c950ywan 486233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* TRAP.. This should not happen */ 487233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 488233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 0, x->mb_segment_tree_probs[0]); 489233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 0, x->mb_segment_tree_probs[1]); 490233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 491233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 492233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 493233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 494233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_convert_rfct_to_prob(VP8_COMP *const cpi) 495233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 496233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int *const rfct = cpi->mb.count_mb_ref_frame_usage; 497233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int rf_intra = rfct[INTRA_FRAME]; 498233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]; 499233d2500723e5594f3e7c70896ffeeef32b9c950ywan 500233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate the probabilities used to code the ref frame based on usage */ 501233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(cpi->prob_intra_coded = rf_intra * 255 / (rf_intra + rf_inter))) 502233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->prob_intra_coded = 1; 503233d2500723e5594f3e7c70896ffeeef32b9c950ywan 504233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128; 505233d2500723e5594f3e7c70896ffeeef32b9c950ywan 506233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cpi->prob_last_coded) 507233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->prob_last_coded = 1; 508233d2500723e5594f3e7c70896ffeeef32b9c950ywan 509233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) 510233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128; 511233d2500723e5594f3e7c70896ffeeef32b9c950ywan 512233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cpi->prob_gf_coded) 513233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->prob_gf_coded = 1; 514233d2500723e5594f3e7c70896ffeeef32b9c950ywan 515233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 516233d2500723e5594f3e7c70896ffeeef32b9c950ywan 517233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void pack_inter_mode_mvs(VP8_COMP *const cpi) 518233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 519233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMMON *const pc = & cpi->common; 520233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *const w = cpi->bc; 521233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MV_CONTEXT *mvc = pc->fc.mvc; 522233d2500723e5594f3e7c70896ffeeef32b9c950ywan 523233d2500723e5594f3e7c70896ffeeef32b9c950ywan 524233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_INFO *m = pc->mi; 525233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int mis = pc->mode_info_stride; 526233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_row = -1; 527233d2500723e5594f3e7c70896ffeeef32b9c950ywan 528233d2500723e5594f3e7c70896ffeeef32b9c950ywan int prob_skip_false = 0; 529233d2500723e5594f3e7c70896ffeeef32b9c950ywan 530233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->mb.partition_info = cpi->mb.pi; 531233d2500723e5594f3e7c70896ffeeef32b9c950ywan 532233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_convert_rfct_to_prob(cpi); 533233d2500723e5594f3e7c70896ffeeef32b9c950ywan 534233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 535233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 1; 536233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 537233d2500723e5594f3e7c70896ffeeef32b9c950ywan 538233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->mb_no_coeff_skip) 539233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 540233d2500723e5594f3e7c70896ffeeef32b9c950ywan int total_mbs = pc->mb_rows * pc->mb_cols; 541233d2500723e5594f3e7c70896ffeeef32b9c950ywan 542233d2500723e5594f3e7c70896ffeeef32b9c950ywan prob_skip_false = (total_mbs - cpi->mb.skip_true_count ) * 256 / total_mbs; 543233d2500723e5594f3e7c70896ffeeef32b9c950ywan 544233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (prob_skip_false <= 1) 545233d2500723e5594f3e7c70896ffeeef32b9c950ywan prob_skip_false = 1; 546233d2500723e5594f3e7c70896ffeeef32b9c950ywan 547233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (prob_skip_false > 255) 548233d2500723e5594f3e7c70896ffeeef32b9c950ywan prob_skip_false = 255; 549233d2500723e5594f3e7c70896ffeeef32b9c950ywan 550233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->prob_skip_false = prob_skip_false; 551233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(w, prob_skip_false, 8); 552233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 553233d2500723e5594f3e7c70896ffeeef32b9c950ywan 554233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(w, cpi->prob_intra_coded, 8); 555233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(w, cpi->prob_last_coded, 8); 556233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(w, cpi->prob_gf_coded, 8); 557233d2500723e5594f3e7c70896ffeeef32b9c950ywan 558233d2500723e5594f3e7c70896ffeeef32b9c950ywan update_mbintra_mode_probs(cpi); 559233d2500723e5594f3e7c70896ffeeef32b9c950ywan 560233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_mvprobs(cpi); 561233d2500723e5594f3e7c70896ffeeef32b9c950ywan 562233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++mb_row < pc->mb_rows) 563233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 564233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_col = -1; 565233d2500723e5594f3e7c70896ffeeef32b9c950ywan 566233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++mb_col < pc->mb_cols) 567233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 568233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MB_MODE_INFO *const mi = & m->mbmi; 569233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MV_REFERENCE_FRAME rf = mi->ref_frame; 570233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MB_PREDICTION_MODE mode = mi->mode; 571233d2500723e5594f3e7c70896ffeeef32b9c950ywan 572233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *xd = &cpi->mb.e_mbd; 573233d2500723e5594f3e7c70896ffeeef32b9c950ywan 574233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Distance of Mb to the various image edges. 575233d2500723e5594f3e7c70896ffeeef32b9c950ywan * These specified to 8th pel as they are always compared to MV 576233d2500723e5594f3e7c70896ffeeef32b9c950ywan * values that are in 1/8th pel units 577233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 578233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mb_to_left_edge = -((mb_col * 16) << 3); 579233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 580233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mb_to_top_edge = -((mb_row * 16) << 3); 581233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 582233d2500723e5594f3e7c70896ffeeef32b9c950ywan 583233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 584233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 9; 585233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 586233d2500723e5594f3e7c70896ffeeef32b9c950ywan 587233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->mb.e_mbd.update_mb_segmentation_map) 588233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_mb_features(w, mi, &cpi->mb.e_mbd); 589233d2500723e5594f3e7c70896ffeeef32b9c950ywan 590233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->mb_no_coeff_skip) 591233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_encode_bool(w, m->mbmi.mb_skip_coeff, prob_skip_false); 592233d2500723e5594f3e7c70896ffeeef32b9c950ywan 593233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rf == INTRA_FRAME) 594233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 595233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 0, cpi->prob_intra_coded); 596233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 597233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 6; 598233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 599233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_ymode(w, mode, pc->fc.ymode_prob); 600233d2500723e5594f3e7c70896ffeeef32b9c950ywan 601233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mode == B_PRED) 602233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 603233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j = 0; 604233d2500723e5594f3e7c70896ffeeef32b9c950ywan 605233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 606233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_bmode(w, m->bmi[j].as_mode, pc->fc.bmode_prob); 607233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++j < 16); 608233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 609233d2500723e5594f3e7c70896ffeeef32b9c950ywan 610233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_uv_mode(w, mi->uv_mode, pc->fc.uv_mode_prob); 611233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 612233d2500723e5594f3e7c70896ffeeef32b9c950ywan else /* inter coded */ 613233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 614233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv best_mv; 615233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob mv_ref_p [VP8_MVREFS-1]; 616233d2500723e5594f3e7c70896ffeeef32b9c950ywan 617233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 1, cpi->prob_intra_coded); 618233d2500723e5594f3e7c70896ffeeef32b9c950ywan 619233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rf == LAST_FRAME) 620233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 0, cpi->prob_last_coded); 621233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 622233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 623233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, 1, cpi->prob_last_coded); 624233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, (rf == GOLDEN_FRAME) ? 0 : 1, cpi->prob_gf_coded); 625233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 626233d2500723e5594f3e7c70896ffeeef32b9c950ywan 627233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 628233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv n1, n2; 629233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ct[4]; 630233d2500723e5594f3e7c70896ffeeef32b9c950ywan 631233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_find_near_mvs(xd, m, &n1, &n2, &best_mv, ct, rf, cpi->common.ref_frame_sign_bias); 632233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clamp_mv2(&best_mv, xd); 633233d2500723e5594f3e7c70896ffeeef32b9c950ywan 634233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_mv_ref_probs(mv_ref_p, ct); 635233d2500723e5594f3e7c70896ffeeef32b9c950ywan 636233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 637233d2500723e5594f3e7c70896ffeeef32b9c950ywan accum_mv_refs(mode, ct); 638233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 639233d2500723e5594f3e7c70896ffeeef32b9c950ywan 640233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 641233d2500723e5594f3e7c70896ffeeef32b9c950ywan 642233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 643233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 3; 644233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 645233d2500723e5594f3e7c70896ffeeef32b9c950ywan 646233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_mv_ref(w, mode, mv_ref_p); 647233d2500723e5594f3e7c70896ffeeef32b9c950ywan 648233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (mode) /* new, split require MVs */ 649233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 650233d2500723e5594f3e7c70896ffeeef32b9c950ywan case NEWMV: 651233d2500723e5594f3e7c70896ffeeef32b9c950ywan 652233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 653233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 5; 654233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 655233d2500723e5594f3e7c70896ffeeef32b9c950ywan 656233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_mv(w, &mi->mv.as_mv, &best_mv, mvc); 657233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 658233d2500723e5594f3e7c70896ffeeef32b9c950ywan 659233d2500723e5594f3e7c70896ffeeef32b9c950ywan case SPLITMV: 660233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 661233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j = 0; 662233d2500723e5594f3e7c70896ffeeef32b9c950ywan 663233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef MODE_STATS 664233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++count_mb_seg [mi->partitioning]; 665233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 666233d2500723e5594f3e7c70896ffeeef32b9c950ywan 667233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_split(w, mi->partitioning); 668233d2500723e5594f3e7c70896ffeeef32b9c950ywan 669233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 670233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 671233d2500723e5594f3e7c70896ffeeef32b9c950ywan B_PREDICTION_MODE blockmode; 672233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv blockmv; 673233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int *const L = vp8_mbsplits [mi->partitioning]; 674233d2500723e5594f3e7c70896ffeeef32b9c950ywan int k = -1; /* first block in subset j */ 675233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_contz; 676233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv leftmv, abovemv; 677233d2500723e5594f3e7c70896ffeeef32b9c950ywan 678233d2500723e5594f3e7c70896ffeeef32b9c950ywan blockmode = cpi->mb.partition_info->bmi[j].mode; 679233d2500723e5594f3e7c70896ffeeef32b9c950ywan blockmv = cpi->mb.partition_info->bmi[j].mv; 680233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_DEBUG 681233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (j != L[++k]) 682233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (k >= 16) 683233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(0); 684233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 685233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (j != L[++k]); 686233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 687233d2500723e5594f3e7c70896ffeeef32b9c950ywan leftmv.as_int = left_block_mv(m, k); 688233d2500723e5594f3e7c70896ffeeef32b9c950ywan abovemv.as_int = above_block_mv(m, k, mis); 689233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_contz = vp8_mv_cont(&leftmv, &abovemv); 690233d2500723e5594f3e7c70896ffeeef32b9c950ywan 691233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_sub_mv_ref(w, blockmode, vp8_sub_mv_ref_prob2 [mv_contz]); 692233d2500723e5594f3e7c70896ffeeef32b9c950ywan 693233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (blockmode == NEW4X4) 694233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 695233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 696233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 11; 697233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 698233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_mv(w, &blockmv.as_mv, &best_mv, (const MV_CONTEXT *) mvc); 699233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 700233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 701233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++j < cpi->mb.partition_info->count); 702233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 703233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 704233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 705233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 706233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 707233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 708233d2500723e5594f3e7c70896ffeeef32b9c950ywan 709233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++m; 710233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->mb.partition_info++; 711233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 712233d2500723e5594f3e7c70896ffeeef32b9c950ywan 713233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++m; /* skip L prediction border */ 714233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->mb.partition_info++; 715233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 716233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 717233d2500723e5594f3e7c70896ffeeef32b9c950ywan 718233d2500723e5594f3e7c70896ffeeef32b9c950ywan 719233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_kfmodes(VP8_COMP *cpi) 720233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 721233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *const bc = cpi->bc; 722233d2500723e5594f3e7c70896ffeeef32b9c950ywan const VP8_COMMON *const c = & cpi->common; 723233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* const */ 724233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_INFO *m = c->mi; 725233d2500723e5594f3e7c70896ffeeef32b9c950ywan 726233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_row = -1; 727233d2500723e5594f3e7c70896ffeeef32b9c950ywan int prob_skip_false = 0; 728233d2500723e5594f3e7c70896ffeeef32b9c950ywan 729233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (c->mb_no_coeff_skip) 730233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 731233d2500723e5594f3e7c70896ffeeef32b9c950ywan int total_mbs = c->mb_rows * c->mb_cols; 732233d2500723e5594f3e7c70896ffeeef32b9c950ywan 733233d2500723e5594f3e7c70896ffeeef32b9c950ywan prob_skip_false = (total_mbs - cpi->mb.skip_true_count ) * 256 / total_mbs; 734233d2500723e5594f3e7c70896ffeeef32b9c950ywan 735233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (prob_skip_false <= 1) 736233d2500723e5594f3e7c70896ffeeef32b9c950ywan prob_skip_false = 1; 737233d2500723e5594f3e7c70896ffeeef32b9c950ywan 738233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (prob_skip_false >= 255) 739233d2500723e5594f3e7c70896ffeeef32b9c950ywan prob_skip_false = 255; 740233d2500723e5594f3e7c70896ffeeef32b9c950ywan 741233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->prob_skip_false = prob_skip_false; 742233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, prob_skip_false, 8); 743233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 744233d2500723e5594f3e7c70896ffeeef32b9c950ywan 745233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++mb_row < c->mb_rows) 746233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 747233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_col = -1; 748233d2500723e5594f3e7c70896ffeeef32b9c950ywan 749233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++mb_col < c->mb_cols) 750233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 751233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int ym = m->mbmi.mode; 752233d2500723e5594f3e7c70896ffeeef32b9c950ywan 753233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->mb.e_mbd.update_mb_segmentation_map) 754233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_mb_features(bc, &m->mbmi, &cpi->mb.e_mbd); 755233d2500723e5594f3e7c70896ffeeef32b9c950ywan 756233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (c->mb_no_coeff_skip) 757233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false); 758233d2500723e5594f3e7c70896ffeeef32b9c950ywan 759233d2500723e5594f3e7c70896ffeeef32b9c950ywan kfwrite_ymode(bc, ym, vp8_kf_ymode_prob); 760233d2500723e5594f3e7c70896ffeeef32b9c950ywan 761233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ym == B_PRED) 762233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 763233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int mis = c->mode_info_stride; 764233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i = 0; 765233d2500723e5594f3e7c70896ffeeef32b9c950ywan 766233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 767233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 768233d2500723e5594f3e7c70896ffeeef32b9c950ywan const B_PREDICTION_MODE A = above_block_mode(m, i, mis); 769233d2500723e5594f3e7c70896ffeeef32b9c950ywan const B_PREDICTION_MODE L = left_block_mode(m, i); 770233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int bm = m->bmi[i].as_mode; 771233d2500723e5594f3e7c70896ffeeef32b9c950ywan 772233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 773233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++intra_mode_stats [A] [L] [bm]; 774233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 775233d2500723e5594f3e7c70896ffeeef32b9c950ywan 776233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_bmode(bc, bm, vp8_kf_bmode_prob [A] [L]); 777233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 778233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++i < 16); 779233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 780233d2500723e5594f3e7c70896ffeeef32b9c950ywan 781233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_uv_mode(bc, (m++)->mbmi.uv_mode, vp8_kf_uv_mode_prob); 782233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 783233d2500723e5594f3e7c70896ffeeef32b9c950ywan 784233d2500723e5594f3e7c70896ffeeef32b9c950ywan m++; /* skip L prediction border */ 785233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 786233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 787233d2500723e5594f3e7c70896ffeeef32b9c950ywan 788233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if 0 789233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* This function is used for debugging probability trees. */ 790233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void print_prob_tree(vp8_prob 791233d2500723e5594f3e7c70896ffeeef32b9c950ywan coef_probs[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES]) 792233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 793233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* print coef probability tree */ 794233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i,j,k,l; 795233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE* f = fopen("enc_tree_probs.txt", "a"); 796233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "{\n"); 797233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < BLOCK_TYPES; i++) 798233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 799233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " {\n"); 800233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < COEF_BANDS; j++) 801233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 802233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " {\n"); 803233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (k = 0; k < PREV_COEF_CONTEXTS; k++) 804233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 805233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " {"); 806233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (l = 0; l < ENTROPY_NODES; l++) 807233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 808233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "%3u, ", 809233d2500723e5594f3e7c70896ffeeef32b9c950ywan (unsigned int)(coef_probs [i][j][k][l])); 810233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 811233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " }\n"); 812233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 813233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " }\n"); 814233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 815233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " }\n"); 816233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 817233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "}\n"); 818233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(f); 819233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 820233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 821233d2500723e5594f3e7c70896ffeeef32b9c950ywan 822233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void sum_probs_over_prev_coef_context( 823233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int probs[PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS], 824233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int* out) 825233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 826233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 827233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i=0; i < MAX_ENTROPY_TOKENS; ++i) 828233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 829233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j=0; j < PREV_COEF_CONTEXTS; ++j) 830233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 831233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int tmp = out[i]; 832233d2500723e5594f3e7c70896ffeeef32b9c950ywan out[i] += probs[j][i]; 833233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* check for wrap */ 834233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (out[i] < tmp) 835233d2500723e5594f3e7c70896ffeeef32b9c950ywan out[i] = UINT_MAX; 836233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 837233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 838233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 839233d2500723e5594f3e7c70896ffeeef32b9c950ywan 840233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int prob_update_savings(const unsigned int *ct, 841233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob oldp, const vp8_prob newp, 842233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob upd) 843233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 844233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int old_b = vp8_cost_branch(ct, oldp); 845233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int new_b = vp8_cost_branch(ct, newp); 846233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int update_b = 8 + 847233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((vp8_cost_one(upd) - vp8_cost_zero(upd)) >> 8); 848233d2500723e5594f3e7c70896ffeeef32b9c950ywan 849233d2500723e5594f3e7c70896ffeeef32b9c950ywan return old_b - new_b - update_b; 850233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 851233d2500723e5594f3e7c70896ffeeef32b9c950ywan 852233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int independent_coef_context_savings(VP8_COMP *cpi) 853233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 854233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCK *const x = & cpi->mb; 855233d2500723e5594f3e7c70896ffeeef32b9c950ywan int savings = 0; 856233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i = 0; 857233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 858233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 859233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j = 0; 860233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 861233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 862233d2500723e5594f3e7c70896ffeeef32b9c950ywan int k = 0; 863233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int prev_coef_count_sum[MAX_ENTROPY_TOKENS] = {0}; 864233d2500723e5594f3e7c70896ffeeef32b9c950ywan int prev_coef_savings[MAX_ENTROPY_TOKENS] = {0}; 865233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int (*probs)[MAX_ENTROPY_TOKENS]; 866233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate new probabilities given the constraint that 867233d2500723e5594f3e7c70896ffeeef32b9c950ywan * they must be equal over the prev coef contexts 868233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 869233d2500723e5594f3e7c70896ffeeef32b9c950ywan 870233d2500723e5594f3e7c70896ffeeef32b9c950ywan probs = (const unsigned int (*)[MAX_ENTROPY_TOKENS]) 871233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->coef_counts[i][j]; 872233d2500723e5594f3e7c70896ffeeef32b9c950ywan 873233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset to default probabilities at key frames */ 874233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type == KEY_FRAME) 875233d2500723e5594f3e7c70896ffeeef32b9c950ywan probs = default_coef_counts[i][j]; 876233d2500723e5594f3e7c70896ffeeef32b9c950ywan 877233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_probs_over_prev_coef_context(probs, prev_coef_count_sum); 878233d2500723e5594f3e7c70896ffeeef32b9c950ywan 879233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 880233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 881233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* at every context */ 882233d2500723e5594f3e7c70896ffeeef32b9c950ywan 883233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* calc probs and branch cts for this frame only */ 884233d2500723e5594f3e7c70896ffeeef32b9c950ywan int t = 0; /* token/prob index */ 885233d2500723e5594f3e7c70896ffeeef32b9c950ywan 886233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_tree_probs_from_distribution( 887233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, 888233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->frame_coef_probs[i][j][k], 889233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->frame_branch_ct [i][j][k], 890233d2500723e5594f3e7c70896ffeeef32b9c950ywan prev_coef_count_sum, 891233d2500723e5594f3e7c70896ffeeef32b9c950ywan 256, 1); 892233d2500723e5594f3e7c70896ffeeef32b9c950ywan 893233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 894233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 895233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t]; 896233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 897233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t]; 898233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 899233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int s = prob_update_savings(ct, oldp, newp, upd); 900233d2500723e5594f3e7c70896ffeeef32b9c950ywan 901233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type != KEY_FRAME || 902233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->common.frame_type == KEY_FRAME && newp != oldp)) 903233d2500723e5594f3e7c70896ffeeef32b9c950ywan prev_coef_savings[t] += s; 904233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 905233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++t < ENTROPY_NODES); 906233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 907233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++k < PREV_COEF_CONTEXTS); 908233d2500723e5594f3e7c70896ffeeef32b9c950ywan k = 0; 909233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 910233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 911233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* We only update probabilities if we can save bits, except 912233d2500723e5594f3e7c70896ffeeef32b9c950ywan * for key frames where we have to update all probabilities 913233d2500723e5594f3e7c70896ffeeef32b9c950ywan * to get the equal probabilities across the prev coef 914233d2500723e5594f3e7c70896ffeeef32b9c950ywan * contexts. 915233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 916233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (prev_coef_savings[k] > 0 || 917233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.frame_type == KEY_FRAME) 918233d2500723e5594f3e7c70896ffeeef32b9c950ywan savings += prev_coef_savings[k]; 919233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 920233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++k < ENTROPY_NODES); 921233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 922233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++j < COEF_BANDS); 923233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 924233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++i < BLOCK_TYPES); 925233d2500723e5594f3e7c70896ffeeef32b9c950ywan return savings; 926233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 927233d2500723e5594f3e7c70896ffeeef32b9c950ywan 928233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int default_coef_context_savings(VP8_COMP *cpi) 929233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 930233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCK *const x = & cpi->mb; 931233d2500723e5594f3e7c70896ffeeef32b9c950ywan int savings = 0; 932233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i = 0; 933233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 934233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 935233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j = 0; 936233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 937233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 938233d2500723e5594f3e7c70896ffeeef32b9c950ywan int k = 0; 939233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 940233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 941233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* at every context */ 942233d2500723e5594f3e7c70896ffeeef32b9c950ywan 943233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* calc probs and branch cts for this frame only */ 944233d2500723e5594f3e7c70896ffeeef32b9c950ywan int t = 0; /* token/prob index */ 945233d2500723e5594f3e7c70896ffeeef32b9c950ywan 946233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_tree_probs_from_distribution( 947233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, 948233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->frame_coef_probs [i][j][k], 949233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->frame_branch_ct [i][j][k], 950233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->coef_counts [i][j][k], 951233d2500723e5594f3e7c70896ffeeef32b9c950ywan 256, 1 952233d2500723e5594f3e7c70896ffeeef32b9c950ywan ); 953233d2500723e5594f3e7c70896ffeeef32b9c950ywan 954233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 955233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 956233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t]; 957233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 958233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t]; 959233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 960233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int s = prob_update_savings(ct, oldp, newp, upd); 961233d2500723e5594f3e7c70896ffeeef32b9c950ywan 962233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (s > 0) 963233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 964233d2500723e5594f3e7c70896ffeeef32b9c950ywan savings += s; 965233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 966233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 967233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++t < ENTROPY_NODES); 968233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 969233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++k < PREV_COEF_CONTEXTS); 970233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 971233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++j < COEF_BANDS); 972233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 973233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++i < BLOCK_TYPES); 974233d2500723e5594f3e7c70896ffeeef32b9c950ywan return savings; 975233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 976233d2500723e5594f3e7c70896ffeeef32b9c950ywan 977233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_calc_ref_frame_costs(int *ref_frame_cost, 978233d2500723e5594f3e7c70896ffeeef32b9c950ywan int prob_intra, 979233d2500723e5594f3e7c70896ffeeef32b9c950ywan int prob_last, 980233d2500723e5594f3e7c70896ffeeef32b9c950ywan int prob_garf 981233d2500723e5594f3e7c70896ffeeef32b9c950ywan ) 982233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 983233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(prob_intra >= 0); 984233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(prob_intra <= 255); 985233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(prob_last >= 0); 986233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(prob_last <= 255); 987233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(prob_garf >= 0); 988233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(prob_garf <= 255); 989233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(prob_intra); 990233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_frame_cost[LAST_FRAME] = vp8_cost_one(prob_intra) 991233d2500723e5594f3e7c70896ffeeef32b9c950ywan + vp8_cost_zero(prob_last); 992233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(prob_intra) 993233d2500723e5594f3e7c70896ffeeef32b9c950ywan + vp8_cost_one(prob_last) 994233d2500723e5594f3e7c70896ffeeef32b9c950ywan + vp8_cost_zero(prob_garf); 995233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(prob_intra) 996233d2500723e5594f3e7c70896ffeeef32b9c950ywan + vp8_cost_one(prob_last) 997233d2500723e5594f3e7c70896ffeeef32b9c950ywan + vp8_cost_one(prob_garf); 998233d2500723e5594f3e7c70896ffeeef32b9c950ywan 999233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1000233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1001233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_estimate_entropy_savings(VP8_COMP *cpi) 1002233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1003233d2500723e5594f3e7c70896ffeeef32b9c950ywan int savings = 0; 1004233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1005233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int *const rfct = cpi->mb.count_mb_ref_frame_usage; 1006233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int rf_intra = rfct[INTRA_FRAME]; 1007233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]; 1008233d2500723e5594f3e7c70896ffeeef32b9c950ywan int new_intra, new_last, new_garf, oldtotal, newtotal; 1009233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ref_frame_cost[MAX_REF_FRAMES]; 1010233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1011233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 1012233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1013233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type != KEY_FRAME) 1014233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1015233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(new_intra = rf_intra * 255 / (rf_intra + rf_inter))) 1016233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_intra = 1; 1017233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1018233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_last = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128; 1019233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1020233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_garf = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) 1021233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128; 1022233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1023233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1024233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_calc_ref_frame_costs(ref_frame_cost,new_intra,new_last,new_garf); 1025233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1026233d2500723e5594f3e7c70896ffeeef32b9c950ywan newtotal = 1027233d2500723e5594f3e7c70896ffeeef32b9c950ywan rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] + 1028233d2500723e5594f3e7c70896ffeeef32b9c950ywan rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] + 1029233d2500723e5594f3e7c70896ffeeef32b9c950ywan rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] + 1030233d2500723e5594f3e7c70896ffeeef32b9c950ywan rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME]; 1031233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1032233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1033233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* old costs */ 1034233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_calc_ref_frame_costs(ref_frame_cost,cpi->prob_intra_coded, 1035233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->prob_last_coded,cpi->prob_gf_coded); 1036233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1037233d2500723e5594f3e7c70896ffeeef32b9c950ywan oldtotal = 1038233d2500723e5594f3e7c70896ffeeef32b9c950ywan rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] + 1039233d2500723e5594f3e7c70896ffeeef32b9c950ywan rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] + 1040233d2500723e5594f3e7c70896ffeeef32b9c950ywan rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] + 1041233d2500723e5594f3e7c70896ffeeef32b9c950ywan rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME]; 1042233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1043233d2500723e5594f3e7c70896ffeeef32b9c950ywan savings += (oldtotal - newtotal) / 256; 1044233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1045233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1046233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1047233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1048233d2500723e5594f3e7c70896ffeeef32b9c950ywan savings += independent_coef_context_savings(cpi); 1049233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1050233d2500723e5594f3e7c70896ffeeef32b9c950ywan savings += default_coef_context_savings(cpi); 1051233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1052233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1053233d2500723e5594f3e7c70896ffeeef32b9c950ywan return savings; 1054233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1055233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1056233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1057233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_update_coef_context(VP8_COMP *cpi) 1058233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1059233d2500723e5594f3e7c70896ffeeef32b9c950ywan int savings = 0; 1060233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1061233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1062233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type == KEY_FRAME) 1063233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1064233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset to default counts/probabilities at key frames */ 1065233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy(cpi->mb.coef_counts, default_coef_counts); 1066233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1067233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1068233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1069233d2500723e5594f3e7c70896ffeeef32b9c950ywan savings += independent_coef_context_savings(cpi); 1070233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1071233d2500723e5594f3e7c70896ffeeef32b9c950ywan savings += default_coef_context_savings(cpi); 1072233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1073233d2500723e5594f3e7c70896ffeeef32b9c950ywan return savings; 1074233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1075233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1076233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1077233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_update_coef_probs(VP8_COMP *cpi) 1078233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1079233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i = 0; 1080233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1081233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *const w = cpi->bc; 1082233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1083233d2500723e5594f3e7c70896ffeeef32b9c950ywan int savings = 0; 1084233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1085233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 1086233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1087233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1088233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1089233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j = 0; 1090233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1091233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1092233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1093233d2500723e5594f3e7c70896ffeeef32b9c950ywan int k = 0; 1094233d2500723e5594f3e7c70896ffeeef32b9c950ywan int prev_coef_savings[ENTROPY_NODES] = {0}; 1095233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1096233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1097233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (k = 0; k < PREV_COEF_CONTEXTS; ++k) 1098233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1099233d2500723e5594f3e7c70896ffeeef32b9c950ywan int t; /* token/prob index */ 1100233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (t = 0; t < ENTROPY_NODES; ++t) 1101233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1102233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int *ct = cpi->frame_branch_ct [i][j] 1103233d2500723e5594f3e7c70896ffeeef32b9c950ywan [k][t]; 1104233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob newp = cpi->frame_coef_probs[i][j][k][t]; 1105233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob oldp = cpi->common.fc.coef_probs[i][j] 1106233d2500723e5594f3e7c70896ffeeef32b9c950ywan [k][t]; 1107233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob upd = vp8_coef_update_probs[i][j][k][t]; 1108233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1109233d2500723e5594f3e7c70896ffeeef32b9c950ywan prev_coef_savings[t] += 1110233d2500723e5594f3e7c70896ffeeef32b9c950ywan prob_update_savings(ct, oldp, newp, upd); 1111233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1112233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1113233d2500723e5594f3e7c70896ffeeef32b9c950ywan k = 0; 1114233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1115233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1116233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1117233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* note: use result from vp8_estimate_entropy_savings, so no 1118233d2500723e5594f3e7c70896ffeeef32b9c950ywan * need to call vp8_tree_probs_from_distribution here. 1119233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1120233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1121233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* at every context */ 1122233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1123233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* calc probs and branch cts for this frame only */ 1124233d2500723e5594f3e7c70896ffeeef32b9c950ywan int t = 0; /* token/prob index */ 1125233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1126233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1127233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1128233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; 1129233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1130233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob *Pold = cpi->common.fc.coef_probs [i][j][k] + t; 1131233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 1132233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1133233d2500723e5594f3e7c70896ffeeef32b9c950ywan int s = prev_coef_savings[t]; 1134233d2500723e5594f3e7c70896ffeeef32b9c950ywan int u = 0; 1135233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1136233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(cpi->oxcf.error_resilient_mode & 1137233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_ERROR_RESILIENT_PARTITIONS)) 1138233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1139233d2500723e5594f3e7c70896ffeeef32b9c950ywan s = prob_update_savings( 1140233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->frame_branch_ct [i][j][k][t], 1141233d2500723e5594f3e7c70896ffeeef32b9c950ywan *Pold, newp, upd); 1142233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1143233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1144233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (s > 0) 1145233d2500723e5594f3e7c70896ffeeef32b9c950ywan u = 1; 1146233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1147233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Force updates on key frames if the new is different, 1148233d2500723e5594f3e7c70896ffeeef32b9c950ywan * so that we can be sure we end up with equal probabilities 1149233d2500723e5594f3e7c70896ffeeef32b9c950ywan * over the prev coef contexts. 1150233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1151233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->oxcf.error_resilient_mode & 1152233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_ERROR_RESILIENT_PARTITIONS) && 1153233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.frame_type == KEY_FRAME && newp != *Pold) 1154233d2500723e5594f3e7c70896ffeeef32b9c950ywan u = 1; 1155233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1156233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1157233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->update_probs[i][j][k][t] = u; 1158233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 1159233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, u, upd); 1160233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1162233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1163233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 1164233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++ tree_update_hist [i][j][k][t] [u]; 1165233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1166233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1167233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (u) 1168233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1169233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* send/use new probability */ 1170233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1171233d2500723e5594f3e7c70896ffeeef32b9c950ywan *Pold = newp; 1172233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1173233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(w, newp, 8); 1174233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1175233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1176233d2500723e5594f3e7c70896ffeeef32b9c950ywan savings += s; 1177233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1178233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1179233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1180233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1181233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++t < ENTROPY_NODES); 1182233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1183233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Accum token counts for generation of default statistics */ 1184233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 1185233d2500723e5594f3e7c70896ffeeef32b9c950ywan t = 0; 1186233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1187233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1188233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1189233d2500723e5594f3e7c70896ffeeef32b9c950ywan context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t]; 1190233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1191233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++t < MAX_ENTROPY_TOKENS); 1192233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1193233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1194233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1195233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1196233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++k < PREV_COEF_CONTEXTS); 1197233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1198233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++j < COEF_BANDS); 1199233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1200233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++i < BLOCK_TYPES); 1201233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1202233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1203233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1204233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1205233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void pack_coef_probs(VP8_COMP *cpi) 1206233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1207233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i = 0; 1208233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *const w = cpi->bc; 1209233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1210233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1211233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1212233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j = 0; 1213233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1214233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1215233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1216233d2500723e5594f3e7c70896ffeeef32b9c950ywan int k = 0; 1217233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1218233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1219233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1220233d2500723e5594f3e7c70896ffeeef32b9c950ywan int t = 0; /* token/prob index */ 1221233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1222233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 1223233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1224233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob newp = cpi->common.fc.coef_probs [i][j][k][t]; 1225233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; 1226233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1227233d2500723e5594f3e7c70896ffeeef32b9c950ywan const char u = cpi->update_probs[i][j][k][t] ; 1228233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1229233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write(w, u, upd); 1230233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1231233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (u) 1232233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1233233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* send/use new probability */ 1234233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(w, newp, 8); 1235233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1236233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1237233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++t < ENTROPY_NODES); 1238233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1239233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++k < PREV_COEF_CONTEXTS); 1240233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1241233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++j < COEF_BANDS); 1242233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1243233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (++i < BLOCK_TYPES); 1244233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1245233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1246233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1247233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef PACKET_TESTING 1248233d2500723e5594f3e7c70896ffeeef32b9c950ywanFILE *vpxlogc = 0; 1249233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1250233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1251233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void put_delta_q(vp8_writer *bc, int delta_q) 1252233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1253233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (delta_q != 0) 1254233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1255233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); 1256233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, abs(delta_q), 4); 1257233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1258233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (delta_q < 0) 1259233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); 1260233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1261233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); 1262233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1263233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1264233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); 1265233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1266233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1267233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned char * dest_end, unsigned long *size) 1268233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1269233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 1270233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_HEADER oh; 1271233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMMON *const pc = & cpi->common; 1272233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_writer *const bc = cpi->bc; 1273233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *const xd = & cpi->mb.e_mbd; 1274233d2500723e5594f3e7c70896ffeeef32b9c950ywan int extra_bytes_packed = 0; 1275233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1276233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *cx_data = dest; 1277233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *cx_data_end = dest_end; 1278233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int *mb_feature_data_bits; 1279233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1280233d2500723e5594f3e7c70896ffeeef32b9c950ywan oh.show_frame = (int) pc->show_frame; 1281233d2500723e5594f3e7c70896ffeeef32b9c950ywan oh.type = (int)pc->frame_type; 1282233d2500723e5594f3e7c70896ffeeef32b9c950ywan oh.version = pc->version; 1283233d2500723e5594f3e7c70896ffeeef32b9c950ywan oh.first_partition_length_in_bytes = 0; 1284233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1285233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_feature_data_bits = vp8_mb_feature_data_bits; 1286233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1287233d2500723e5594f3e7c70896ffeeef32b9c950ywan bc[0].error = &pc->error; 1288233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1289233d2500723e5594f3e7c70896ffeeef32b9c950ywan validate_buffer(cx_data, 3, cx_data_end, &cpi->common.error); 1290233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data += 3; 1291233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1292233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(SECTIONBITS_OUTPUT) 1293233d2500723e5594f3e7c70896ffeeef32b9c950ywan Sectionbits[active_section = 1] += sizeof(VP8_HEADER) * 8 * 256; 1294233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1295233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1296233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* every keyframe send startcode, width, height, scale factor, clamp 1297233d2500723e5594f3e7c70896ffeeef32b9c950ywan * and color type 1298233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1299233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (oh.type == KEY_FRAME) 1300233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1301233d2500723e5594f3e7c70896ffeeef32b9c950ywan int v; 1302233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1303233d2500723e5594f3e7c70896ffeeef32b9c950ywan validate_buffer(cx_data, 7, cx_data_end, &cpi->common.error); 1304233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1305233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Start / synch code */ 1306233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data[0] = 0x9D; 1307233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data[1] = 0x01; 1308233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data[2] = 0x2a; 1309233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1310233d2500723e5594f3e7c70896ffeeef32b9c950ywan v = (pc->horiz_scale << 14) | pc->Width; 1311233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data[3] = v; 1312233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data[4] = v >> 8; 1313233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1314233d2500723e5594f3e7c70896ffeeef32b9c950ywan v = (pc->vert_scale << 14) | pc->Height; 1315233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data[5] = v; 1316233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data[6] = v >> 8; 1317233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1318233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1319233d2500723e5594f3e7c70896ffeeef32b9c950ywan extra_bytes_packed = 7; 1320233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data += extra_bytes_packed ; 1321233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1322233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_start_encode(bc, cx_data, cx_data_end); 1323233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1324233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* signal clr type */ 1325233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); 1326233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->clamp_type); 1327233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1328233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1329233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1330233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_start_encode(bc, cx_data, cx_data_end); 1331233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1332233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1333233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Signal whether or not Segmentation is enabled */ 1334233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, xd->segmentation_enabled); 1335233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1336233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Indicate which features are enabled */ 1337233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (xd->segmentation_enabled) 1338233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1339233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Signal whether or not the segmentation map is being updated. */ 1340233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, xd->update_mb_segmentation_map); 1341233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, xd->update_mb_segmentation_data); 1342233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1343233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (xd->update_mb_segmentation_data) 1344233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1345233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed char Data; 1346233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1347233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, xd->mb_segement_abs_delta); 1348233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1349233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* For each segmentation feature (Quant and loop filter level) */ 1350233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MB_LVL_MAX; i++) 1351233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1352233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* For each of the segments */ 1353233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < MAX_MB_SEGMENTS; j++) 1354233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1355233d2500723e5594f3e7c70896ffeeef32b9c950ywan Data = xd->segment_feature_data[i][j]; 1356233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1357233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Frame level data */ 1358233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Data) 1359233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1360233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); 1361233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1362233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Data < 0) 1363233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1364233d2500723e5594f3e7c70896ffeeef32b9c950ywan Data = - Data; 1365233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, Data, mb_feature_data_bits[i]); 1366233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); 1367233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1368233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1369233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1370233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, Data, mb_feature_data_bits[i]); 1371233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); 1372233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1373233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1374233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1375233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); 1376233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1377233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1378233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1379233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1380233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (xd->update_mb_segmentation_map) 1381233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1382233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Write the probs used to decode the segment id for each mb */ 1383233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) 1384233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1385233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Data = xd->mb_segment_tree_probs[i]; 1386233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1387233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Data != 255) 1388233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1389233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); 1390233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, Data, 8); 1391233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1392233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1393233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); 1394233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1395233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1396233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1397233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1398233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->filter_type); 1399233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, pc->filter_level, 6); 1400233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, pc->sharpness_level, 3); 1401233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1402233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Write out loop filter deltas applied at the MB level based on mode 1403233d2500723e5594f3e7c70896ffeeef32b9c950ywan * or ref frame (if they are enabled). 1404233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1405233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, xd->mode_ref_lf_delta_enabled); 1406233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1407233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (xd->mode_ref_lf_delta_enabled) 1408233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1409233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Do the deltas need to be updated */ 1410233d2500723e5594f3e7c70896ffeeef32b9c950ywan int send_update = xd->mode_ref_lf_delta_update 1411233d2500723e5594f3e7c70896ffeeef32b9c950ywan || cpi->oxcf.error_resilient_mode; 1412233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1413233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, send_update); 1414233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (send_update) 1415233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1416233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Data; 1417233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1418233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Send update */ 1419233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MAX_REF_LF_DELTAS; i++) 1420233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1421233d2500723e5594f3e7c70896ffeeef32b9c950ywan Data = xd->ref_lf_deltas[i]; 1422233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1423233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Frame level data */ 1424233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (xd->ref_lf_deltas[i] != xd->last_ref_lf_deltas[i] 1425233d2500723e5594f3e7c70896ffeeef32b9c950ywan || cpi->oxcf.error_resilient_mode) 1426233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1427233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->last_ref_lf_deltas[i] = xd->ref_lf_deltas[i]; 1428233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); 1429233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1430233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Data > 0) 1431233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1432233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, (Data & 0x3F), 6); 1433233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); /* sign */ 1434233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1435233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1436233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1437233d2500723e5594f3e7c70896ffeeef32b9c950ywan Data = -Data; 1438233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, (Data & 0x3F), 6); 1439233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); /* sign */ 1440233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1441233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1442233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1443233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); 1444233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1445233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1446233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Send update */ 1447233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MAX_MODE_LF_DELTAS; i++) 1448233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1449233d2500723e5594f3e7c70896ffeeef32b9c950ywan Data = xd->mode_lf_deltas[i]; 1450233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1451233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (xd->mode_lf_deltas[i] != xd->last_mode_lf_deltas[i] 1452233d2500723e5594f3e7c70896ffeeef32b9c950ywan || cpi->oxcf.error_resilient_mode) 1453233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1454233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->last_mode_lf_deltas[i] = xd->mode_lf_deltas[i]; 1455233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); 1456233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1457233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Data > 0) 1458233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1459233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, (Data & 0x3F), 6); 1460233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); /* sign */ 1461233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1462233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1463233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1464233d2500723e5594f3e7c70896ffeeef32b9c950ywan Data = -Data; 1465233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, (Data & 0x3F), 6); 1466233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 1); /* sign */ 1467233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1468233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1469233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1470233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, 0); 1471233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1472233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1473233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1474233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1475233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* signal here is multi token partition is enabled */ 1476233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, pc->multi_token_partition, 2); 1477233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1478233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Frame Qbaseline quantizer index */ 1479233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, pc->base_qindex, 7); 1480233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1481233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Transmit Dc, Second order and Uv quantizer delta information */ 1482233d2500723e5594f3e7c70896ffeeef32b9c950ywan put_delta_q(bc, pc->y1dc_delta_q); 1483233d2500723e5594f3e7c70896ffeeef32b9c950ywan put_delta_q(bc, pc->y2dc_delta_q); 1484233d2500723e5594f3e7c70896ffeeef32b9c950ywan put_delta_q(bc, pc->y2ac_delta_q); 1485233d2500723e5594f3e7c70896ffeeef32b9c950ywan put_delta_q(bc, pc->uvdc_delta_q); 1486233d2500723e5594f3e7c70896ffeeef32b9c950ywan put_delta_q(bc, pc->uvac_delta_q); 1487233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1488233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* When there is a key frame all reference buffers are updated using 1489233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the new key frame 1490233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1491233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->frame_type != KEY_FRAME) 1492233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1493233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Should the GF or ARF be updated using the transmitted frame 1494233d2500723e5594f3e7c70896ffeeef32b9c950ywan * or buffer 1495233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1496233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->refresh_golden_frame); 1497233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->refresh_alt_ref_frame); 1498233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1499233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If not being updated from current frame should either GF or ARF 1500233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be updated from another buffer 1501233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1502233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!pc->refresh_golden_frame) 1503233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, pc->copy_buffer_to_gf, 2); 1504233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1505233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!pc->refresh_alt_ref_frame) 1506233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_literal(bc, pc->copy_buffer_to_arf, 2); 1507233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1508233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Indicate reference frame sign bias for Golden and ARF frames 1509233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (always 0 for last frame buffer) 1510233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1511233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->ref_frame_sign_bias[GOLDEN_FRAME]); 1512233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->ref_frame_sign_bias[ALTREF_FRAME]); 1513233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1514233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1515233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 1516233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) 1517233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1518233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->frame_type == KEY_FRAME) 1519233d2500723e5594f3e7c70896ffeeef32b9c950ywan pc->refresh_entropy_probs = 1; 1520233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1521233d2500723e5594f3e7c70896ffeeef32b9c950ywan pc->refresh_entropy_probs = 0; 1522233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1523233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1524233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1525233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->refresh_entropy_probs); 1526233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1527233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->frame_type != KEY_FRAME) 1528233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->refresh_last_frame); 1529233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1530233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 1531233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1532233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->frame_type == INTER_FRAME) 1533233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 0; 1534233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1535233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 7; 1536233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1537233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1538233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1539233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 1540233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1541233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1542233d2500723e5594f3e7c70896ffeeef32b9c950ywan pack_coef_probs(cpi); 1543233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 1544233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->refresh_entropy_probs == 0) 1545233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1546233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* save a copy for later refresh */ 1547233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&cpi->common.lfc, &cpi->common.fc, sizeof(cpi->common.fc)); 1548233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1549233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1550233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_update_coef_probs(cpi); 1551233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1552233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1553233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 1554233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 2; 1555233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1556233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1557233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Write out the mb_no_coeff_skip flag */ 1558233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_write_bit(bc, pc->mb_no_coeff_skip); 1559233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1560233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->frame_type == KEY_FRAME) 1561233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1562233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_kfmodes(cpi); 1563233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1564233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 1565233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 8; 1566233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1567233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1568233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1569233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1570233d2500723e5594f3e7c70896ffeeef32b9c950ywan pack_inter_mode_mvs(cpi); 1571233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1572233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 1573233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_section = 1; 1574233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1575233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1576233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1577233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_stop_encode(bc); 1578233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1579233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data += bc->pos; 1580233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1581233d2500723e5594f3e7c70896ffeeef32b9c950ywan oh.first_partition_length_in_bytes = cpi->bc->pos; 1582233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1583233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* update frame tag */ 1584233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1585233d2500723e5594f3e7c70896ffeeef32b9c950ywan int v = (oh.first_partition_length_in_bytes << 5) | 1586233d2500723e5594f3e7c70896ffeeef32b9c950ywan (oh.show_frame << 4) | 1587233d2500723e5594f3e7c70896ffeeef32b9c950ywan (oh.version << 1) | 1588233d2500723e5594f3e7c70896ffeeef32b9c950ywan oh.type; 1589233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1590233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest[0] = v; 1591233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest[1] = v >> 8; 1592233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest[2] = v >> 16; 1593233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1594233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1595233d2500723e5594f3e7c70896ffeeef32b9c950ywan *size = VP8_HEADER_SIZE + extra_bytes_packed + cpi->bc->pos; 1596233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1597233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->partition_sz[0] = *size; 1598233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1599233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1600233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1601233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int num_part = (1 << pc->multi_token_partition); 1602233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char * dp = cpi->partition_d[0] + cpi->partition_sz[0]; 1603233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1604233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (num_part > 1) 1605233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1606233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* write token part sizes (all but last) if more than 1 */ 1607233d2500723e5594f3e7c70896ffeeef32b9c950ywan validate_buffer(dp, 3 * (num_part - 1), cpi->partition_d_end[0], 1608233d2500723e5594f3e7c70896ffeeef32b9c950ywan &pc->error); 1609233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1610233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->partition_sz[0] += 3*(num_part-1); 1611233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1612233d2500723e5594f3e7c70896ffeeef32b9c950ywan for(i = 1; i < num_part; i++) 1613233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1614233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_partition_size(dp, cpi->partition_sz[i]); 1615233d2500723e5594f3e7c70896ffeeef32b9c950ywan dp += 3; 1616233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1617233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1618233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1619233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cpi->output_partition) 1620233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1621233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* concatenate partition buffers */ 1622233d2500723e5594f3e7c70896ffeeef32b9c950ywan for(i = 0; i < num_part; i++) 1623233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1624233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memmove(dp, cpi->partition_d[i+1], cpi->partition_sz[i+1]); 1625233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->partition_d[i+1] = dp; 1626233d2500723e5594f3e7c70896ffeeef32b9c950ywan dp += cpi->partition_sz[i+1]; 1627233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1628233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1629233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1630233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* update total size */ 1631233d2500723e5594f3e7c70896ffeeef32b9c950ywan *size = 0; 1632233d2500723e5594f3e7c70896ffeeef32b9c950ywan for(i = 0; i < num_part+1; i++) 1633233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1634233d2500723e5594f3e7c70896ffeeef32b9c950ywan *size += cpi->partition_sz[i]; 1635233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1636233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1637233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 1638233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pc->multi_token_partition != ONE_PARTITION) 1639233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1640233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num_part = 1 << pc->multi_token_partition; 1641233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1642233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* partition size table at the end of first partition */ 1643233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->partition_sz[0] += 3 * (num_part - 1); 1644233d2500723e5594f3e7c70896ffeeef32b9c950ywan *size += 3 * (num_part - 1); 1645233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1646233d2500723e5594f3e7c70896ffeeef32b9c950ywan validate_buffer(cx_data, 3 * (num_part - 1), cx_data_end, 1647233d2500723e5594f3e7c70896ffeeef32b9c950ywan &pc->error); 1648233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1649233d2500723e5594f3e7c70896ffeeef32b9c950ywan for(i = 1; i < num_part + 1; i++) 1650233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1651233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->bc[i].error = &pc->error; 1652233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1653233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1654233d2500723e5594f3e7c70896ffeeef32b9c950ywan pack_tokens_into_partitions(cpi, cx_data + 3 * (num_part - 1), 1655233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data_end, num_part); 1656233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1657233d2500723e5594f3e7c70896ffeeef32b9c950ywan for(i = 1; i < num_part; i++) 1658233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1659233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->partition_sz[i] = cpi->bc[i].pos; 1660233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_partition_size(cx_data, cpi->partition_sz[i]); 1661233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data += 3; 1662233d2500723e5594f3e7c70896ffeeef32b9c950ywan *size += cpi->partition_sz[i]; /* add to total */ 1663233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1664233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1665233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* add last partition to total size */ 1666233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->partition_sz[i] = cpi->bc[i].pos; 1667233d2500723e5594f3e7c70896ffeeef32b9c950ywan *size += cpi->partition_sz[i]; 1668233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1669233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1670233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1671233d2500723e5594f3e7c70896ffeeef32b9c950ywan bc[1].error = &pc->error; 1672233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1673233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_start_encode(&cpi->bc[1], cx_data, cx_data_end); 1674233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1675233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTITHREAD 1676233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->b_multi_threaded) 1677233d2500723e5594f3e7c70896ffeeef32b9c950ywan pack_mb_row_tokens(cpi, &cpi->bc[1]); 1678233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1679233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1680233d2500723e5594f3e7c70896ffeeef32b9c950ywan pack_tokens(&cpi->bc[1], cpi->tok, cpi->tok_count); 1681233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1682233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_stop_encode(&cpi->bc[1]); 1683233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1684233d2500723e5594f3e7c70896ffeeef32b9c950ywan *size += cpi->bc[1].pos; 1685233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->partition_sz[1] = cpi->bc[1].pos; 1686233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1687233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1688233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1689233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1690233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef VP8_ENTROPY_STATS 1691233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid print_tree_update_probs() 1692233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1693233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j, k, l; 1694233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *f = fopen("context.c", "a"); 1695233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Sum; 1696233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "\n/* Update probabilities for token entropy tree. */\n\n"); 1697233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "const vp8_prob tree_update_probs[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] = {\n"); 1698233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1699233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < BLOCK_TYPES; i++) 1700233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1701233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " { \n"); 1702233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1703233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < COEF_BANDS; j++) 1704233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1705233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " {\n"); 1706233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1707233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (k = 0; k < PREV_COEF_CONTEXTS; k++) 1708233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1709233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " {"); 1710233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1711233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (l = 0; l < ENTROPY_NODES; l++) 1712233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1713233d2500723e5594f3e7c70896ffeeef32b9c950ywan Sum = tree_update_hist[i][j][k][l][0] + tree_update_hist[i][j][k][l][1]; 1714233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1715233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Sum > 0) 1716233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1717233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (((tree_update_hist[i][j][k][l][0] * 255) / Sum) > 0) 1718233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "%3ld, ", (tree_update_hist[i][j][k][l][0] * 255) / Sum); 1719233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1720233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "%3ld, ", 1); 1721233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1722233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1723233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "%3ld, ", 128); 1724233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1725233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1726233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "},\n"); 1727233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1728233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1729233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " },\n"); 1730233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1731233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1732233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " },\n"); 1733233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1734233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1735233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "};\n"); 1736233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(f); 1737233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1738233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1739