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