1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
21184aebb761cbeac9124c37189a80a1a58f04b6bhkuang * 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
115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <math.h>
125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h>
135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <limits.h>
145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vpx_config.h"
165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vpx_scale_rtcd.h"
17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx/internal/vpx_psnr.h"
18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx_ports/vpx_timer.h"
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_alloccommon.h"
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_filter.h"
225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_idct.h"
235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if CONFIG_VP9_POSTPROC
245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_postproc.h"
255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_reconinter.h"
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_systemdependent.h"
285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_tile_common.h"
29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_aq_complexity.h"
316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_aq_cyclicrefresh.h"
326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_aq_variance.h"
33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_bitstream.h"
34a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian#include "vp9/encoder/vp9_encodeframe.h"
35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_encodemv.h"
36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_firstpass.h"
375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_mbgraph.h"
385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_onyx_int.h"
395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_picklpf.h"
40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_ratectrl.h"
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_rdopt.h"
425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_segmentation.h"
436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_speed_features.h"
446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#if CONFIG_INTERNAL_STATS
456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_ssim.h"
466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#endif
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_temporal_filter.h"
48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/encoder/vp9_resize.h"
49a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian#include "vp9/encoder/vp9_svc_layercontext.h"
50a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_coef_tree_initialize();
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define DEFAULT_INTERP_FILTER SWITCHABLE
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define SHARP_FILTER_QTHRESH 0          /* Q threshold for 8-tap sharp filter */
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ALTREF_HIGH_PRECISION_MV 1      // Whether to use high precision mv
585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         //  for altref computation.
595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define HIGH_PRECISION_MV_QTHRESH 200   // Q threshold for high precision
605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         // mv. Choose a very high value for
615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         // now so that HIGH_PRECISION is always
625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         // chosen.
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Max rate target for 1080P and below encodes under normal circumstances
65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB
66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define MAX_MB_RATE 250
67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define MAXRATE_1080P 2025000
68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #define OUTPUT_YUV_REC
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_SRC
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *yuv_file;
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_REC
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *yuv_rec_file;
76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *framepsnr;
80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *kf_list;
81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *keyfile;
82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_init_quantizer(VP9_COMP *cpi);
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) {
8791037db265ecdd914a26e056cf69207b4f50924ehkuang  switch (mode) {
8891037db265ecdd914a26e056cf69207b4f50924ehkuang    case NORMAL:
8991037db265ecdd914a26e056cf69207b4f50924ehkuang      *hr = 1;
9091037db265ecdd914a26e056cf69207b4f50924ehkuang      *hs = 1;
9191037db265ecdd914a26e056cf69207b4f50924ehkuang      break;
9291037db265ecdd914a26e056cf69207b4f50924ehkuang    case FOURFIVE:
9391037db265ecdd914a26e056cf69207b4f50924ehkuang      *hr = 4;
9491037db265ecdd914a26e056cf69207b4f50924ehkuang      *hs = 5;
9591037db265ecdd914a26e056cf69207b4f50924ehkuang      break;
9691037db265ecdd914a26e056cf69207b4f50924ehkuang    case THREEFIVE:
9791037db265ecdd914a26e056cf69207b4f50924ehkuang      *hr = 3;
9891037db265ecdd914a26e056cf69207b4f50924ehkuang      *hs = 5;
9991037db265ecdd914a26e056cf69207b4f50924ehkuang    break;
10091037db265ecdd914a26e056cf69207b4f50924ehkuang    case ONETWO:
10191037db265ecdd914a26e056cf69207b4f50924ehkuang      *hr = 1;
10291037db265ecdd914a26e056cf69207b4f50924ehkuang      *hs = 2;
10391037db265ecdd914a26e056cf69207b4f50924ehkuang    break;
10491037db265ecdd914a26e056cf69207b4f50924ehkuang    default:
10591037db265ecdd914a26e056cf69207b4f50924ehkuang      *hr = 1;
10691037db265ecdd914a26e056cf69207b4f50924ehkuang      *hs = 1;
10791037db265ecdd914a26e056cf69207b4f50924ehkuang       assert(0);
10891037db265ecdd914a26e056cf69207b4f50924ehkuang      break;
10991037db265ecdd914a26e056cf69207b4f50924ehkuang  }
11091037db265ecdd914a26e056cf69207b4f50924ehkuang}
11191037db265ecdd914a26e056cf69207b4f50924ehkuang
112b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
1135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  MACROBLOCK *const mb = &cpi->mb;
114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->common.allow_high_precision_mv = allow_high_precision_mv;
1155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (cpi->common.allow_high_precision_mv) {
116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mb->mvcost = mb->nmvcost_hp;
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mb->mvsadcost = mb->nmvsadcost_hp;
118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mb->mvcost = mb->nmvcost;
120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mb->mvsadcost = mb->nmvsadcost;
121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1246ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void setup_key_frame(VP9_COMP *cpi) {
1256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_setup_past_independence(&cpi->common);
1266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // All buffers are implicitly updated on key frames.
1286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->refresh_golden_frame = 1;
1296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->refresh_alt_ref_frame = 1;
1306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
1316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1326ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void setup_inter_frame(VP9_COMMON *cm) {
1336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cm->error_resilient_mode || cm->intra_only)
1346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_setup_past_independence(cm);
1356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  assert(cm->frame_context_idx < FRAME_CONTEXTS);
1376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cm->fc = cm->frame_contexts[cm->frame_context_idx];
1386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
1396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_initialize_enc() {
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  static int init_done = 0;
142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!init_done) {
1446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_init_neighbors();
1456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_init_quant_tables();
1466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
147b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_coef_tree_initialize();
148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_tokenize_initialize();
149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_init_me_luts();
150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_rc_init_minq_luts();
151b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_entropy_mv_init();
152b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_entropy_mode_init();
153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    init_done = 1;
154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void dealloc_compressor_data(VP9_COMP *cpi) {
158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_COMMON *const cm = &cpi->common;
1596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int i;
160b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Delete sementation map
162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->segmentation_map);
163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->segmentation_map = NULL;
164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_free(cm->last_frame_seg_map);
165b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->last_frame_seg_map = NULL;
166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
167b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->coding_context.last_frame_seg_map_copy = NULL;
168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
169b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_free(cpi->complexity_map);
1706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->complexity_map = NULL;
1716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_cyclic_refresh_free(cpi->cyclic_refresh);
1736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->cyclic_refresh = NULL;
1746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->active_map);
1766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->active_map = NULL;
177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
178b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_free_frame_buffers(cm);
179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_free_frame_buffer(&cpi->last_frame_uf);
181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_free_frame_buffer(&cpi->scaled_source);
1826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_free_frame_buffer(&cpi->scaled_last_source);
183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_free_frame_buffer(&cpi->alt_ref_buffer);
184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_lookahead_destroy(cpi->lookahead);
185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->tok);
187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->tok = 0;
188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Activity mask based per mb zbin adjustments
190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->mb_activity_map);
191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb_activity_map = 0;
192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->mb_norm_activity_map);
193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb_norm_activity_map = 0;
194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
1966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i];
1976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vpx_free(lc->rc_twopass_stats_in.buf);
1986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    lc->rc_twopass_stats_in.buf = NULL;
1996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    lc->rc_twopass_stats_in.sz = 0;
200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2036ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void save_coding_context(VP9_COMP *cpi) {
2046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  CODING_CONTEXT *const cc = &cpi->coding_context;
2056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  VP9_COMMON *cm = &cpi->common;
206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // Stores a snapshot of key state variables which can subsequently be
2086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // restored with a call to vp9_restore_coding_context. These functions are
2096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // intended for use in a re-code loop in vp9_compress_frame where the
2106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // quantizer value is adjusted between loop iterations.
2116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
2126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
2136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);
214b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
216b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
2186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang             cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
219b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
2216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
222b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cc->fc = cm->fc;
2246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
225b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2266ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void restore_coding_context(VP9_COMP *cpi) {
2276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  CODING_CONTEXT *const cc = &cpi->coding_context;
2286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  VP9_COMMON *cm = &cpi->common;
229b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // Restore key state variables to the snapshot state stored in the
2316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // previous call to vp9_save_coding_context.
2326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
2336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
2346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);
235b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
237b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vpx_memcpy(cm->last_frame_seg_map,
2396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang             cpi->coding_context.last_frame_seg_map_copy,
2406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang             (cm->mi_rows * cm->mi_cols));
241b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
2436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
244b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cm->fc = cc->fc;
246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
2476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void configure_static_seg_features(VP9_COMP *cpi) {
249b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_COMMON *const cm = &cpi->common;
250a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  const RATE_CONTROL *const rc = &cpi->rc;
251b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  struct segmentation *const seg = &cm->seg;
252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
253a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  int high_q = (int)(rc->avg_q > 48.0);
254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int qi_delta;
255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Disable and clear down for KF
257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cm->frame_type == KEY_FRAME) {
258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Clear down the global segmentation map
259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
260f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    seg->update_map = 0;
261f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    seg->update_data = 0;
262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->static_mb_pct = 0;
263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Disable segmentation
265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_disable_segmentation(seg);
266ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Clear down the segment features.
268f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    vp9_clearall_segfeatures(seg);
269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else if (cpi->refresh_alt_ref_frame) {
270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // If this is an alt ref frame
271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Clear down the global segmentation map
272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
273f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    seg->update_map = 0;
274f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    seg->update_data = 0;
275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->static_mb_pct = 0;
276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Disable segmentation and individual segment features by default
278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_disable_segmentation(seg);
279f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    vp9_clearall_segfeatures(seg);
280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Scan frames from current to arf frame.
282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // This function re-enables segmentation if appropriate.
283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_update_mbgraph_stats(cpi);
284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // If segmentation was enabled set those features needed for the
286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // arf itself.
287f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    if (seg->enabled) {
288f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      seg->update_map = 1;
289f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      seg->update_data = 1;
290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 0.875);
292a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian      vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2);
293f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
295f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
296f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // Where relevant assume segment data is delta data
299f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      seg->abs_delta = SEGMENT_DELTADATA;
300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
301f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  } else if (seg->enabled) {
302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // All other frames if segmentation has been enabled
303ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // First normal frame in a valid gf or alt ref group
305a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    if (rc->frames_since_golden == 0) {
306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // Set up segment features for normal frames in an arf group
307a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian      if (rc->source_alt_ref_active) {
308f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        seg->update_map = 0;
309f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        seg->update_data = 1;
310f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        seg->abs_delta = SEGMENT_DELTADATA;
311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        qi_delta = vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 1.125);
313a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2);
314f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
316f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
317f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        // Segment coding disabled for compred testing
320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        if (high_q || (cpi->static_mb_pct == 100)) {
321f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang          vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
322f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang          vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
323f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang          vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        }
325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      } else {
326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        // Disable segmentation and clear down features if alt ref
327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        // is not active for this group
328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
329b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        vp9_disable_segmentation(seg);
330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
333f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        seg->update_map = 0;
334f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        seg->update_data = 0;
335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
336f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        vp9_clearall_segfeatures(seg);
337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
338a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    } else if (rc->is_src_frame_alt_ref) {
339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // Special case where we are coding over the top of a previous
340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // alt ref frame.
341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // Segment coding disabled for compred testing
342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // Enable ref frame features for segment 0 as well
344f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME);
345f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // All mbs should use ALTREF_FRAME
348f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME);
349f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_set_segdata(seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
350f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_clear_segdata(seg, 1, SEG_LVL_REF_FRAME);
351f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
352ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // Skip all MBs if high Q (0,0 mv and skip coeffs)
354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (high_q) {
3555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
3565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
35891037db265ecdd914a26e056cf69207b4f50924ehkuang      // Enable data update
359f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      seg->update_data = 1;
360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    } else {
361ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // All other frames.
362ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
363ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // No updates.. leave things as they are.
364f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      seg->update_map = 0;
365f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      seg->update_data = 0;
366ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
367ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
368ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
369ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
370ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// DEBUG: Print out the segment id of each MB in the current frame.
371ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void print_seg_map(VP9_COMP *cpi) {
372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *cm = &cpi->common;
373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int row, col;
374ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int map_index = 0;
375ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FILE *statsfile = fopen("segmap.stt", "a");
376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fprintf(statsfile, "%10d\n", cm->current_video_frame);
378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (row = 0; row < cpi->common.mi_rows; row++) {
380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for (col = 0; col < cpi->common.mi_cols; col++) {
381ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
382ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      map_index++;
383ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fprintf(statsfile, "\n");
385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fprintf(statsfile, "\n");
387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
388ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fclose(statsfile);
389ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void update_reference_segmentation_map(VP9_COMP *cpi) {
392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *const cm = &cpi->common;
393b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible;
394b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *cache_ptr = cm->last_frame_seg_map;
395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int row, col;
396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (row = 0; row < cm->mi_rows; row++) {
398b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    MODE_INFO **mi_8x8 = mi_8x8_ptr;
399b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    uint8_t *cache = cache_ptr;
4001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++)
4011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      cache[0] = mi_8x8[0]->mbmi.segment_id;
4026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    mi_8x8_ptr += cm->mi_stride;
403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cache_ptr += cm->mi_cols;
404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
406b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int is_slowest_mode(int mode) {
407b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return (mode == MODE_SECONDPASS_BEST || mode == MODE_BESTQUALITY);
408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
410b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void set_rd_speed_thresholds(VP9_COMP *cpi) {
411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Set baseline threshold values
414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < MAX_MODES; ++i)
4156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0;
4166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
4176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEARESTMV] = 0;
4186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEARESTG] = 0;
4196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEARESTA] = 0;
4206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
4216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_DC] += 1000;
4226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
4236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEWMV] += 1000;
4246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEWA] += 1000;
4256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEWG] += 1000;
4266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
4276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEARMV] += 1000;
4286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEARA] += 1000;
4296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_COMP_NEARESTLA] += 1000;
4306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_COMP_NEARESTGA] += 1000;
4316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
4326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_TM] += 1000;
4336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
4346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_COMP_NEARLA] += 1500;
4356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_COMP_NEWLA] += 2000;
4366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_NEARG] += 1000;
4376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_COMP_NEARGA] += 1500;
4386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_COMP_NEWGA] += 2000;
4396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
4406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_ZEROMV] += 2000;
4416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_ZEROG] += 2000;
4426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_ZEROA] += 2000;
4436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_COMP_ZEROLA] += 2500;
4446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_COMP_ZEROGA] += 2500;
4456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
4466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_H_PRED] += 2000;
4476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_V_PRED] += 2000;
4486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_D45_PRED ] += 2500;
4496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_D135_PRED] += 2500;
4506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_D117_PRED] += 2500;
4516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_D153_PRED] += 2500;
4526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_D207_PRED] += 2500;
4536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult[THR_D63_PRED] += 2500;
45491037db265ecdd914a26e056cf69207b4f50924ehkuang
455ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* disable frame modes if flags not set */
456ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) {
4576ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEWMV    ] = INT_MAX;
4586ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEARESTMV] = INT_MAX;
4596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_ZEROMV   ] = INT_MAX;
4606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEARMV   ] = INT_MAX;
461ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
462ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) {
4636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEARESTG ] = INT_MAX;
4646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_ZEROG    ] = INT_MAX;
4656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEARG    ] = INT_MAX;
4666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEWG     ] = INT_MAX;
467ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
468ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) {
4696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEARESTA ] = INT_MAX;
4706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_ZEROA    ] = INT_MAX;
4716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEARA    ] = INT_MAX;
4726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_NEWA     ] = INT_MAX;
473ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
474ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
475ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      (VP9_LAST_FLAG | VP9_ALT_FLAG)) {
4776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_COMP_ZEROLA   ] = INT_MAX;
4786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_COMP_NEARESTLA] = INT_MAX;
4796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_COMP_NEARLA   ] = INT_MAX;
4806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_COMP_NEWLA    ] = INT_MAX;
481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      (VP9_GOLD_FLAG | VP9_ALT_FLAG)) {
4846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_COMP_ZEROGA   ] = INT_MAX;
4856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_COMP_NEARESTGA] = INT_MAX;
4866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_COMP_NEARGA   ] = INT_MAX;
4876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult[THR_COMP_NEWGA    ] = INT_MAX;
488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
4895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
4905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
491b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
4926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  const SPEED_FEATURES *const sf = &cpi->sf;
4935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int i;
4945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (i = 0; i < MAX_REFS; ++i)
4966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode)  ? -500 : 0;
49791037db265ecdd914a26e056cf69207b4f50924ehkuang
4986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult_sub8x8[THR_LAST] += 2500;
4996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult_sub8x8[THR_GOLD] += 2500;
5006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult_sub8x8[THR_ALTR] += 2500;
5016ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult_sub8x8[THR_INTRA] += 2500;
5026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] += 4500;
5036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] += 4500;
50491037db265ecdd914a26e056cf69207b4f50924ehkuang
5055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Check for masked out split cases.
5066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  for (i = 0; i < MAX_REFS; i++)
5075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (sf->disable_split_mask & (1 << i))
5086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->rd_thresh_mult_sub8x8[i] = INT_MAX;
5095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // disable mode test if frame flag is not set
5115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG))
5126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult_sub8x8[THR_LAST] = INT_MAX;
5135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG))
5146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult_sub8x8[THR_GOLD] = INT_MAX;
5155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG))
5166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult_sub8x8[THR_ALTR] = INT_MAX;
5175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
5185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (VP9_LAST_FLAG | VP9_ALT_FLAG))
5196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX;
5205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
5215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (VP9_GOLD_FLAG | VP9_ALT_FLAG))
5226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX;
523ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
524ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5256ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void set_speed_features(VP9_COMP *cpi) {
526b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_INTERNAL_STATS
5276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int i;
5285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (i = 0; i < MAX_MODES; ++i)
529ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->mode_chosen_counts[i] = 0;
530b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
531ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_set_speed_features(cpi);
533ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
534ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Set rd thresholds based on mode and speed setting
535b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  set_rd_speed_thresholds(cpi);
536b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  set_rd_speed_thresholds_sub8x8(cpi);
537ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  cpi->mb.fwd_txm4x4 = vp9_fdct4x4;
5395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
5405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    cpi->mb.fwd_txm4x4 = vp9_fwht4x4;
5415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
542ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
544ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void alloc_raw_frame_buffers(VP9_COMP *cpi) {
545ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *cm = &cpi->common;
546b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const VP9_CONFIG *oxcf = &cpi->oxcf;
547ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
548b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height,
549ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                      cm->subsampling_x, cm->subsampling_y,
550b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      oxcf->lag_in_frames);
551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!cpi->lookahead)
552b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
553ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       "Failed to allocate lag buffers");
554ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer,
556b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                               oxcf->width, oxcf->height,
557ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               cm->subsampling_x, cm->subsampling_y,
558b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
559b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
560ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       "Failed to allocate altref buffer");
561ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
562ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
563ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_alloc_compressor_data(VP9_COMP *cpi) {
564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *cm = &cpi->common;
565ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
566ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (vp9_alloc_frame_buffers(cm, cm->width, cm->height))
567b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
568ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       "Failed to allocate frame buffers");
569ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
570ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (vp9_alloc_frame_buffer(&cpi->last_frame_uf,
571ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             cm->width, cm->height,
572ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             cm->subsampling_x, cm->subsampling_y,
573b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                             VP9_ENC_BORDER_IN_PIXELS))
574b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
575ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       "Failed to allocate last frame buffer");
576ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
577ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (vp9_alloc_frame_buffer(&cpi->scaled_source,
578ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             cm->width, cm->height,
579ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             cm->subsampling_x, cm->subsampling_y,
580b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                             VP9_ENC_BORDER_IN_PIXELS))
581b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
582ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       "Failed to allocate scaled source buffer");
583ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (vp9_alloc_frame_buffer(&cpi->scaled_last_source,
5856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                             cm->width, cm->height,
5866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                             cm->subsampling_x, cm->subsampling_y,
5876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                             VP9_ENC_BORDER_IN_PIXELS))
5886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
5896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                       "Failed to allocate scaled last source buffer");
5906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
591ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->tok);
592ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
593ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  {
594ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols);
595ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
59691037db265ecdd914a26e056cf69207b4f50924ehkuang    CHECK_MEM_ERROR(cm, cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
597ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
598ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
599ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->mb_activity_map);
60091037db265ecdd914a26e056cf69207b4f50924ehkuang  CHECK_MEM_ERROR(cm, cpi->mb_activity_map,
601ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                  vpx_calloc(sizeof(unsigned int),
602ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             cm->mb_rows * cm->mb_cols));
603ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
604ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->mb_norm_activity_map);
60591037db265ecdd914a26e056cf69207b4f50924ehkuang  CHECK_MEM_ERROR(cm, cpi->mb_norm_activity_map,
606ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                  vpx_calloc(sizeof(unsigned int),
607ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             cm->mb_rows * cm->mb_cols));
608ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
609ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
610ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
611ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void update_frame_size(VP9_COMP *cpi) {
6126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  VP9_COMMON *const cm = &cpi->common;
6136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  MACROBLOCKD *const xd = &cpi->mb.e_mbd;
614ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
615ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_update_frame_size(cm);
616ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
617ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Update size of buffers local to this frame
618ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (vp9_realloc_frame_buffer(&cpi->last_frame_uf,
619ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               cm->width, cm->height,
620ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               cm->subsampling_x, cm->subsampling_y,
621b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
622b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
623ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       "Failed to reallocate last frame buffer");
624ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
625ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (vp9_realloc_frame_buffer(&cpi->scaled_source,
626ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               cm->width, cm->height,
627ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               cm->subsampling_x, cm->subsampling_y,
628b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
629b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
630ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       "Failed to reallocate scaled source buffer");
631ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
6326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (vp9_realloc_frame_buffer(&cpi->scaled_last_source,
6336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                               cm->width, cm->height,
6346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                               cm->subsampling_x, cm->subsampling_y,
6356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
6366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
6376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                       "Failed to reallocate scaled last source buffer");
6386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
639ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  {
640ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int y_stride = cpi->scaled_source.y_stride;
641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
642ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cpi->sf.search_method == NSTEP) {
643ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_init3smotion_compensation(&cpi->mb, y_stride);
644ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    } else if (cpi->sf.search_method == DIAMOND) {
645ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_init_dsmotion_compensation(&cpi->mb, y_stride);
646ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
647ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
6485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  init_macroblockd(cm, xd);
650ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
651ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
652ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// Table that converts 0-63 Q range values passed in outside to the Qindex
653ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// range used internally.
654a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianconst int q_trans[] = {
655ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  0,    4,   8,  12,  16,  20,  24,  28,
656ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  32,   36,  40,  44,  48,  52,  56,  60,
657ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  64,   68,  72,  76,  80,  84,  88,  92,
658ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  96,  100, 104, 108, 112, 116, 120, 124,
659ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  128, 132, 136, 140, 144, 148, 152, 156,
660ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  160, 164, 168, 172, 176, 180, 184, 188,
661ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  192, 196, 200, 204, 208, 212, 216, 220,
662ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  224, 228, 232, 236, 240, 244, 249, 255,
663ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
664ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
665ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_reverse_trans(int x) {
666ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
667ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
668ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < 64; i++)
669ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (q_trans[i] >= x)
670ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      return i;
671ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
672ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 63;
673ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
674b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
67591037db265ecdd914a26e056cf69207b4f50924ehkuangvoid vp9_new_framerate(VP9_COMP *cpi, double framerate) {
676b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_COMMON *const cm = &cpi->common;
677b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  RATE_CONTROL *const rc = &cpi->rc;
678b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_CONFIG *const oxcf = &cpi->oxcf;
679b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int vbr_max_bits;
680ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
681b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  oxcf->framerate = framerate < 0.1 ? 30 : framerate;
6825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  cpi->output_framerate = cpi->oxcf.framerate;
683b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  rc->av_per_frame_bandwidth = (int)(oxcf->target_bandwidth /
6846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                     cpi->output_framerate);
685b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  rc->min_frame_bandwidth = (int)(rc->av_per_frame_bandwidth *
6866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                  oxcf->two_pass_vbrmin_section / 100);
687b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
688b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS);
689b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
690b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // A maximum bitrate for a frame is defined.
691b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // The baseline for this aligns with HW implementations that
692b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits
693b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // per 16x16 MB (averaged over a frame). However this limit is extended if
694b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // a very high rate is given on the command line or the the rate cannnot
695b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // be acheived because of a user specificed max q (e.g. when the user
696b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // specifies lossless encode.
697b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  //
698b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vbr_max_bits = (int)(((int64_t)rc->av_per_frame_bandwidth *
699b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      oxcf->two_pass_vbrmax_section) / 100);
700b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P),
701b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                vbr_max_bits);
702ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
703ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Set Maximum gf/arf interval
704b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  rc->max_gf_interval = 16;
705ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
706ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Extended interval for genuinely static scenes
707b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  rc->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
708ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
709ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Special conditions when alt ref frame enabled in lagged compress mode
710b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (oxcf->play_alternate && oxcf->lag_in_frames) {
711b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (rc->max_gf_interval > oxcf->lag_in_frames - 1)
712b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      rc->max_gf_interval = oxcf->lag_in_frames - 1;
713ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
714b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1)
715b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1;
716ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
717ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
718b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
719b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    rc->max_gf_interval = rc->static_scene_max_gf_interval;
720ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
721ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
722a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianint64_t vp9_rescale(int64_t val, int64_t num, int denom) {
723ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int64_t llnum = num;
724ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int64_t llden = denom;
725ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int64_t llval = val;
726ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
727ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return (llval * llnum / llden);
728ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
729ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
730ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void set_tile_limits(VP9_COMP *cpi) {
731ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *const cm = &cpi->common;
732ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
73391037db265ecdd914a26e056cf69207b4f50924ehkuang  int min_log2_tile_cols, max_log2_tile_cols;
73491037db265ecdd914a26e056cf69207b4f50924ehkuang  vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
73691037db265ecdd914a26e056cf69207b4f50924ehkuang  cm->log2_tile_cols = clamp(cpi->oxcf.tile_columns,
73791037db265ecdd914a26e056cf69207b4f50924ehkuang                             min_log2_tile_cols, max_log2_tile_cols);
73891037db265ecdd914a26e056cf69207b4f50924ehkuang  cm->log2_tile_rows = cpi->oxcf.tile_rows;
739ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
740ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
741b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void init_config(struct VP9_COMP *cpi, VP9_CONFIG *oxcf) {
742ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *const cm = &cpi->common;
743ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
744ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
745ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->oxcf = *oxcf;
746ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
7476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cm->profile = oxcf->profile;
7486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cm->bit_depth = oxcf->bit_depth;
749ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
750ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->width = oxcf->width;
751ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->height = oxcf->height;
752ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->subsampling_x = 0;
753ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->subsampling_y = 0;
754ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_alloc_compressor_data(cpi);
755ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
756b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Spatial scalability.
757b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
758b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Temporal scalability.
759b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
760b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
7616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if ((cpi->svc.number_temporal_layers > 1 &&
7626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
7636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      (cpi->svc.number_spatial_layers > 1 &&
7646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->oxcf.mode == MODE_SECONDPASS_BEST)) {
765a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    vp9_init_layer_context(cpi);
766b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
767b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
768ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // change includes all joint functionality
769b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_change_config(cpi, oxcf);
770ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
771ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->static_mb_pct = 0;
772ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
773ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->lst_fb_idx = 0;
774ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->gld_fb_idx = 1;
775ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->alt_fb_idx = 2;
776ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
777ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  set_tile_limits(cpi);
778ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
779ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->fixed_divide[0] = 0;
780ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 1; i < 512; i++)
781ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fixed_divide[i] = 0x80000 / i;
782ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
783ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
7846ac915abcdb404a00d927fe6308a47fcf09d9519hkuangvoid vp9_change_config(struct VP9_COMP *cpi, const VP9_CONFIG *oxcf) {
785ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *const cm = &cpi->common;
7866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  RATE_CONTROL *const rc = &cpi->rc;
787ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
7886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cm->profile != oxcf->profile)
7896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cm->profile = oxcf->profile;
7906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cm->bit_depth = oxcf->bit_depth;
791ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
7926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cm->profile <= PROFILE_1)
7936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    assert(cm->bit_depth == BITS_8);
7946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  else
7956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    assert(cm->bit_depth > BITS_8);
796ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
797ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->oxcf = *oxcf;
798ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
799b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->oxcf.cpu_used == -6)
800b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->oxcf.play_alternate = 0;
801b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
802b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  switch (cpi->oxcf.mode) {
803ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // Real time and one pass deprecated in test code base
8045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case MODE_GOODQUALITY:
8055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      cpi->pass = 0;
8065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5);
8075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
8085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
809b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    case MODE_BESTQUALITY:
810b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->pass = 0;
811b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      break;
812b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
813ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    case MODE_FIRSTPASS:
814ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->pass = 1;
815ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      break;
816ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
817ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    case MODE_SECONDPASS:
818ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->pass = 2;
819ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5);
820ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      break;
821ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
822ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    case MODE_SECONDPASS_BEST:
823ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->pass = 2;
824b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      break;
825b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
826b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    case MODE_REALTIME:
827b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->pass = 0;
828ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      break;
829ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
830ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
831ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->oxcf.lossless = oxcf->lossless;
8326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cpi->oxcf.lossless) {
8336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    // In lossless mode, make sure right quantizer range and correct transform
8346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    // is set.
8356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->oxcf.worst_allowed_q = 0;
8366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->oxcf.best_allowed_q = 0;
8376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->mb.e_mbd.itxm_add = vp9_iwht4x4_add;
8386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  } else {
8396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->mb.e_mbd.itxm_add = vp9_idct4x4_add;
8406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
8416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
842ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
843ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
844ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->refresh_golden_frame = 0;
845ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->refresh_last_frame = 1;
846ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->refresh_frame_context = 1;
847ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->reset_frame_context = 0;
848ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
849b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_reset_segment_features(&cm->seg);
850b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  set_high_precision_mv(cpi, 0);
851ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
852ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  {
853ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int i;
854ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
85591037db265ecdd914a26e056cf69207b4f50924ehkuang    for (i = 0; i < MAX_SEGMENTS; i++)
856ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
857ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
858b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->encode_breakout = cpi->oxcf.encode_breakout;
859ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
860ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // local file playback mode == really big buffer
861ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) {
862ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->oxcf.starting_buffer_level   = 60000;
863ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->oxcf.optimal_buffer_level    = 60000;
864ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->oxcf.maximum_buffer_size     = 240000;
865ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
866ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
867ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Convert target bandwidth from Kbit/s to Bit/s
868ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->oxcf.target_bandwidth       *= 1000;
869ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
870a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  cpi->oxcf.starting_buffer_level =
871a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian      vp9_rescale(cpi->oxcf.starting_buffer_level,
872a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                  cpi->oxcf.target_bandwidth, 1000);
873ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
874ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Set or reset optimal and maximum buffer levels.
875ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->oxcf.optimal_buffer_level == 0)
876ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
877ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else
878a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    cpi->oxcf.optimal_buffer_level =
879a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        vp9_rescale(cpi->oxcf.optimal_buffer_level,
880a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                    cpi->oxcf.target_bandwidth, 1000);
881ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
882ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->oxcf.maximum_buffer_size == 0)
883ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
884ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else
885a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    cpi->oxcf.maximum_buffer_size =
886a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        vp9_rescale(cpi->oxcf.maximum_buffer_size,
887a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                    cpi->oxcf.target_bandwidth, 1000);
888b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Under a configuration change, where maximum_buffer_size may change,
889b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // keep buffer level clipped to the maximum allowed buffer size.
8906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  rc->bits_off_target = MIN(rc->bits_off_target, cpi->oxcf.maximum_buffer_size);
8916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  rc->buffer_level = MIN(rc->buffer_level, cpi->oxcf.maximum_buffer_size);
892ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
893ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Set up frame rate and related parameters rate control values.
89491037db265ecdd914a26e056cf69207b4f50924ehkuang  vp9_new_framerate(cpi, cpi->oxcf.framerate);
895ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
896ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Set absolute upper and lower quality limits
8976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  rc->worst_quality = cpi->oxcf.worst_allowed_q;
8986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  rc->best_quality = cpi->oxcf.best_allowed_q;
899ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
900ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // active values should only be modified if out of new range
901ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
902ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->cq_target_quality = cpi->oxcf.cq_level;
903ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
904b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->interp_filter = DEFAULT_INTERP_FILTER;
905ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
906ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->display_width = cpi->oxcf.width;
907ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->display_height = cpi->oxcf.height;
908ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
909ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
910b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->oxcf.sharpness = MIN(7, cpi->oxcf.sharpness);
911ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
912b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->common.lf.sharpness_level = cpi->oxcf.sharpness;
913ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
914ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->initial_width) {
915ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Increasing the size of the frame beyond the first seen frame, or some
916b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // otherwise signaled maximum size, is not supported.
917ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // TODO(jkoleszar): exit gracefully.
918ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    assert(cm->width <= cpi->initial_width);
919ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    assert(cm->height <= cpi->initial_height);
920ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
921ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  update_frame_size(cpi);
922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
9236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if ((cpi->svc.number_temporal_layers > 1 &&
9246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
9256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) {
926a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    vp9_update_layer_context_change_config(cpi,
927a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian                                           (int)cpi->oxcf.target_bandwidth);
928ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
929ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
930b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->speed = abs(cpi->oxcf.cpu_used);
931ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
932b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Limit on lag buffers as these are not currently dynamically allocated.
933b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
934ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
935ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
936ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_zero(cpi->alt_ref_source);
938ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
939ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->alt_ref_source = NULL;
940ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
9416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  rc->is_src_frame_alt_ref = 0;
942ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
943ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0
944ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Experimental RD Code
945ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->frame_distortion = 0;
946ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->last_frame_distortion = 0;
947ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
948ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
949ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  set_tile_limits(cpi);
950b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
951b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->ext_refresh_frame_flags_pending = 0;
952b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->ext_refresh_frame_context_pending = 0;
953ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
954ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
955ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define M_LOG2_E 0.693147180559945309417
956ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define log2f(x) (log (x) / (float) M_LOG2_E)
957ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void cal_nmvjointsadcost(int *mvjointsadcost) {
959ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  mvjointsadcost[0] = 600;
960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  mvjointsadcost[1] = 300;
961ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  mvjointsadcost[2] = 300;
9626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  mvjointsadcost[3] = 300;
963ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
964ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
965ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void cal_nmvsadcosts(int *mvsadcost[2]) {
966ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i = 1;
967ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
968ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  mvsadcost[0][0] = 0;
969ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  mvsadcost[1][0] = 0;
970ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
971ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
972ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    double z = 256 * (2 * (log2f(8 * i) + .6));
973ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mvsadcost[0][i] = (int)z;
974ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mvsadcost[1][i] = (int)z;
975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mvsadcost[0][-i] = (int)z;
976ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mvsadcost[1][-i] = (int)z;
977ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (++i <= MV_MAX);
978ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
979ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
980ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void cal_nmvsadcosts_hp(int *mvsadcost[2]) {
981ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i = 1;
982ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
983ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  mvsadcost[0][0] = 0;
984ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  mvsadcost[1][0] = 0;
985ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
986ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
987ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    double z = 256 * (2 * (log2f(8 * i) + .6));
988ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mvsadcost[0][i] = (int)z;
989ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mvsadcost[1][i] = (int)z;
990ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mvsadcost[0][-i] = (int)z;
991ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    mvsadcost[1][-i] = (int)z;
992ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (++i <= MV_MAX);
993ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
994ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
9959b35249446b07f40ac5fcc3205f2c048616efacchkuangstatic void alloc_mode_context(VP9_COMMON *cm, int num_4x4_blk,
9969b35249446b07f40ac5fcc3205f2c048616efacchkuang                               PICK_MODE_CONTEXT *ctx) {
9979b35249446b07f40ac5fcc3205f2c048616efacchkuang  int num_pix = num_4x4_blk << 4;
9989b35249446b07f40ac5fcc3205f2c048616efacchkuang  int i, k;
9999b35249446b07f40ac5fcc3205f2c048616efacchkuang  ctx->num_4x4_blk = num_4x4_blk;
1000b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
10019b35249446b07f40ac5fcc3205f2c048616efacchkuang  CHECK_MEM_ERROR(cm, ctx->zcoeff_blk,
10029b35249446b07f40ac5fcc3205f2c048616efacchkuang                  vpx_calloc(num_4x4_blk, sizeof(uint8_t)));
10039b35249446b07f40ac5fcc3205f2c048616efacchkuang  for (i = 0; i < MAX_MB_PLANE; ++i) {
10049b35249446b07f40ac5fcc3205f2c048616efacchkuang    for (k = 0; k < 3; ++k) {
10059b35249446b07f40ac5fcc3205f2c048616efacchkuang      CHECK_MEM_ERROR(cm, ctx->coeff[i][k],
10069b35249446b07f40ac5fcc3205f2c048616efacchkuang                      vpx_memalign(16, num_pix * sizeof(int16_t)));
10079b35249446b07f40ac5fcc3205f2c048616efacchkuang      CHECK_MEM_ERROR(cm, ctx->qcoeff[i][k],
10089b35249446b07f40ac5fcc3205f2c048616efacchkuang                      vpx_memalign(16, num_pix * sizeof(int16_t)));
10099b35249446b07f40ac5fcc3205f2c048616efacchkuang      CHECK_MEM_ERROR(cm, ctx->dqcoeff[i][k],
10109b35249446b07f40ac5fcc3205f2c048616efacchkuang                      vpx_memalign(16, num_pix * sizeof(int16_t)));
10119b35249446b07f40ac5fcc3205f2c048616efacchkuang      CHECK_MEM_ERROR(cm, ctx->eobs[i][k],
10129b35249446b07f40ac5fcc3205f2c048616efacchkuang                      vpx_memalign(16, num_pix * sizeof(uint16_t)));
10139b35249446b07f40ac5fcc3205f2c048616efacchkuang      ctx->coeff_pbuf[i][k]   = ctx->coeff[i][k];
10149b35249446b07f40ac5fcc3205f2c048616efacchkuang      ctx->qcoeff_pbuf[i][k]  = ctx->qcoeff[i][k];
10159b35249446b07f40ac5fcc3205f2c048616efacchkuang      ctx->dqcoeff_pbuf[i][k] = ctx->dqcoeff[i][k];
10169b35249446b07f40ac5fcc3205f2c048616efacchkuang      ctx->eobs_pbuf[i][k]    = ctx->eobs[i][k];
10179b35249446b07f40ac5fcc3205f2c048616efacchkuang    }
10189b35249446b07f40ac5fcc3205f2c048616efacchkuang  }
10199b35249446b07f40ac5fcc3205f2c048616efacchkuang}
10209b35249446b07f40ac5fcc3205f2c048616efacchkuang
10219b35249446b07f40ac5fcc3205f2c048616efacchkuangstatic void free_mode_context(PICK_MODE_CONTEXT *ctx) {
10229b35249446b07f40ac5fcc3205f2c048616efacchkuang  int i, k;
10239b35249446b07f40ac5fcc3205f2c048616efacchkuang  vpx_free(ctx->zcoeff_blk);
10249b35249446b07f40ac5fcc3205f2c048616efacchkuang  ctx->zcoeff_blk = 0;
10259b35249446b07f40ac5fcc3205f2c048616efacchkuang  for (i = 0; i < MAX_MB_PLANE; ++i) {
10269b35249446b07f40ac5fcc3205f2c048616efacchkuang    for (k = 0; k < 3; ++k) {
10279b35249446b07f40ac5fcc3205f2c048616efacchkuang      vpx_free(ctx->coeff[i][k]);
10289b35249446b07f40ac5fcc3205f2c048616efacchkuang      ctx->coeff[i][k] = 0;
10299b35249446b07f40ac5fcc3205f2c048616efacchkuang      vpx_free(ctx->qcoeff[i][k]);
10309b35249446b07f40ac5fcc3205f2c048616efacchkuang      ctx->qcoeff[i][k] = 0;
10319b35249446b07f40ac5fcc3205f2c048616efacchkuang      vpx_free(ctx->dqcoeff[i][k]);
10329b35249446b07f40ac5fcc3205f2c048616efacchkuang      ctx->dqcoeff[i][k] = 0;
10339b35249446b07f40ac5fcc3205f2c048616efacchkuang      vpx_free(ctx->eobs[i][k]);
10349b35249446b07f40ac5fcc3205f2c048616efacchkuang      ctx->eobs[i][k] = 0;
10359b35249446b07f40ac5fcc3205f2c048616efacchkuang    }
10369b35249446b07f40ac5fcc3205f2c048616efacchkuang  }
10379b35249446b07f40ac5fcc3205f2c048616efacchkuang}
10389b35249446b07f40ac5fcc3205f2c048616efacchkuang
10395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void init_pick_mode_context(VP9_COMP *cpi) {
10405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int i;
10419b35249446b07f40ac5fcc3205f2c048616efacchkuang  VP9_COMMON *const cm = &cpi->common;
10429b35249446b07f40ac5fcc3205f2c048616efacchkuang  MACROBLOCK *const x  = &cpi->mb;
10439b35249446b07f40ac5fcc3205f2c048616efacchkuang
10445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (i = 0; i < BLOCK_SIZES; ++i) {
10455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
10465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int num_4x4_h = num_4x4_blocks_high_lookup[i];
10475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
10485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (i < BLOCK_16X16) {
10499b35249446b07f40ac5fcc3205f2c048616efacchkuang      for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
10509b35249446b07f40ac5fcc3205f2c048616efacchkuang        for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) {
10519b35249446b07f40ac5fcc3205f2c048616efacchkuang          for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) {
10525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
10539b35249446b07f40ac5fcc3205f2c048616efacchkuang            alloc_mode_context(cm, num_4x4_blk, ctx);
10545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          }
10555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
10565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
10575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (i < BLOCK_32X32) {
10589b35249446b07f40ac5fcc3205f2c048616efacchkuang      for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
10599b35249446b07f40ac5fcc3205f2c048616efacchkuang        for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) {
10605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
10615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ctx->num_4x4_blk = num_4x4_blk;
10629b35249446b07f40ac5fcc3205f2c048616efacchkuang          alloc_mode_context(cm, num_4x4_blk, ctx);
10635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
10645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
10655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (i < BLOCK_64X64) {
10669b35249446b07f40ac5fcc3205f2c048616efacchkuang      for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) {
10675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
10685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ctx->num_4x4_blk = num_4x4_blk;
10699b35249446b07f40ac5fcc3205f2c048616efacchkuang        alloc_mode_context(cm, num_4x4_blk, ctx);
10705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
10715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
10725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
10735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ctx->num_4x4_blk = num_4x4_blk;
10749b35249446b07f40ac5fcc3205f2c048616efacchkuang      alloc_mode_context(cm, num_4x4_blk, ctx);
10755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
10765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
10785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void free_pick_mode_context(MACROBLOCK *x) {
10805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int i;
10815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (i = 0; i < BLOCK_SIZES; ++i) {
10835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
10845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int num_4x4_h = num_4x4_blocks_high_lookup[i];
10855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
10865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (i < BLOCK_16X16) {
10879b35249446b07f40ac5fcc3205f2c048616efacchkuang      for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
10889b35249446b07f40ac5fcc3205f2c048616efacchkuang        for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) {
10899b35249446b07f40ac5fcc3205f2c048616efacchkuang          for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) {
10905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
10919b35249446b07f40ac5fcc3205f2c048616efacchkuang            free_mode_context(ctx);
10925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          }
10935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
10945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
10955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (i < BLOCK_32X32) {
10969b35249446b07f40ac5fcc3205f2c048616efacchkuang      for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
10979b35249446b07f40ac5fcc3205f2c048616efacchkuang        for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) {
10985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
10999b35249446b07f40ac5fcc3205f2c048616efacchkuang          free_mode_context(ctx);
11005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
11015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
11025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (i < BLOCK_64X64) {
11039b35249446b07f40ac5fcc3205f2c048616efacchkuang      for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) {
11045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
11059b35249446b07f40ac5fcc3205f2c048616efacchkuang        free_mode_context(ctx);
11065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
11075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
11085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
11099b35249446b07f40ac5fcc3205f2c048616efacchkuang      free_mode_context(ctx);
11105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
11115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
11135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianVP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf) {
11151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  int i, j;
1116a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  VP9_COMP *const cpi = vpx_memalign(32, sizeof(VP9_COMP));
1117a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  VP9_COMMON *const cm = cpi != NULL ? &cpi->common : NULL;
1118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (!cm)
1120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return NULL;
1121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1122f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  vp9_zero(*cpi);
1123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (setjmp(cm->error.jmp)) {
1125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->error.setjmp = 0;
1126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_remove_compressor(cpi);
1127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return 0;
1128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
113091037db265ecdd914a26e056cf69207b4f50924ehkuang  cm->error.setjmp = 1;
1131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
113291037db265ecdd914a26e056cf69207b4f50924ehkuang  CHECK_MEM_ERROR(cm, cpi->mb.ss, vpx_calloc(sizeof(search_site),
113391037db265ecdd914a26e056cf69207b4f50924ehkuang                                             (MAX_MVSEARCH_STEPS * 8) + 1));
1134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1135b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_rtcd();
1136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->use_svc = 0;
1138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  init_config(cpi, oxcf);
11406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_rc_init(&cpi->oxcf, cpi->pass, &cpi->rc);
11415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  init_pick_mode_context(cpi);
11425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->current_video_frame = 0;
1144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Set reference frame sign bias for ALTREF frame to 1 (for now)
114691037db265ecdd914a26e056cf69207b4f50924ehkuang  cm->ref_frame_sign_bias[ALTREF_FRAME] = 1;
1147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->gold_is_last = 0;
1149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->alt_is_last = 0;
1150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->gold_is_alt = 0;
11511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
1152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Create the encoder segmentation map and set all entries to 0
115391037db265ecdd914a26e056cf69207b4f50924ehkuang  CHECK_MEM_ERROR(cm, cpi->segmentation_map,
115491037db265ecdd914a26e056cf69207b4f50924ehkuang                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1156b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Create a complexity map used for rd adjustment
1157b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  CHECK_MEM_ERROR(cm, cpi->complexity_map,
1158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1159b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1160a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  // Create a map used for cyclic background refresh.
11616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  CHECK_MEM_ERROR(cm, cpi->cyclic_refresh,
11626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                  vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols));
1163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // And a place holder structure is the coding context
1165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // for use if we want to save and restore it
116691037db265ecdd914a26e056cf69207b4f50924ehkuang  CHECK_MEM_ERROR(cm, cpi->coding_context.last_frame_seg_map_copy,
116791037db265ecdd914a26e056cf69207b4f50924ehkuang                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
116991037db265ecdd914a26e056cf69207b4f50924ehkuang  CHECK_MEM_ERROR(cm, cpi->active_map, vpx_calloc(cm->MBs, 1));
117091037db265ecdd914a26e056cf69207b4f50924ehkuang  vpx_memset(cpi->active_map, 1, cm->MBs);
1171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->active_map_enabled = 0;
1172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < (sizeof(cpi->mbgraph_stats) /
1174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                   sizeof(cpi->mbgraph_stats[0])); i++) {
117591037db265ecdd914a26e056cf69207b4f50924ehkuang    CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats,
117691037db265ecdd914a26e056cf69207b4f50924ehkuang                    vpx_calloc(cm->MBs *
117791037db265ecdd914a26e056cf69207b4f50924ehkuang                               sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
1178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*Initialize the feed-forward activity masking.*/
1181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->activity_avg = 90 << 12;
1182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->key_frame_frequency = cpi->oxcf.key_freq;
1183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->refresh_alt_ref_frame = 0;
1184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
1186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Turn multiple ARF usage on/off. This is a quick hack for the initial test
1187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // version. It should eventually be set via the codec API.
1188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->multi_arf_enabled = 1;
1189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->multi_arf_enabled) {
1191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->sequence_number = 0;
1192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->frame_coding_order_period = 0;
1193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_zero(cpi->frame_coding_order);
1194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_zero(cpi->arf_buffer_idx);
1195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS
1200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->b_calculate_ssimg = 0;
1201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->count = 0;
1203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->bytes = 0;
1204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->b_calculate_psnr) {
1206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->total_y = 0.0;
1207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->total_u = 0.0;
1208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->total_v = 0.0;
1209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->total = 0.0;
1210b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->total_sq_error = 0;
1211b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->total_samples = 0;
1212b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->totalp_y = 0.0;
1214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->totalp_u = 0.0;
1215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->totalp_v = 0.0;
1216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->totalp = 0.0;
1217b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->totalp_sq_error = 0;
1218b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->totalp_samples = 0;
1219b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->tot_recode_hits = 0;
1221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->summed_quality = 0;
1222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->summed_weights = 0;
1223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->summedp_quality = 0;
1224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->summedp_weights = 0;
1225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->b_calculate_ssimg) {
1228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->total_ssimg_y = 0;
1229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->total_ssimg_u = 0;
1230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->total_ssimg_v = 0;
1231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->total_ssimg_all = 0;
1232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->first_time_stamp_ever = INT64_MAX;
1237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cal_nmvjointsadcost(cpi->mb.nmvjointsadcost);
1239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb.nmvcost[0] = &cpi->mb.nmvcosts[0][MV_MAX];
1240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb.nmvcost[1] = &cpi->mb.nmvcosts[1][MV_MAX];
1241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX];
1242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX];
1243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cal_nmvsadcosts(cpi->mb.nmvsadcost);
1244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX];
1246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX];
1247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX];
1248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX];
1249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp);
1250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_SRC
1252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  yuv_file = fopen("bd.yuv", "ab");
1253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_REC
1255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  yuv_rec_file = fopen("rec.yuv", "wb");
1256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0
1259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  framepsnr = fopen("framepsnr.stt", "a");
1260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  kf_list = fopen("kf_list.stt", "w");
1261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->output_pkt_list = oxcf->output_pkt_list;
1264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
12661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
1267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->pass == 1) {
1268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_init_first_pass(cpi);
1269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else if (cpi->pass == 2) {
1270b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    const size_t packet_sz = sizeof(FIRSTPASS_STATS);
1271b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
1272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
12736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (cpi->svc.number_spatial_layers > 1
12746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        && cpi->svc.number_temporal_layers == 1) {
12756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf;
12766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = {0};
12776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      int i;
12786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
12796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      for (i = 0; i < oxcf->ss_number_layers; ++i) {
12806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        FIRSTPASS_STATS *const last_packet_for_layer =
12816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang            &stats[packets - oxcf->ss_number_layers + i];
12826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        const int layer_id = (int)last_packet_for_layer->spatial_layer_id;
12836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        const int packets_in_layer = (int)last_packet_for_layer->count + 1;
12846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        if (layer_id >= 0 && layer_id < oxcf->ss_number_layers) {
12856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer_id];
12866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
12876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          vpx_free(lc->rc_twopass_stats_in.buf);
12886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
12896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          lc->rc_twopass_stats_in.sz = packets_in_layer * packet_sz;
12906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          CHECK_MEM_ERROR(cm, lc->rc_twopass_stats_in.buf,
12916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                          vpx_malloc(lc->rc_twopass_stats_in.sz));
12926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          lc->twopass.stats_in_start = lc->rc_twopass_stats_in.buf;
12936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          lc->twopass.stats_in = lc->twopass.stats_in_start;
12946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          lc->twopass.stats_in_end = lc->twopass.stats_in_start
12956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                     + packets_in_layer - 1;
12966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          stats_copy[layer_id] = lc->rc_twopass_stats_in.buf;
12976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        }
12986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      }
12996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
13006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      for (i = 0; i < packets; ++i) {
13016ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        const int layer_id = (int)stats[i].spatial_layer_id;
13026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        if (layer_id >= 0 && layer_id < oxcf->ss_number_layers
13036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang            && stats_copy[layer_id] != NULL) {
13046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          *stats_copy[layer_id] = stats[i];
13056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          ++stats_copy[layer_id];
13066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        }
13076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      }
13086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
13096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      vp9_init_second_pass_spatial_svc(cpi);
13106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    } else {
13116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
13126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->twopass.stats_in = cpi->twopass.stats_in_start;
13136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1];
13146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
13156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      vp9_init_second_pass(cpi);
13166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    }
1317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  set_speed_features(cpi);
1320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  // Default rd threshold factors for mode selection
13225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (i = 0; i < BLOCK_SIZES; ++i) {
13231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    for (j = 0; j < MAX_MODES; ++j)
13241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      cpi->rd_thresh_freq_fact[i][j] = 32;
13255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (j = 0; j < MAX_REFS; ++j)
13265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      cpi->rd_thresh_freq_sub8x8[i][j] = 32;
13275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
1328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
132991037db265ecdd914a26e056cf69207b4f50924ehkuang#define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SVFHH, SVFHV, SVFHHV, \
133091037db265ecdd914a26e056cf69207b4f50924ehkuang            SDX3F, SDX8F, SDX4DF)\
1331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].sdf            = SDF; \
133291037db265ecdd914a26e056cf69207b4f50924ehkuang    cpi->fn_ptr[BT].sdaf           = SDAF; \
1333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].vf             = VF; \
1334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].svf            = SVF; \
1335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].svaf           = SVAF; \
1336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].svf_halfpix_h  = SVFHH; \
1337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].svf_halfpix_v  = SVFHV; \
1338ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].svf_halfpix_hv = SVFHHV; \
1339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].sdx3f          = SDX3F; \
1340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].sdx8f          = SDX8F; \
1341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->fn_ptr[BT].sdx4df         = SDX4DF;
1342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
134391037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_32X16, vp9_sad32x16, vp9_sad32x16_avg,
134491037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance32x16, vp9_sub_pixel_variance32x16,
1345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance32x16, NULL, NULL,
1346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      NULL, NULL, NULL,
1347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad32x16x4d)
1348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
134991037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_16X32, vp9_sad16x32, vp9_sad16x32_avg,
135091037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance16x32, vp9_sub_pixel_variance16x32,
1351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance16x32, NULL, NULL,
1352ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      NULL, NULL, NULL,
1353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad16x32x4d)
1354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
135591037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_64X32, vp9_sad64x32, vp9_sad64x32_avg,
135691037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance64x32, vp9_sub_pixel_variance64x32,
1357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance64x32, NULL, NULL,
1358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      NULL, NULL, NULL,
1359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad64x32x4d)
1360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
136191037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_32X64, vp9_sad32x64, vp9_sad32x64_avg,
136291037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance32x64, vp9_sub_pixel_variance32x64,
1363ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance32x64, NULL, NULL,
1364ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      NULL, NULL, NULL,
1365ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad32x64x4d)
1366ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
136791037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_32X32, vp9_sad32x32, vp9_sad32x32_avg,
136891037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance32x32, vp9_sub_pixel_variance32x32,
1369ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance32x32, vp9_variance_halfpixvar32x32_h,
1370ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_variance_halfpixvar32x32_v,
1371ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_variance_halfpixvar32x32_hv, vp9_sad32x32x3, vp9_sad32x32x8,
1372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad32x32x4d)
1373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
137491037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_64X64, vp9_sad64x64, vp9_sad64x64_avg,
137591037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance64x64, vp9_sub_pixel_variance64x64,
1376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance64x64, vp9_variance_halfpixvar64x64_h,
1377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_variance_halfpixvar64x64_v,
1378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_variance_halfpixvar64x64_hv, vp9_sad64x64x3, vp9_sad64x64x8,
1379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad64x64x4d)
1380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
138191037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_16X16, vp9_sad16x16, vp9_sad16x16_avg,
138291037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance16x16, vp9_sub_pixel_variance16x16,
1383ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance16x16, vp9_variance_halfpixvar16x16_h,
1384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_variance_halfpixvar16x16_v,
1385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_variance_halfpixvar16x16_hv, vp9_sad16x16x3, vp9_sad16x16x8,
1386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad16x16x4d)
1387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
138891037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_16X8, vp9_sad16x8, vp9_sad16x8_avg,
138991037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance16x8, vp9_sub_pixel_variance16x8,
1390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance16x8, NULL, NULL, NULL,
1391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad16x8x3, vp9_sad16x8x8, vp9_sad16x8x4d)
1392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
139391037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_8X16, vp9_sad8x16, vp9_sad8x16_avg,
139491037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance8x16, vp9_sub_pixel_variance8x16,
1395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance8x16, NULL, NULL, NULL,
1396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad8x16x3, vp9_sad8x16x8, vp9_sad8x16x4d)
1397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
139891037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_8X8, vp9_sad8x8, vp9_sad8x8_avg,
139991037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance8x8, vp9_sub_pixel_variance8x8,
1400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance8x8, NULL, NULL, NULL,
1401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad8x8x3, vp9_sad8x8x8, vp9_sad8x8x4d)
1402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
140391037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_8X4, vp9_sad8x4, vp9_sad8x4_avg,
140491037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance8x4, vp9_sub_pixel_variance8x4,
1405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance8x4, NULL, NULL,
1406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      NULL, NULL, vp9_sad8x4x8,
1407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad8x4x4d)
1408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
140991037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg,
141091037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance4x8, vp9_sub_pixel_variance4x8,
1411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance4x8, NULL, NULL,
1412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      NULL, NULL, vp9_sad4x8x8,
1413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad4x8x4d)
1414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
141591037db265ecdd914a26e056cf69207b4f50924ehkuang  BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg,
141691037db265ecdd914a26e056cf69207b4f50924ehkuang      vp9_variance4x4, vp9_sub_pixel_variance4x4,
1417ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sub_pixel_avg_variance4x4, NULL, NULL, NULL,
1418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d)
1419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->full_search_sad = vp9_full_search_sad;
1421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->diamond_search_sad = vp9_diamond_search_sad;
1422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->refining_search_sad = vp9_refining_search_sad;
1423ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1424ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* vp9_init_quantizer() is first called here. Add check in
1425ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   * vp9_frame_init_quantizer() so that vp9_init_quantizer is only
1426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   * called later when needed. This will avoid unnecessary calls of
1427ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   * vp9_init_quantizer() for every frame.
1428ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   */
1429ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_init_quantizer(cpi);
1430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  vp9_loop_filter_init(cm);
1432ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1433b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->error.setjmp = 0;
1434ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1435b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_zero(cpi->common.counts.uv_mode);
1436ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#ifdef MODE_TEST_HIT_STATS
14385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  vp9_zero(cpi->mode_test_hits);
14391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif
14401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
1441b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return cpi;
1442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1443ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1444b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_remove_compressor(VP9_COMP *cpi) {
1445ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
1446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1447ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!cpi)
1448ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return;
1449ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1450ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi && (cpi->common.current_video_frame > 0)) {
1451ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS
1452ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1453ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_clear_system_state();
1454ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1455ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count);
1456ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cpi->pass != 1) {
1457ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      FILE *f = fopen("opsnr.stt", "a");
1458ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      double time_encoded = (cpi->last_end_time_stamp_seen
1459ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             - cpi->first_time_stamp_ever) / 10000000.000;
14605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      double total_encode_time = (cpi->time_receive_data +
14615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  cpi->time_compress_data)   / 1000.000;
14625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      double dr = (double)cpi->bytes * (double) 8 / (double)1000
14635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  / time_encoded;
1464ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1465ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (cpi->b_calculate_psnr) {
1466b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        const double total_psnr =
1467b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            vpx_sse_to_psnr((double)cpi->total_samples, 255.0,
1468b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                            (double)cpi->total_sq_error);
1469b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        const double totalp_psnr =
1470b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            vpx_sse_to_psnr((double)cpi->totalp_samples, 255.0,
1471b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                            (double)cpi->totalp_sq_error);
1472b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        const double total_ssim = 100 * pow(cpi->summed_quality /
1473b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                                cpi->summed_weights, 8.0);
1474b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        const double totalp_ssim = 100 * pow(cpi->summedp_quality /
1475b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                                cpi->summedp_weights, 8.0);
1476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1477ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
1478ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                "VPXSSIM\tVPSSIMP\t  Time(ms)\n");
1479ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        fprintf(f, "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n",
1480ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                dr, cpi->total / cpi->count, total_psnr,
1481b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                cpi->totalp / cpi->count, totalp_psnr, total_ssim, totalp_ssim,
1482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                total_encode_time);
1483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
1484ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1485ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (cpi->b_calculate_ssimg) {
1486ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t  Time(ms)\n");
1487ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        fprintf(f, "%7.2f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
14885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                cpi->total_ssimg_y / cpi->count,
14895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                cpi->total_ssimg_u / cpi->count,
14905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                cpi->total_ssimg_v / cpi->count,
14915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                cpi->total_ssimg_all / cpi->count, total_encode_time);
1492ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
1493ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1494ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      fclose(f);
1495ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
1496ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1497ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1498ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#ifdef MODE_TEST_HIT_STATS
15001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (cpi->pass != 1) {
15011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      double norm_per_pixel_mode_tests = 0;
15021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      double norm_counts[BLOCK_SIZES];
15031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      int i;
15041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      int sb64_per_frame;
15051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      int norm_factors[BLOCK_SIZES] =
15061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        {256, 128, 128, 64, 32, 32, 16, 8, 8, 4, 2, 2, 1};
15071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      FILE *f = fopen("mode_hit_stats.stt", "a");
15081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
15091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      // On average, how many mode tests do we do
15101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      for (i = 0; i < BLOCK_SIZES; ++i) {
15111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        norm_counts[i] = (double)cpi->mode_test_hits[i] /
15121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                         (double)norm_factors[i];
15131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        norm_per_pixel_mode_tests += norm_counts[i];
15141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      }
15151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      // Convert to a number per 64x64 and per frame
15161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      sb64_per_frame = ((cpi->common.height + 63) / 64) *
15171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                       ((cpi->common.width + 63) / 64);
15181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      norm_per_pixel_mode_tests =
15191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        norm_per_pixel_mode_tests /
15201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        (double)(cpi->common.current_video_frame * sb64_per_frame);
15211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
15221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      fprintf(f, "%6.4f\n", norm_per_pixel_mode_tests);
15231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      fclose(f);
15241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    }
15251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif
15261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
1527ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0
1528ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    {
1529ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
1530ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
1531f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame,
1532f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang             cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000,
1533f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang             cpi->time_compress_data / 1000,
1534f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang             (cpi->time_receive_data + cpi->time_compress_data) / 1000);
1535ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
1536ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1537ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1538ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
15395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  free_pick_mode_context(&cpi->mb);
1540ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  dealloc_compressor_data(cpi);
1541ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->mb.ss);
1542ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi->tok);
1543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
15445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (i = 0; i < sizeof(cpi->mbgraph_stats) /
15455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  sizeof(cpi->mbgraph_stats[0]); ++i) {
1546ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vpx_free(cpi->mbgraph_stats[i].mb_stats);
1547ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1548ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1549ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_remove_common(&cpi->common);
1550ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_free(cpi);
1551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1552ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_SRC
1553ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fclose(yuv_file);
1554ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_REC
1556ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fclose(yuv_rec_file);
1557ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1558ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1559ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0
1560ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1561ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (keyfile)
1562ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fclose(keyfile);
1563ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (framepsnr)
1565ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fclose(framepsnr);
1566ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1567ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (kf_list)
1568ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fclose(kf_list);
1569ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1570ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1571ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
15726ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic int64_t get_sse(const uint8_t *a, int a_stride,
15736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                       const uint8_t *b, int b_stride,
15746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                       int width, int height) {
15756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  const int dw = width % 16;
15766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  const int dh = height % 16;
15776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int64_t total_sse = 0;
15786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  unsigned int sse = 0;
15796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int sum = 0;
15806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int x, y;
15816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
15826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (dw > 0) {
15836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    variance(&a[width - dw], a_stride, &b[width - dw], b_stride,
15846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang             dw, height, &sse, &sum);
15856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    total_sse += sse;
15866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
1587ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
15886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (dh > 0) {
15896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    variance(&a[(height - dh) * a_stride], a_stride,
15906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang             &b[(height - dh) * b_stride], b_stride,
15916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang             width - dw, dh, &sse, &sum);
15926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    total_sse += sse;
15936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
1594ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
15956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  for (y = 0; y < height / 16; ++y) {
15966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    const uint8_t *pa = a;
15976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    const uint8_t *pb = b;
15986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    for (x = 0; x < width / 16; ++x) {
15996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      vp9_mse16x16(pa, a_stride, pb, b_stride, &sse);
1600ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      total_sse += sse;
1601ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
16026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      pa += 16;
16036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      pb += 16;
1604ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
1605ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
16066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    a += 16 * a_stride;
16076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    b += 16 * b_stride;
1608ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1609ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1610ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return total_sse;
1611ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1612ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1613b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef struct {
1614b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double psnr[4];       // total/y/u/v
1615b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint64_t sse[4];      // total/y/u/v
1616b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint32_t samples[4];  // total/y/u/v
1617b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} PSNR_STATS;
1618b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1619b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b,
1620b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      PSNR_STATS *psnr) {
1621b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int widths[3]        = {a->y_width,  a->uv_width,  a->uv_width };
1622b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int heights[3]       = {a->y_height, a->uv_height, a->uv_height};
1623b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer,  a->v_buffer };
1624b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int a_strides[3]     = {a->y_stride, a->uv_stride, a->uv_stride};
1625b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer,  b->v_buffer };
1626b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int b_strides[3]     = {b->y_stride, b->uv_stride, b->uv_stride};
1627b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int i;
1628b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint64_t total_sse = 0;
1629b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint32_t total_samples = 0;
1630ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1631b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < 3; ++i) {
1632b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    const int w = widths[i];
1633b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    const int h = heights[i];
1634b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    const uint32_t samples = w * h;
16356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    const uint64_t sse = get_sse(a_planes[i], a_strides[i],
16366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 b_planes[i], b_strides[i],
16376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 w, h);
1638b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    psnr->sse[1 + i] = sse;
1639b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    psnr->samples[1 + i] = samples;
1640b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, 255.0, (double)sse);
1641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1642b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    total_sse += sse;
1643b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    total_samples += samples;
1644b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
1645ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1646b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  psnr->sse[0] = total_sse;
1647b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  psnr->samples[0] = total_samples;
1648b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, 255.0,
1649b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                  (double)total_sse);
1650ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1651ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1652b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void generate_psnr_packet(VP9_COMP *cpi) {
1653b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  struct vpx_codec_cx_pkt pkt;
1654b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int i;
1655b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  PSNR_STATS psnr;
1656b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  calc_psnr(cpi->Source, cpi->common.frame_to_show, &psnr);
1657b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < 4; ++i) {
1658b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    pkt.data.psnr.samples[i] = psnr.samples[i];
1659b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    pkt.data.psnr.sse[i] = psnr.sse[i];
1660b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    pkt.data.psnr.psnr[i] = psnr.psnr[i];
1661b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
1662b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  pkt.kind = VPX_CODEC_PSNR_PKT;
1663b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
1664b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
1665ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1666b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags) {
1667ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (ref_frame_flags > 7)
1668ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
1669ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1670ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->ref_frame_flags = ref_frame_flags;
1671ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 0;
1672ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1673ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1674a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags) {
1675a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  cpi->ext_refresh_golden_frame = (ref_frame_flags & VP9_GOLD_FLAG) != 0;
1676a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  cpi->ext_refresh_alt_ref_frame = (ref_frame_flags & VP9_ALT_FLAG) != 0;
1677a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  cpi->ext_refresh_last_frame = (ref_frame_flags & VP9_LAST_FLAG) != 0;
1678b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->ext_refresh_frame_flags_pending = 1;
1679ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1680ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1681b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic YV12_BUFFER_CONFIG *get_vp9_ref_frame_buffer(VP9_COMP *cpi,
1682b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                VP9_REFFRAME ref_frame_flag) {
1683b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  MV_REFERENCE_FRAME ref_frame = NONE;
1684ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (ref_frame_flag == VP9_LAST_FLAG)
1685b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_frame = LAST_FRAME;
1686ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else if (ref_frame_flag == VP9_GOLD_FLAG)
1687b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_frame = GOLDEN_FRAME;
1688ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else if (ref_frame_flag == VP9_ALT_FLAG)
1689b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_frame = ALTREF_FRAME;
1690ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1691b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return ref_frame == NONE ? NULL : get_ref_frame_buffer(cpi, ref_frame);
1692b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
1693ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1694b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
1695b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                           YV12_BUFFER_CONFIG *sd) {
1696b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
1697b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cfg) {
1698b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp8_yv12_copy_frame(cfg, sd);
1699b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return 0;
1700b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
1701b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return -1;
1702b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
1703ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1704ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1705b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_reference_enc(VP9_COMP *cpi, int index, YV12_BUFFER_CONFIG **fb) {
1706ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *cm = &cpi->common;
1707ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1708b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (index < 0 || index >= REF_FRAMES)
1709ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
1710ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1711b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  *fb = &cm->frame_bufs[cm->ref_frame_map[index]].buf;
1712ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 0;
1713ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1714ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1715b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
1716ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                          YV12_BUFFER_CONFIG *sd) {
1717b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
1718b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cfg) {
1719b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp8_yv12_copy_frame(sd, cfg);
1720b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return 0;
1721b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
1722ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
1723b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
1724ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1725b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1726b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_update_entropy(VP9_COMP * cpi, int update) {
1727b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->ext_refresh_frame_context = update;
1728b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->ext_refresh_frame_context_pending = 1;
1729ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 0;
1730ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1731ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1732ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1733ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_SRC
1734ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s) {
1735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint8_t *src = s->y_buffer;
1736ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int h = s->y_height;
1737ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1738ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
1739ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(src, s->y_width, 1,  yuv_file);
1740ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    src += s->y_stride;
1741ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (--h);
1742ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1743ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  src = s->u_buffer;
1744ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  h = s->uv_height;
1745ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1746ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
1747ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(src, s->uv_width, 1,  yuv_file);
1748ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    src += s->uv_stride;
1749ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (--h);
1750ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1751ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  src = s->v_buffer;
1752ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  h = s->uv_height;
1753ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1754ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
1755ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(src, s->uv_width, 1, yuv_file);
1756ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    src += s->uv_stride;
1757ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (--h);
1758ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1759ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1760ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1761ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef OUTPUT_YUV_REC
1762ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_write_yuv_rec_frame(VP9_COMMON *cm) {
1763ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  YV12_BUFFER_CONFIG *s = cm->frame_to_show;
1764ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint8_t *src = s->y_buffer;
1765ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int h = cm->height;
1766ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1767ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
1768ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(src, s->y_width, 1,  yuv_rec_file);
1769ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    src += s->y_stride;
1770ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (--h);
1771ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1772ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  src = s->u_buffer;
1773ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  h = s->uv_height;
1774ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1775ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
1776ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(src, s->uv_width, 1,  yuv_rec_file);
1777ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    src += s->uv_stride;
1778ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (--h);
1779ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1780ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  src = s->v_buffer;
1781ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  h = s->uv_height;
1782ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1783ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
1784ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(src, s->uv_width, 1, yuv_rec_file);
1785ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    src += s->uv_stride;
1786ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (--h);
1787ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1788ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_ALPHA
1789ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (s->alpha_buffer) {
1790ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    src = s->alpha_buffer;
1791ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    h = s->alpha_height;
1792ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    do {
1793ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      fwrite(src, s->alpha_width, 1,  yuv_rec_file);
1794ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      src += s->alpha_stride;
1795ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    } while (--h);
1796ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1797ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1798ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1799ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fflush(yuv_rec_file);
1800ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1801ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1802ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1803b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void scale_and_extend_frame_nonnormative(YV12_BUFFER_CONFIG *src_fb,
1804b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                                YV12_BUFFER_CONFIG *dst_fb) {
1805b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int in_w = src_fb->y_crop_width;
1806b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int in_h = src_fb->y_crop_height;
1807b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int out_w = dst_fb->y_crop_width;
1808b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int out_h = dst_fb->y_crop_height;
1809b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int in_w_uv = src_fb->uv_crop_width;
1810b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int in_h_uv = src_fb->uv_crop_height;
1811b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int out_w_uv = dst_fb->uv_crop_width;
1812b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int out_h_uv = dst_fb->uv_crop_height;
1813b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int i;
1814b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1815b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer,
1816b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    src_fb->alpha_buffer};
1817b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride,
1818b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    src_fb->alpha_stride};
1819b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1820b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer,
1821b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    dst_fb->alpha_buffer};
1822b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride,
1823b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    dst_fb->alpha_stride};
1824b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1825b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < MAX_MB_PLANE; ++i) {
1826b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (i == 0 || i == 3) {
1827b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      // Y and alpha planes
1828b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_resize_plane(srcs[i], in_h, in_w, src_strides[i],
1829b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                       dsts[i], out_h, out_w, dst_strides[i]);
1830b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    } else {
1831b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      // Chroma planes
1832b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_resize_plane(srcs[i], in_h_uv, in_w_uv, src_strides[i],
1833b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                       dsts[i], out_h_uv, out_w_uv, dst_strides[i]);
1834b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
1835b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
1836b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp8_yv12_extend_frame_borders(dst_fb);
1837b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
1838b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1839ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void scale_and_extend_frame(YV12_BUFFER_CONFIG *src_fb,
1840ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                   YV12_BUFFER_CONFIG *dst_fb) {
1841ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int in_w = src_fb->y_crop_width;
1842ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int in_h = src_fb->y_crop_height;
1843ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int out_w = dst_fb->y_crop_width;
1844ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int out_h = dst_fb->y_crop_height;
1845ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int x, y, i;
1846ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1847ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer,
1848ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                      src_fb->alpha_buffer};
1849ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride,
1850ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        src_fb->alpha_stride};
1851ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1852ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer,
1853ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                      dst_fb->alpha_buffer};
1854ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride,
1855ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        dst_fb->alpha_stride};
1856ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1857ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (y = 0; y < out_h; y += 16) {
1858ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for (x = 0; x < out_w; x += 16) {
1859ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      for (i = 0; i < MAX_MB_PLANE; ++i) {
1860b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        const int factor = (i == 0 || i == 3 ? 1 : 2);
1861ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        const int x_q4 = x * (16 / factor) * in_w / out_w;
1862ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        const int y_q4 = y * (16 / factor) * in_h / out_h;
1863ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        const int src_stride = src_strides[i];
1864ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        const int dst_stride = dst_strides[i];
1865ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        uint8_t *src = srcs[i] + y / factor * in_h / out_h * src_stride +
1866ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 x / factor * in_w / out_w;
1867ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        uint8_t *dst = dsts[i] + y / factor * dst_stride + x / factor;
1868ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1869ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        vp9_convolve8(src, src_stride, dst, dst_stride,
1870ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                      vp9_sub_pel_filters_8[x_q4 & 0xf], 16 * in_w / out_w,
1871ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                      vp9_sub_pel_filters_8[y_q4 & 0xf], 16 * in_h / out_h,
1872ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                      16 / factor, 16 / factor);
1873ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
1874ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
1875ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1876ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1877ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp8_yv12_extend_frame_borders(dst_fb);
1878ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1879ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1880ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int find_fp_qindex() {
1881ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
1882ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1883ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < QINDEX_RANGE; i++) {
1884ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (vp9_convert_qindex_to_q(i) >= 30.0) {
1885ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      break;
1886ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
1887ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1888ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1889ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (i == QINDEX_RANGE)
1890ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    i--;
1891ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1892ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return i;
1893ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1894ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1895ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define WRITE_RECON_BUFFER 0
1896ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER
1897ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame) {
1898ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FILE *yframe;
1899ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
1900ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  char filename[255];
1901ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
19025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  snprintf(filename, sizeof(filename), "cx\\y%04d.raw", this_frame);
1903ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  yframe = fopen(filename, "wb");
1904ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1905ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < frame->y_height; i++)
1906ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(frame->y_buffer + i * frame->y_stride,
1907ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang           frame->y_width, 1, yframe);
1908ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1909ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fclose(yframe);
19105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  snprintf(filename, sizeof(filename), "cx\\u%04d.raw", this_frame);
1911ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  yframe = fopen(filename, "wb");
1912ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1913ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < frame->uv_height; i++)
1914ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(frame->u_buffer + i * frame->uv_stride,
1915ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang           frame->uv_width, 1, yframe);
1916ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1917ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fclose(yframe);
19185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  snprintf(filename, sizeof(filename), "cx\\v%04d.raw", this_frame);
1919ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  yframe = fopen(filename, "wb");
1920ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1921ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < frame->uv_height; i++)
1922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fwrite(frame->v_buffer + i * frame->uv_stride,
1923ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang           frame->uv_width, 1, yframe);
1924ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1925ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fclose(yframe);
1926ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1927ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1928ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1929ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// Function to test for conditions that indicate we should loop
1930ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// back and recode a frame.
1931b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int recode_loop_test(const VP9_COMP *cpi,
1932ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                            int high_limit, int low_limit,
1933ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                            int q, int maxq, int minq) {
1934b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const VP9_COMMON *const cm = &cpi->common;
1935b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const RATE_CONTROL *const rc = &cpi->rc;
1936ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int force_recode = 0;
1937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1938b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Special case trap if maximum allowed frame size exceeded.
1939b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (rc->projected_frame_size > rc->max_frame_bandwidth) {
1940b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    force_recode = 1;
1941b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
1942b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Is frame recode allowed.
1943b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Yes if either recode mode 1 is selected or mode 2 is selected
1944b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // and the frame is a key frame, golden frame or alt_ref_frame
1945b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else if ((cpi->sf.recode_loop == ALLOW_RECODE) ||
1946b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian             ((cpi->sf.recode_loop == ALLOW_RECODE_KFARFGF) &&
1947b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian              (cm->frame_type == KEY_FRAME ||
1948b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian               cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) {
1949ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // General over and under shoot tests
1950b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if ((rc->projected_frame_size > high_limit && q < maxq) ||
1951b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        (rc->projected_frame_size < low_limit && q > minq)) {
1952ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      force_recode = 1;
19535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
19545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Deal with frame undershoot and whether or not we are
19555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // below the automatically set cq level.
1956ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (q > cpi->cq_target_quality &&
1957b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) {
1958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        force_recode = 1;
1959ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
1960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
1961ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1962ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return force_recode;
1963ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
1964ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1965a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_update_reference_frames(VP9_COMP *cpi) {
1966ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON * const cm = &cpi->common;
1967ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1968ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // At this point the new frame has been encoded.
1969ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // If any buffer copy / swapping is signaled it should be done here.
1970ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cm->frame_type == KEY_FRAME) {
1971b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_cnt_fb(cm->frame_bufs,
1972ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang               &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
1973b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_cnt_fb(cm->frame_bufs,
1974ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang               &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
1975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1976ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
1977ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else if (!cpi->multi_arf_enabled && cpi->refresh_golden_frame &&
1978ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      !cpi->refresh_alt_ref_frame) {
1979ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
19801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  else if (cpi->refresh_golden_frame && !cpi->refresh_alt_ref_frame &&
19811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang           !cpi->use_svc) {
1982ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
1983ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /* Preserve the previously existing golden frame and update the frame in
1984ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * the alt ref slot instead. This is highly specific to the current use of
1985ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * alt-ref as a forward reference, and this needs to be generalized as
1986ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * other uses are implemented (like RTC/temporal scaling)
1987ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     *
1988ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * The update to the buffer in the alt ref slot was signaled in
1989ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * vp9_pack_bitstream(), now swap the buffer pointers so that it's treated
1990ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * as the golden frame next time.
1991ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     */
1992ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int tmp;
1993ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1994b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_cnt_fb(cm->frame_bufs,
1995ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang               &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
1996ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1997ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    tmp = cpi->alt_fb_idx;
1998ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->alt_fb_idx = cpi->gld_fb_idx;
1999ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->gld_fb_idx = tmp;
2000ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }  else { /* For non key/golden frames */
2001ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cpi->refresh_alt_ref_frame) {
2002ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      int arf_idx = cpi->alt_fb_idx;
2003ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2004ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (cpi->multi_arf_enabled) {
2005ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        arf_idx = cpi->arf_buffer_idx[cpi->sequence_number + 1];
2006ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
2007ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2008b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      ref_cnt_fb(cm->frame_bufs,
2009ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                 &cm->ref_frame_map[arf_idx], cm->new_fb_idx);
2010ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2011ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2012ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cpi->refresh_golden_frame) {
2013b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      ref_cnt_fb(cm->frame_bufs,
2014ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                 &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
2015ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2016ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2017ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2018ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->refresh_last_frame) {
2019b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_cnt_fb(cm->frame_bufs,
2020ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang               &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx);
2021ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2022ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2023ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2024ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
202591037db265ecdd914a26e056cf69207b4f50924ehkuang  MACROBLOCKD *xd = &cpi->mb.e_mbd;
20261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  struct loopfilter *lf = &cm->lf;
202791037db265ecdd914a26e056cf69207b4f50924ehkuang  if (xd->lossless) {
2028f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      lf->filter_level = 0;
2029ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
2030ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    struct vpx_usec_timer timer;
2031ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2032ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_clear_system_state();
2033ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2034ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vpx_usec_timer_start(&timer);
2035ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
20366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
2037ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2038ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vpx_usec_timer_mark(&timer);
2039ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
2040ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2041ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2042f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  if (lf->filter_level > 0) {
20431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    vp9_loop_filter_frame(cm, xd, lf->filter_level, 0, 0);
2044ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2045ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2046b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_extend_frame_inner_borders(cm->frame_to_show);
2047ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2048ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2049a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianvoid vp9_scale_references(VP9_COMP *cpi) {
2050ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *cm = &cpi->common;
2051b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  MV_REFERENCE_FRAME ref_frame;
2052ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2053b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
2054b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
2055b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    YV12_BUFFER_CONFIG *const ref = &cm->frame_bufs[idx].buf;
2056ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2057ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (ref->y_crop_width != cm->width ||
2058ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ref->y_crop_height != cm->height) {
2059b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      const int new_fb = get_free_fb(cm);
2060b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf,
2061ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               cm->width, cm->height,
2062ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               cm->subsampling_x, cm->subsampling_y,
2063b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
2064b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf);
2065b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->scaled_ref_idx[ref_frame - 1] = new_fb;
2066ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    } else {
2067b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->scaled_ref_idx[ref_frame - 1] = idx;
2068b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cm->frame_bufs[idx].ref_count++;
2069ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2070ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2071ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2072ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2073ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void release_scaled_references(VP9_COMP *cpi) {
2074ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *cm = &cpi->common;
2075ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
2076ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2077ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < 3; i++)
2078b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->frame_bufs[cpi->scaled_ref_idx[i]].ref_count--;
2079ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2080ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
208191037db265ecdd914a26e056cf69207b4f50924ehkuangstatic void full_to_model_count(unsigned int *model_count,
208291037db265ecdd914a26e056cf69207b4f50924ehkuang                                unsigned int *full_count) {
208391037db265ecdd914a26e056cf69207b4f50924ehkuang  int n;
208491037db265ecdd914a26e056cf69207b4f50924ehkuang  model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
208591037db265ecdd914a26e056cf69207b4f50924ehkuang  model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
208691037db265ecdd914a26e056cf69207b4f50924ehkuang  model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
2087b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (n = THREE_TOKEN; n < EOB_TOKEN; ++n)
208891037db265ecdd914a26e056cf69207b4f50924ehkuang    model_count[TWO_TOKEN] += full_count[n];
2089b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  model_count[EOB_MODEL_TOKEN] = full_count[EOB_TOKEN];
209091037db265ecdd914a26e056cf69207b4f50924ehkuang}
209191037db265ecdd914a26e056cf69207b4f50924ehkuang
2092b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void full_to_model_counts(vp9_coeff_count_model *model_count,
2093b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                 vp9_coeff_count *full_count) {
209491037db265ecdd914a26e056cf69207b4f50924ehkuang  int i, j, k, l;
2095b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2096b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < PLANE_TYPES; ++i)
209791037db265ecdd914a26e056cf69207b4f50924ehkuang    for (j = 0; j < REF_TYPES; ++j)
209891037db265ecdd914a26e056cf69207b4f50924ehkuang      for (k = 0; k < COEF_BANDS; ++k)
2099b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l)
210091037db265ecdd914a26e056cf69207b4f50924ehkuang          full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]);
210191037db265ecdd914a26e056cf69207b4f50924ehkuang}
210291037db265ecdd914a26e056cf69207b4f50924ehkuang
21035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if 0 && CONFIG_INTERNAL_STATS
21045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void output_frame_level_debug_stats(VP9_COMP *cpi) {
21055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  VP9_COMMON *const cm = &cpi->common;
21065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w");
21075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int recon_err;
210891037db265ecdd914a26e056cf69207b4f50924ehkuang
2109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_clear_system_state();
2110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  recon_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
21125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (cpi->twopass.total_left_stats.coded_error != 0.0)
2114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    fprintf(f, "%10u %10d %10d %10d %10d %10d "
2115b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        "%10"PRId64" %10"PRId64" %10d "
2116b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf"
2117b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        "%6d %6d %5d %5d %5d "
2118b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        "%10"PRId64" %10.3lf"
2119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        "%10lf %8u %10d %10d %10d\n",
2120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->common.current_video_frame, cpi->rc.this_frame_target,
2121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->rc.projected_frame_size,
2122b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->rc.projected_frame_size / cpi->common.MBs,
2123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        (cpi->rc.projected_frame_size - cpi->rc.this_frame_target),
2124b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->rc.total_target_vs_actual,
2125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        (cpi->oxcf.starting_buffer_level - cpi->rc.bits_off_target),
2126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->rc.total_actual_bits, cm->base_qindex,
21275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        vp9_convert_qindex_to_q(cm->base_qindex),
21285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0,
2129b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->rc.avg_q,
2130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        vp9_convert_qindex_to_q(cpi->rc.ni_av_qi),
21315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        vp9_convert_qindex_to_q(cpi->cq_target_quality),
21325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        cpi->refresh_last_frame, cpi->refresh_golden_frame,
2133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost,
2134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->twopass.bits_left,
21355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        cpi->twopass.total_left_stats.coded_error,
2136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->twopass.bits_left /
21375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            (1 + cpi->twopass.total_left_stats.coded_error),
2138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
2139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->twopass.kf_zeromotion_pct);
214091037db265ecdd914a26e056cf69207b4f50924ehkuang
21415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fclose(f);
2142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (0) {
21445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    FILE *const fmodes = fopen("Modes.stt", "a");
21455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int i;
2146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fprintf(fmodes, "%6d:%1d:%1d:%1d ", cpi->common.current_video_frame,
21485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            cm->frame_type, cpi->refresh_golden_frame,
21495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            cpi->refresh_alt_ref_frame);
2150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (i = 0; i < MAX_MODES; ++i)
21525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
2153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fprintf(fmodes, "\n");
2155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fclose(fmodes);
2157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
21585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
2160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2161b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void encode_without_recode_loop(VP9_COMP *cpi,
2162b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                       size_t *size,
2163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                       uint8_t *dest,
2164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                       int q) {
21655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  VP9_COMMON *const cm = &cpi->common;
2166b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_clear_system_state();
21676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_set_quantizer(cm, q);
2168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2169b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Set up entropy context depending on frame type. The decoder mandates
2170b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // the use of the default context, index 0, for keyframes and inter
2171b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // frames where the error_resilient_mode or intra_only flag is set. For
2172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // other inter-frames the encoder currently uses only two contexts;
2173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // context 1 for ALTREF frames and context 0 for the others.
2174b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cm->frame_type == KEY_FRAME) {
21756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    setup_key_frame(cpi);
2176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
21776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc)
21786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cm->frame_context_idx = cpi->refresh_alt_ref_frame;
21796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
21806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    setup_inter_frame(cm);
2181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Variance adaptive and in frame q adjustment experiments are mutually
2183b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // exclusive.
2184b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
2185b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_vaq_frame_setup(cpi);
2186b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
21876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_setup_in_frame_q_adj(cpi);
2188a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
21896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_cyclic_refresh_setup(cpi);
2190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2191b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // transform / motion compensation build reconstruction frame
2192b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_encode_frame(cpi);
2193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2194b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Update the skip mb flag probabilities based on the distribution
2195b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // seen in the last encoder iteration.
2196b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // update_base_skip_probs(cpi);
2197b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_clear_system_state();
21985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
2200b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void encode_with_recode_loop(VP9_COMP *cpi,
2201b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                    size_t *size,
2202b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                    uint8_t *dest,
2203b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                    int q,
2204b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                    int bottom_index,
2205b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                    int top_index) {
2206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_COMMON *const cm = &cpi->common;
2207b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  RATE_CONTROL *const rc = &cpi->rc;
2208b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int loop_count = 0;
22095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int loop = 0;
22105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int overshoot_seen = 0;
22115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int undershoot_seen = 0;
2212b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int q_low = bottom_index, q_high = top_index;
2213b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int frame_over_shoot_limit;
2214b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int frame_under_shoot_limit;
22155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
2216b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Decide frame size bounds
2217b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target,
2218b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                   &frame_under_shoot_limit,
2219b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                   &frame_over_shoot_limit);
2220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  do {
2222b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_clear_system_state();
2223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
22246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_set_quantizer(cm, q);
2225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (loop_count == 0) {
22275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Set up entropy context depending on frame type. The decoder mandates
22285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // the use of the default context, index 0, for keyframes and inter
22295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // frames where the error_resilient_mode or intra_only flag is set. For
22305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // other inter-frames the encoder currently uses only two contexts;
22315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // context 1 for ALTREF frames and context 0 for the others.
2232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (cm->frame_type == KEY_FRAME) {
22336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        setup_key_frame(cpi);
2234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      } else {
22356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc)
22365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          cpi->common.frame_context_idx = cpi->refresh_alt_ref_frame;
22376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
22386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        setup_inter_frame(cm);
2239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
2240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2242b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Variance adaptive and in frame q adjustment experiments are mutually
2243b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // exclusive.
2244b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
2245b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_vaq_frame_setup(cpi);
2246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
22476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      vp9_setup_in_frame_q_adj(cpi);
22485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
22495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
2250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // transform / motion compensation build reconstruction frame
2251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_encode_frame(cpi);
2252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Update the skip mb flag probabilities based on the distribution
2254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // seen in the last encoder iteration.
2255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // update_base_skip_probs(cpi);
2256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2257b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_clear_system_state();
2258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Dummy pack of the bitstream using up to date stats to get an
2260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // accurate estimate of output frame size to determine if we need
2261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // to recode.
2262b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) {
22636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      save_coding_context(cpi);
2264b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->dummy_packing = 1;
2265b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      if (!cpi->sf.use_nonrd_pick_mode)
2266b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        vp9_pack_bitstream(cpi, dest, size);
2267b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2268b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      rc->projected_frame_size = (int)(*size) << 3;
22696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      restore_coding_context(cpi);
2270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2271b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      if (frame_over_shoot_limit == 0)
2272b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        frame_over_shoot_limit = 1;
2273b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
2274ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
22751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
22761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      loop = 0;
22771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    } else {
2278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      if ((cm->frame_type == KEY_FRAME) &&
2279b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian           rc->this_key_frame_forced &&
2280b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian           (rc->projected_frame_size < rc->max_frame_bandwidth)) {
22811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        int last_q = q;
22826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        int kf_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
22831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
22841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        int high_err_target = cpi->ambient_err;
22851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        int low_err_target = cpi->ambient_err >> 1;
22861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
22871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // Prevent possible divide by zero error below for perfect KF
22881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        kf_err += !kf_err;
22891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
22901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // The key frame is not good enough or we can afford
22911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // to make it better without undue risk of popping.
22921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        if ((kf_err > high_err_target &&
2293b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian             rc->projected_frame_size <= frame_over_shoot_limit) ||
22941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            (kf_err > low_err_target &&
2295b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian             rc->projected_frame_size <= frame_under_shoot_limit)) {
22961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          // Lower q_high
22971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          q_high = q > q_low ? q - 1 : q_low;
22981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
22991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          // Adjust Q
23001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          q = (q * high_err_target) / kf_err;
23011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          q = MIN(q, (q_high + q_low) >> 1);
23021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        } else if (kf_err < low_err_target &&
2303b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                   rc->projected_frame_size >= frame_under_shoot_limit) {
23041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          // The key frame is much better than the previous frame
23051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          // Raise q_low
23061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          q_low = q < q_high ? q + 1 : q_high;
23071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
23081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          // Adjust Q
23091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          q = (q * low_err_target) / kf_err;
23101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          q = MIN(q, (q_high + q_low + 1) >> 1);
23111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        }
2312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // Clamp Q to upper and lower limits:
23141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        q = clamp(q, q_low, q_high);
23151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
23161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        loop = q != last_q;
23171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      } else if (recode_loop_test(
23181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          cpi, frame_over_shoot_limit, frame_under_shoot_limit,
2319b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          q, MAX(q_high, top_index), bottom_index)) {
23201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // Is the projected frame size out of range and are we allowed
23211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // to attempt to recode.
23221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        int last_q = q;
23231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        int retries = 0;
23241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
23251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // Frame size out of permitted range:
23261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // Update correction factor & compute new Q to try...
23271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
23281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // Frame is too large
2329b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        if (rc->projected_frame_size > rc->this_frame_target) {
2330b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          // Special case if the projected size is > the max allowed.
2331b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          if (rc->projected_frame_size >= rc->max_frame_bandwidth)
2332b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            q_high = rc->worst_quality;
2333b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
23341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          // Raise Qlow as to at least the current value
23351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          q_low = q < q_high ? q + 1 : q_high;
23361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
23371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          if (undershoot_seen || loop_count > 1) {
23381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            // Update rate_correction_factor unless
2339b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            vp9_rc_update_rate_correction_factors(cpi, 1);
23401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
23411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            q = (q_high + q_low + 1) / 2;
23421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          } else {
23431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            // Update rate_correction_factor unless
2344b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            vp9_rc_update_rate_correction_factors(cpi, 0);
2345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2346b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2347b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                   bottom_index, MAX(q_high, top_index));
2348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            while (q < q_low && retries < 10) {
2350b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian              vp9_rc_update_rate_correction_factors(cpi, 0);
2351b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian              q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2352b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                     bottom_index, MAX(q_high, top_index));
23531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang              retries++;
23541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            }
23551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          }
2356ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          overshoot_seen = 1;
2358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        } else {
23591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          // Frame is too small
23601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          q_high = q > q_low ? q - 1 : q_low;
23611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
23621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          if (overshoot_seen || loop_count > 1) {
2363b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            vp9_rc_update_rate_correction_factors(cpi, 1);
23641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            q = (q_high + q_low) / 2;
23651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          } else {
2366b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            vp9_rc_update_rate_correction_factors(cpi, 0);
2367b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2368b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                   bottom_index, top_index);
23691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            // Special case reset for qlow for constrained quality.
23701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            // This should only trigger where there is very substantial
23711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            // undershoot on a frame and the auto cq level is above
23721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            // the user passsed in value.
2373b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian            if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
2374b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                q < q_low) {
23751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang              q_low = q;
23761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            }
2377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            while (q > q_high && retries < 10) {
2379b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian              vp9_rc_update_rate_correction_factors(cpi, 0);
2380b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian              q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2381b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                     bottom_index, top_index);
23821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang              retries++;
23831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang            }
2384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          }
2385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          undershoot_seen = 1;
2387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        }
2388ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        // Clamp Q to upper and lower limits:
23901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        q = clamp(q, q_low, q_high);
2391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        loop = q != last_q;
23931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      } else {
23941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        loop = 0;
23951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      }
2396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2398b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Special case for overlay frame.
2399b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (rc->is_src_frame_alt_ref &&
2400b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        rc->projected_frame_size < rc->max_frame_bandwidth)
2401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      loop = 0;
2402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (loop) {
2404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      loop_count++;
2405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS
2407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->tot_recode_hits++;
2408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } while (loop);
2411b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
2412b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2413b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void get_ref_frame_flags(VP9_COMP *cpi) {
2414b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->refresh_last_frame & cpi->refresh_golden_frame)
2415b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->gold_is_last = 1;
2416b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  else if (cpi->refresh_last_frame ^ cpi->refresh_golden_frame)
2417b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->gold_is_last = 0;
2418b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2419b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->refresh_last_frame & cpi->refresh_alt_ref_frame)
2420b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->alt_is_last = 1;
2421b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  else if (cpi->refresh_last_frame ^ cpi->refresh_alt_ref_frame)
2422b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->alt_is_last = 0;
2423b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2424b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame)
2425b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->gold_is_alt = 1;
2426b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame)
2427b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->gold_is_alt = 0;
2428b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2429b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
2430b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2431b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->gold_is_last)
2432b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
2433b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2434b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->rc.frames_till_gf_update_due == INT_MAX)
2435b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
2436b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2437b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->alt_is_last)
2438b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
2439b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2440b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->gold_is_alt)
2441b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
2442b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
2443b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2444b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void set_ext_overrides(VP9_COMP *cpi) {
2445b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Overrides the defaults with the externally supplied values with
2446b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // vp9_update_reference() and vp9_update_entropy() calls
2447b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Note: The overrides are valid only for the next frame passed
2448b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // to encode_frame_to_data_rate() function
2449b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->ext_refresh_frame_context_pending) {
2450b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->common.refresh_frame_context = cpi->ext_refresh_frame_context;
2451b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->ext_refresh_frame_context_pending = 0;
2452b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2453b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->ext_refresh_frame_flags_pending) {
2454b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->refresh_last_frame = cpi->ext_refresh_last_frame;
2455b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->refresh_golden_frame = cpi->ext_refresh_golden_frame;
2456b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame;
2457b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->ext_refresh_frame_flags_pending = 0;
2458b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2459b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
2460b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2461b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void encode_frame_to_data_rate(VP9_COMP *cpi,
2462b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      size_t *size,
2463b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      uint8_t *dest,
2464b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      unsigned int *frame_flags) {
2465b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_COMMON *const cm = &cpi->common;
2466b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  TX_SIZE t;
2467b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int q;
2468b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int top_index;
2469b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int bottom_index;
2470b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2471b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const SPEED_FEATURES *const sf = &cpi->sf;
2472b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const unsigned int max_mv_def = MIN(cm->width, cm->height);
2473b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  struct segmentation *const seg = &cm->seg;
2474b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2475b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  set_ext_overrides(cpi);
2476b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2477b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  /* Scale the source buffer, if required. */
2478b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cm->mi_cols * MI_SIZE != cpi->un_scaled_source->y_width ||
2479b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cm->mi_rows * MI_SIZE != cpi->un_scaled_source->y_height) {
2480b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    scale_and_extend_frame_nonnormative(cpi->un_scaled_source,
2481b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                        &cpi->scaled_source);
2482b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->Source = &cpi->scaled_source;
2483b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
2484b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->Source = cpi->un_scaled_source;
2485b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
24866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
24876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // Scale the last source buffer, if required.
24886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cpi->unscaled_last_source != NULL) {
24896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (cm->mi_cols * MI_SIZE != cpi->unscaled_last_source->y_width ||
24906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        cm->mi_rows * MI_SIZE != cpi->unscaled_last_source->y_height) {
24916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      scale_and_extend_frame_nonnormative(cpi->unscaled_last_source,
24926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                          &cpi->scaled_last_source);
24936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->Last_Source = &cpi->scaled_last_source;
24946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    } else {
24956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->Last_Source = cpi->unscaled_last_source;
24966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    }
24976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
24986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2499a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  vp9_scale_references(cpi);
2500b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2501b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_clear_system_state();
2502b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2503b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Enable or disable mode based tweaking of the zbin.
2504b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // For 2 pass only used where GF/ARF prediction quality
2505b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // is above a threshold.
2506b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->zbin_mode_boost = 0;
2507b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->zbin_mode_boost_enabled = 0;
2508b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2509b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Current default encoder behavior for the altref sign bias.
2510b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->ref_frame_sign_bias[ALTREF_FRAME] = cpi->rc.source_alt_ref_active;
2511b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2512b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Set default state for segment based loop filter update flags.
2513b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->lf.mode_ref_delta_update = 0;
2514b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2515b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Initialize cpi->mv_step_param to default based on max resolution.
2516b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->mv_step_param = vp9_init_search_range(cpi, max_mv_def);
2517b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Initialize cpi->max_mv_magnitude and cpi->mv_step_param if appropriate.
2518b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (sf->auto_mv_step_size) {
2519b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (frame_is_intra_only(cm)) {
2520b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      // Initialize max_mv_magnitude for use in the first INTER frame
2521b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      // after a key/intra-only frame.
2522b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->max_mv_magnitude = max_mv_def;
2523b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    } else {
2524b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      if (cm->show_frame)
2525b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        // Allow mv_steps to correspond to twice the max mv magnitude found
2526b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        // in the previous frame, capped by the default max_mv_magnitude based
2527b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        // on resolution.
2528b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->mv_step_param = vp9_init_search_range(cpi, MIN(max_mv_def, 2 *
2529b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                 cpi->max_mv_magnitude));
2530b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->max_mv_magnitude = 0;
2531b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
2532b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2533b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2534b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Set various flags etc to special state if it is a key frame.
2535b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (frame_is_intra_only(cm)) {
25366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    setup_key_frame(cpi);
2537b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // Reset the loop filter deltas and segmentation map.
2538b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_reset_segment_features(&cm->seg);
2539b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2540b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // If segmentation is enabled force a map update for key frames.
2541b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (seg->enabled) {
2542b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      seg->update_map = 1;
2543b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      seg->update_data = 1;
2544b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
2545b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2546b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // The alternate reference frame cannot be active for a key frame.
2547b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->rc.source_alt_ref_active = 0;
2548b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2549b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->error_resilient_mode = (cpi->oxcf.error_resilient_mode != 0);
2550b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->frame_parallel_decoding_mode =
2551b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      (cpi->oxcf.frame_parallel_decoding_mode != 0);
2552b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2553b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // By default, encoder assumes decoder can use prev_mi.
2554b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->coding_use_prev_mi = 1;
2555b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (cm->error_resilient_mode) {
2556b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cm->coding_use_prev_mi = 0;
2557b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cm->frame_parallel_decoding_mode = 1;
2558b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cm->reset_frame_context = 0;
2559b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cm->refresh_frame_context = 0;
2560b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    } else if (cm->intra_only) {
2561b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      // Only reset the current context.
2562b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cm->reset_frame_context = 2;
2563b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
2564b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2565b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2566b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Configure experimental use of segmentation for enhanced coding of
2567b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // static regions if indicated.
2568b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Only allowed in second pass of two pass (as requires lagged coding)
2569b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // and if the relevant speed feature flag is set.
2570b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->pass == 2 && cpi->sf.static_segmentation)
2571b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    configure_static_seg_features(cpi);
2572b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2573b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // For 1 pass CBR, check if we are dropping this frame.
2574b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Never drop on key frame.
2575b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->pass == 0 &&
2576b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
2577b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cm->frame_type != KEY_FRAME) {
2578b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (vp9_rc_drop_frame(cpi)) {
2579b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_rc_postencode_update_drop_frame(cpi);
2580b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      ++cm->current_video_frame;
2581b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      return;
2582b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
2583b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2584b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2585b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_clear_system_state();
2586b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2587b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_zero(cpi->rd_tx_select_threshes);
2588b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2589b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_VP9_POSTPROC
2590b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->oxcf.noise_sensitivity > 0) {
2591b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    int l = 0;
2592b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    switch (cpi->oxcf.noise_sensitivity) {
2593b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      case 1:
2594b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        l = 20;
2595b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        break;
2596b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      case 2:
2597b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        l = 40;
2598b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        break;
2599b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      case 3:
2600b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        l = 60;
2601b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        break;
2602b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      case 4:
2603b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      case 5:
2604b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        l = 100;
2605b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        break;
2606b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      case 6:
2607b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        l = 150;
2608b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        break;
2609b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
2610b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_denoise(cpi->Source, cpi->Source, l);
2611b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2612b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
2613b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2614b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef OUTPUT_YUV_SRC
2615b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_write_yuv_frame(cpi->Source);
2616b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
2617b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
26186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  set_speed_features(cpi);
26196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2620b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Decide q and q bounds.
2621b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index);
2622b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2623b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (!frame_is_intra_only(cm)) {
2624b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->interp_filter = DEFAULT_INTERP_FILTER;
2625b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    /* TODO: Decide this more intelligently */
2626b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH);
2627b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2628b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2629b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->sf.recode_loop == DISALLOW_RECODE) {
2630b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    encode_without_recode_loop(cpi, size, dest, q);
2631b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
2632b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index);
2633b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2634ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2635ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Special case code to reduce pulsing when key frames are forced at a
2636ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // fixed interval. Note the reconstruction error if it is the frame before
2637ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // the force key frame
2638b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
26396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->ambient_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
2640ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2642b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // If the encoder forced a KEY_FRAME decision
2643ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cm->frame_type == KEY_FRAME)
2644ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->refresh_last_frame = 1;
2645ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
26465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  cm->frame_to_show = get_frame_new_buffer(cm);
2647ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2648ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER
2649ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cm->show_frame)
2650ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    write_cx_frame_to_file(cm->frame_to_show,
2651ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           cm->current_video_frame);
2652ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else
2653ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    write_cx_frame_to_file(cm->frame_to_show,
2654ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           cm->current_video_frame + 1000);
2655ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2656ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2657ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Pick the loop filter level for the frame.
2658ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  loopfilter_frame(cpi, cm);
2659ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2660ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER
2661ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cm->show_frame)
2662ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    write_cx_frame_to_file(cm->frame_to_show,
2663ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           cm->current_video_frame + 2000);
2664ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else
2665ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    write_cx_frame_to_file(cm->frame_to_show,
2666ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           cm->current_video_frame + 3000);
2667ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2668ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2669ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // build the bitstream
2670ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->dummy_packing = 0;
2671ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vp9_pack_bitstream(cpi, dest, size);
2672ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
26731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (cm->seg.update_map)
2674ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    update_reference_segmentation_map(cpi);
2675ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2676ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  release_scaled_references(cpi);
2677a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  vp9_update_reference_frames(cpi);
2678ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2679ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (t = TX_4X4; t <= TX_32X32; t++)
2680b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    full_to_model_counts(cm->counts.coef[t], cpi->coef_counts[t]);
2681ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2682b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode)
2683b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_adapt_coef_probs(cm);
2684ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2685b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (!frame_is_intra_only(cm)) {
2686b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) {
2687b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_adapt_mode_probs(cm);
2688b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv);
2689b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
2690ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2691ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2692ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0
26935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  output_frame_level_debug_stats(cpi);
2694ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2695ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->refresh_golden_frame == 1)
2696b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->frame_flags |= FRAMEFLAGS_GOLDEN;
2697ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else
2698b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->frame_flags &= ~FRAMEFLAGS_GOLDEN;
2699ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2700ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->refresh_alt_ref_frame == 1)
2701b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->frame_flags |= FRAMEFLAGS_ALTREF;
2702ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  else
2703b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->frame_flags &= ~FRAMEFLAGS_ALTREF;
2704ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2705b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  get_ref_frame_flags(cpi);
2706ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2707b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_rc_postencode_update(cpi, *size);
2708ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2709ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cm->frame_type == KEY_FRAME) {
2710ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Tell the caller that the frame was coded as a key frame
2711ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
2712ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2713ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2714ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // Reset the sequence number.
2715ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cpi->multi_arf_enabled) {
2716ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->sequence_number = 0;
2717ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->frame_coding_order_period = cpi->new_frame_coding_order_period;
2718ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->new_frame_coding_order_period = -1;
2719ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2720ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2721ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
2722ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
2723ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2724ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2725ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /* Increment position in the coded frame sequence. */
2726ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cpi->multi_arf_enabled) {
2727ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      ++cpi->sequence_number;
2728ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (cpi->sequence_number >= cpi->frame_coding_order_period) {
2729ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->sequence_number = 0;
2730ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->frame_coding_order_period = cpi->new_frame_coding_order_period;
2731ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->new_frame_coding_order_period = -1;
2732ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
2733ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->this_frame_weight = cpi->arf_weight[cpi->sequence_number];
2734ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      assert(cpi->this_frame_weight >= 0);
2735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2736ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2737ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2738ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
27395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Clear the one shot update flags for segmentation map and mode/ref loop
27405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // filter deltas.
27411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->seg.update_map = 0;
27421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->seg.update_data = 0;
27431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cm->lf.mode_ref_delta_update = 0;
2744ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2745ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // keep track of the last coded dimensions
2746ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->last_width = cm->width;
2747ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->last_height = cm->height;
2748ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
274991037db265ecdd914a26e056cf69207b4f50924ehkuang  // reset to normal state now that we are done.
2750b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (!cm->show_existing_frame)
2751b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->last_show_frame = cm->show_frame;
2752b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2753ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cm->show_frame) {
2754a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    vp9_swap_mi_and_prev_mi(cm);
27555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
275691037db265ecdd914a26e056cf69207b4f50924ehkuang    // Don't increment frame counters if this was an altref buffer
275791037db265ecdd914a26e056cf69207b4f50924ehkuang    // update not a real frame
2758ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ++cm->current_video_frame;
27596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (cpi->use_svc)
27606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      vp9_inc_frame_in_layer(&cpi->svc);
2761ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2762b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
276391037db265ecdd914a26e056cf69207b4f50924ehkuang  // restore prev_mi
27646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
27656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
2766ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2767ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2768b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2769b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                      unsigned int *frame_flags) {
2770b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_rc_get_svc_params(cpi);
2771b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2772b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
2773ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2774b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2775b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                        unsigned int *frame_flags) {
2776b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
2777b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_rc_get_one_pass_cbr_params(cpi);
2778b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
2779b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_rc_get_one_pass_vbr_params(cpi);
2780b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2781ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2782b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
2783b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2784b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void Pass1Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2785b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                        unsigned int *frame_flags) {
2786b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  (void) size;
2787b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  (void) dest;
2788b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  (void) frame_flags;
2789b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2790b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_rc_get_first_pass_params(cpi);
27916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_set_quantizer(&cpi->common, find_fp_qindex());
2792b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_first_pass(cpi);
2793b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
2794ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2795b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void Pass2Encode(VP9_COMP *cpi, size_t *size,
2796b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                        uint8_t *dest, unsigned int *frame_flags) {
2797b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
2798ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2799b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_rc_get_second_pass_params(cpi);
2800b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2801ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
28026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  vp9_twopass_postencode_update(cpi);
2803ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2804ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2805b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void check_initial_width(VP9_COMP *cpi, int subsampling_x,
2806b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                int subsampling_y) {
2807b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_COMMON *const cm = &cpi->common;
2808b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2809ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!cpi->initial_width) {
2810b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->subsampling_x = subsampling_x;
2811b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cm->subsampling_y = subsampling_y;
2812ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    alloc_raw_frame_buffers(cpi);
2813ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->initial_width = cm->width;
2814ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->initial_height = cm->height;
2815ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
28161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}
28171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
28181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
2819b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags,
28201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                          YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
28211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                          int64_t end_time) {
2822b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_COMMON *cm = &cpi->common;
2823b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  struct vpx_usec_timer timer;
2824b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int res = 0;
2825b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int subsampling_x = sd->uv_width  < sd->y_width;
2826b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const int subsampling_y = sd->uv_height < sd->y_height;
28271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
2828b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  check_initial_width(cpi, subsampling_x, subsampling_y);
2829ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_usec_timer_start(&timer);
2830b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (vp9_lookahead_push(cpi->lookahead,
2831b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         sd, time_stamp, end_time, frame_flags))
2832ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    res = -1;
2833ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_usec_timer_mark(&timer);
2834ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
2835ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
28366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cm->profile == PROFILE_0 && (subsampling_x != 1 || subsampling_y != 1)) {
2837b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
2838b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                       "Non-4:2:0 color space requires profile >= 1");
2839b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    res = -1;
2840b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2841b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2842ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return res;
2843ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2844ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2845ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2846ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int frame_is_reference(const VP9_COMP *cpi) {
2847ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const VP9_COMMON *cm = &cpi->common;
2848ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2849ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return cm->frame_type == KEY_FRAME ||
2850ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang         cpi->refresh_last_frame ||
2851ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang         cpi->refresh_golden_frame ||
2852ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang         cpi->refresh_alt_ref_frame ||
2853ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang         cm->refresh_frame_context ||
28541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang         cm->lf.mode_ref_delta_update ||
28551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang         cm->seg.update_map ||
28561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang         cm->seg.update_data;
2857ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2858ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2859ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2860ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint is_next_frame_arf(VP9_COMP *cpi) {
2861ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Negative entry in frame_coding_order indicates an ARF at this position.
2862ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return cpi->frame_coding_order[cpi->sequence_number + 1] < 0 ? 1 : 0;
2863ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
2864ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2865ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2866b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid adjust_frame_rate(VP9_COMP *cpi) {
2867b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t this_duration;
2868b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int step = 0;
2869b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2870b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
2871b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    this_duration = cpi->source->ts_end - cpi->source->ts_start;
2872b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    step = 1;
2873b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
2874b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    int64_t last_duration = cpi->last_end_time_stamp_seen
2875b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        - cpi->last_time_stamp_seen;
2876b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2877b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
2878b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2879b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // do a step update if the duration changes by 10%
2880b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (last_duration)
2881b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      step = (int)((this_duration - last_duration) * 10 / last_duration);
2882b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2883b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2884b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (this_duration) {
2885b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (step) {
2886b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_new_framerate(cpi, 10000000.0 / this_duration);
2887b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    } else {
2888b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      // Average this frame's rate into the last second's average
2889b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      // frame rate. If we haven't seen 1 second yet, then average
2890b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      // over the whole interval seen.
2891b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      const double interval = MIN((double)(cpi->source->ts_end
2892b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                   - cpi->first_time_stamp_ever), 10000000.0);
2893b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      double avg_duration = 10000000.0 / cpi->oxcf.framerate;
2894b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      avg_duration *= (interval - avg_duration + this_duration);
2895b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      avg_duration /= interval;
2896b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2897b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_new_framerate(cpi, 10000000.0 / avg_duration);
2898b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
2899b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
2900b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->last_time_stamp_seen = cpi->source->ts_start;
2901b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->last_end_time_stamp_seen = cpi->source->ts_end;
2902b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
2903b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2904b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
2905b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                            size_t *size, uint8_t *dest,
2906ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                            int64_t *time_stamp, int64_t *time_end, int flush) {
29076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  VP9_COMMON *const cm = &cpi->common;
29086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  MACROBLOCKD *const xd = &cpi->mb.e_mbd;
29096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  RATE_CONTROL *const rc = &cpi->rc;
2910ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  struct vpx_usec_timer  cmptimer;
2911b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  YV12_BUFFER_CONFIG *force_src_buffer = NULL;
2912b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  MV_REFERENCE_FRAME ref_frame;
2913ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2914ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!cpi)
2915ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
2916ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
29176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2) {
29186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_restore_layer_context(cpi);
29196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
29206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2921ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_usec_timer_start(&cmptimer);
2922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2923ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->source = NULL;
29246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->last_source = NULL;
2925ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2926b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV);
2927b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2928b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Normal defaults
2929b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->reset_frame_context = 0;
2930b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->refresh_frame_context = 1;
2931b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->refresh_last_frame = 1;
2932b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->refresh_golden_frame = 0;
2933b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cpi->refresh_alt_ref_frame = 0;
2934ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2935ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Should we code an alternate reference frame.
29366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cpi->oxcf.play_alternate && rc->source_alt_ref_pending) {
2937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int frames_to_arf;
2938ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2939ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2940ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    assert(!cpi->multi_arf_enabled ||
2941ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang           cpi->frame_coding_order[cpi->sequence_number] < 0);
2942ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2943ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cpi->multi_arf_enabled && (cpi->pass == 2))
2944ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      frames_to_arf = (-cpi->frame_coding_order[cpi->sequence_number])
2945b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          - cpi->next_frame_in_order;
2946ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    else
2947ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
29486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      frames_to_arf = rc->frames_till_gf_update_due;
2949ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
29506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    assert(frames_to_arf <= rc->frames_to_key);
2951ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2952ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if ((cpi->source = vp9_lookahead_peek(cpi->lookahead, frames_to_arf))) {
2953ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2954ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->alt_ref_source[cpi->arf_buffered] = cpi->source;
2955ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
2956ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->alt_ref_source = cpi->source;
2957ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
2958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2959ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (cpi->oxcf.arnr_max_frames > 0) {
2960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        // Produce the filtered ARF frame.
2961ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        // TODO(agrange) merge these two functions.
29626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        vp9_configure_arnr_filter(cpi, frames_to_arf, rc->gfu_boost);
2963ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        vp9_temporal_filter_prepare(cpi, frames_to_arf);
2964b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        vp9_extend_frame_borders(&cpi->alt_ref_buffer);
2965ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        force_src_buffer = &cpi->alt_ref_buffer;
2966ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
2967ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2968ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cm->show_frame = 0;
2969ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->refresh_alt_ref_frame = 1;
2970ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->refresh_golden_frame = 0;
2971ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->refresh_last_frame = 0;
29726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      rc->is_src_frame_alt_ref = 0;
2973ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2974ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (!cpi->multi_arf_enabled)
2976ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
29776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        rc->source_alt_ref_pending = 0;
2978b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    } else {
29796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      rc->source_alt_ref_pending = 0;
2980ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
2981ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
2982ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2983ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!cpi->source) {
2984ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2985ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int i;
2986ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
29876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
29886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    // Get last frame source.
29896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (cm->current_video_frame > 0) {
29906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      if ((cpi->last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL)
29916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        return -1;
29926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    }
29936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2994ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if ((cpi->source = vp9_lookahead_pop(cpi->lookahead, flush))) {
2995ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cm->show_frame = 1;
29965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      cm->intra_only = 0;
2997ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2998ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
2999ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      // Is this frame the ARF overlay.
30006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      rc->is_src_frame_alt_ref = 0;
3001ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      for (i = 0; i < cpi->arf_buffered; ++i) {
3002ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        if (cpi->source == cpi->alt_ref_source[i]) {
30036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang          rc->is_src_frame_alt_ref = 1;
3004ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          cpi->refresh_golden_frame = 1;
3005ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          break;
3006ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        }
3007ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
3008ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
30096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      rc->is_src_frame_alt_ref = cpi->alt_ref_source &&
30106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 (cpi->source == cpi->alt_ref_source);
3011ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
30126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      if (rc->is_src_frame_alt_ref) {
3013ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        // Current frame is an ARF overlay frame.
3014ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
3015ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->alt_ref_source[i] = NULL;
3016ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
3017ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->alt_ref_source = NULL;
3018ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
3019ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        // Don't refresh the last buffer for an ARF overlay frame. It will
3020ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        // become the GF so preserve last as an alternative prediction option.
3021ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->refresh_last_frame = 0;
3022ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
3023ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
3024ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      ++cpi->next_frame_in_order;
3025ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
3026ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
3027ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3028ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3029ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->source) {
3030ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer
3031ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                                           : &cpi->source->img;
30326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
30336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cpi->last_source != NULL) {
30346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->unscaled_last_source = &cpi->last_source->img;
30356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  } else {
30366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->unscaled_last_source = NULL;
30376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
30386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3039ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    *time_stamp = cpi->source->ts_start;
3040ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    *time_end = cpi->source->ts_end;
3041ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    *frame_flags = cpi->source->flags;
3042ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3043ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
30446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (cm->frame_type != KEY_FRAME && cpi->pass == 2)
30456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      rc->source_alt_ref_pending = is_next_frame_arf(cpi);
3046ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
3047ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
3048ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    *size = 0;
3049ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
3050ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vp9_end_first_pass(cpi);    /* get last stats packet */
3051ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->twopass.first_pass_done = 1;
3052ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
3053ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
3054ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3055ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3056ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
3057ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->first_time_stamp_ever = cpi->source->ts_start;
3058ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->last_end_time_stamp_seen = cpi->source->ts_start;
3059ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3060ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3061ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // adjust frame rates based on timestamps given
3062b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cm->show_frame) {
3063b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    adjust_frame_rate(cpi);
3064b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
3065ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3066b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->svc.number_temporal_layers > 1 &&
3067b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
30686ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    vp9_update_temporal_layer_framerate(cpi);
3069a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    vp9_restore_layer_context(cpi);
3070ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3071ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3072ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // start with a 0 size frame
3073ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  *size = 0;
3074ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3075ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Clear down mmx registers
3076b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_clear_system_state();
3077ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3078ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* find a free buffer for the new frame, releasing the reference previously
3079ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   * held.
3080ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   */
3081b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  cm->frame_bufs[cm->new_fb_idx].ref_count--;
3082ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->new_fb_idx = get_free_fb(cm);
3083ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3084ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_MULTIPLE_ARF
3085ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* Set up the correct ARF frame. */
3086ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->refresh_alt_ref_frame) {
3087ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ++cpi->arf_buffered;
3088ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3089ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
3090ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      (cpi->pass == 2)) {
3091ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->alt_fb_idx = cpi->arf_buffer_idx[cpi->sequence_number];
3092ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3093ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
3094ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3095ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->frame_flags = *frame_flags;
3096ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3097ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Reset the frame pointers to the current frame size
30985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  vp9_realloc_frame_buffer(get_frame_new_buffer(cm),
3099ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           cm->width, cm->height,
3100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           cm->subsampling_x, cm->subsampling_y,
3101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                           VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
3102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3103b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
3104b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
3105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    YV12_BUFFER_CONFIG *const buf = &cm->frame_bufs[idx].buf;
3106b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
3107b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_buf->buf = buf;
3108b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ref_buf->idx = idx;
3109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_setup_scale_factors_for_frame(&ref_buf->sf,
3110b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      buf->y_crop_width, buf->y_crop_height,
3111b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      cm->width, cm->height);
3112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3113b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (vp9_is_scaled(&ref_buf->sf))
3114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      vp9_extend_frame_borders(buf);
3115b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
3116b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
3117b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
3118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
3120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_vaq_init();
31215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
31225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3123a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  if (cpi->pass == 1 &&
3124a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian      (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
3125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    Pass1Encode(cpi, size, dest, frame_flags);
31266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  } else if (cpi->pass == 2 &&
31276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
3128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    Pass2Encode(cpi, size, dest, frame_flags);
3129a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian  } else if (cpi->use_svc) {
3130a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    SvcEncode(cpi, size, dest, frame_flags);
3131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
3132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    // One pass encode
3133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    Pass0Encode(cpi, size, dest, frame_flags);
3134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cm->refresh_frame_context)
3137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cm->frame_contexts[cm->frame_context_idx] = cm->fc;
3138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Frame was dropped, release scaled references.
3140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (*size == 0) {
3141b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    release_scaled_references(cpi);
3142b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
3143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
3144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (*size > 0) {
3145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->droppable = !frame_is_reference(cpi);
3146b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
3147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Save layer specific state.
31496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if ((cpi->svc.number_temporal_layers > 1 &&
31506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
31516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) {
3152a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    vp9_save_layer_context(cpi);
3153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_usec_timer_mark(&cmptimer);
3156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
3157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
3159ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    generate_psnr_packet(cpi);
3160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS
3162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->pass != 1) {
3164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    cpi->bytes += (int)(*size);
3165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cm->show_frame) {
3167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->count++;
3168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (cpi->b_calculate_psnr) {
3170b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        YV12_BUFFER_CONFIG *orig = cpi->Source;
3171b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
3172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
3173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        PSNR_STATS psnr;
3174b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        calc_psnr(orig, recon, &psnr);
3175b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
3176b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->total += psnr.psnr[0];
3177b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->total_y += psnr.psnr[1];
3178b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->total_u += psnr.psnr[2];
3179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->total_v += psnr.psnr[3];
3180b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->total_sq_error += psnr.sse[0];
3181b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        cpi->total_samples += psnr.samples[0];
3182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
3183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        {
3184b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          PSNR_STATS psnr2;
3185b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          double frame_ssim2 = 0, weight = 0;
31861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_VP9_POSTPROC
3187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer,
31881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                      cm->lf.filter_level * 10 / 6);
3189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
3190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          vp9_clear_system_state();
3191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3192b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          calc_psnr(orig, pp, &psnr2);
3193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3194b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          cpi->totalp += psnr2.psnr[0];
3195b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          cpi->totalp_y += psnr2.psnr[1];
3196b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          cpi->totalp_u += psnr2.psnr[2];
3197b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          cpi->totalp_v += psnr2.psnr[3];
3198b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          cpi->totalp_sq_error += psnr2.sse[0];
3199b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          cpi->totalp_samples += psnr2.samples[0];
3200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3201b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          frame_ssim2 = vp9_calc_ssim(orig, recon, 1, &weight);
3202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          cpi->summed_quality += frame_ssim2 * weight;
3204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          cpi->summed_weights += weight;
3205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          frame_ssim2 = vp9_calc_ssim(orig, &cm->post_proc_buffer, 1, &weight);
3207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          cpi->summedp_quality += frame_ssim2 * weight;
3209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          cpi->summedp_weights += weight;
3210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0
3211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          {
3212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            FILE *f = fopen("q_used.stt", "a");
3213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
3214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    cpi->common.current_video_frame, y2, u2, v2,
3215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    frame_psnr2, frame_ssim2);
3216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fclose(f);
3217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          }
3218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
3219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        }
3220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
3221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      if (cpi->b_calculate_ssimg) {
3223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        double y, u, v, frame_all;
3224b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        frame_all = vp9_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, &v);
3225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->total_ssimg_y += y;
3226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->total_ssimg_u += u;
3227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->total_ssimg_v += v;
3228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        cpi->total_ssimg_all += frame_all;
3229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
3230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
3231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
3234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 0;
3235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
3236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3237b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest,
3238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                              vp9_ppflags_t *flags) {
3239b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  VP9_COMMON *cm = &cpi->common;
3240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3241b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (!cm->show_frame) {
3242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
32435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
3244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int ret;
32451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_VP9_POSTPROC
3246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    ret = vp9_post_proc_frame(cm, dest, flags);
3247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
3248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3249b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (cm->frame_to_show) {
3250b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      *dest = *cm->frame_to_show;
3251b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      dest->y_width = cm->width;
3252b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      dest->y_height = cm->height;
3253b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      dest->uv_width = cm->width >> cm->subsampling_x;
3254b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      dest->uv_height = cm->height >> cm->subsampling_y;
3255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      ret = 0;
3256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    } else {
3257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      ret = -1;
3258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
3259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
32601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif  // !CONFIG_VP9_POSTPROC
3261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp9_clear_system_state();
3262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return ret;
3263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
3265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3266b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_roimap(VP9_COMP *cpi, unsigned char *map, unsigned int rows,
326791037db265ecdd914a26e056cf69207b4f50924ehkuang                   unsigned int cols, int delta_q[MAX_SEGMENTS],
326891037db265ecdd914a26e056cf69207b4f50924ehkuang                   int delta_lf[MAX_SEGMENTS],
326991037db265ecdd914a26e056cf69207b4f50924ehkuang                   unsigned int threshold[MAX_SEGMENTS]) {
327091037db265ecdd914a26e056cf69207b4f50924ehkuang  signed char feature_data[SEG_LVL_MAX][MAX_SEGMENTS];
32711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  struct segmentation *seg = &cpi->common.seg;
3272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
3273ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3274ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
3275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
3276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (!map) {
3278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vp9_disable_segmentation(seg);
3279ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return 0;
3280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Set the segmentation Map
3283b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_set_segmentation_map(cpi, map);
3284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Activate segmentation.
3286b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_enable_segmentation(seg);
3287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
32881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  // Set up the quant, LF and breakout threshold segment data
328991037db265ecdd914a26e056cf69207b4f50924ehkuang  for (i = 0; i < MAX_SEGMENTS; i++) {
3290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    feature_data[SEG_LVL_ALT_Q][i] = delta_q[i];
3291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    feature_data[SEG_LVL_ALT_LF][i] = delta_lf[i];
3292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->segment_encode_breakout[i] = threshold[i];
3293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Enable the loop and quant changes in the feature mask
329691037db265ecdd914a26e056cf69207b4f50924ehkuang  for (i = 0; i < MAX_SEGMENTS; i++) {
3297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (delta_q[i])
3298f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_enable_segfeature(seg, i, SEG_LVL_ALT_Q);
3299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    else
3300f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_disable_segfeature(seg, i, SEG_LVL_ALT_Q);
3301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (delta_lf[i])
3303f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_enable_segfeature(seg, i, SEG_LVL_ALT_LF);
3304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    else
3305f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF);
3306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3307ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
33081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  // Initialize the feature data structure
3309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1
3310b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vp9_set_segment_data(seg, &feature_data[0][0], SEGMENT_DELTADATA);
3311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 0;
3313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
3314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3315b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_active_map(VP9_COMP *cpi, unsigned char *map,
3316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       unsigned int rows, unsigned int cols) {
3317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) {
3318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (map) {
3319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memcpy(cpi->active_map, map, rows * cols);
3320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->active_map_enabled = 1;
3321ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    } else {
3322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      cpi->active_map_enabled = 0;
3323ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
3324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return 0;
3326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
3327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // cpi->active_map_enabled = 0;
3328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
3329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
3330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
3331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3332b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_internal_size(VP9_COMP *cpi,
3333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                          VPX_SCALING horiz_mode, VPX_SCALING vert_mode) {
3334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_COMMON *cm = &cpi->common;
3335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int hr = 0, hs = 0, vr = 0, vs = 0;
3336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (horiz_mode > ONETWO || vert_mode > ONETWO)
3338ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return -1;
3339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  Scale2Ratio(horiz_mode, &hr, &hs);
3341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  Scale2Ratio(vert_mode, &vr, &vs);
3342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // always go to the next whole number
3344ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs;
3345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs;
3346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  assert(cm->width <= cpi->initial_width);
3348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  assert(cm->height <= cpi->initial_height);
3349ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  update_frame_size(cpi);
3350ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return 0;
3351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
3352ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3353b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_set_size_literal(VP9_COMP *cpi, unsigned int width,
33541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                         unsigned int height) {
33551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  VP9_COMMON *cm = &cpi->common;
33561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
3357b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  check_initial_width(cpi, 1, 1);
33581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
33591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (width) {
33601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    cm->width = width;
33611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (cm->width * 5 < cpi->initial_width) {
33621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      cm->width = cpi->initial_width / 5 + 1;
3363b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      printf("Warning: Desired width too small, changed to %d\n", cm->width);
33641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    }
33651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (cm->width > cpi->initial_width) {
33661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      cm->width = cpi->initial_width;
3367b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      printf("Warning: Desired width too large, changed to %d\n", cm->width);
33681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    }
33691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  }
33701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
33711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (height) {
33721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    cm->height = height;
33731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (cm->height * 5 < cpi->initial_height) {
33741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      cm->height = cpi->initial_height / 5 + 1;
3375b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      printf("Warning: Desired height too small, changed to %d\n", cm->height);
33761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    }
33771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (cm->height > cpi->initial_height) {
33781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      cm->height = cpi->initial_height;
3379b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      printf("Warning: Desired height too large, changed to %d\n", cm->height);
33801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    }
33811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  }
33821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
33831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  assert(cm->width <= cpi->initial_width);
33841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  assert(cm->height <= cpi->initial_height);
33851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  update_frame_size(cpi);
33861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  return 0;
33871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}
33881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
3389b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_set_svc(VP9_COMP *cpi, int use_svc) {
33901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  cpi->use_svc = use_svc;
33911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  return;
33921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}
3393ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
33946ac915abcdb404a00d927fe6308a47fcf09d9519hkuangint vp9_get_y_sse(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b) {
33956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  assert(a->y_crop_width == b->y_crop_width);
33966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  assert(a->y_crop_height == b->y_crop_height);
3397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
33986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  return (int)get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
33996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                      a->y_crop_width, a->y_crop_height);
3400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
3401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3403b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_get_quantizer(VP9_COMP *cpi) {
3404b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return cpi->common.base_qindex;
3405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
3406