1/*
2 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11
12#ifndef VP9_ENCODER_VP9_ONYX_INT_H_
13#define VP9_ENCODER_VP9_ONYX_INT_H_
14
15#include <stdio.h>
16#include "./vpx_config.h"
17#include "vp9/common/vp9_onyx.h"
18#include "vp9/encoder/vp9_treewriter.h"
19#include "vp9/encoder/vp9_tokenize.h"
20#include "vp9/common/vp9_onyxc_int.h"
21#include "vp9/encoder/vp9_variance.h"
22#include "vp9/encoder/vp9_encodemb.h"
23#include "vp9/encoder/vp9_quantize.h"
24#include "vp9/common/vp9_entropy.h"
25#include "vp9/common/vp9_entropymode.h"
26#include "vpx_ports/mem.h"
27#include "vpx/internal/vpx_codec_internal.h"
28#include "vp9/encoder/vp9_mcomp.h"
29#include "vp9/common/vp9_findnearmv.h"
30#include "vp9/encoder/vp9_lookahead.h"
31
32// Experimental rate control switches
33#if CONFIG_ONESHOTQ
34#define ONE_SHOT_Q_ESTIMATE 0
35#define STRICT_ONE_SHOT_Q 0
36#define DISABLE_RC_LONG_TERM_MEM 0
37#endif
38
39// #define MODE_TEST_HIT_STATS
40
41// #define SPEEDSTATS 1
42#if CONFIG_MULTIPLE_ARF
43// Set MIN_GF_INTERVAL to 1 for the full decomposition.
44#define MIN_GF_INTERVAL             2
45#else
46#define MIN_GF_INTERVAL             4
47#endif
48#define DEFAULT_GF_INTERVAL         7
49
50#define KEY_FRAME_CONTEXT 5
51
52#define MAX_MODES 36
53
54#define MIN_THRESHMULT  32
55#define MAX_THRESHMULT  512
56
57#define GF_ZEROMV_ZBIN_BOOST 0
58#define LF_ZEROMV_ZBIN_BOOST 0
59#define MV_ZBIN_BOOST        0
60#define SPLIT_MV_ZBIN_BOOST  0
61#define INTRA_ZBIN_BOOST     0
62
63typedef struct {
64  nmv_context nmvc;
65  int nmvjointcost[MV_JOINTS];
66  int nmvcosts[2][MV_VALS];
67  int nmvcosts_hp[2][MV_VALS];
68
69  vp9_prob segment_pred_probs[PREDICTION_PROBS];
70  vp9_prob intra_inter_prob[INTRA_INTER_CONTEXTS];
71  vp9_prob comp_inter_prob[COMP_INTER_CONTEXTS];
72  vp9_prob single_ref_prob[REF_CONTEXTS][2];
73  vp9_prob comp_ref_prob[REF_CONTEXTS];
74
75  unsigned char *last_frame_seg_map_copy;
76
77  // 0 = Intra, Last, GF, ARF
78  signed char last_ref_lf_deltas[MAX_REF_LF_DELTAS];
79  // 0 = ZERO_MV, MV
80  signed char last_mode_lf_deltas[MAX_MODE_LF_DELTAS];
81
82  vp9_coeff_probs_model coef_probs[TX_SIZES][BLOCK_TYPES];
83
84  vp9_prob y_mode_prob[4][INTRA_MODES - 1];
85  vp9_prob uv_mode_prob[INTRA_MODES][INTRA_MODES - 1];
86  vp9_prob partition_prob[2][NUM_PARTITION_CONTEXTS][PARTITION_TYPES - 1];
87
88  vp9_prob switchable_interp_prob[SWITCHABLE_FILTERS + 1]
89                                 [SWITCHABLE_FILTERS - 1];
90
91  int inter_mode_counts[INTER_MODE_CONTEXTS][INTER_MODES - 1][2];
92  vp9_prob inter_mode_probs[INTER_MODE_CONTEXTS][INTER_MODES - 1];
93
94  struct tx_probs tx_probs;
95  vp9_prob mbskip_probs[MBSKIP_CONTEXTS];
96} CODING_CONTEXT;
97
98typedef struct {
99  double frame;
100  double intra_error;
101  double coded_error;
102  double sr_coded_error;
103  double ssim_weighted_pred_err;
104  double pcnt_inter;
105  double pcnt_motion;
106  double pcnt_second_ref;
107  double pcnt_neutral;
108  double MVr;
109  double mvr_abs;
110  double MVc;
111  double mvc_abs;
112  double MVrv;
113  double MVcv;
114  double mv_in_out_count;
115  double new_mv_count;
116  double duration;
117  double count;
118} FIRSTPASS_STATS;
119
120typedef struct {
121  int frames_so_far;
122  double frame_intra_error;
123  double frame_coded_error;
124  double frame_pcnt_inter;
125  double frame_pcnt_motion;
126  double frame_mvr;
127  double frame_mvr_abs;
128  double frame_mvc;
129  double frame_mvc_abs;
130} ONEPASS_FRAMESTATS;
131
132typedef struct {
133  struct {
134    int err;
135    union {
136      int_mv mv;
137      MB_PREDICTION_MODE mode;
138    } m;
139  } ref[MAX_REF_FRAMES];
140} MBGRAPH_MB_STATS;
141
142typedef struct {
143  MBGRAPH_MB_STATS *mb_stats;
144} MBGRAPH_FRAME_STATS;
145
146// This enumerator type needs to be kept aligned with the mode order in
147// const MODE_DEFINITION vp9_mode_order[MAX_MODES] used in the rd code.
148typedef enum {
149  THR_NEARESTMV,
150  THR_NEARESTA,
151  THR_NEARESTG,
152
153  THR_DC,
154
155  THR_NEWMV,
156  THR_NEWA,
157  THR_NEWG,
158
159  THR_NEARMV,
160  THR_NEARA,
161  THR_COMP_NEARESTLA,
162  THR_COMP_NEARESTGA,
163
164  THR_TM,
165
166  THR_COMP_NEARLA,
167  THR_COMP_NEWLA,
168  THR_NEARG,
169  THR_COMP_NEARGA,
170  THR_COMP_NEWGA,
171
172  THR_SPLITMV,
173  THR_SPLITG,
174  THR_SPLITA,
175  THR_COMP_SPLITLA,
176  THR_COMP_SPLITGA,
177
178  THR_ZEROMV,
179  THR_ZEROG,
180  THR_ZEROA,
181  THR_COMP_ZEROLA,
182  THR_COMP_ZEROGA,
183
184  THR_B_PRED,
185  THR_H_PRED,
186  THR_V_PRED,
187  THR_D135_PRED,
188  THR_D207_PRED,
189  THR_D153_PRED,
190  THR_D63_PRED,
191  THR_D117_PRED,
192  THR_D45_PRED,
193} THR_MODES;
194
195typedef enum {
196  DIAMOND = 0,
197  NSTEP = 1,
198  HEX = 2,
199  BIGDIA = 3,
200  SQUARE = 4
201} SEARCH_METHODS;
202
203typedef enum {
204  USE_FULL_RD = 0,
205  USE_LARGESTINTRA,
206  USE_LARGESTINTRA_MODELINTER,
207  USE_LARGESTALL
208} TX_SIZE_SEARCH_METHOD;
209
210typedef enum {
211  // Values should be powers of 2 so that they can be selected as bits of
212  // an integer flags field
213
214  // terminate search early based on distortion so far compared to
215  // qp step, distortion in the neighborhood of the frame, etc.
216  FLAG_EARLY_TERMINATE = 1,
217
218  // skips comp inter modes if the best so far is an intra mode
219  FLAG_SKIP_COMP_BESTINTRA = 2,
220
221  // skips comp inter modes if the best single intermode so far does
222  // not have the same reference as one of the two references being
223  // tested
224  FLAG_SKIP_COMP_REFMISMATCH = 4,
225
226  // skips oblique intra modes if the best so far is an inter mode
227  FLAG_SKIP_INTRA_BESTINTER = 8,
228
229  // skips oblique intra modes  at angles 27, 63, 117, 153 if the best
230  // intra so far is not one of the neighboring directions
231  FLAG_SKIP_INTRA_DIRMISMATCH = 16,
232
233  // skips intra modes other than DC_PRED if the source variance
234  // is small
235  FLAG_SKIP_INTRA_LOWVAR = 32,
236} MODE_SEARCH_SKIP_LOGIC;
237
238typedef enum {
239  SUBPEL_ITERATIVE = 0,
240  SUBPEL_TREE = 1,
241  // Other methods to come
242} SUBPEL_SEARCH_METHODS;
243
244#define ALL_INTRA_MODES 0x3FF
245#define INTRA_DC_ONLY 0x01
246#define INTRA_DC_TM ((1 << TM_PRED) | (1 << DC_PRED))
247#define INTRA_DC_TM_H_V (INTRA_DC_TM | (1 << V_PRED) | (1 << H_PRED))
248
249typedef struct {
250  int RD;
251  SEARCH_METHODS search_method;
252  int auto_filter;
253  int recode_loop;
254  SUBPEL_SEARCH_METHODS subpel_search_method;
255  int subpel_iters_per_step;
256  int thresh_mult[MAX_MODES];
257  int max_step_search_steps;
258  int reduce_first_step_size;
259  int auto_mv_step_size;
260  int optimize_coefficients;
261  int static_segmentation;
262  int comp_inter_joint_search_thresh;
263  int adaptive_rd_thresh;
264  int skip_encode_sb;
265  int skip_encode_frame;
266  int use_lastframe_partitioning;
267  TX_SIZE_SEARCH_METHOD tx_size_search_method;
268  int use_lp32x32fdct;
269  int use_avoid_tested_higherror;
270  int skip_lots_of_modes;
271  int partition_by_variance;
272  int use_one_partition_size_always;
273  int less_rectangular_check;
274  int use_square_partition_only;
275  int mode_skip_start;
276  int reference_masking;
277  BLOCK_SIZE always_this_block_size;
278  int auto_min_max_partition_size;
279  int auto_min_max_partition_interval;
280  int auto_min_max_partition_count;
281  BLOCK_SIZE min_partition_size;
282  BLOCK_SIZE max_partition_size;
283  int adjust_partitioning_from_last_frame;
284  int last_partitioning_redo_frequency;
285  int disable_splitmv;
286  int using_small_partition_info;
287  // TODO(jingning): combine the related motion search speed features
288  int adaptive_motion_search;
289
290  // Implements various heuristics to skip searching modes
291  // The heuristics selected are based on  flags
292  // defined in the MODE_SEARCH_SKIP_HEURISTICS enum
293  unsigned int mode_search_skip_flags;
294  // A source variance threshold below which the split mode is disabled
295  unsigned int disable_split_var_thresh;
296  // A source variance threshold below which filter search is disabled
297  // Choose a very large value (UINT_MAX) to use 8-tap always
298  unsigned int disable_filter_search_var_thresh;
299  int intra_y_mode_mask;
300  int intra_uv_mode_mask;
301  int use_rd_breakout;
302  int use_uv_intra_rd_estimate;
303  int use_fast_lpf_pick;
304  int use_fast_coef_updates;  // 0: 2-loop, 1: 1-loop, 2: 1-loop reduced
305} SPEED_FEATURES;
306
307typedef struct VP9_COMP {
308  DECLARE_ALIGNED(16, int16_t, y_quant[QINDEX_RANGE][8]);
309  DECLARE_ALIGNED(16, int16_t, y_quant_shift[QINDEX_RANGE][8]);
310  DECLARE_ALIGNED(16, int16_t, y_zbin[QINDEX_RANGE][8]);
311  DECLARE_ALIGNED(16, int16_t, y_round[QINDEX_RANGE][8]);
312
313  DECLARE_ALIGNED(16, int16_t, uv_quant[QINDEX_RANGE][8]);
314  DECLARE_ALIGNED(16, int16_t, uv_quant_shift[QINDEX_RANGE][8]);
315  DECLARE_ALIGNED(16, int16_t, uv_zbin[QINDEX_RANGE][8]);
316  DECLARE_ALIGNED(16, int16_t, uv_round[QINDEX_RANGE][8]);
317
318#if CONFIG_ALPHA
319  DECLARE_ALIGNED(16, int16_t, a_quant[QINDEX_RANGE][8]);
320  DECLARE_ALIGNED(16, int16_t, a_quant_shift[QINDEX_RANGE][8]);
321  DECLARE_ALIGNED(16, int16_t, a_zbin[QINDEX_RANGE][8]);
322  DECLARE_ALIGNED(16, int16_t, a_round[QINDEX_RANGE][8]);
323#endif
324
325  MACROBLOCK mb;
326  VP9_COMMON common;
327  VP9_CONFIG oxcf;
328
329  struct lookahead_ctx    *lookahead;
330  struct lookahead_entry  *source;
331#if CONFIG_MULTIPLE_ARF
332  struct lookahead_entry  *alt_ref_source[NUM_REF_FRAMES];
333#else
334  struct lookahead_entry  *alt_ref_source;
335#endif
336
337  YV12_BUFFER_CONFIG *Source;
338  YV12_BUFFER_CONFIG *un_scaled_source;
339  YV12_BUFFER_CONFIG scaled_source;
340
341  unsigned int frames_till_alt_ref_frame;
342  int source_alt_ref_pending; // frame in src_buffers has been identified to be encoded as an alt ref
343  int source_alt_ref_active;  // an alt ref frame has been encoded and is usable
344
345  int is_src_frame_alt_ref;   // source of frame to encode is an exact copy of an alt ref frame
346
347  int gold_is_last; // golden frame same as last frame ( short circuit gold searches)
348  int alt_is_last;  // Alt reference frame same as last ( short circuit altref search)
349  int gold_is_alt;  // don't do both alt and gold search ( just do gold).
350
351  int scaled_ref_idx[3];
352  int lst_fb_idx;
353  int gld_fb_idx;
354  int alt_fb_idx;
355
356  int current_layer;
357  int use_svc;
358
359#if CONFIG_MULTIPLE_ARF
360  int alt_ref_fb_idx[NUM_REF_FRAMES - 3];
361#endif
362  int refresh_last_frame;
363  int refresh_golden_frame;
364  int refresh_alt_ref_frame;
365  YV12_BUFFER_CONFIG last_frame_uf;
366
367  TOKENEXTRA *tok;
368  unsigned int tok_count[4][1 << 6];
369
370
371  unsigned int frames_since_key;
372  unsigned int key_frame_frequency;
373  unsigned int this_key_frame_forced;
374  unsigned int next_key_frame_forced;
375#if CONFIG_MULTIPLE_ARF
376  // Position within a frame coding order (including any additional ARF frames).
377  unsigned int sequence_number;
378  // Next frame in naturally occurring order that has not yet been coded.
379  int next_frame_in_order;
380#endif
381
382  // Ambient reconstruction err target for force key frames
383  int ambient_err;
384
385  unsigned int mode_check_freq[MAX_MODES];
386  unsigned int mode_test_hit_counts[MAX_MODES];
387  unsigned int mode_chosen_counts[MAX_MODES];
388  int64_t mode_skip_mask;
389  int ref_frame_mask;
390  int set_ref_frame_mask;
391
392  int rd_threshes[BLOCK_SIZES][MAX_MODES];
393  int rd_thresh_freq_fact[BLOCK_SIZES][MAX_MODES];
394
395  int64_t rd_comp_pred_diff[NB_PREDICTION_TYPES];
396  // FIXME(rbultje) int64_t?
397  int rd_prediction_type_threshes[4][NB_PREDICTION_TYPES];
398  unsigned int intra_inter_count[INTRA_INTER_CONTEXTS][2];
399  unsigned int comp_inter_count[COMP_INTER_CONTEXTS][2];
400  unsigned int single_ref_count[REF_CONTEXTS][2][2];
401  unsigned int comp_ref_count[REF_CONTEXTS][2];
402
403  int64_t rd_tx_select_diff[TX_MODES];
404  // FIXME(rbultje) can this overflow?
405  int rd_tx_select_threshes[4][TX_MODES];
406
407  int64_t rd_filter_diff[SWITCHABLE_FILTERS + 1];
408  int64_t rd_filter_threshes[4][SWITCHABLE_FILTERS + 1];
409  int64_t rd_filter_cache[SWITCHABLE_FILTERS + 1];
410
411  int RDMULT;
412  int RDDIV;
413
414  CODING_CONTEXT coding_context;
415
416  // Rate targetting variables
417  int this_frame_target;
418  int projected_frame_size;
419  int last_q[2];                   // Separate values for Intra/Inter
420  int last_boosted_qindex;         // Last boosted GF/KF/ARF q
421
422  double rate_correction_factor;
423  double key_frame_rate_correction_factor;
424  double gf_rate_correction_factor;
425
426  unsigned int frames_since_golden;
427  int frames_till_gf_update_due;      // Count down till next GF
428
429  int gf_overspend_bits;            // Total bits overspent becasue of GF boost (cumulative)
430
431  int non_gf_bitrate_adjustment;     // Used in the few frames following a GF to recover the extra bits spent in that GF
432
433  int kf_overspend_bits;            // Extra bits spent on key frames that need to be recovered on inter frames
434  int kf_bitrate_adjustment;        // Current number of bit s to try and recover on each inter frame.
435  int max_gf_interval;
436  int baseline_gf_interval;
437  int active_arnr_frames;           // <= cpi->oxcf.arnr_max_frames
438  int active_arnr_strength;         // <= cpi->oxcf.arnr_max_strength
439
440  int64_t key_frame_count;
441  int prior_key_frame_distance[KEY_FRAME_CONTEXT];
442  int per_frame_bandwidth;          // Current section per frame bandwidth target
443  int av_per_frame_bandwidth;        // Average frame size target for clip
444  int min_frame_bandwidth;          // Minimum allocation that should be used for any frame
445  int inter_frame_target;
446  double output_framerate;
447  int64_t last_time_stamp_seen;
448  int64_t last_end_time_stamp_seen;
449  int64_t first_time_stamp_ever;
450
451  int ni_av_qi;
452  int ni_tot_qi;
453  int ni_frames;
454  int avg_frame_qindex;
455  double tot_q;
456  double avg_q;
457
458  int zbin_mode_boost;
459  int zbin_mode_boost_enabled;
460
461  int64_t total_byte_count;
462
463  int buffered_mode;
464
465  int buffer_level;
466  int bits_off_target;
467
468  int rolling_target_bits;
469  int rolling_actual_bits;
470
471  int long_rolling_target_bits;
472  int long_rolling_actual_bits;
473
474  int64_t total_actual_bits;
475  int total_target_vs_actual;        // debug stats
476
477  int worst_quality;
478  int active_worst_quality;
479  int best_quality;
480  int active_best_quality;
481
482  int cq_target_quality;
483
484  int y_mode_count[4][INTRA_MODES];
485  int y_uv_mode_count[INTRA_MODES][INTRA_MODES];
486  unsigned int partition_count[NUM_PARTITION_CONTEXTS][PARTITION_TYPES];
487
488  nmv_context_counts NMVcount;
489
490  vp9_coeff_count coef_counts[TX_SIZES][BLOCK_TYPES];
491  vp9_coeff_probs_model frame_coef_probs[TX_SIZES][BLOCK_TYPES];
492  vp9_coeff_stats frame_branch_ct[TX_SIZES][BLOCK_TYPES];
493
494  int gfu_boost;
495  int last_boost;
496  int kf_boost;
497  int kf_zeromotion_pct;
498  int gf_zeromotion_pct;
499
500  int64_t target_bandwidth;
501  struct vpx_codec_pkt_list  *output_pkt_list;
502
503#if 0
504  // Experimental code for lagged and one pass
505  ONEPASS_FRAMESTATS one_pass_frame_stats[MAX_LAG_BUFFERS];
506  int one_pass_frame_index;
507#endif
508  MBGRAPH_FRAME_STATS mbgraph_stats[MAX_LAG_BUFFERS];
509  int mbgraph_n_frames;             // number of frames filled in the above
510  int static_mb_pct;                // % forced skip mbs by segmentation
511  int seg0_progress, seg0_idx, seg0_cnt;
512
513  int decimation_factor;
514  int decimation_count;
515
516  // for real time encoding
517  int avg_encode_time;              // microsecond
518  int avg_pick_mode_time;            // microsecond
519  int speed;
520  unsigned int cpu_freq;           // Mhz
521  int compressor_speed;
522
523  int interquantizer;
524  int goldfreq;
525  int auto_worst_q;
526  int cpu_used;
527  int pass;
528
529  vp9_prob last_skip_false_probs[3][MBSKIP_CONTEXTS];
530  int last_skip_probs_q[3];
531
532  int ref_frame_flags;
533
534  SPEED_FEATURES sf;
535  int error_bins[1024];
536
537  unsigned int max_mv_magnitude;
538  int mv_step_param;
539
540  // Data used for real time conferencing mode to help determine if it would be good to update the gf
541  int inter_zz_count;
542  int gf_bad_count;
543  int gf_update_recommended;
544
545  unsigned char *segmentation_map;
546
547  // segment threashold for encode breakout
548  int  segment_encode_breakout[MAX_SEGMENTS];
549
550  unsigned char *active_map;
551  unsigned int active_map_enabled;
552
553  fractional_mv_step_fp *find_fractional_mv_step;
554  fractional_mv_step_comp_fp *find_fractional_mv_step_comp;
555  vp9_full_search_fn_t full_search_sad;
556  vp9_refining_search_fn_t refining_search_sad;
557  vp9_diamond_search_fn_t diamond_search_sad;
558  vp9_variance_fn_ptr_t fn_ptr[BLOCK_SIZES];
559  uint64_t time_receive_data;
560  uint64_t time_compress_data;
561  uint64_t time_pick_lpf;
562  uint64_t time_encode_sb_row;
563
564  struct twopass_rc {
565    unsigned int section_intra_rating;
566    unsigned int next_iiratio;
567    unsigned int this_iiratio;
568    FIRSTPASS_STATS total_stats;
569    FIRSTPASS_STATS this_frame_stats;
570    FIRSTPASS_STATS *stats_in, *stats_in_end, *stats_in_start;
571    FIRSTPASS_STATS total_left_stats;
572    int first_pass_done;
573    int64_t bits_left;
574    int64_t clip_bits_total;
575    double avg_iiratio;
576    double modified_error_total;
577    double modified_error_used;
578    double modified_error_left;
579    double kf_intra_err_min;
580    double gf_intra_err_min;
581    int frames_to_key;
582    int maxq_max_limit;
583    int maxq_min_limit;
584    int static_scene_max_gf_interval;
585    int kf_bits;
586    // Remaining error from uncoded frames in a gf group. Two pass use only
587    int64_t gf_group_error_left;
588
589    // Projected total bits available for a key frame group of frames
590    int64_t kf_group_bits;
591
592    // Error score of frames still to be coded in kf group
593    int64_t kf_group_error_left;
594
595    // Projected Bits available for a group of frames including 1 GF or ARF
596    int64_t gf_group_bits;
597    // Bits for the golden frame or ARF - 2 pass only
598    int gf_bits;
599    int alt_extra_bits;
600
601    int sr_update_lag;
602    double est_max_qcorrection_factor;
603  } twopass;
604
605  YV12_BUFFER_CONFIG alt_ref_buffer;
606  YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS];
607  int fixed_divide[512];
608
609#if CONFIG_INTERNAL_STATS
610  int    count;
611  double total_y;
612  double total_u;
613  double total_v;
614  double total;
615  double total_sq_error;
616  double totalp_y;
617  double totalp_u;
618  double totalp_v;
619  double totalp;
620  double total_sq_error2;
621  int    bytes;
622  double summed_quality;
623  double summed_weights;
624  double summedp_quality;
625  double summedp_weights;
626  unsigned int tot_recode_hits;
627
628
629  double total_ssimg_y;
630  double total_ssimg_u;
631  double total_ssimg_v;
632  double total_ssimg_all;
633
634  int b_calculate_ssimg;
635#endif
636  int b_calculate_psnr;
637
638  // Per MB activity measurement
639  unsigned int activity_avg;
640  unsigned int *mb_activity_map;
641  int *mb_norm_activity_map;
642  int output_partition;
643
644  /* force next frame to intra when kf_auto says so */
645  int force_next_frame_intra;
646
647  int droppable;
648
649  int dummy_packing;    /* flag to indicate if packing is dummy */
650
651  unsigned int switchable_interp_count[SWITCHABLE_FILTERS + 1]
652                                      [SWITCHABLE_FILTERS];
653
654  unsigned int txfm_stepdown_count[TX_SIZES];
655
656  int initial_width;
657  int initial_height;
658
659  int number_spatial_layers;
660  int enable_encode_breakout;   // Default value is 1. From first pass stats,
661                                // encode_breakout may be disabled.
662
663#if CONFIG_MULTIPLE_ARF
664  // ARF tracking variables.
665  int multi_arf_enabled;
666  unsigned int frame_coding_order_period;
667  unsigned int new_frame_coding_order_period;
668  int frame_coding_order[MAX_LAG_BUFFERS * 2];
669  int arf_buffer_idx[MAX_LAG_BUFFERS * 3 / 2];
670  int arf_weight[MAX_LAG_BUFFERS];
671  int arf_buffered;
672  int this_frame_weight;
673  int max_arf_level;
674#endif
675
676#ifdef ENTROPY_STATS
677  int64_t mv_ref_stats[INTER_MODE_CONTEXTS][INTER_MODES - 1][2];
678#endif
679
680
681#ifdef MODE_TEST_HIT_STATS
682  // Debug / test stats
683  int64_t mode_test_hits[BLOCK_SIZES];
684#endif
685} VP9_COMP;
686
687static int get_ref_frame_idx(VP9_COMP *cpi, MV_REFERENCE_FRAME ref_frame) {
688  if (ref_frame == LAST_FRAME) {
689    return cpi->lst_fb_idx;
690  } else if (ref_frame == GOLDEN_FRAME) {
691    return cpi->gld_fb_idx;
692  } else {
693    return cpi->alt_fb_idx;
694  }
695}
696
697static int get_scale_ref_frame_idx(VP9_COMP *cpi,
698                                   MV_REFERENCE_FRAME ref_frame) {
699  if (ref_frame == LAST_FRAME) {
700    return 0;
701  } else if (ref_frame == GOLDEN_FRAME) {
702    return 1;
703  } else {
704    return 2;
705  }
706}
707
708void vp9_encode_frame(VP9_COMP *cpi);
709
710void vp9_pack_bitstream(VP9_COMP *cpi, unsigned char *dest,
711                        unsigned long *size);
712
713void vp9_activity_masking(VP9_COMP *cpi, MACROBLOCK *x);
714
715void vp9_set_speed_features(VP9_COMP *cpi);
716
717extern int vp9_calc_ss_err(YV12_BUFFER_CONFIG *source,
718                           YV12_BUFFER_CONFIG *dest);
719
720extern void vp9_alloc_compressor_data(VP9_COMP *cpi);
721
722#endif  // VP9_ENCODER_VP9_ONYX_INT_H_
723