1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
128b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#ifndef VP8_ENCODER_ONYX_INT_H_
138b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#define VP8_ENCODER_ONYX_INT_H_
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdio.h>
16167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vpx_config.h"
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/onyx.h"
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "treewriter.h"
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "tokenize.h"
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/onyxc_int.h"
215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vp8/common/variance.h"
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodemb.h"
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "quantize.h"
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/entropy.h"
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/threading.h"
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_ports/mem.h"
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx/internal/vpx_codec_internal.h"
28ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vpx/vp8.h"
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "mcomp.h"
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/findnearmv.h"
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "lookahead.h"
325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING
335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vp8/encoder/denoising.h"
345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
36dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
37dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgextern "C" {
38dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
39dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define MIN_GF_INTERVAL             4
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define DEFAULT_GF_INTERVAL         7
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define KEY_FRAME_CONTEXT 5
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define MAX_LAG_BUFFERS (CONFIG_REALTIME_ONLY? 1 : 25)
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define AF_THRESH   25
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define AF_THRESH2  100
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define ARF_DECAY_THRESH 12
50d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define MIN_THRESHMULT  32
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define MAX_THRESHMULT  512
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define GF_ZEROMV_ZBIN_BOOST 12
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define LF_ZEROMV_ZBIN_BOOST 6
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define MV_ZBIN_BOOST        4
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define ZBIN_OQ_MAX 192
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define VP8_TEMPORAL_ALT_REF 1
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int kf_indicated;
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int frames_since_key;
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int frames_since_golden;
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int filter_level;
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int frames_till_gf_update_due;
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int recent_ref_frame_usage[MAX_REF_FRAMES];
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MV_CONTEXT mvc[2];
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int mvcosts[2][MVvals+1];
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int y_modes[5];
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int uv_modes[4];
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int b_modes[10];
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int inter_y_modes[10];
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int inter_uv_modes[4];
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int inter_b_modes[10];
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_prob ymode_prob[4], uv_mode_prob[3];   /* interframe intra mode probs */
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_prob kf_ymode_prob[4], kf_uv_mode_prob[3];   /* keyframe "" */
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ymode_count[5], uv_mode_count[4];  /* intra MB type cts this frame */
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int count_mb_ref_frame_usage[MAX_REF_FRAMES];
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int this_frame_percent_intra;
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int last_frame_percent_intra;
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} CODING_CONTEXT;
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame;
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double intra_error;
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double coded_error;
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double ssim_weighted_pred_err;
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double pcnt_inter;
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double pcnt_motion;
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double pcnt_second_ref;
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double pcnt_neutral;
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double MVr;
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double mvr_abs;
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double MVc;
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double mvc_abs;
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double MVrv;
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double MVcv;
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double mv_in_out_count;
115167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    double new_mv_count;
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double duration;
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double count;
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgFIRSTPASS_STATS;
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int frames_so_far;
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame_intra_error;
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame_coded_error;
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame_pcnt_inter;
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame_pcnt_motion;
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame_mvr;
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame_mvr_abs;
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame_mvc;
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double frame_mvc_abs;
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} ONEPASS_FRAMESTATS;
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef enum
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
138167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_ZERO1          = 0,
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    THR_DC             = 1,
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
141167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEAREST1       = 2,
142167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEAR1          = 3,
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
144167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_ZERO2          = 4,
145167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEAREST2       = 5,
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
147167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_ZERO3          = 6,
148167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEAREST3       = 7,
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
150167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEAR2          = 8,
151167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEAR3          = 9,
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    THR_V_PRED         = 10,
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    THR_H_PRED         = 11,
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    THR_TM             = 12,
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
157167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEW1           = 13,
158167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEW2           = 14,
159167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_NEW3           = 15,
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
161167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_SPLIT1         = 16,
162167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_SPLIT2         = 17,
163167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    THR_SPLIT3         = 18,
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    THR_B_PRED         = 19
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgTHR_MODES;
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef enum
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DIAMOND = 0,
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    NSTEP = 1,
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    HEX = 2
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} SEARCH_METHODS;
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int RD;
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SEARCH_METHODS search_method;
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int improved_quant;
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int improved_dct;
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int auto_filter;
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int recode_loop;
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int iterative_sub_pixel;
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int half_pixel_search;
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int quarter_pixel_search;
187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int thresh_mult[MAX_MODES];
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int max_step_search_steps;
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int first_step;
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int optimize_coefficients;
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int use_fastquant_for_pick;
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int no_skip_block4x4_search;
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int improved_mv_pred;
195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} SPEED_FEATURES;
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCK  mb;
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int segment_counts[MAX_MB_SEGMENTS];
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int totalrate;
203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} MB_ROW_COMP;
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    TOKENEXTRA *start;
208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    TOKENEXTRA *stop;
209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} TOKENLIST;
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ithread;
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    void *ptr1;
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    void *ptr2;
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} ENCODETHREAD_DATA;
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ithread;
220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    void *ptr1;
221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} LPFTHREAD_DATA;
222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgenum
224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    BLOCK_16X8,
226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    BLOCK_8X16,
227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    BLOCK_8X8,
228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    BLOCK_4X4,
229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    BLOCK_16X16,
230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    BLOCK_MAX_SEGMENTS
231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
233167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgtypedef struct
234167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{
235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Layer configuration */
23647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    double framerate;
237167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int target_bandwidth;
238167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Layer specific coding parameters */
240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t starting_buffer_level;
241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t optimal_buffer_level;
242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t maximum_buffer_size;
243ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t starting_buffer_level_in_ms;
244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t optimal_buffer_level_in_ms;
245ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t maximum_buffer_size_in_ms;
246167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
247167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int avg_frame_size_for_layer;
248167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
249ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t buffer_level;
250ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t bits_off_target;
251167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
252167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int64_t total_actual_bits;
253167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int total_target_vs_actual;
254167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
255167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int worst_quality;
256167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int active_worst_quality;
257167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int best_quality;
258167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int active_best_quality;
259167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
260167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int ni_av_qi;
261167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int ni_tot_qi;
262167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int ni_frames;
263167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int avg_frame_qindex;
264167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
265167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    double rate_correction_factor;
266167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    double key_frame_rate_correction_factor;
267167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    double gf_rate_correction_factor;
268167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
269167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int zbin_over_quant;
270167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
271167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int inter_frame_target;
272167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int64_t total_byte_count;
273167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
274167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int filter_level;
275167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int last_frame_percent_intra;
277167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
278167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int count_mb_ref_frame_usage[MAX_REF_FRAMES];
279167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
280167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} LAYER_CONTEXT;
281167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct VP8_COMP
283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, Y1quant[QINDEX_RANGE][16]);
2864b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org    DECLARE_ALIGNED(16, short, Y1quant_shift[QINDEX_RANGE][16]);
287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, Y1zbin[QINDEX_RANGE][16]);
288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, Y1round[QINDEX_RANGE][16]);
289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, Y2quant[QINDEX_RANGE][16]);
2914b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org    DECLARE_ALIGNED(16, short, Y2quant_shift[QINDEX_RANGE][16]);
292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, Y2zbin[QINDEX_RANGE][16]);
293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, Y2round[QINDEX_RANGE][16]);
294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, UVquant[QINDEX_RANGE][16]);
2964b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org    DECLARE_ALIGNED(16, short, UVquant_shift[QINDEX_RANGE][16]);
297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, UVzbin[QINDEX_RANGE][16]);
298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, UVround[QINDEX_RANGE][16]);
299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, zrun_zbin_boost_y1[QINDEX_RANGE][16]);
301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, zrun_zbin_boost_y2[QINDEX_RANGE][16]);
302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, zrun_zbin_boost_uv[QINDEX_RANGE][16]);
303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, Y1quant_fast[QINDEX_RANGE][16]);
304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, Y2quant_fast[QINDEX_RANGE][16]);
305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, short, UVquant_fast[QINDEX_RANGE][16]);
306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCK mb;
309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON common;
310ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_writer bc[9]; /* one boolcoder for each partition */
311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_CONFIG oxcf;
313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct lookahead_ctx    *lookahead;
315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct lookahead_entry  *source;
316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct lookahead_entry  *alt_ref_source;
3175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    struct lookahead_entry  *last_source;
318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *Source;
320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *un_scaled_source;
321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG scaled_source;
3225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    YV12_BUFFER_CONFIG *last_frame_unscaled_source;
323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
32447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    unsigned int frames_till_alt_ref_frame;
325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* frame in src_buffers has been identified to be encoded as an alt ref */
326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int source_alt_ref_pending;
327ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* an alt ref frame has been encoded and is usable */
328ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int source_alt_ref_active;
329ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* source of frame to encode is an exact copy of an alt ref frame */
330ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int is_src_frame_alt_ref;
331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* golden frame same as last frame ( short circuit gold searches) */
333ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int gold_is_last;
334ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Alt reference frame same as last ( short circuit altref search) */
335ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int alt_is_last;
336ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* don't do both alt and gold search ( just do gold). */
337ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int gold_is_alt;
338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
339167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    YV12_BUFFER_CONFIG pick_lf_lvl_frame;
340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    TOKENEXTRA *tok;
342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int tok_count;
343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int frames_since_key;
346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int key_frame_frequency;
347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int this_key_frame_forced;
348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int next_key_frame_forced;
349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
350ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Ambient reconstruction err target for force key frames */
351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ambient_err;
352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int mode_check_freq[MAX_MODES];
354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int rd_baseline_thresh[MAX_MODES];
356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int RDMULT;
358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int RDDIV ;
359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    CODING_CONTEXT coding_context;
361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
362ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Rate targetting variables */
363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t last_prediction_error;
364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t last_intra_error;
365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int this_frame_target;
367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int projected_frame_size;
368ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int last_q[2];                   /* Separate values for Intra/Inter */
369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double rate_correction_factor;
371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double key_frame_rate_correction_factor;
372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double gf_rate_correction_factor;
373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
37447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    unsigned int frames_since_golden;
375ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Count down till next GF */
376ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int frames_till_gf_update_due;
377ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
378ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* GF interval chosen when we coded the last GF */
379ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int current_gf_interval;
380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
381ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Total bits overspent becasue of GF boost (cumulative) */
382ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int gf_overspend_bits;
383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
384ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Used in the few frames following a GF to recover the extra bits
385ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * spent in that GF
386ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
387ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int non_gf_bitrate_adjustment;
388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
389ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Extra bits spent on key frames that need to be recovered */
390ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int kf_overspend_bits;
391ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
392ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Current number of bit s to try and recover on each inter frame. */
393ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int kf_bitrate_adjustment;
394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int max_gf_interval;
395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int baseline_gf_interval;
396ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int active_arnr_frames;
397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t key_frame_count;
399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int prior_key_frame_distance[KEY_FRAME_CONTEXT];
400ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Current section per frame bandwidth target */
401ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int per_frame_bandwidth;
402ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Average frame size target for clip */
403ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int av_per_frame_bandwidth;
404ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Minimum allocation that should be used for any frame */
405ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int min_frame_bandwidth;
406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int inter_frame_target;
40747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    double output_framerate;
408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t last_time_stamp_seen;
409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t last_end_time_stamp_seen;
410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t first_time_stamp_ever;
411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ni_av_qi;
413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ni_tot_qi;
414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ni_frames;
415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int avg_frame_qindex;
416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t total_byte_count;
418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int buffered_mode;
420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
42147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    double framerate;
42247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    double ref_framerate;
423167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int64_t buffer_level;
424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int64_t bits_off_target;
425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int rolling_target_bits;
427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int rolling_actual_bits;
428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int long_rolling_target_bits;
430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int long_rolling_actual_bits;
431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t total_actual_bits;
433ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int total_target_vs_actual; /* debug stats */
434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int worst_quality;
436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int active_worst_quality;
437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int best_quality;
438474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int active_best_quality;
439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int cq_target_quality;
441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
442ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int drop_frames_allowed; /* Are we permitted to drop frames? */
443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int drop_frame;          /* Drop this frame? */
444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
445474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_prob frame_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
4465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    char update_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
4475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int frame_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int gfu_boost;
451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int kf_boost;
452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int last_boost;
453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int target_bandwidth;
455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct vpx_codec_pkt_list  *output_pkt_list;
456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
458ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Experimental code for lagged and one pass */
459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ONEPASS_FRAMESTATS one_pass_frame_stats[MAX_LAG_BUFFERS];
460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int one_pass_frame_index;
461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
462474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int decimation_factor;
464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int decimation_count;
465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* for real time encoding */
467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int avg_encode_time;     /* microsecond */
468ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int avg_pick_mode_time;  /* microsecond */
469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Speed;
470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int compressor_speed;
471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int auto_gold;
473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int auto_adjust_gold_quantizer;
474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int auto_worst_q;
475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int cpu_used;
476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int pass;
477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int prob_intra_coded;
480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int prob_last_coded;
481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int prob_gf_coded;
482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int prob_skip_false;
483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int last_skip_false_probs[3];
484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int last_skip_probs_q[3];
485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int recent_ref_frame_usage[MAX_REF_FRAMES];
486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int this_frame_percent_intra;
488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int last_frame_percent_intra;
489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ref_frame_flags;
491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SPEED_FEATURES sf;
493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
494ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Count ZEROMV on all reference frames. */
495ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int zeromv_count;
496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int lf_zeromv_pct;
497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *segmentation_map;
499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    signed char segment_feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
500ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int  segment_encode_breakout[MAX_MB_SEGMENTS];
501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
502474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *active_map;
503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int active_map_enabled;
504ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Video conferencing cyclic refresh mode flags. This is a mode
506ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * designed to clean up the background over time in live encoding
507ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * scenarious. It uses segmentation.
508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int cyclic_refresh_mode_enabled;
510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int cyclic_refresh_mode_max_mbs_perframe;
511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int cyclic_refresh_mode_index;
512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int cyclic_refresh_q;
513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    signed char *cyclic_refresh_map;
51441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Count on how many (consecutive) times a macroblock uses ZER0MV_LAST.
51541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    unsigned char *consec_zero_last;
516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
51710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    // Frame counter for the temporal pattern. Counter is rest when the temporal
51810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    // layers are changed dynamically (run-time change).
51910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    unsigned int temporal_pattern_counter;
52010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* multithread data */
523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int * mt_current_mb_col;
524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int mt_sync_range;
525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int b_multi_threaded;
526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int encoding_thread_count;
5275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    int b_lpf_running;
528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pthread_t *h_encoding_thread;
530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pthread_t h_filter_thread;
531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MB_ROW_COMP *mb_row_ei;
533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ENCODETHREAD_DATA *en_thread_data;
534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    LPFTHREAD_DATA lpf_thread_data;
535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
536ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* events */
537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sem_t *h_event_start_encoding;
538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sem_t h_event_end_encoding;
539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sem_t h_event_start_lpf;
540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sem_t h_event_end_lpf;
541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    TOKENLIST *tplist;
544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int partition_sz[MAX_PARTITIONS];
5455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    unsigned char *partition_d[MAX_PARTITIONS];
5465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    unsigned char *partition_d_end[MAX_PARTITIONS];
547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    fractional_mv_step_fp *find_fractional_mv_step;
550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_full_search_fn_t full_search_sad;
551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_refining_search_fn_t refining_search_sad;
552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_diamond_search_fn_t diamond_search_sad;
553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_variance_fn_ptr_t fn_ptr[BLOCK_MAX_SEGMENTS];
554ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint64_t time_receive_data;
555ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint64_t time_compress_data;
556ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint64_t time_pick_lpf;
557ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint64_t time_encode_mb_row;
558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int base_skip_false_prob[128];
560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
561167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    FRAME_CONTEXT lfc_n; /* last frame entropy */
562167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    FRAME_CONTEXT lfc_a; /* last alt ref entropy */
563167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    FRAME_CONTEXT lfc_g; /* last gold ref entropy */
564167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
565167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct twopass_rc
567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int section_intra_rating;
569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double section_max_qfactor;
570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int next_iiratio;
571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int this_iiratio;
572167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        FIRSTPASS_STATS total_stats;
573167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        FIRSTPASS_STATS this_frame_stats;
574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        FIRSTPASS_STATS *stats_in, *stats_in_end, *stats_in_start;
575167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        FIRSTPASS_STATS total_left_stats;
576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int first_pass_done;
577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int64_t bits_left;
578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int64_t clip_bits_total;
579474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double avg_iiratio;
580474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double modified_error_total;
581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double modified_error_used;
582474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double modified_error_left;
583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double kf_intra_err_min;
584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double gf_intra_err_min;
585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int frames_to_key;
586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int maxq_max_limit;
587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int maxq_min_limit;
588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int gf_decay_rate;
589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int static_scene_max_gf_interval;
590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int kf_bits;
591ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Remaining error from uncoded frames in a gf group. */
592ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int gf_group_error_left;
593ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Projected total bits available for a key frame group of frames */
594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int64_t kf_group_bits;
595ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Error score of frames still to be coded in kf group */
596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int64_t kf_group_error_left;
597ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Projected Bits available for a group including 1 GF or ARF */
5984b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org        int64_t gf_group_bits;
599ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Bits for the golden frame or ARF */
600ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int gf_bits;
601167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        int alt_extra_bits;
602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double est_max_qcorrection_factor;
603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    } twopass;
604474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
605474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if VP8_TEMPORAL_ALT_REF
606474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG alt_ref_buffer;
607474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS];
608474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int fixed_divide[512];
609474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
610474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_INTERNAL_STATS
612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int    count;
613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_y;
614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_u;
615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_v;
616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total ;
617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_sq_error;
618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double totalp_y;
619474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double totalp_u;
620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double totalp_v;
621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double totalp;
622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_sq_error2;
623474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int    bytes;
624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double summed_quality;
625474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double summed_weights;
626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int tot_recode_hits;
627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
628474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_ssimg_y;
630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_ssimg_u;
631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_ssimg_v;
632474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double total_ssimg_all;
633474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
634474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int b_calculate_ssimg;
635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int b_calculate_psnr;
637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
638ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Per MB activity measurement */
639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int activity_avg;
640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int * mb_activity_map;
641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
642ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Record of which MBs still refer to last golden frame either
643ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * directly or through 0,0
644ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *gf_active_flags;
646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int gf_active_count;
647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int output_partition;
649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
650ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Store last frame's MV info for next frame MV prediction */
651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int_mv *lfmv;
652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int *lf_ref_frame_sign_bias;
653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int *lf_ref_frame;
654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
655ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* force next frame to intra when kf_auto says so */
656ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int force_next_frame_intra;
657167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int droppable;
659167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
6605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING
6615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    VP8_DENOISER denoiser;
6625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
6635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
664ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Coding layer state variables */
665167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    unsigned int current_layer;
6665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    LAYER_CONTEXT layer_context[VPX_TS_MAX_LAYERS];
6675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
6685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    int64_t frames_in_layer[VPX_TS_MAX_LAYERS];
6695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    int64_t bytes_in_layer[VPX_TS_MAX_LAYERS];
6705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double sum_psnr[VPX_TS_MAX_LAYERS];
6715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double sum_psnr_p[VPX_TS_MAX_LAYERS];
6725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double total_error2[VPX_TS_MAX_LAYERS];
6735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double total_error2_p[VPX_TS_MAX_LAYERS];
6745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double sum_ssim[VPX_TS_MAX_LAYERS];
6755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double sum_weights[VPX_TS_MAX_LAYERS];
6765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
6775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double total_ssimg_y_in_layer[VPX_TS_MAX_LAYERS];
6785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double total_ssimg_u_in_layer[VPX_TS_MAX_LAYERS];
6795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double total_ssimg_v_in_layer[VPX_TS_MAX_LAYERS];
6805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double total_ssimg_all_in_layer[VPX_TS_MAX_LAYERS];
681167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
682167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING
683167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* Number of MBs per row at lower-resolution level */
684167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int    mr_low_res_mb_cols;
685ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Indicate if lower-res mv info is available */
686ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char  mr_low_res_mv_avail;
68741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
688ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* The frame number of each reference frames */
689ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int current_ref_frames[MAX_REF_FRAMES];
69041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MV_REFERENCE_FRAME closest_reference_frame;
691167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
692ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    struct rd_costs_struct
693ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
694ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int mvcosts[2][MVvals+1];
695ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int mvsadcosts[2][MVfpvals+1];
696ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int mbmode_cost[2][MB_MODE_COUNT];
697ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int intra_uv_mode_cost[2][MB_MODE_COUNT];
698ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int bmode_costs[10][10][10];
699ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int inter_bmode_costs[B_MODE_COUNT];
700ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int token_costs[BLOCK_TYPES][COEF_BANDS]
701ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
702ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    } rd_costs;
703474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} VP8_COMP;
704474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
705d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgvoid vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest,
706d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        unsigned char *dest_end, unsigned long *size);
707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
708d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgvoid vp8_tokenize_mb(VP8_COMP *, MACROBLOCK *, TOKENEXTRA **);
709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_set_speed_features(VP8_COMP *cpi);
711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_DEBUG
713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define CHECK_MEM_ERROR(lval,expr) do {\
714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lval = (expr); \
715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if(!lval) \
716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,\
717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               "Failed to allocate "#lval" at %s:%d", \
718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               __FILE__,__LINE__);\
719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    } while(0)
720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define CHECK_MEM_ERROR(lval,expr) do {\
722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lval = (expr); \
723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if(!lval) \
724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,\
725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               "Failed to allocate "#lval);\
726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    } while(0)
727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
728dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
729dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}  // extern "C"
730dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
731dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
7328b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#endif  // VP8_ENCODER_ONYX_INT_H_
733