1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_ENCODER_VP9_ONYX_INT_H_
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_ENCODER_VP9_ONYX_INT_H_
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <stdio.h>
15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h"
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_ports/mem.h"
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/internal/vpx_codec_internal.h"
19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx/vp8cx.h"
20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/common/vp9_ppflags.h"
22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/common/vp9_entropy.h"
23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/common/vp9_entropymode.h"
24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/common/vp9_onyxc_int.h"
25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_aq_cyclicrefresh.h"
27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_encodemb.h"
28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_firstpass.h"
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_lookahead.h"
30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_mbgraph.h"
31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_mcomp.h"
32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_quantize.h"
33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_ratectrl.h"
346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_speed_features.h"
35a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian#include "vp9/encoder/vp9_svc_layercontext.h"
36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_tokenize.h"
37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_variance.h"
38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
39b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" {
41b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// #define MODE_TEST_HIT_STATS
441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define DEFAULT_GF_INTERVAL         10
46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define MAX_MODES 30
485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define MAX_REFS  6
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct {
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int nmvjointcost[MV_JOINTS];
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int nmvcosts[2][MV_VALS];
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int nmvcosts_hp[2][MV_VALS];
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_prob segment_pred_probs[PREDICTION_PROBS];
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned char *last_frame_seg_map_copy;
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // 0 = Intra, Last, GF, ARF
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  signed char last_ref_lf_deltas[MAX_REF_LF_DELTAS];
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // 0 = ZERO_MV, MV
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  signed char last_mode_lf_deltas[MAX_MODE_LF_DELTAS];
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FRAME_CONTEXT fc;
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} CODING_CONTEXT;
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
6791037db265ecdd914a26e056cf69207b4f50924ehkuang// This enumerator type needs to be kept aligned with the mode order in
6891037db265ecdd914a26e056cf69207b4f50924ehkuang// const MODE_DEFINITION vp9_mode_order[MAX_MODES] used in the rd code.
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef enum {
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  THR_NEARESTMV,
7191037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_NEARESTA,
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  THR_NEARESTG,
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  THR_DC,
751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  THR_NEWMV,
7791037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_NEWA,
781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  THR_NEWG,
791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  THR_NEARMV,
81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  THR_NEARA,
821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  THR_COMP_NEARESTLA,
831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  THR_COMP_NEARESTGA,
84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  THR_TM,
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
8791037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_COMP_NEARLA,
8891037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_COMP_NEWLA,
8991037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_NEARG,
9091037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_COMP_NEARGA,
9191037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_COMP_NEWGA,
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
9391037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_ZEROMV,
9491037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_ZEROG,
9591037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_ZEROA,
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  THR_COMP_ZEROLA,
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  THR_COMP_ZEROGA,
98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
9991037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_H_PRED,
10091037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_V_PRED,
10191037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_D135_PRED,
1021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  THR_D207_PRED,
10391037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_D153_PRED,
10491037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_D63_PRED,
10591037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_D117_PRED,
10691037db265ecdd914a26e056cf69207b4f50924ehkuang  THR_D45_PRED,
107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} THR_MODES;
108ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
109ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef enum {
1105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  THR_LAST,
1115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  THR_GOLD,
1125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  THR_ALTR,
1135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  THR_COMP_LA,
1145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  THR_COMP_GA,
1155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  THR_INTRA,
1165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} THR_MODES_SUB8X8;
1175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef enum {
119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // encode_breakout is disabled.
120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  ENCODE_BREAKOUT_DISABLED = 0,
121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // encode_breakout is enabled.
122b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  ENCODE_BREAKOUT_ENABLED = 1,
123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // encode_breakout is enabled with small max_thresh limit.
124b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  ENCODE_BREAKOUT_LIMITED = 2
125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} ENCODE_BREAKOUT_TYPE;
126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
127b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef enum {
128b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  NORMAL      = 0,
129b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  FOURFIVE    = 1,
130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  THREEFIVE   = 2,
131b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  ONETWO      = 3
132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} VPX_SCALING;
133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef enum {
135a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  USAGE_LOCAL_FILE_PLAYBACK = 0,
136a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  USAGE_STREAM_FROM_SERVER  = 1,
137a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  USAGE_CONSTRAINED_QUALITY = 2,
138a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  USAGE_CONSTANT_QUALITY    = 3,
139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} END_USAGE;
140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
141b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef enum {
142a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // Good Quality Fast Encoding. The encoder balances quality with the
143a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // amount of time it takes to encode the output. (speed setting
144a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // controls how fast)
145a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  MODE_GOODQUALITY = 1,
146a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
147a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // One Pass - Best Quality. The encoder places priority on the
148a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // quality of the output over encoding speed. The output is compressed
149a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // at the highest possible quality. This option takes the longest
150a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // amount of time to encode. (speed setting ignored)
151a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  MODE_BESTQUALITY = 2,
152a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
153a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // Two Pass - First Pass. The encoder generates a file of statistics
154a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // for use in the second encoding pass. (speed setting controls how fast)
155a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  MODE_FIRSTPASS = 3,
156a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
157a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // Two Pass - Second Pass. The encoder uses the statistics that were
158a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // generated in the first encoding pass to create the compressed
159a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // output. (speed setting controls how fast)
160a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  MODE_SECONDPASS = 4,
161a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
162a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // Two Pass - Second Pass Best.  The encoder uses the statistics that
163a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // were generated in the first encoding pass to create the compressed
164a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // output using the highest possible quality, and taking a
165a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // longer amount of time to encode. (speed setting ignored)
166a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  MODE_SECONDPASS_BEST = 5,
167a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
168a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // Realtime/Live Encoding. This mode is optimized for realtime
169a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // encoding (for example, capturing a television signal or feed from
170a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // a live camera). (speed setting controls how fast)
171a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  MODE_REALTIME = 6,
172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} MODE;
173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
174b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef enum {
175a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  FRAMEFLAGS_KEY    = 1 << 0,
176a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  FRAMEFLAGS_GOLDEN = 1 << 1,
177a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  FRAMEFLAGS_ALTREF = 1 << 2,
178b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} FRAMETYPE_FLAGS;
179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
180b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef enum {
181b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  NO_AQ = 0,
182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VARIANCE_AQ = 1,
183b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  COMPLEXITY_AQ = 2,
184a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  CYCLIC_REFRESH_AQ = 3,
185b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  AQ_MODE_COUNT  // This should always be the last member of the enum
186b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} AQ_MODE;
187b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1886ac915abcdb404a00d927fe6308a47fcf09d9519hkuangtypedef struct VP9_CONFIG {
1896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  BITSTREAM_PROFILE profile;
1906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  BIT_DEPTH bit_depth;
191b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int width;  // width of data passed to the compressor
192b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int height;  // height of data passed to the compressor
193b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double framerate;  // set to passed in framerate
194b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t target_bandwidth;  // bandwidth to be used in kilobits per second
195b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
196b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int noise_sensitivity;  // pre processing blur: recommendation 0
197b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int sharpness;  // sharpening output: recommendation 0:
198b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int cpu_used;
199b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  unsigned int rc_max_intra_bitrate_pct;
200b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
201b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  MODE mode;
202b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
203b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Key Framing Operations
204b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int auto_key;  // autodetect cut scenes and set the keyframes
205b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int key_freq;  // maximum distance to key frame.
206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
207b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int lag_in_frames;  // how many frames lag before we start encoding
208b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
209b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // ----------------------------------------------------------------
210b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // DATARATE CONTROL OPTIONS
211b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
212b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  END_USAGE end_usage;  // vbr or cbr
213b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
214b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // buffer targeting aggressiveness
215b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int under_shoot_pct;
216b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int over_shoot_pct;
217b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
218b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // buffering parameters
219b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t starting_buffer_level;  // in seconds
220b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t optimal_buffer_level;
221b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t maximum_buffer_size;
222b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
223b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Frame drop threshold.
224b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int drop_frames_water_mark;
225b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
226b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // controlling quality
227b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int fixed_q;
228b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int worst_allowed_q;
229b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int best_allowed_q;
230b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int cq_level;
231b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int lossless;
232b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  AQ_MODE aq_mode;  // Adaptive Quantization mode
233b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // Enable feature to reduce the frame quantization every x frames.
2356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int frame_periodic_boost;
2366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
237b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // two pass datarate control
238b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int two_pass_vbrbias;        // two pass datarate control tweaks
239b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int two_pass_vbrmin_section;
240b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int two_pass_vbrmax_section;
241b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // END DATARATE CONTROL OPTIONS
242b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // ----------------------------------------------------------------
243b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
244b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Spatial and temporal scalability.
245b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ss_number_layers;  // Number of spatial layers.
246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ts_number_layers;  // Number of temporal layers.
247b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Bitrate allocation for spatial layers.
248b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ss_target_bitrate[VPX_SS_MAX_LAYERS];
249b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Bitrate allocation (CBR mode) and framerate factor, for temporal layers.
250b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ts_target_bitrate[VPX_TS_MAX_LAYERS];
251b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ts_rate_decimator[VPX_TS_MAX_LAYERS];
252b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
253b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // these parameters aren't to be used in final build don't use!!!
254b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int play_alternate;
255b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int alt_freq;
256b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
257b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int encode_breakout;  // early breakout : for video conf recommend 800
258b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
259b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  /* Bitfield defining the error resiliency features to enable.
260b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * Can provide decodable frames after losses in previous
261b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * frames and decodable partitions after losses in the same frame.
262b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   */
263b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  unsigned int error_resilient_mode;
264b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  /* Bitfield defining the parallel decoding mode where the
266b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * decoding in successive frames may be conducted in parallel
267b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * just by decoding the frame headers.
268b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   */
269b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  unsigned int frame_parallel_decoding_mode;
270b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
271b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int arnr_max_frames;
272b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int arnr_strength;
273b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int arnr_type;
274b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
275b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int tile_columns;
276b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int tile_rows;
277b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  struct vpx_fixed_buf         two_pass_stats_in;
279b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  struct vpx_codec_pkt_list  *output_pkt_list;
280b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
281b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp8e_tuning tuning;
282b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} VP9_CONFIG;
283b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct VP9_COMP {
2856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  QUANTS quants;
286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  MACROBLOCK mb;
287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON common;
288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_CONFIG oxcf;
289ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  struct lookahead_ctx    *lookahead;
290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  struct lookahead_entry  *source;
291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
292b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  struct lookahead_entry  *alt_ref_source[REF_FRAMES];
293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  struct lookahead_entry  *alt_ref_source;
295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  struct lookahead_entry  *last_source;
297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  YV12_BUFFER_CONFIG *Source;
2996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  YV12_BUFFER_CONFIG *Last_Source;  // NULL for first frame and alt_ref frames
300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  YV12_BUFFER_CONFIG *un_scaled_source;
301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  YV12_BUFFER_CONFIG scaled_source;
3026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  YV12_BUFFER_CONFIG *unscaled_last_source;
3036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  YV12_BUFFER_CONFIG scaled_last_source;
304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
305b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int key_frame_frequency;
306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int gold_is_last;  // gold same as last frame ( short circuit gold searches)
3085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int alt_is_last;  // Alt same as last ( short circuit altref search)
309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int gold_is_alt;  // don't do both alt and gold search ( just do gold).
310ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int scaled_ref_idx[3];
312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int lst_fb_idx;
313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int gld_fb_idx;
314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int alt_fb_idx;
3151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
317b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int alt_ref_fb_idx[REF_FRAMES - 3];
318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int refresh_last_frame;
320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int refresh_golden_frame;
321ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int refresh_alt_ref_frame;
322b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
323b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ext_refresh_frame_flags_pending;
324b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ext_refresh_last_frame;
325b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ext_refresh_golden_frame;
326b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ext_refresh_alt_ref_frame;
327b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
328b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ext_refresh_frame_context_pending;
329b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int ext_refresh_frame_context;
330b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  YV12_BUFFER_CONFIG last_frame_uf;
332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  TOKENEXTRA *tok;
334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int tok_count[4][1 << 6];
335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Position within a frame coding order (including any additional ARF frames).
338ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int sequence_number;
339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Next frame in naturally occurring order that has not yet been coded.
340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int next_frame_in_order;
341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Ambient reconstruction err target for force key frames
344ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int ambient_err;
345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // Thresh_mult is used to set a threshold for the rd score. A higher value
3476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // means that we will accept the best mode so far more often. This number
3486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // is used in combination with the current block size, and thresh_freq_fact
3496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // to pick a threshold.
3506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int rd_thresh_mult[MAX_MODES];
3516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int rd_thresh_mult_sub8x8[MAX_REFS];
3526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int rd_threshes[MAX_SEGMENTS][BLOCK_SIZES][MAX_MODES];
3541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  int rd_thresh_freq_fact[BLOCK_SIZES][MAX_MODES];
3555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int rd_thresh_sub8x8[MAX_SEGMENTS][BLOCK_SIZES][MAX_REFS];
3565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int rd_thresh_freq_sub8x8[BLOCK_SIZES][MAX_REFS];
357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
358b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t rd_comp_pred_diff[REFERENCE_MODES];
359b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t rd_prediction_type_threshes[MAX_REF_FRAMES][REFERENCE_MODES];
360f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  int64_t rd_tx_select_diff[TX_MODES];
36191037db265ecdd914a26e056cf69207b4f50924ehkuang  // FIXME(rbultje) can this overflow?
362b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int rd_tx_select_threshes[MAX_REF_FRAMES][TX_MODES];
363ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int64_t rd_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
365b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t rd_filter_threshes[MAX_REF_FRAMES][SWITCHABLE_FILTER_CONTEXTS];
3665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int64_t rd_filter_cache[SWITCHABLE_FILTER_CONTEXTS];
367b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t mask_filter_rd;
36891037db265ecdd914a26e056cf69207b4f50924ehkuang
369ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int RDMULT;
370ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int RDDIV;
371ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  CODING_CONTEXT coding_context;
373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
374b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int zbin_mode_boost;
375b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int zbin_mode_boost_enabled;
376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int active_arnr_frames;           // <= cpi->oxcf.arnr_max_frames
377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int active_arnr_strength;         // <= cpi->oxcf.arnr_max_strength
378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
37991037db265ecdd914a26e056cf69207b4f50924ehkuang  double output_framerate;
380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int64_t last_time_stamp_seen;
381ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int64_t last_end_time_stamp_seen;
382ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int64_t first_time_stamp_ever;
383ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
384b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  RATE_CONTROL rc;
385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int cq_target_quality;
387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
388b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_coeff_count coef_counts[TX_SIZES][PLANE_TYPES];
389b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_coeff_probs_model frame_coef_probs[TX_SIZES][PLANE_TYPES];
390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  struct vpx_codec_pkt_list  *output_pkt_list;
392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
393ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  MBGRAPH_FRAME_STATS mbgraph_stats[MAX_LAG_BUFFERS];
394ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int mbgraph_n_frames;             // number of frames filled in the above
395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int static_mb_pct;                // % forced skip mbs by segmentation
396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // for real time encoding
398ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int speed;
399ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int cpu_used;
401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int pass;
402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int ref_frame_flags;
404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  SPEED_FEATURES sf;
406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
40791037db265ecdd914a26e056cf69207b4f50924ehkuang  unsigned int max_mv_magnitude;
40891037db265ecdd914a26e056cf69207b4f50924ehkuang  int mv_step_param;
40991037db265ecdd914a26e056cf69207b4f50924ehkuang
410b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Default value is 1. From first pass stats, encode_breakout may be disabled.
411b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  ENCODE_BREAKOUT_TYPE allow_encode_breakout;
412b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
413b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Get threshold from external input. In real time mode, it can be
414b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // overwritten according to encoding speed.
415b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int encode_breakout;
416b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
417ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned char *segmentation_map;
418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // segment threashold for encode breakout
42091037db265ecdd914a26e056cf69207b4f50924ehkuang  int  segment_encode_breakout[MAX_SEGMENTS];
421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
422b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  unsigned char *complexity_map;
423b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
424ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned char *active_map;
425ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int active_map_enabled;
426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  CYCLIC_REFRESH *cyclic_refresh;
428a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
429ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fractional_mv_step_fp *find_fractional_mv_step;
4301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  fractional_mv_step_comp_fp *find_fractional_mv_step_comp;
431ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_full_search_fn_t full_search_sad;
432ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_refining_search_fn_t refining_search_sad;
433ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_diamond_search_fn_t diamond_search_sad;
4341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vp9_variance_fn_ptr_t fn_ptr[BLOCK_SIZES];
435ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint64_t time_receive_data;
436ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint64_t time_compress_data;
437ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint64_t time_pick_lpf;
438f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  uint64_t time_encode_sb_row;
439ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
440b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  struct twopass_rc twopass;
441ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  YV12_BUFFER_CONFIG alt_ref_buffer;
443ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS];
444ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int fixed_divide[512];
445ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS
447b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  unsigned int mode_chosen_counts[MAX_MODES];
448b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
449ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int    count;
450ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double total_y;
451ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double total_u;
452ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double total_v;
453ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double total;
454b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint64_t total_sq_error;
455b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint64_t total_samples;
456b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
457ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double totalp_y;
458ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double totalp_u;
459ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double totalp_v;
460ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double totalp;
461b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint64_t totalp_sq_error;
462b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint64_t totalp_samples;
463b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
464ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int    bytes;
465ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double summed_quality;
466ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double summed_weights;
467ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double summedp_quality;
468ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double summedp_weights;
469ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int tot_recode_hits;
470ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
471ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
472ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double total_ssimg_y;
473ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double total_ssimg_u;
474ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double total_ssimg_v;
475ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  double total_ssimg_all;
476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
477ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int b_calculate_ssimg;
478ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
479ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int b_calculate_psnr;
480ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Per MB activity measurement
482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int activity_avg;
483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int *mb_activity_map;
484ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int *mb_norm_activity_map;
485ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
486ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int droppable;
487ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int dummy_packing;    /* flag to indicate if packing is dummy */
489ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unsigned int tx_stepdown_count[TX_SIZES];
491ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
492ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int initial_width;
493ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int initial_height;
494ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
495b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int use_svc;
496b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
497a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  SVC svc;
4981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
4996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int use_large_partition_rate;
5006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
501ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
502ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // ARF tracking variables.
503ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int multi_arf_enabled;
504ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int frame_coding_order_period;
505ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int new_frame_coding_order_period;
506ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int frame_coding_order[MAX_LAG_BUFFERS * 2];
507ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int arf_buffer_idx[MAX_LAG_BUFFERS * 3 / 2];
508ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int arf_weight[MAX_LAG_BUFFERS];
509ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int arf_buffered;
510ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int this_frame_weight;
511ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int max_arf_level;
512ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
513ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#ifdef MODE_TEST_HIT_STATS
5151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  // Debug / test stats
5161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  int64_t mode_test_hits[BLOCK_SIZES];
517ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
518ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} VP9_COMP;
519ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
520b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_initialize_enc();
521b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
522b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct VP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf);
523b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_remove_compressor(VP9_COMP *cpi);
524b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
5256ac915abcdb404a00d927fe6308a47fcf09d9519hkuangvoid vp9_change_config(VP9_COMP *cpi, const VP9_CONFIG *oxcf);
526b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
527b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // receive a frames worth of data. caller can assume that a copy of this
528b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // frame is made and not just a copy of the pointer..
529b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags,
530b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                          YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
531b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                          int64_t end_time_stamp);
532b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
533b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
534b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                            size_t *size, uint8_t *dest,
535b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                            int64_t *time_stamp, int64_t *time_end, int flush);
536b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
537b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest,
538b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                              vp9_ppflags_t *flags);
539b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
540b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags);
541b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
542a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags);
543b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
544b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
545b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                           YV12_BUFFER_CONFIG *sd);
546b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
547b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_reference_enc(VP9_COMP *cpi, int index,
548b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                          YV12_BUFFER_CONFIG **fb);
549b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
550b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
551b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                          YV12_BUFFER_CONFIG *sd);
552b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
553b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_update_entropy(VP9_COMP *cpi, int update);
554b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
555b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_roimap(VP9_COMP *cpi, unsigned char *map,
556b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   unsigned int rows, unsigned int cols,
557b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   int delta_q[MAX_SEGMENTS],
558b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   int delta_lf[MAX_SEGMENTS],
559b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   unsigned int threshold[MAX_SEGMENTS]);
560b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
561b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_active_map(VP9_COMP *cpi, unsigned char *map,
562b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                       unsigned int rows, unsigned int cols);
563b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
564b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_internal_size(VP9_COMP *cpi,
565b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                          VPX_SCALING horiz_mode, VPX_SCALING vert_mode);
566b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
567b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_size_literal(VP9_COMP *cpi, unsigned int width,
568b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         unsigned int height);
569b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
570b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_set_svc(VP9_COMP *cpi, int use_svc);
571b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
572b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_quantizer(struct VP9_COMP *cpi);
573b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
5746ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic INLINE int get_ref_frame_idx(const VP9_COMP *cpi,
5756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                    MV_REFERENCE_FRAME ref_frame) {
576ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (ref_frame == LAST_FRAME) {
577ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return cpi->lst_fb_idx;
578ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else if (ref_frame == GOLDEN_FRAME) {
579ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return cpi->gld_fb_idx;
580ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
581ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return cpi->alt_fb_idx;
582ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
583ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
584ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5856ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic INLINE YV12_BUFFER_CONFIG *get_ref_frame_buffer(
5866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    VP9_COMP *cpi, MV_REFERENCE_FRAME ref_frame) {
5876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  VP9_COMMON * const cm = &cpi->common;
5886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  return &cm->frame_bufs[cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]]
5896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      .buf;
5901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}
5911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
5926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang// Intra only frames, golden frames (except alt ref overlays) and
5936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang// alt ref frames tend to be coded at a higher than ambient quality
5946ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic INLINE int vp9_frame_is_boosted(const VP9_COMP *cpi) {
5956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  return frame_is_intra_only(&cpi->common) || cpi->refresh_alt_ref_frame ||
5966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang         (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref);
5976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
5985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5996ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic INLINE int get_token_alloc(int mb_rows, int mb_cols) {
6006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // TODO(JBB): make this work for alpha channel and double check we can't
6016ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // exceed this token count if we have a 32x32 transform crossing a boundary
6026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // at a multiple of 16.
6036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // mb_rows, cols are in units of 16 pixels. We assume 3 planes all at full
6046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // resolution. We assume up to 1 token per pixel, and then allow
6056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // a head room of 4.
6066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  return mb_rows * mb_cols * (16 * 16 * 3 + 4);
6076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
608ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
6096ac915abcdb404a00d927fe6308a47fcf09d9519hkuangint vp9_get_y_sse(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b);
6105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6116ac915abcdb404a00d927fe6308a47fcf09d9519hkuangvoid vp9_alloc_compressor_data(VP9_COMP *cpi);
612a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
613a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_scale_references(VP9_COMP *cpi);
614a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
615a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_update_reference_frames(VP9_COMP *cpi);
616a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
617a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianextern const int q_trans[];
618a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
619a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianint64_t vp9_rescale(int64_t val, int64_t num, int denom);
620a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
6216ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic INLINE void set_ref_ptrs(VP9_COMMON *cm, MACROBLOCKD *xd,
6226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                MV_REFERENCE_FRAME ref0,
6236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                MV_REFERENCE_FRAME ref1) {
624b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  xd->block_refs[0] = &cm->frame_refs[ref0 >= LAST_FRAME ? ref0 - LAST_FRAME
625b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                                         : 0];
626b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  xd->block_refs[1] = &cm->frame_refs[ref1 >= LAST_FRAME ? ref1 - LAST_FRAME
627b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                                         : 0];
628b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
629b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
630b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
631b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}  // extern "C"
632b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
633b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
634ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // VP9_ENCODER_VP9_ONYX_INT_H_
635