1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP9_ENCODER_VP9_ONYX_INT_H_ 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP9_ENCODER_VP9_ONYX_INT_H_ 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h> 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vpx_config.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/mem.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/internal/vpx_codec_internal.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vp8cx.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_ppflags.h" 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropy.h" 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropymode.h" 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_onyxc_int.h" 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_aq_cyclicrefresh.h" 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_encodemb.h" 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_firstpass.h" 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_lookahead.h" 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_mbgraph.h" 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_mcomp.h" 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_quantize.h" 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_ratectrl.h" 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_speed_features.h" 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_svc_layercontext.h" 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_tokenize.h" 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_variance.h" 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 40233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" { 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan// #define MODE_TEST_HIT_STATS 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define DEFAULT_GF_INTERVAL 10 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_MODES 30 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_REFS 6 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan 50233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct { 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvjointcost[MV_JOINTS]; 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvcosts[2][MV_VALS]; 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvcosts_hp[2][MV_VALS]; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_prob segment_pred_probs[PREDICTION_PROBS]; 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *last_frame_seg_map_copy; 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan // 0 = Intra, Last, GF, ARF 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed char last_ref_lf_deltas[MAX_REF_LF_DELTAS]; 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan // 0 = ZERO_MV, MV 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed char last_mode_lf_deltas[MAX_MODE_LF_DELTAS]; 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan FRAME_CONTEXT fc; 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan} CODING_CONTEXT; 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This enumerator type needs to be kept aligned with the mode order in 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan// const MODE_DEFINITION vp9_mode_order[MAX_MODES] used in the rd code. 69233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum { 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEARESTMV, 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEARESTA, 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEARESTG, 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_DC, 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEWMV, 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEWA, 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEWG, 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEARMV, 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEARA, 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_NEARESTLA, 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_NEARESTGA, 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_TM, 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_NEARLA, 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_NEWLA, 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_NEARG, 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_NEARGA, 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_NEWGA, 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_ZEROMV, 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_ZEROG, 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_ZEROA, 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_ZEROLA, 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_ZEROGA, 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_H_PRED, 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_V_PRED, 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_D135_PRED, 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_D207_PRED, 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_D153_PRED, 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_D63_PRED, 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_D117_PRED, 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_D45_PRED, 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan} THR_MODES; 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan 109233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum { 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_LAST, 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_GOLD, 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_ALTR, 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_LA, 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_COMP_GA, 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan THR_INTRA, 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan} THR_MODES_SUB8X8; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan 118233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum { 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan // encode_breakout is disabled. 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan ENCODE_BREAKOUT_DISABLED = 0, 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan // encode_breakout is enabled. 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan ENCODE_BREAKOUT_ENABLED = 1, 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan // encode_breakout is enabled with small max_thresh limit. 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan ENCODE_BREAKOUT_LIMITED = 2 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan} ENCODE_BREAKOUT_TYPE; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan 127233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum { 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan NORMAL = 0, 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan FOURFIVE = 1, 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan THREEFIVE = 2, 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan ONETWO = 3 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan} VPX_SCALING; 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan 134233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum { 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan USAGE_LOCAL_FILE_PLAYBACK = 0, 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan USAGE_STREAM_FROM_SERVER = 1, 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan USAGE_CONSTRAINED_QUALITY = 2, 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan USAGE_CONSTANT_QUALITY = 3, 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan} END_USAGE; 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan 141233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum { 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Good Quality Fast Encoding. The encoder balances quality with the 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan // amount of time it takes to encode the output. (speed setting 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan // controls how fast) 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_GOODQUALITY = 1, 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan // One Pass - Best Quality. The encoder places priority on the 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan // quality of the output over encoding speed. The output is compressed 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan // at the highest possible quality. This option takes the longest 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan // amount of time to encode. (speed setting ignored) 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_BESTQUALITY = 2, 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Two Pass - First Pass. The encoder generates a file of statistics 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan // for use in the second encoding pass. (speed setting controls how fast) 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_FIRSTPASS = 3, 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Two Pass - Second Pass. The encoder uses the statistics that were 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan // generated in the first encoding pass to create the compressed 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan // output. (speed setting controls how fast) 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_SECONDPASS = 4, 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Two Pass - Second Pass Best. The encoder uses the statistics that 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan // were generated in the first encoding pass to create the compressed 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan // output using the highest possible quality, and taking a 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan // longer amount of time to encode. (speed setting ignored) 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_SECONDPASS_BEST = 5, 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Realtime/Live Encoding. This mode is optimized for realtime 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan // encoding (for example, capturing a television signal or feed from 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan // a live camera). (speed setting controls how fast) 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_REALTIME = 6, 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan} MODE; 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan 174233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum { 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan FRAMEFLAGS_KEY = 1 << 0, 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan FRAMEFLAGS_GOLDEN = 1 << 1, 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan FRAMEFLAGS_ALTREF = 1 << 2, 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan} FRAMETYPE_FLAGS; 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan 180233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum { 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan NO_AQ = 0, 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan VARIANCE_AQ = 1, 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan COMPLEXITY_AQ = 2, 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan CYCLIC_REFRESH_AQ = 3, 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan AQ_MODE_COUNT // This should always be the last member of the enum 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan} AQ_MODE; 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan 188233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct { 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan int version; // 4 versions of bitstream defined: 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan // 0 - best quality/slowest decode, 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan // 3 - lowest quality/fastest decode 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan int width; // width of data passed to the compressor 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan int height; // height of data passed to the compressor 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan double framerate; // set to passed in framerate 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t target_bandwidth; // bandwidth to be used in kilobits per second 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan int noise_sensitivity; // pre processing blur: recommendation 0 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sharpness; // sharpening output: recommendation 0: 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cpu_used; 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int rc_max_intra_bitrate_pct; 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE mode; 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Key Framing Operations 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan int auto_key; // autodetect cut scenes and set the keyframes 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan int key_freq; // maximum distance to key frame. 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan int lag_in_frames; // how many frames lag before we start encoding 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan // ---------------------------------------------------------------- 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan // DATARATE CONTROL OPTIONS 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan END_USAGE end_usage; // vbr or cbr 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan // buffer targeting aggressiveness 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan int under_shoot_pct; 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan int over_shoot_pct; 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan // buffering parameters 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t starting_buffer_level; // in seconds 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t optimal_buffer_level; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t maximum_buffer_size; 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Frame drop threshold. 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan int drop_frames_water_mark; 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan // controlling quality 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan int fixed_q; 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan int worst_allowed_q; 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan int best_allowed_q; 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cq_level; 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan int lossless; 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan AQ_MODE aq_mode; // Adaptive Quantization mode 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Enable feature to reduce the frame quantization every x frames. 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frame_periodic_boost; 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan // two pass datarate control 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan int two_pass_vbrbias; // two pass datarate control tweaks 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan int two_pass_vbrmin_section; 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan int two_pass_vbrmax_section; 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan // END DATARATE CONTROL OPTIONS 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan // ---------------------------------------------------------------- 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Spatial and temporal scalability. 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ss_number_layers; // Number of spatial layers. 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ts_number_layers; // Number of temporal layers. 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Bitrate allocation for spatial layers. 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ss_target_bitrate[VPX_SS_MAX_LAYERS]; 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Bitrate allocation (CBR mode) and framerate factor, for temporal layers. 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ts_target_bitrate[VPX_TS_MAX_LAYERS]; 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ts_rate_decimator[VPX_TS_MAX_LAYERS]; 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan // these parameters aren't to be used in final build don't use!!! 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan int play_alternate; 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_freq; 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan int encode_breakout; // early breakout : for video conf recommend 800 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Bitfield defining the error resiliency features to enable. 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Can provide decodable frames after losses in previous 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan * frames and decodable partitions after losses in the same frame. 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 264233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int error_resilient_mode; 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Bitfield defining the parallel decoding mode where the 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan * decoding in successive frames may be conducted in parallel 268233d2500723e5594f3e7c70896ffeeef32b9c950ywan * just by decoding the frame headers. 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int frame_parallel_decoding_mode; 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan int arnr_max_frames; 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan int arnr_strength; 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan int arnr_type; 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tile_columns; 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tile_rows; 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan 279233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_fixed_buf two_pass_stats_in; 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_codec_pkt_list *output_pkt_list; 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_tuning tuning; 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan} VP9_CONFIG; 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan 285233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct VP9_COMP { 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan QUANTS quants; 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCK mb; 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_COMMON common; 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_CONFIG oxcf; 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct lookahead_ctx *lookahead; 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct lookahead_entry *source; 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct lookahead_entry *alt_ref_source[REF_FRAMES]; 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct lookahead_entry *alt_ref_source; 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct lookahead_entry *last_source; 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *Source; 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *Last_Source; // NULL for first frame and alt_ref frames 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *un_scaled_source; 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG scaled_source; 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *unscaled_last_source; 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG scaled_last_source; 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan int key_frame_frequency; 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan int gold_is_last; // gold same as last frame ( short circuit gold searches) 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_is_last; // Alt same as last ( short circuit altref search) 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan int gold_is_alt; // don't do both alt and gold search ( just do gold). 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan int scaled_ref_idx[3]; 313233d2500723e5594f3e7c70896ffeeef32b9c950ywan int lst_fb_idx; 314233d2500723e5594f3e7c70896ffeeef32b9c950ywan int gld_fb_idx; 315233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_fb_idx; 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 318233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_ref_fb_idx[REF_FRAMES - 3]; 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan int refresh_last_frame; 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan int refresh_golden_frame; 322233d2500723e5594f3e7c70896ffeeef32b9c950ywan int refresh_alt_ref_frame; 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ext_refresh_frame_flags_pending; 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ext_refresh_last_frame; 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ext_refresh_golden_frame; 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ext_refresh_alt_ref_frame; 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ext_refresh_frame_context_pending; 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ext_refresh_frame_context; 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG last_frame_uf; 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan TOKENEXTRA *tok; 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int tok_count[4][1 << 6]; 336233d2500723e5594f3e7c70896ffeeef32b9c950ywan 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Position within a frame coding order (including any additional ARF frames). 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int sequence_number; 340233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Next frame in naturally occurring order that has not yet been coded. 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan int next_frame_in_order; 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan 344233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Ambient reconstruction err target for force key frames 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ambient_err; 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Thresh_mult is used to set a threshold for the rd score. A higher value 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan // means that we will accept the best mode so far more often. This number 349233d2500723e5594f3e7c70896ffeeef32b9c950ywan // is used in combination with the current block size, and thresh_freq_fact 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan // to pick a threshold. 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_thresh_mult[MAX_MODES]; 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_thresh_mult_sub8x8[MAX_REFS]; 353233d2500723e5594f3e7c70896ffeeef32b9c950ywan 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_threshes[MAX_SEGMENTS][BLOCK_SIZES][MAX_MODES]; 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_thresh_freq_fact[BLOCK_SIZES][MAX_MODES]; 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_thresh_sub8x8[MAX_SEGMENTS][BLOCK_SIZES][MAX_REFS]; 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_thresh_freq_sub8x8[BLOCK_SIZES][MAX_REFS]; 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t rd_comp_pred_diff[REFERENCE_MODES]; 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t rd_prediction_type_threshes[MAX_REF_FRAMES][REFERENCE_MODES]; 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t rd_tx_select_diff[TX_MODES]; 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan // FIXME(rbultje) can this overflow? 363233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_tx_select_threshes[MAX_REF_FRAMES][TX_MODES]; 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan 365233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t rd_filter_diff[SWITCHABLE_FILTER_CONTEXTS]; 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t rd_filter_threshes[MAX_REF_FRAMES][SWITCHABLE_FILTER_CONTEXTS]; 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t rd_filter_cache[SWITCHABLE_FILTER_CONTEXTS]; 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t mask_filter_rd; 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan int RDMULT; 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan int RDDIV; 372233d2500723e5594f3e7c70896ffeeef32b9c950ywan 373233d2500723e5594f3e7c70896ffeeef32b9c950ywan CODING_CONTEXT coding_context; 374233d2500723e5594f3e7c70896ffeeef32b9c950ywan 375233d2500723e5594f3e7c70896ffeeef32b9c950ywan int zbin_mode_boost; 376233d2500723e5594f3e7c70896ffeeef32b9c950ywan int zbin_mode_boost_enabled; 377233d2500723e5594f3e7c70896ffeeef32b9c950ywan int active_arnr_frames; // <= cpi->oxcf.arnr_max_frames 378233d2500723e5594f3e7c70896ffeeef32b9c950ywan int active_arnr_strength; // <= cpi->oxcf.arnr_max_strength 379233d2500723e5594f3e7c70896ffeeef32b9c950ywan 380233d2500723e5594f3e7c70896ffeeef32b9c950ywan double output_framerate; 381233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t last_time_stamp_seen; 382233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t last_end_time_stamp_seen; 383233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t first_time_stamp_ever; 384233d2500723e5594f3e7c70896ffeeef32b9c950ywan 385233d2500723e5594f3e7c70896ffeeef32b9c950ywan RATE_CONTROL rc; 386233d2500723e5594f3e7c70896ffeeef32b9c950ywan 387233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cq_target_quality; 388233d2500723e5594f3e7c70896ffeeef32b9c950ywan 389233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_coeff_count coef_counts[TX_SIZES][PLANE_TYPES]; 390233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_coeff_probs_model frame_coef_probs[TX_SIZES][PLANE_TYPES]; 391233d2500723e5594f3e7c70896ffeeef32b9c950ywan 392233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_codec_pkt_list *output_pkt_list; 393233d2500723e5594f3e7c70896ffeeef32b9c950ywan 394233d2500723e5594f3e7c70896ffeeef32b9c950ywan MBGRAPH_FRAME_STATS mbgraph_stats[MAX_LAG_BUFFERS]; 395233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mbgraph_n_frames; // number of frames filled in the above 396233d2500723e5594f3e7c70896ffeeef32b9c950ywan int static_mb_pct; // % forced skip mbs by segmentation 397233d2500723e5594f3e7c70896ffeeef32b9c950ywan int seg0_progress, seg0_idx, seg0_cnt; 398233d2500723e5594f3e7c70896ffeeef32b9c950ywan 399233d2500723e5594f3e7c70896ffeeef32b9c950ywan // for real time encoding 400233d2500723e5594f3e7c70896ffeeef32b9c950ywan int speed; 401233d2500723e5594f3e7c70896ffeeef32b9c950ywan 402233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cpu_used; 403233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pass; 404233d2500723e5594f3e7c70896ffeeef32b9c950ywan 405233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ref_frame_flags; 406233d2500723e5594f3e7c70896ffeeef32b9c950ywan 407233d2500723e5594f3e7c70896ffeeef32b9c950ywan SPEED_FEATURES sf; 408233d2500723e5594f3e7c70896ffeeef32b9c950ywan 409233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int max_mv_magnitude; 410233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_step_param; 411233d2500723e5594f3e7c70896ffeeef32b9c950ywan 412233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Default value is 1. From first pass stats, encode_breakout may be disabled. 413233d2500723e5594f3e7c70896ffeeef32b9c950ywan ENCODE_BREAKOUT_TYPE allow_encode_breakout; 414233d2500723e5594f3e7c70896ffeeef32b9c950ywan 415233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Get threshold from external input. In real time mode, it can be 416233d2500723e5594f3e7c70896ffeeef32b9c950ywan // overwritten according to encoding speed. 417233d2500723e5594f3e7c70896ffeeef32b9c950ywan int encode_breakout; 418233d2500723e5594f3e7c70896ffeeef32b9c950ywan 419233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *segmentation_map; 420233d2500723e5594f3e7c70896ffeeef32b9c950ywan 421233d2500723e5594f3e7c70896ffeeef32b9c950ywan // segment threashold for encode breakout 422233d2500723e5594f3e7c70896ffeeef32b9c950ywan int segment_encode_breakout[MAX_SEGMENTS]; 423233d2500723e5594f3e7c70896ffeeef32b9c950ywan 424233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *complexity_map; 425233d2500723e5594f3e7c70896ffeeef32b9c950ywan 426233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *active_map; 427233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int active_map_enabled; 428233d2500723e5594f3e7c70896ffeeef32b9c950ywan 429233d2500723e5594f3e7c70896ffeeef32b9c950ywan CYCLIC_REFRESH *cyclic_refresh; 430233d2500723e5594f3e7c70896ffeeef32b9c950ywan 431233d2500723e5594f3e7c70896ffeeef32b9c950ywan fractional_mv_step_fp *find_fractional_mv_step; 432233d2500723e5594f3e7c70896ffeeef32b9c950ywan fractional_mv_step_comp_fp *find_fractional_mv_step_comp; 433233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_full_search_fn_t full_search_sad; 434233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_refining_search_fn_t refining_search_sad; 435233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_diamond_search_fn_t diamond_search_sad; 436233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_variance_fn_ptr_t fn_ptr[BLOCK_SIZES]; 437233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t time_receive_data; 438233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t time_compress_data; 439233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t time_pick_lpf; 440233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t time_encode_sb_row; 441233d2500723e5594f3e7c70896ffeeef32b9c950ywan 442233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct twopass_rc twopass; 443233d2500723e5594f3e7c70896ffeeef32b9c950ywan 444233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG alt_ref_buffer; 445233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS]; 446233d2500723e5594f3e7c70896ffeeef32b9c950ywan int fixed_divide[512]; 447233d2500723e5594f3e7c70896ffeeef32b9c950ywan 448233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_INTERNAL_STATS 449233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int mode_chosen_counts[MAX_MODES]; 450233d2500723e5594f3e7c70896ffeeef32b9c950ywan 451233d2500723e5594f3e7c70896ffeeef32b9c950ywan int count; 452233d2500723e5594f3e7c70896ffeeef32b9c950ywan double total_y; 453233d2500723e5594f3e7c70896ffeeef32b9c950ywan double total_u; 454233d2500723e5594f3e7c70896ffeeef32b9c950ywan double total_v; 455233d2500723e5594f3e7c70896ffeeef32b9c950ywan double total; 456233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t total_sq_error; 457233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t total_samples; 458233d2500723e5594f3e7c70896ffeeef32b9c950ywan 459233d2500723e5594f3e7c70896ffeeef32b9c950ywan double totalp_y; 460233d2500723e5594f3e7c70896ffeeef32b9c950ywan double totalp_u; 461233d2500723e5594f3e7c70896ffeeef32b9c950ywan double totalp_v; 462233d2500723e5594f3e7c70896ffeeef32b9c950ywan double totalp; 463233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t totalp_sq_error; 464233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t totalp_samples; 465233d2500723e5594f3e7c70896ffeeef32b9c950ywan 466233d2500723e5594f3e7c70896ffeeef32b9c950ywan int bytes; 467233d2500723e5594f3e7c70896ffeeef32b9c950ywan double summed_quality; 468233d2500723e5594f3e7c70896ffeeef32b9c950ywan double summed_weights; 469233d2500723e5594f3e7c70896ffeeef32b9c950ywan double summedp_quality; 470233d2500723e5594f3e7c70896ffeeef32b9c950ywan double summedp_weights; 471233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int tot_recode_hits; 472233d2500723e5594f3e7c70896ffeeef32b9c950ywan 473233d2500723e5594f3e7c70896ffeeef32b9c950ywan 474233d2500723e5594f3e7c70896ffeeef32b9c950ywan double total_ssimg_y; 475233d2500723e5594f3e7c70896ffeeef32b9c950ywan double total_ssimg_u; 476233d2500723e5594f3e7c70896ffeeef32b9c950ywan double total_ssimg_v; 477233d2500723e5594f3e7c70896ffeeef32b9c950ywan double total_ssimg_all; 478233d2500723e5594f3e7c70896ffeeef32b9c950ywan 479233d2500723e5594f3e7c70896ffeeef32b9c950ywan int b_calculate_ssimg; 480233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 481233d2500723e5594f3e7c70896ffeeef32b9c950ywan int b_calculate_psnr; 482233d2500723e5594f3e7c70896ffeeef32b9c950ywan 483233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Per MB activity measurement 484233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int activity_avg; 485233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int *mb_activity_map; 486233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *mb_norm_activity_map; 487233d2500723e5594f3e7c70896ffeeef32b9c950ywan 488233d2500723e5594f3e7c70896ffeeef32b9c950ywan int droppable; 489233d2500723e5594f3e7c70896ffeeef32b9c950ywan 490233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dummy_packing; /* flag to indicate if packing is dummy */ 491233d2500723e5594f3e7c70896ffeeef32b9c950ywan 492233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int tx_stepdown_count[TX_SIZES]; 493233d2500723e5594f3e7c70896ffeeef32b9c950ywan 494233d2500723e5594f3e7c70896ffeeef32b9c950ywan int initial_width; 495233d2500723e5594f3e7c70896ffeeef32b9c950ywan int initial_height; 496233d2500723e5594f3e7c70896ffeeef32b9c950ywan 497233d2500723e5594f3e7c70896ffeeef32b9c950ywan int use_svc; 498233d2500723e5594f3e7c70896ffeeef32b9c950ywan 499233d2500723e5594f3e7c70896ffeeef32b9c950ywan SVC svc; 500233d2500723e5594f3e7c70896ffeeef32b9c950ywan 501233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 502233d2500723e5594f3e7c70896ffeeef32b9c950ywan // ARF tracking variables. 503233d2500723e5594f3e7c70896ffeeef32b9c950ywan int multi_arf_enabled; 504233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int frame_coding_order_period; 505233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int new_frame_coding_order_period; 506233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frame_coding_order[MAX_LAG_BUFFERS * 2]; 507233d2500723e5594f3e7c70896ffeeef32b9c950ywan int arf_buffer_idx[MAX_LAG_BUFFERS * 3 / 2]; 508233d2500723e5594f3e7c70896ffeeef32b9c950ywan int arf_weight[MAX_LAG_BUFFERS]; 509233d2500723e5594f3e7c70896ffeeef32b9c950ywan int arf_buffered; 510233d2500723e5594f3e7c70896ffeeef32b9c950ywan int this_frame_weight; 511233d2500723e5594f3e7c70896ffeeef32b9c950ywan int max_arf_level; 512233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 513233d2500723e5594f3e7c70896ffeeef32b9c950ywan 514233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef MODE_TEST_HIT_STATS 515233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Debug / test stats 516233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t mode_test_hits[BLOCK_SIZES]; 517233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 518233d2500723e5594f3e7c70896ffeeef32b9c950ywan} VP9_COMP; 519233d2500723e5594f3e7c70896ffeeef32b9c950ywan 520233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_initialize_enc(); 521233d2500723e5594f3e7c70896ffeeef32b9c950ywan 522233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct VP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf); 523233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_remove_compressor(VP9_COMP *cpi); 524233d2500723e5594f3e7c70896ffeeef32b9c950ywan 525233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_change_config(VP9_COMP *cpi, const VP9_CONFIG *oxcf); 526233d2500723e5594f3e7c70896ffeeef32b9c950ywan 527233d2500723e5594f3e7c70896ffeeef32b9c950ywan // receive a frames worth of data. caller can assume that a copy of this 528233d2500723e5594f3e7c70896ffeeef32b9c950ywan // frame is made and not just a copy of the pointer.. 529233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags, 530233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *sd, int64_t time_stamp, 531233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t end_time_stamp); 532233d2500723e5594f3e7c70896ffeeef32b9c950ywan 533233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, 534233d2500723e5594f3e7c70896ffeeef32b9c950ywan size_t *size, uint8_t *dest, 535233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t *time_stamp, int64_t *time_end, int flush); 536233d2500723e5594f3e7c70896ffeeef32b9c950ywan 537233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest, 538233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_ppflags_t *flags); 539233d2500723e5594f3e7c70896ffeeef32b9c950ywan 540233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags); 541233d2500723e5594f3e7c70896ffeeef32b9c950ywan 542233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags); 543233d2500723e5594f3e7c70896ffeeef32b9c950ywan 544233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag, 545233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *sd); 546233d2500723e5594f3e7c70896ffeeef32b9c950ywan 547233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_get_reference_enc(VP9_COMP *cpi, int index, 548233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG **fb); 549233d2500723e5594f3e7c70896ffeeef32b9c950ywan 550233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag, 551233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *sd); 552233d2500723e5594f3e7c70896ffeeef32b9c950ywan 553233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_update_entropy(VP9_COMP *cpi, int update); 554233d2500723e5594f3e7c70896ffeeef32b9c950ywan 555233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_set_roimap(VP9_COMP *cpi, unsigned char *map, 556233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int rows, unsigned int cols, 557233d2500723e5594f3e7c70896ffeeef32b9c950ywan int delta_q[MAX_SEGMENTS], 558233d2500723e5594f3e7c70896ffeeef32b9c950ywan int delta_lf[MAX_SEGMENTS], 559233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int threshold[MAX_SEGMENTS]); 560233d2500723e5594f3e7c70896ffeeef32b9c950ywan 561233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_set_active_map(VP9_COMP *cpi, unsigned char *map, 562233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int rows, unsigned int cols); 563233d2500723e5594f3e7c70896ffeeef32b9c950ywan 564233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_set_internal_size(VP9_COMP *cpi, 565233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_SCALING horiz_mode, VPX_SCALING vert_mode); 566233d2500723e5594f3e7c70896ffeeef32b9c950ywan 567233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_set_size_literal(VP9_COMP *cpi, unsigned int width, 568233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int height); 569233d2500723e5594f3e7c70896ffeeef32b9c950ywan 570233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_set_svc(VP9_COMP *cpi, int use_svc); 571233d2500723e5594f3e7c70896ffeeef32b9c950ywan 572233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_get_quantizer(struct VP9_COMP *cpi); 573233d2500723e5594f3e7c70896ffeeef32b9c950ywan 574233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic INLINE int get_ref_frame_idx(const VP9_COMP *cpi, 575233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV_REFERENCE_FRAME ref_frame) { 576233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ref_frame == LAST_FRAME) { 577233d2500723e5594f3e7c70896ffeeef32b9c950ywan return cpi->lst_fb_idx; 578233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (ref_frame == GOLDEN_FRAME) { 579233d2500723e5594f3e7c70896ffeeef32b9c950ywan return cpi->gld_fb_idx; 580233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 581233d2500723e5594f3e7c70896ffeeef32b9c950ywan return cpi->alt_fb_idx; 582233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 583233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 584233d2500723e5594f3e7c70896ffeeef32b9c950ywan 585233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic INLINE YV12_BUFFER_CONFIG *get_ref_frame_buffer( 586233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_COMP *cpi, MV_REFERENCE_FRAME ref_frame) { 587233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_COMMON * const cm = &cpi->common; 588233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &cm->frame_bufs[cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]] 589233d2500723e5594f3e7c70896ffeeef32b9c950ywan .buf; 590233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 591233d2500723e5594f3e7c70896ffeeef32b9c950ywan 592233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Intra only frames, golden frames (except alt ref overlays) and 593233d2500723e5594f3e7c70896ffeeef32b9c950ywan// alt ref frames tend to be coded at a higher than ambient quality 594233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic INLINE int vp9_frame_is_boosted(const VP9_COMP *cpi) { 595233d2500723e5594f3e7c70896ffeeef32b9c950ywan return frame_is_intra_only(&cpi->common) || cpi->refresh_alt_ref_frame || 596233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref); 597233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 598233d2500723e5594f3e7c70896ffeeef32b9c950ywan 599233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic INLINE int get_token_alloc(int mb_rows, int mb_cols) { 600233d2500723e5594f3e7c70896ffeeef32b9c950ywan // TODO(JBB): make this work for alpha channel and double check we can't 601233d2500723e5594f3e7c70896ffeeef32b9c950ywan // exceed this token count if we have a 32x32 transform crossing a boundary 602233d2500723e5594f3e7c70896ffeeef32b9c950ywan // at a multiple of 16. 603233d2500723e5594f3e7c70896ffeeef32b9c950ywan // mb_rows, cols are in units of 16 pixels. We assume 3 planes all at full 604233d2500723e5594f3e7c70896ffeeef32b9c950ywan // resolution. We assume up to 1 token per pixel, and then allow 605233d2500723e5594f3e7c70896ffeeef32b9c950ywan // a head room of 4. 606233d2500723e5594f3e7c70896ffeeef32b9c950ywan return mb_rows * mb_cols * (16 * 16 * 3 + 4); 607233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 608233d2500723e5594f3e7c70896ffeeef32b9c950ywan 609233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_calc_ss_err(const YV12_BUFFER_CONFIG *source, 610233d2500723e5594f3e7c70896ffeeef32b9c950ywan const YV12_BUFFER_CONFIG *reference); 611233d2500723e5594f3e7c70896ffeeef32b9c950ywan 612233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_alloc_compressor_data(VP9_COMP *cpi); 613233d2500723e5594f3e7c70896ffeeef32b9c950ywan 614233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget); 615233d2500723e5594f3e7c70896ffeeef32b9c950ywan 616233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_compute_qdelta_by_rate(VP9_COMP *cpi, int base_q_index, 617233d2500723e5594f3e7c70896ffeeef32b9c950ywan double rate_target_ratio); 618233d2500723e5594f3e7c70896ffeeef32b9c950ywan 619233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_scale_references(VP9_COMP *cpi); 620233d2500723e5594f3e7c70896ffeeef32b9c950ywan 621233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_update_reference_frames(VP9_COMP *cpi); 622233d2500723e5594f3e7c70896ffeeef32b9c950ywan 623233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern const int q_trans[]; 624233d2500723e5594f3e7c70896ffeeef32b9c950ywan 625233d2500723e5594f3e7c70896ffeeef32b9c950ywanint64_t vp9_rescale(int64_t val, int64_t num, int denom); 626233d2500723e5594f3e7c70896ffeeef32b9c950ywan 627233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic INLINE void set_ref_ptrs(VP9_COMMON *cm, MACROBLOCKD *xd, 628233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV_REFERENCE_FRAME ref0, 629233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV_REFERENCE_FRAME ref1) { 630233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->block_refs[0] = &cm->frame_refs[ref0 >= LAST_FRAME ? ref0 - LAST_FRAME 631233d2500723e5594f3e7c70896ffeeef32b9c950ywan : 0]; 632233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->block_refs[1] = &cm->frame_refs[ref1 >= LAST_FRAME ? ref1 - LAST_FRAME 633233d2500723e5594f3e7c70896ffeeef32b9c950ywan : 0]; 634233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 635233d2500723e5594f3e7c70896ffeeef32b9c950ywan 636233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 637233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // extern "C" 638233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 639233d2500723e5594f3e7c70896ffeeef32b9c950ywan 640233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // VP9_ENCODER_VP9_ONYX_INT_H_ 641