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