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