1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_config.h"
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "./vpx_scale_rtcd.h"
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/onyxc_int.h"
15ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vp8/common/blockd.h"
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "onyx_int.h"
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/systemdependent.h"
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "quantize.h"
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/alloccommon.h"
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "mcomp.h"
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "firstpass.h"
22411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#include "vpx/internal/vpx_psnr.h"
23d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#include "vpx_scale/vpx_scale.h"
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/extend.h"
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "ratectrl.h"
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/quant_common.h"
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "segmentation.h"
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_POSTPROC
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/postproc.h"
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h"
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/swapyv12buffer.h"
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/threading.h"
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_ports/vpx_timer.h"
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if ARCH_ARM
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_ports/arm.h"
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
38167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING
39167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "mr_dissim.h"
40167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif
415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "encodeframe.h"
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <math.h>
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdio.h>
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <limits.h>
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgextern int vp8_update_coef_context(VP8_COMP *cpi);
495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgextern void vp8_update_coef_probs(VP8_COMP *cpi);
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void print_parms(VP8_CONFIG *ocf, char *filenam);
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern unsigned int vp8_get_processor_freq();
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void print_tree_update_probs();
60ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgextern int vp8cx_create_encoder_threads(VP8_COMP *cpi);
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_estimate_entropy_savings(VP8_COMP *cpi);
64167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgint vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void set_default_lf_deltas(VP8_COMP *cpi);
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern const int vp8_gf_interval_table[101];
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_INTERNAL_STATS
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "math.h"
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern double vp8_calc_ssim
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *source,
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *dest,
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int lumamask,
815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double *weight
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern double vp8_calc_ssimg
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *source,
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *dest,
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double *ssim_y,
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double *ssim_u,
915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    double *ssim_v
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef OUTPUT_YUV_SRC
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgFILE *yuv_file;
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
10188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef OUTPUT_YUV_DENOISED
10288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgFILE *yuv_denoised_file;
10388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgFILE *framepsnr;
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgFILE *kf_list;
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgFILE *keyfile;
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int skip_true_count;
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int skip_false_count;
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1171cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int intra_mode_stats[10][10][10];
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef SPEEDSTATS
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int tot_pm = 0;
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int cnt_pm = 0;
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int tot_ef = 0;
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int cnt_ef = 0;
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern unsigned __int64 Sectionbits[50];
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int y_modes[5]  ;
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int uv_modes[4] ;
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int b_modes[10]  ;
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int inter_y_modes[10] ;
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int inter_uv_modes[4] ;
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern unsigned int inter_b_modes[15];
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern const int vp8_bits_per_mb[2][QINDEX_RANGE];
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern const int qrounding_factors[129];
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern const int qzbin_factors[129];
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8cx_init_quantizer(VP8_COMP *cpi);
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern const int vp8cx_base_skip_false_prob[128];
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
147ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Tables relating active max Q to active min Q */
1485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const unsigned char kf_low_motion_minq[QINDEX_RANGE] =
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
1595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const unsigned char kf_high_motion_minq[QINDEX_RANGE] =
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6,
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21,
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
1705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const unsigned char gf_low_motion_minq[QINDEX_RANGE] =
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
1815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const unsigned char gf_mid_motion_minq[QINDEX_RANGE] =
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4,
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,
187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48,
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
1925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const unsigned char gf_high_motion_minq[QINDEX_RANGE] =
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4,
195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54,
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
2035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const unsigned char inter_minq[QINDEX_RANGE] =
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef PACKET_TESTING
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern FILE *vpxlogc;
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
219167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void save_layer_context(VP8_COMP *cpi)
220167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{
221167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
222167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Save layer dependent coding state */
224167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->target_bandwidth                 = cpi->target_bandwidth;
225167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->starting_buffer_level            = cpi->oxcf.starting_buffer_level;
226167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->optimal_buffer_level             = cpi->oxcf.optimal_buffer_level;
227167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->maximum_buffer_size              = cpi->oxcf.maximum_buffer_size;
228167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->starting_buffer_level_in_ms      = cpi->oxcf.starting_buffer_level_in_ms;
229167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->optimal_buffer_level_in_ms       = cpi->oxcf.optimal_buffer_level_in_ms;
230167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->maximum_buffer_size_in_ms        = cpi->oxcf.maximum_buffer_size_in_ms;
231167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->buffer_level                     = cpi->buffer_level;
232167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->bits_off_target                  = cpi->bits_off_target;
233167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->total_actual_bits                = cpi->total_actual_bits;
234167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->worst_quality                    = cpi->worst_quality;
235167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->active_worst_quality             = cpi->active_worst_quality;
236167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->best_quality                     = cpi->best_quality;
237167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->active_best_quality              = cpi->active_best_quality;
238167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->ni_av_qi                         = cpi->ni_av_qi;
239167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->ni_tot_qi                        = cpi->ni_tot_qi;
240167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->ni_frames                        = cpi->ni_frames;
241167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->avg_frame_qindex                 = cpi->avg_frame_qindex;
242167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->rate_correction_factor           = cpi->rate_correction_factor;
243167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
244167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->gf_rate_correction_factor        = cpi->gf_rate_correction_factor;
245d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    lc->zbin_over_quant                  = cpi->mb.zbin_over_quant;
246167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->inter_frame_target               = cpi->inter_frame_target;
247167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->total_byte_count                 = cpi->total_byte_count;
248167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->filter_level                     = cpi->common.filter_level;
249167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
250167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    lc->last_frame_percent_intra         = cpi->last_frame_percent_intra;
251167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
252167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    memcpy (lc->count_mb_ref_frame_usage,
253d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->mb.count_mb_ref_frame_usage,
254d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            sizeof(cpi->mb.count_mb_ref_frame_usage));
255167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org}
256167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
257167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void restore_layer_context(VP8_COMP *cpi, const int layer)
258167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{
259167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    LAYER_CONTEXT *lc = &cpi->layer_context[layer];
260167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
261ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Restore layer dependent coding state */
262167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->current_layer                    = layer;
263167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->target_bandwidth                 = lc->target_bandwidth;
264167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->oxcf.target_bandwidth            = lc->target_bandwidth;
265167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->oxcf.starting_buffer_level       = lc->starting_buffer_level;
266167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->oxcf.optimal_buffer_level        = lc->optimal_buffer_level;
267167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->oxcf.maximum_buffer_size         = lc->maximum_buffer_size;
268167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
269167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->oxcf.optimal_buffer_level_in_ms  = lc->optimal_buffer_level_in_ms;
270167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->oxcf.maximum_buffer_size_in_ms   = lc->maximum_buffer_size_in_ms;
271167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->buffer_level                     = lc->buffer_level;
272167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->bits_off_target                  = lc->bits_off_target;
273167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->total_actual_bits                = lc->total_actual_bits;
274167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->active_worst_quality             = lc->active_worst_quality;
275167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->active_best_quality              = lc->active_best_quality;
276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->ni_av_qi                         = lc->ni_av_qi;
277167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->ni_tot_qi                        = lc->ni_tot_qi;
278167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->ni_frames                        = lc->ni_frames;
279167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->avg_frame_qindex                 = lc->avg_frame_qindex;
280167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->rate_correction_factor           = lc->rate_correction_factor;
281167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
282167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->gf_rate_correction_factor        = lc->gf_rate_correction_factor;
283d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    cpi->mb.zbin_over_quant                  = lc->zbin_over_quant;
284167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->inter_frame_target               = lc->inter_frame_target;
285167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->total_byte_count                 = lc->total_byte_count;
286167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->common.filter_level              = lc->filter_level;
287167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
288167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->last_frame_percent_intra         = lc->last_frame_percent_intra;
289167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
290d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    memcpy (cpi->mb.count_mb_ref_frame_usage,
291167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            lc->count_mb_ref_frame_usage,
292d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            sizeof(cpi->mb.count_mb_ref_frame_usage));
293167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org}
294167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
29510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgstatic int rescale(int val, int num, int denom)
29610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org{
29710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    int64_t llnum = num;
29810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    int64_t llden = denom;
29910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    int64_t llval = val;
30010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
30110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    return (int)(llval * llnum / llden);
30210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}
30310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
30410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgstatic void init_temporal_layer_context(VP8_COMP *cpi,
30510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                        VP8_CONFIG *oxcf,
30610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                        const int layer,
30747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                                        double prev_layer_framerate)
30810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org{
30910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    LAYER_CONTEXT *lc = &cpi->layer_context[layer];
31010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
31147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    lc->framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[layer];
31210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    lc->target_bandwidth = cpi->oxcf.target_bitrate[layer] * 1000;
31310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
31410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
31510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    lc->optimal_buffer_level_in_ms  = oxcf->optimal_buffer_level;
31610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    lc->maximum_buffer_size_in_ms   = oxcf->maximum_buffer_size;
31710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
31810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    lc->starting_buffer_level =
31910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        rescale((int)(oxcf->starting_buffer_level),
32010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                lc->target_bandwidth, 1000);
32110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
32210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    if (oxcf->optimal_buffer_level == 0)
32310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      lc->optimal_buffer_level = lc->target_bandwidth / 8;
32410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    else
32510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      lc->optimal_buffer_level =
32610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org          rescale((int)(oxcf->optimal_buffer_level),
32710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                  lc->target_bandwidth, 1000);
32810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
32910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    if (oxcf->maximum_buffer_size == 0)
33010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      lc->maximum_buffer_size = lc->target_bandwidth / 8;
33110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    else
33210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      lc->maximum_buffer_size =
33310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org          rescale((int)(oxcf->maximum_buffer_size),
33410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                  lc->target_bandwidth, 1000);
33510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
33610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    /* Work out the average size of a frame within this layer */
33710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    if (layer > 0)
33810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      lc->avg_frame_size_for_layer =
33910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org          (int)((cpi->oxcf.target_bitrate[layer] -
34010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                cpi->oxcf.target_bitrate[layer-1]) * 1000 /
34147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                (lc->framerate - prev_layer_framerate));
34210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
34310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->active_worst_quality         = cpi->oxcf.worst_allowed_q;
34410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->active_best_quality          = cpi->oxcf.best_allowed_q;
34510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->avg_frame_qindex             = cpi->oxcf.worst_allowed_q;
34610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
34710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->buffer_level                 = lc->starting_buffer_level;
34810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->bits_off_target              = lc->starting_buffer_level;
34910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
35010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->total_actual_bits                 = 0;
35110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->ni_av_qi                          = 0;
35210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->ni_tot_qi                         = 0;
35310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->ni_frames                         = 0;
35410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->rate_correction_factor            = 1.0;
35510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->key_frame_rate_correction_factor  = 1.0;
35610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->gf_rate_correction_factor         = 1.0;
35710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org     lc->inter_frame_target                = 0;
35810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}
35910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
36010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// Upon a run-time change in temporal layers, reset the layer context parameters
36110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// for any "new" layers. For "existing" layers, let them inherit the parameters
36210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// from the previous layer state (at the same layer #). In future we may want
36310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// to better map the previous layer state(s) to the "new" ones.
36410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgstatic void reset_temporal_layer_change(VP8_COMP *cpi,
36510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                        VP8_CONFIG *oxcf,
36610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                        const int prev_num_layers)
36710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org{
3689317728b1000351b129816f2945bbcbb48add326fgalligan@chromium.org    int i;
36947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    double prev_layer_framerate = 0;
37010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    const int curr_num_layers = cpi->oxcf.number_of_layers;
37110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    // If the previous state was 1 layer, get current layer context from cpi.
37210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    // We need this to set the layer context for the new layers below.
37310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    if (prev_num_layers == 1)
37410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    {
37510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        cpi->current_layer = 0;
37610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        save_layer_context(cpi);
37710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    }
37810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    for (i = 0; i < curr_num_layers; i++)
37910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    {
38010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        LAYER_CONTEXT *lc = &cpi->layer_context[i];
38110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        if (i >= prev_num_layers)
38210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        {
38347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org           init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
38410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        }
38510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // The initial buffer levels are set based on their starting levels.
38610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // We could set the buffer levels based on the previous state (normalized
38710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // properly by the layer bandwidths) but we would need to keep track of
38810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // the previous set of layer bandwidths (i.e., target_bitrate[i])
38910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // before the layer change. For now, reset to the starting levels.
39010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
39110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                           cpi->oxcf.target_bitrate[i];
39210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        lc->bits_off_target = lc->buffer_level;
39310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // TDOD(marpan): Should we set the rate_correction_factor and
39410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // active_worst/best_quality to values derived from the previous layer
39510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // state (to smooth-out quality dips/rate fluctuation at transition)?
39610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
39710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // We need to treat the 1 layer case separately: oxcf.target_bitrate[i]
39810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // is not set for 1 layer, and the restore_layer_context/save_context()
39910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // are not called in the encoding loop, so we need to call it here to
40010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // pass the layer context state to |cpi|.
40110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        if (curr_num_layers == 1)
40210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        {
40310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            lc->target_bandwidth = cpi->oxcf.target_bandwidth;
40410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
40510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                               lc->target_bandwidth  / 1000;
40610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            lc->bits_off_target = lc->buffer_level;
40710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            restore_layer_context(cpi, 0);
40810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        }
40947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        prev_layer_framerate = cpi->output_framerate /
41047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                               cpi->oxcf.rate_decimator[i];
41110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    }
41210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}
41310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void setup_features(VP8_COMP *cpi)
415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // If segmentation enabled set the update flags
417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if ( cpi->mb.e_mbd.segmentation_enabled )
418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->mb.e_mbd.update_mb_segmentation_map = 1;
420ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->mb.e_mbd.update_mb_segmentation_data = 1;
421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else
423ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->mb.e_mbd.update_mb_segmentation_map = 0;
425ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->mb.e_mbd.update_mb_segmentation_data = 0;
426ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    set_default_lf_deltas(cpi);
436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
438474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void dealloc_raw_frame_buffers(VP8_COMP *cpi);
4415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
4425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void dealloc_compressor_data(VP8_COMP *cpi)
444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
445474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->tplist);
446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->tplist = NULL;
447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
448ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Delete last frame MV storage buffers */
449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->lfmv);
450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->lfmv = 0;
451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->lf_ref_frame_sign_bias);
453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->lf_ref_frame_sign_bias = 0;
454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->lf_ref_frame);
456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->lf_ref_frame = 0;
457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
458ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Delete sementation map */
459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->segmentation_map);
460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->segmentation_map = 0;
461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
462474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->active_map);
463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->active_map = 0;
464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_de_alloc_frame_buffers(&cpi->common);
466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
467167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
4695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    dealloc_raw_frame_buffers(cpi);
470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->tok);
472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->tok = 0;
473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
474ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Structure used to monitor GF usage */
475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->gf_active_flags);
476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->gf_active_flags = 0;
477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
478ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Activity mask based per mb zbin adjustments */
479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->mb_activity_map);
480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb_activity_map = 0;
481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->mb.pip);
483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.pip = 0;
484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_MULTITHREAD
486ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(cpi->mt_current_mb_col);
487ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mt_current_mb_col = NULL;
488ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif
489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
491167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void enable_segmentation(VP8_COMP *cpi)
492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
493ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set the appropriate feature bit */
494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.segmentation_enabled = 1;
495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
498167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void disable_segmentation(VP8_COMP *cpi)
499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
500ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear the appropriate feature bit */
501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.segmentation_enabled = 0;
502474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
504ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Valid values for a segment are 0 to 3
505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * Segmentation map is arrange as [Rows][Columns]
506ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
507167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void set_segmentation_map(VP8_COMP *cpi, unsigned char *segmentation_map)
508474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
509ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Copy in the new segmentation map */
510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));
511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
512ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Signal that the map should be updated. */
513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
517ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* The values given for each segment can be either deltas (from the default
518ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * value chosen for the frame) or absolute values.
519ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *
520ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * Valid range for abs values is:
521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *    (0-127 for MB_LVL_ALT_Q), (0-63 for SEGMENT_ALT_LF)
522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * Valid range for delta values are:
523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *    (+/-127 for MB_LVL_ALT_Q), (+/-63 for SEGMENT_ALT_LF)
524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *
525ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * abs_delta = SEGMENT_DELTADATA (deltas)
526ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * abs_delta = SEGMENT_ABSDATA (use the absolute values given).
527ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *
528ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
529167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned char abs_delta)
530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
536167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void segmentation_test_function(VP8_COMP *cpi)
537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *seg_map;
539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    // Create a temporary map for segmentation data.
542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    // Set the segmentation Map
545167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    set_segmentation_map(cpi, seg_map);
546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    // Activate segmentation.
548167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    enable_segmentation(cpi);
549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    // Set up the quant segment data
551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_Q][0] = 0;
552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_Q][1] = 4;
553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_Q][2] = 0;
554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_Q][3] = 0;
555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    // Set up the loop segment data
556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][0] = 0;
557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][1] = 0;
558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][2] = 0;
559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][3] = 0;
560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    // Initialise the feature data structure
562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1
563167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    // Delete sementation map
566ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(seg_map);
567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    seg_map = 0;
569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
571ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* A simple function to cyclically refresh the background at a lower Q */
572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
574ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *seg_map = cpi->segmentation_map;
575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i;
577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
579474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
580ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->cyclic_refresh_q = Q / 2;
581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
582ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // Set every macroblock to be eligible for update.
583ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // For key frame this will reset seg map to 0.
584ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_memset(cpi->segmentation_map, 0, mbs_in_frame);
585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->common.frame_type != KEY_FRAME)
587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
588ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Cycle through the macro_block rows */
589ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* MB loop to set local segmentation map */
590ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        i = cpi->cyclic_refresh_mode_index;
591ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        assert(i < mbs_in_frame);
592ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        do
593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
594ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          /* If the MB is as a candidate for clean up then mark it for
595ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org           * possible boost/refresh (segment 1) The segment id may get
596ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org           * reset to 0 later if the MB gets coded anything other than
597ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org           * last frame 0,0 as only (last frame 0,0) MBs are eligable for
598ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org           * refresh : that is to say Mbs likely to be background blocks.
599ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org           */
600ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          if (cpi->cyclic_refresh_map[i] == 0)
601ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          {
602ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              seg_map[i] = 1;
603ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              block_count --;
604ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          }
605ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          else if (cpi->cyclic_refresh_map[i] < 0)
606ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              cpi->cyclic_refresh_map[i]++;
607ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
608ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          i++;
609ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          if (i == mbs_in_frame)
610ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              i = 0;
611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
613ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        while(block_count && i != cpi->cyclic_refresh_mode_index);
614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->cyclic_refresh_mode_index = i;
61641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
61741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if CONFIG_TEMPORAL_DENOISING
618ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org        if (cpi->oxcf.noise_sensitivity > 0) {
619ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org          if (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive &&
620ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org              Q < (int)cpi->denoiser.denoise_pars.qp_thresh) {
621ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            // Under aggressive denoising, use segmentation to turn off loop
622ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            // filter below some qp thresh. The filter is turned off for all
623ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            // blocks that have been encoded as ZEROMV LAST x frames in a row,
624ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            // where x is set by cpi->denoiser.denoise_pars.consec_zerolast.
625ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            // This is to avoid "dot" artifacts that can occur from repeated
626ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            // loop filtering on noisy input source.
627ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            cpi->cyclic_refresh_q = Q;
628ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            lf_adjustment = -MAX_LOOP_FILTER;
629ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            for (i = 0; i < mbs_in_frame; ++i) {
630ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org              seg_map[i] = (cpi->consec_zero_last[i] >
631ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org                            cpi->denoiser.denoise_pars.consec_zerolast) ? 1 : 0;
632ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org            }
63341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          }
63441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
63541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
638ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Activate segmentation. */
639ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
640ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
641167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    enable_segmentation(cpi);
642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
643ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set up the quant segment data */
644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_Q][0] = 0;
645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_Q][2] = 0;
647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_Q][3] = 0;
648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
649ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set up the loop segment data */
650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][0] = 0;
651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][2] = 0;
653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][3] = 0;
654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
655ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Initialise the feature data structure */
656167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void set_default_lf_deltas(VP8_COMP *cpi)
661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
663474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
664474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
665474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
666474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
667474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
668ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Test of ref frame deltas */
669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
672474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
673474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
674ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.e_mbd.mode_lf_deltas[0] = 4;               /* BPRED */
675ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
676ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if(cpi->oxcf.Mode == MODE_REALTIME)
677ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      cpi->mb.e_mbd.mode_lf_deltas[1] = -12;              /* Zero */
678ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else
679ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      cpi->mb.e_mbd.mode_lf_deltas[1] = -2;              /* Zero */
680ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
681ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.e_mbd.mode_lf_deltas[2] = 2;               /* New mv */
682ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.e_mbd.mode_lf_deltas[3] = 4;               /* Split mv */
683474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
685167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org/* Convenience macros for mapping speed and mode into a continuous
686167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * range
687167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */
688167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#define GOOD(x) (x+1)
689167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#define RT(x) (x+7)
690167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
6915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic int speed_map(int speed, const int *map)
692167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{
693167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int res;
694167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
695167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    do
696167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
697167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        res = *map++;
698167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    } while(speed >= *map++);
699167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    return res;
700167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org}
701167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int thresh_mult_map_znn[] = {
703167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* map common to zero, nearest, and near */
704167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
705167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
706167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int thresh_mult_map_vhpred[] = {
708167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(1), 2000,
709167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    RT(7), INT_MAX, INT_MAX
710167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
711167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int thresh_mult_map_bpred[] = {
713167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    2000, GOOD(0), 2500, GOOD(2), 5000, GOOD(3), 7500, RT(0), 2500, RT(1), 5000,
714167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    RT(6), INT_MAX, INT_MAX
715167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
716167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int thresh_mult_map_tm[] = {
718167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 0, RT(1), 1000, RT(2), 2000,
719167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    RT(7), INT_MAX, INT_MAX
720167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
721167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int thresh_mult_map_new1[] = {
723167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    1000, GOOD(2), 2000, RT(0), 2000, INT_MAX
724167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
725167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int thresh_mult_map_new2[] = {
727167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    1000, GOOD(2), 2000, GOOD(3), 2500, GOOD(5), 4000, RT(0), 2000, RT(2), 2500,
728167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    RT(5), 4000, INT_MAX
729167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
730167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int thresh_mult_map_split1[] = {
732167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    2500, GOOD(0), 1700, GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
733167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    RT(0), 5000, RT(1), 10000, RT(2), 25000, RT(3), INT_MAX, INT_MAX
734167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
735167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int thresh_mult_map_split2[] = {
737167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    5000, GOOD(0), 4500, GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
738167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    RT(0), 10000, RT(1), 20000, RT(2), 50000, RT(3), INT_MAX, INT_MAX
739167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
740167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int mode_check_freq_map_zn2[] = {
742167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* {zero,nearest}{2,3} */
743167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
744167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
745167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int mode_check_freq_map_vhbpred[] = {
747167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(5), 4, INT_MAX
748167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
749167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int mode_check_freq_map_near2[] = {
751167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(10), 1<<2, RT(11), 1<<3, RT(12), 1<<4,
752167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    INT_MAX
753167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
754167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int mode_check_freq_map_new1[] = {
756167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
757167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
758167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int mode_check_freq_map_new2[] = {
760167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    0, GOOD(5), 4, RT(0), 0, RT(3), 4, RT(10), 1<<3, RT(11), 1<<4, RT(12), 1<<5,
761167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    INT_MAX
762167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
763167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int mode_check_freq_map_split1[] = {
765167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    0, GOOD(2), 2, GOOD(3), 7, RT(1), 2, RT(2), 7, INT_MAX
766167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
767167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
7685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic const int mode_check_freq_map_split2[] = {
769167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
770167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org};
771167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
772474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_set_speed_features(VP8_COMP *cpi)
773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
774474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    SPEED_FEATURES *sf = &cpi->sf;
775474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Mode = cpi->compressor_speed;
776474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Speed = cpi->Speed;
777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i;
778474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
779474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int last_improved_quant = sf->improved_quant;
780167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int ref_frames;
781474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
782ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Initialise default mode frequency sampling variables */
783474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < MAX_MODES; i ++)
784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->mode_check_freq[i] = 0;
786474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
787474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
788d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    cpi->mb.mbs_tested_so_far = 0;
789474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
790ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* best quality defaults */
791474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->RD = 1;
792474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->search_method = NSTEP;
793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->improved_quant = 1;
794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->improved_dct = 1;
795474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->auto_filter = 1;
796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->recode_loop = 1;
797474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->quarter_pixel_search = 1;
798474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->half_pixel_search = 1;
799474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->iterative_sub_pixel = 1;
800474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->optimize_coefficients = 1;
801474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->use_fastquant_for_pick = 0;
802474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->no_skip_block4x4_search = 1;
803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->first_step = 0;
805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
806474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sf->improved_mv_pred = 1;
807474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
808ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* default thresholds to 0 */
809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < MAX_MODES; i++)
810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->thresh_mult[i] = 0;
811474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
812167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* Count enabled references */
813167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    ref_frames = 1;
814ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cpi->ref_frame_flags & VP8_LAST_FRAME)
815167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        ref_frames++;
816ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
817167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        ref_frames++;
818ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
819167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        ref_frames++;
820167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
821167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* Convert speed to continuous range, with clamping */
822167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (Mode == 0)
823167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        Speed = 0;
824167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    else if (Mode == 2)
825167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        Speed = RT(Speed);
826167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    else
827167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
828167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (Speed > 5)
829167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            Speed = 5;
830167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        Speed = GOOD(Speed);
831167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
832167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
833167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_ZERO1] =
834167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEAREST1] =
835167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEAR1] =
836167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_DC] = 0; /* always */
837167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
838167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_ZERO2] =
839167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_ZERO3] =
840167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEAREST2] =
841167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEAREST3] =
842167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEAR2]  =
843167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEAR3]  = speed_map(Speed, thresh_mult_map_znn);
844167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
845167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_V_PRED] =
846167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_H_PRED] = speed_map(Speed, thresh_mult_map_vhpred);
847167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
848167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_TM]     = speed_map(Speed, thresh_mult_map_tm);
849167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEW1]   = speed_map(Speed, thresh_mult_map_new1);
850167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEW2]   =
851167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_NEW3]   = speed_map(Speed, thresh_mult_map_new2);
852167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
853167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_SPLIT2] =
854167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    sf->thresh_mult[THR_SPLIT3] = speed_map(Speed, thresh_mult_map_split2);
855167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
856167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_ZERO1] =
857167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEAREST1] =
858167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEAR1] =
859167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_TM]     =
860167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_DC] = 0; /* always */
861167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
862167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_ZERO2] =
863167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_ZERO3] =
864167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEAREST2] =
865167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEAREST3] = speed_map(Speed,
866167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                   mode_check_freq_map_zn2);
867167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
868167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEAR2]  =
869167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEAR3]  = speed_map(Speed,
870167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                 mode_check_freq_map_near2);
871167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
872167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_V_PRED] =
873167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_H_PRED] =
874167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_B_PRED] = speed_map(Speed,
875167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                 mode_check_freq_map_vhbpred);
876167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEW1]   = speed_map(Speed,
877167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                 mode_check_freq_map_new1);
878167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEW2]   =
879167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_NEW3]   = speed_map(Speed,
880167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                 mode_check_freq_map_new2);
881167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_SPLIT1] = speed_map(Speed,
882167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                 mode_check_freq_map_split1);
883167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_SPLIT2] =
884167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->mode_check_freq[THR_SPLIT3] = speed_map(Speed,
885167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                 mode_check_freq_map_split2);
886167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    Speed = cpi->Speed;
887474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    switch (Mode)
888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
890ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    case 0: /* best quality mode */
891474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->first_step = 0;
892474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
893474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case 1:
895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case 3:
896474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 0)
897474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            /* Disable coefficient optimization above speed 0 */
899474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->optimize_coefficients = 0;
900474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->use_fastquant_for_pick = 1;
901474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->no_skip_block4x4_search = 0;
902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
903474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->first_step = 1;
904474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
905474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
906474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 2)
907474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
908474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->improved_quant = 0;
909474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->improved_dct = 0;
910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
911ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Only do recode loop on key frames, golden frames and
912ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * alt ref frames
913ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
914474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->recode_loop = 2;
915474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
916474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
917474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
918474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 3)
919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->auto_filter = 1;
921ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            sf->recode_loop = 0; /* recode loop off */
922ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            sf->RD = 0;         /* Turn rd off */
923474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
924474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
925474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
926474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 4)
927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
928ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            sf->auto_filter = 0;  /* Faster selection of loop filter */
929474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
931474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
932474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
933474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case 2:
934474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->optimize_coefficients = 0;
935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->recode_loop = 0;
936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->auto_filter = 1;
937474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->iterative_sub_pixel = 1;
938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->search_method = NSTEP;
939474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
940474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 0)
941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
942474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->improved_quant = 0;
943474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->improved_dct = 0;
944474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
945474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->use_fastquant_for_pick = 1;
946474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->no_skip_block4x4_search = 0;
947474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->first_step = 1;
948474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
949474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
950474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 2)
951ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            sf->auto_filter = 0;  /* Faster selection of loop filter */
952474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
953474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 3)
954474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
955474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->RD = 0;
956474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->auto_filter = 1;
957474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
958474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
959474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 4)
960474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
961ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            sf->auto_filter = 0;  /* Faster selection of loop filter */
962474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->search_method = HEX;
963474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->iterative_sub_pixel = 0;
964474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
965474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
966474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 6)
967474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
968167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            unsigned int sum = 0;
969474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            unsigned int total_mbs = cm->MBs;
9701929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org            int thresh;
971167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            unsigned int total_skip;
972474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
973474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int min = 2000;
974474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
975474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->oxcf.encode_breakout > 2000)
976474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                min = cpi->oxcf.encode_breakout;
977474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
978474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            min >>= 7;
979474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
980474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (i = 0; i < min; i++)
981474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
982d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                sum += cpi->mb.error_bins[i];
983474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
984474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
985474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            total_skip = sum;
986474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sum = 0;
987474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
988ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* i starts from 2 to make sure thresh started from 2048 */
989474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (; i < 1024; i++)
990474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
991d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                sum += cpi->mb.error_bins[i];
992474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
993474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
994474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    break;
995474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
996474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
997474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            i--;
998474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            thresh = (i << 7);
999474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1000474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (thresh < 2000)
1001474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                thresh = 2000;
1002474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1003167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (ref_frames > 1)
1004474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1005167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEW1 ] = thresh;
1006167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEAREST1  ] = thresh >> 1;
1007167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEAR1     ] = thresh >> 1;
1008474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1009474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1010167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (ref_frames > 2)
1011474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1012167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEW2] = thresh << 1;
1013167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEAREST2 ] = thresh;
1014167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEAR2    ] = thresh;
1015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1017167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (ref_frames > 3)
1018474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1019167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEW3] = thresh << 1;
1020167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEAREST3 ] = thresh;
1021167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                sf->thresh_mult[THR_NEAR3    ] = thresh;
1022474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1023474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1024474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->improved_mv_pred = 0;
1025474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1026474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1027474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed > 8)
1028474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sf->quarter_pixel_search = 0;
1029474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1030167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if(cm->version == 0)
1031474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1032167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cm->filter_type = NORMAL_LOOPFILTER;
1033474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1034167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (Speed >= 14)
1035167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cm->filter_type = SIMPLE_LOOPFILTER;
1036474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1037167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        else
1038167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
1039474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->filter_type = SIMPLE_LOOPFILTER;
1040167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
1041474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1042ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* This has a big hit on quality. Last resort */
1043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Speed >= 15)
1044167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            sf->half_pixel_search = 0;
1045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1046d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        vpx_memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
1047474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1048474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }; /* switch */
1049474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1050ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Slow quant, dct and trellis not worthwhile for first pass
1051ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * so make sure they are always turned off.
1052ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1053474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ( cpi->pass == 1 )
1054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->improved_quant = 0;
1056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->optimize_coefficients = 0;
1057474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sf->improved_dct = 0;
1058474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1059474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1060474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->sf.search_method == NSTEP)
1061474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1062474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1063474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1064474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->sf.search_method == DIAMOND)
1065474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1066474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1067474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1068474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1069474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->sf.improved_dct)
1070474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
10715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
10725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
1073474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1074474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1075474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
10765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        /* No fast FDCT defined for any platform at this time. */
10775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
10785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
1079474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
10815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
1082474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1083474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->sf.improved_quant)
1084474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
10855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->mb.quantize_b      = vp8_regular_quantize_b;
10865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->mb.quantize_b_pair = vp8_regular_quantize_b_pair;
1087474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1088474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1089474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
10905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->mb.quantize_b      = vp8_fast_quantize_b;
10915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->mb.quantize_b_pair = vp8_fast_quantize_b_pair;
1092474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1093474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->sf.improved_quant != last_improved_quant)
1094474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8cx_init_quantizer(cpi);
1095474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1096474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->sf.iterative_sub_pixel == 1)
1097474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1098474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
1099474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->sf.quarter_pixel_search)
1101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
1103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->sf.half_pixel_search)
1105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
1114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->mb.optimize = 1;
1115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->mb.optimize = 0;
1117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->common.full_pixel)
1119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef SPEEDSTATS
1122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    frames_at_speed[cpi->Speed]++;
1123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1125167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#undef GOOD
1126167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#undef RT
1127167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void alloc_raw_frame_buffers(VP8_COMP *cpi)
1129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
11305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if VP8_TEMPORAL_ALT_REF
1131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int width = (cpi->oxcf.Width + 15) & ~15;
1132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int height = (cpi->oxcf.Height + 15) & ~15;
11335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
1134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
1136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                        cpi->oxcf.lag_in_frames);
1137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if(!cpi->lookahead)
1138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           "Failed to allocate lag buffers");
1140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if VP8_TEMPORAL_ALT_REF
1142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
1144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                    width, height, VP8BORDERINPIXELS))
1145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           "Failed to allocate altref buffer");
1147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
11525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void dealloc_raw_frame_buffers(VP8_COMP *cpi)
11535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{
11545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if VP8_TEMPORAL_ALT_REF
11555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
11565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
11575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_lookahead_destroy(cpi->lookahead);
11585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org}
11595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
11605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int vp8_alloc_partition_data(VP8_COMP *cpi)
1162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_free(cpi->mb.pip);
1164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
1166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                (cpi->common.mb_rows + 1),
1167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                sizeof(PARTITION_INFO));
1168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if(!cpi->mb.pip)
1169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return 1;
1170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
1174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_alloc_compressor_data(VP8_COMP *cpi)
1177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = & cpi->common;
1179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int width = cm->Width;
1181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int height = cm->Height;
1182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (vp8_alloc_frame_buffers(cm, width, height))
1184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           "Failed to allocate frame buffers");
1186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (vp8_alloc_partition_data(cpi))
1188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           "Failed to allocate partition data");
1190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ((width & 0xf) != 0)
1193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        width += 16 - (width & 0xf);
1194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ((height & 0xf) != 0)
1196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        height += 16 - (height & 0xf);
1197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1199167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame,
1200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                    width, height, VP8BORDERINPIXELS))
1201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           "Failed to allocate last frame buffer");
1203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
1205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                    width, height, VP8BORDERINPIXELS))
1206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           "Failed to allocate scaled source buffer");
1208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
12095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vpx_free(cpi->tok);
1210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
12125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
12135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
12145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#else
1215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
12165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
1217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1220ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Data used for real time vc mode to see if gf needs refreshing */
1221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->zeromv_count = 0;
1222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Structures used to monitor GF usage */
1225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->gf_active_flags);
1226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    CHECK_MEM_ERROR(cpi->gf_active_flags,
1227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    vpx_calloc(sizeof(*cpi->gf_active_flags),
1228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    cm->mb_rows * cm->mb_cols));
1229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->mb_activity_map);
1232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    CHECK_MEM_ERROR(cpi->mb_activity_map,
1233ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    vpx_calloc(sizeof(*cpi->mb_activity_map),
1234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cm->mb_rows * cm->mb_cols));
1235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1236ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* allocate memory for storing last frame's MVs for MV prediction. */
1237ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(cpi->lfmv);
1238ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    sizeof(*cpi->lfmv)));
1240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(cpi->lf_ref_frame_sign_bias);
1241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
1242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1243ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    sizeof(*cpi->lf_ref_frame_sign_bias)));
1244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(cpi->lf_ref_frame);
1245ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    CHECK_MEM_ERROR(cpi->lf_ref_frame,
1246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1247ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    sizeof(*cpi->lf_ref_frame)));
1248ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1249ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Create the encoder segmentation map and set all entries to 0 */
1250ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(cpi->segmentation_map);
1251ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    CHECK_MEM_ERROR(cpi->segmentation_map,
1252ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    vpx_calloc(cm->mb_rows * cm->mb_cols,
1253ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    sizeof(*cpi->segmentation_map)));
1254ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->cyclic_refresh_mode_index = 0;
1255ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(cpi->active_map);
1256ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    CHECK_MEM_ERROR(cpi->active_map,
1257ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    vpx_calloc(cm->mb_rows * cm->mb_cols,
1258ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    sizeof(*cpi->active_map)));
1259ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_memset(cpi->active_map , 1, (cm->mb_rows * cm->mb_cols));
1260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
1262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (width < 640)
1263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->mt_sync_range = 1;
1264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (width <= 1280)
1265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->mt_sync_range = 4;
1266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (width <= 2560)
1267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->mt_sync_range = 8;
1268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->mt_sync_range = 16;
1270ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1271ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cpi->oxcf.multi_threaded > 1)
1272ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
1273ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vpx_free(cpi->mt_current_mb_col);
1274ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        CHECK_MEM_ERROR(cpi->mt_current_mb_col,
1275ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
1276ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
1277ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1280167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vpx_free(cpi->tplist);
1281ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
128249c52261361fe90a27c0bdff38f752d507e535b7marpan@google.com
128349c52261361fe90a27c0bdff38f752d507e535b7marpan@google.com#if CONFIG_TEMPORAL_DENOISING
128449c52261361fe90a27c0bdff38f752d507e535b7marpan@google.com    if (cpi->oxcf.noise_sensitivity > 0) {
128549c52261361fe90a27c0bdff38f752d507e535b7marpan@google.com      vp8_denoiser_free(&cpi->denoiser);
128649c52261361fe90a27c0bdff38f752d507e535b7marpan@google.com      vp8_denoiser_allocate(&cpi->denoiser, width, height,
128741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                            cm->mb_rows, cm->mb_cols,
128841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                            cpi->oxcf.noise_sensitivity);
128949c52261361fe90a27c0bdff38f752d507e535b7marpan@google.com    }
129049c52261361fe90a27c0bdff38f752d507e535b7marpan@google.com#endif
1291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Quant MOD */
1295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const int q_trans[] =
1296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    0,   1,  2,  3,  4,  5,  7,  8,
1298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    9,  10, 12, 13, 15, 17, 18, 19,
1299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    20,  21, 23, 24, 25, 26, 27, 28,
1300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    29,  30, 31, 33, 35, 37, 39, 41,
1301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    43,  45, 47, 49, 51, 53, 55, 57,
1302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    59,  61, 64, 67, 70, 73, 76, 79,
1303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    82,  85, 88, 91, 94, 97, 100, 103,
1304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    106, 109, 112, 115, 118, 121, 124, 127,
1305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
1306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_reverse_trans(int x)
1308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i;
1310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < 64; i++)
1312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (q_trans[i] >= x)
1313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            return i;
1314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 63;
1316ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
131747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.orgvoid vp8_new_framerate(VP8_COMP *cpi, double framerate)
1318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if(framerate < .1)
1320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        framerate = 30;
1321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
132247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    cpi->framerate              = framerate;
132347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    cpi->output_framerate       = framerate;
1324167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->per_frame_bandwidth    = (int)(cpi->oxcf.target_bandwidth /
132547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                                  cpi->output_framerate);
1326167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
1327167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->min_frame_bandwidth    = (int)(cpi->av_per_frame_bandwidth *
1328167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                  cpi->oxcf.two_pass_vbrmin_section / 100);
1329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1330ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set Maximum gf/arf interval */
133147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);
1332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if(cpi->max_gf_interval < 12)
1334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->max_gf_interval = 12;
1335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1336ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Extended interval for genuinely static scenes */
1337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1339ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     /* Special conditions when altr ref frame enabled in lagged compress mode */
1340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
1341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
1350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1354167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
1355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
1357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->oxcf = *oxcf;
1359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->auto_gold = 1;
1361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->auto_adjust_gold_quantizer = 1;
1362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->version = oxcf->Version;
1364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_setup_version(cm);
1365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1366167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* frame rate is not available on the first frame, as it's derived from
1367167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org     * the observed timestamps. The actual value used here doesn't matter
1368167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org     * too much, as it will adapt quickly. If the reciprocal of the timebase
1369167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org     * seems like a reasonable framerate, then use that as a guess, otherwise
1370167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org     * use 30.
1371167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org     */
137247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    cpi->framerate = (double)(oxcf->timebase.den) /
137347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                     (double)(oxcf->timebase.num);
1374167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
137547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    if (cpi->framerate > 180)
137647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        cpi->framerate = 30;
1377167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
137847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    cpi->ref_framerate = cpi->framerate;
1379167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1380ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* change includes all joint functionality */
1381167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vp8_change_config(cpi, oxcf);
1382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1383ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Initialize active best and worst q and average q values. */
1384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->active_worst_quality         = cpi->oxcf.worst_allowed_q;
1385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->active_best_quality          = cpi->oxcf.best_allowed_q;
1386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->avg_frame_qindex             = cpi->oxcf.worst_allowed_q;
1387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1388ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Initialise the starting buffer levels */
1389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->buffer_level                 = cpi->oxcf.starting_buffer_level;
1390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->bits_off_target              = cpi->oxcf.starting_buffer_level;
1391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->rolling_target_bits          = cpi->av_per_frame_bandwidth;
1393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->rolling_actual_bits          = cpi->av_per_frame_bandwidth;
1394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->long_rolling_target_bits     = cpi->av_per_frame_bandwidth;
1395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->long_rolling_actual_bits     = cpi->av_per_frame_bandwidth;
1396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->total_actual_bits            = 0;
1398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->total_target_vs_actual       = 0;
1399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1400ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Temporal scalabilty */
1401167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->oxcf.number_of_layers > 1)
1402167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
1403167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        unsigned int i;
140447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        double prev_layer_framerate=0;
1405167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1406167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        for (i=0; i<cpi->oxcf.number_of_layers; i++)
1407167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
140847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org            init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
140947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org            prev_layer_framerate = cpi->output_framerate /
141047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                                   cpi->oxcf.rate_decimator[i];
1411167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
1412167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
1413167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if VP8_TEMPORAL_ALT_REF
1415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int i;
1417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->fixed_divide[0] = 0;
1419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (i = 1; i < 512; i++)
1421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->fixed_divide[i] = 0x80000 / i;
1422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
14265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void update_layer_contexts (VP8_COMP *cpi)
1427167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{
1428167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    VP8_CONFIG *oxcf = &cpi->oxcf;
1429167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1430167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* Update snapshots of the layer contexts to reflect new parameters */
1431167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (oxcf->number_of_layers > 1)
1432167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
1433167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        unsigned int i;
143447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        double prev_layer_framerate=0;
1435167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
143693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        assert(oxcf->number_of_layers <= VPX_TS_MAX_LAYERS);
14373983288b51bb3c8f48a2d5f77523ef3ff1e94cd2johannkoenig@chromium.org        for (i = 0; i < oxcf->number_of_layers && i < VPX_TS_MAX_LAYERS; ++i)
1438167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
1439167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            LAYER_CONTEXT *lc = &cpi->layer_context[i];
1440167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
144147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org            lc->framerate =
144247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                cpi->ref_framerate / oxcf->rate_decimator[i];
1443167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
1444167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1445167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            lc->starting_buffer_level = rescale(
1446ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                          (int)oxcf->starting_buffer_level_in_ms,
1447167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                          lc->target_bandwidth, 1000);
1448167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1449167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (oxcf->optimal_buffer_level == 0)
1450167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                lc->optimal_buffer_level = lc->target_bandwidth / 8;
1451167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            else
1452167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                lc->optimal_buffer_level = rescale(
1453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                          (int)oxcf->optimal_buffer_level_in_ms,
1454167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                          lc->target_bandwidth, 1000);
1455167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1456167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (oxcf->maximum_buffer_size == 0)
1457167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                lc->maximum_buffer_size = lc->target_bandwidth / 8;
1458167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            else
1459167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                lc->maximum_buffer_size = rescale(
1460ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                          (int)oxcf->maximum_buffer_size_in_ms,
1461167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                          lc->target_bandwidth, 1000);
1462167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1463ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Work out the average size of a frame within this layer */
1464167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (i > 0)
1465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                lc->avg_frame_size_for_layer =
1466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                   (int)((oxcf->target_bitrate[i] -
1467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                          oxcf->target_bitrate[i-1]) * 1000 /
146847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                          (lc->framerate - prev_layer_framerate));
1469167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
147047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org            prev_layer_framerate = lc->framerate;
1471167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
1472167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
1473167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org}
1474167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1475167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
1476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
147810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    int last_w, last_h, prev_number_of_layers;
1479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi)
1481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return;
1482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!oxcf)
1484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return;
1485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
14865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_MULTITHREAD
14875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    /*  wait for the last picture loopfilter thread done */
14885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if (cpi->b_lpf_running)
14895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    {
14905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        sem_wait(&cpi->h_event_end_lpf);
14915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->b_lpf_running = 0;
14925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    }
14935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
14945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->version != oxcf->Version)
1496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->version = oxcf->Version;
1498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_setup_version(cm);
1499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
15015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    last_w = cpi->oxcf.Width;
15025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    last_h = cpi->oxcf.Height;
150310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    prev_number_of_layers = cpi->oxcf.number_of_layers;
15045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1505474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->oxcf = *oxcf;
1506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1507474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    switch (cpi->oxcf.Mode)
1508474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case MODE_REALTIME:
1511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->pass = 0;
1512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->compressor_speed = 2;
1513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.cpu_used < -16)
1515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.cpu_used = -16;
1517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.cpu_used > 16)
1520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.cpu_used = 16;
1521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case MODE_GOODQUALITY:
1525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->pass = 0;
1526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->compressor_speed = 1;
1527474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.cpu_used < -5)
1529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.cpu_used = -5;
1531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.cpu_used > 5)
1534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.cpu_used = 5;
1535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case MODE_BESTQUALITY:
1539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->pass = 0;
1540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->compressor_speed = 0;
1541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case MODE_FIRSTPASS:
1544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->pass = 1;
1545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->compressor_speed = 1;
1546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case MODE_SECONDPASS:
1548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->pass = 2;
1549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->compressor_speed = 1;
1550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.cpu_used < -5)
1552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.cpu_used = -5;
1554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.cpu_used > 5)
1557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.cpu_used = 5;
1558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case MODE_SECONDPASS_BEST:
1561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->pass = 2;
1562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->compressor_speed = 0;
1563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass == 0)
1567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->auto_worst_q = 1;
1568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (oxcf->fixed_q >= 0)
1574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (oxcf->worst_allowed_q < 0)
1576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.fixed_q = q_trans[0];
1577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1579474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1580474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (oxcf->alt_q < 0)
1581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.alt_q = q_trans[0];
1582474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (oxcf->key_q < 0)
1586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.key_q = q_trans[0];
1587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.key_q = q_trans[oxcf->key_q];
1589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (oxcf->gold_q < 0)
1591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.gold_q = q_trans[0];
1592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1597474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->baseline_gf_interval =
1598474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1600ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
1601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->refresh_golden_frame = 0;
1603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->refresh_last_frame = 1;
1604474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->refresh_entropy_probs = 1;
1605474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
16065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
16075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->oxcf.token_partitions = 3;
16085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
16095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1610474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
1611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->multi_token_partition =
1612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            (TOKEN_PARTITION) cpi->oxcf.token_partitions;
1613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    setup_features(cpi);
1615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int i;
1618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1619474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (i = 0; i < MAX_MB_SEGMENTS; i++)
1620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1623ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* At the moment the first order values may not be > MAXQ */
1624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.fixed_q > MAXQ)
1625474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.fixed_q = MAXQ;
1626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1627ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* local file playback mode == really big buffer */
1628474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
1629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1630167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->oxcf.starting_buffer_level       = 60000;
1631167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->oxcf.optimal_buffer_level        = 60000;
1632167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->oxcf.maximum_buffer_size         = 240000;
1633167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->oxcf.starting_buffer_level_in_ms = 60000;
1634167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->oxcf.optimal_buffer_level_in_ms  = 60000;
1635167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->oxcf.maximum_buffer_size_in_ms   = 240000;
1636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1638ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Convert target bandwidth from Kbit/s to Bit/s */
1639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->oxcf.target_bandwidth       *= 1000;
1640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->oxcf.starting_buffer_level =
1642ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        rescale((int)cpi->oxcf.starting_buffer_level,
1643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->oxcf.target_bandwidth, 1000);
1644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1645ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set or reset optimal and maximum buffer levels. */
1646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.optimal_buffer_level == 0)
1647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.optimal_buffer_level =
1650ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            rescale((int)cpi->oxcf.optimal_buffer_level,
1651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->oxcf.target_bandwidth, 1000);
1652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.maximum_buffer_size == 0)
1654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.maximum_buffer_size =
1657ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            rescale((int)cpi->oxcf.maximum_buffer_size,
1658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->oxcf.target_bandwidth, 1000);
1659dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    // Under a configuration change, where maximum_buffer_size may change,
1660dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    // keep buffer level clipped to the maximum allowed buffer size.
1661dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
1662dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org      cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
1663dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org      cpi->buffer_level = cpi->bits_off_target;
1664dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    }
1665474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1666ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set up frame rate and related parameters rate control values. */
166747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    vp8_new_framerate(cpi, cpi->framerate);
1668474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1669ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set absolute upper and lower quality limits */
1670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->worst_quality               = cpi->oxcf.worst_allowed_q;
1671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->best_quality                = cpi->oxcf.best_allowed_q;
1672474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1673ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* active values should only be modified if out of new range */
1674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
1675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org      cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1678ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* less likely */
1679474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
1680474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1681474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org      cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1683474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
1684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org      cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1686474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1687ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* less likely */
1688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
1689474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org      cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1693167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
1694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1695474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->cq_target_quality = cpi->oxcf.cq_level;
1696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1697ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Only allow dropped frames in buffered mode */
1698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
170210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    // Check if the number of temporal layers has changed, and if so reset the
170310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    // pattern counter and set/initialize the temporal layer context for the
170410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    // new layer configuration.
170510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    if (cpi->oxcf.number_of_layers != prev_number_of_layers)
170610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    {
170710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // If the number of temporal layers are changed we must start at the
170810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // base of the pattern cycle, so reset temporal_pattern_counter.
170910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        cpi->temporal_pattern_counter = 0;
171010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
171110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    }
17125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1713167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cm->Width       = cpi->oxcf.Width;
1714167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cm->Height      = cpi->oxcf.Height;
1715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
17165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    /* TODO(jkoleszar): if an internal spatial resampling is active,
17175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org     * and we downsize the input image, maybe we should clear the
17185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org     * internal scale immediately rather than waiting for it to
17195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org     * correct.
17205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org     */
1721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1722ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
1723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.Sharpness > 7)
1724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.Sharpness = 7;
1725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->sharpness_level = cpi->oxcf.Sharpness;
1727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
1729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1730474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
1731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
1732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Scale2Ratio(cm->horiz_scale, &hr, &hs);
1734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Scale2Ratio(cm->vert_scale, &vr, &vs);
1735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1736ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* always go to the next whole number */
1737474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1738474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1739474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1740474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
17415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height)
17425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->force_next_frame_intra = 1;
17435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1744474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (((cm->Width + 15) & 0xfffffff0) !=
1745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org          cm->yv12_fb[cm->lst_fb_idx].y_width ||
1746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ((cm->Height + 15) & 0xfffffff0) !=
1747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org          cm->yv12_fb[cm->lst_fb_idx].y_height ||
1748474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
1749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1750c1e5cf4c65bbfa134110b17fba3246ad3d7323b0hclam@chromium.org        dealloc_raw_frame_buffers(cpi);
1751474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        alloc_raw_frame_buffers(cpi);
1752474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_alloc_compressor_data(cpi);
1753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.fixed_q >= 0)
1756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1757474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->last_q[0] = cpi->oxcf.fixed_q;
1758474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->last_q[1] = cpi->oxcf.fixed_q;
1759474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1761474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->Speed = cpi->oxcf.cpu_used;
1762474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1763ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* force to allowlag to 0 if lag_in_frames is 0; */
1764474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.lag_in_frames == 0)
1765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.allow_lag = 0;
1767474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1768ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Limit on lag buffers as these are not currently dynamically allocated */
1769474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
1770474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1771474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1772ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* YX Temp */
1773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->alt_ref_source = NULL;
1774474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->is_src_frame_alt_ref = 0;
1775474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
17765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING
17775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if (cpi->oxcf.noise_sensitivity)
17785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    {
17795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org      if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc)
17805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org      {
17815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        int width = (cpi->oxcf.Width + 15) & ~15;
17825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        int height = (cpi->oxcf.Height + 15) & ~15;
178388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        vp8_denoiser_allocate(&cpi->denoiser, width, height,
178441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                              cm->mb_rows, cm->mb_cols,
178541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                              cpi->oxcf.noise_sensitivity);
17865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org      }
17875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    }
17885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
1789474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1790474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
1791ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Experimental RD Code */
1792474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->frame_distortion = 0;
1793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->last_frame_distortion = 0;
1794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1795474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1797474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1798693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#ifndef M_LOG2_E
1799474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define M_LOG2_E 0.693147180559945309417
1800693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#endif
1801474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define log2f(x) (log (x) / (float) M_LOG2_E)
1802693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com
1803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void cal_mvsadcosts(int *mvsadcost[2])
1804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i = 1;
1806474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1807474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mvsadcost [0] [0] = 300;
1808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    mvsadcost [1] [0] = 300;
1809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    do
1811474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1812474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double z = 256 * (2 * (log2f(8 * i) + .6));
1813474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mvsadcost [0][i] = (int) z;
1814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mvsadcost [1][i] = (int) z;
1815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mvsadcost [0][-i] = (int) z;
1816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mvsadcost [1][-i] = (int) z;
1817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1818474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    while (++i <= mvfp_max);
1819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1821167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstruct VP8_COMP* vp8_create_compressor(VP8_CONFIG *oxcf)
1822474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i;
1824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMP *cpi;
1826474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm;
1827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1828167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi = vpx_memalign(32, sizeof(VP8_COMP));
1829ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Check that the CPI instance is valid */
1830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi)
1831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return 0;
1832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm = &cpi->common;
1834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cpi, 0, sizeof(VP8_COMP));
1836474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1837474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (setjmp(cm->error.jmp))
1838474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1839167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->common.error.setjmp = 0;
1840167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        vp8_remove_compressor(&cpi);
1841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return 0;
1842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.error.setjmp = 1;
1845474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1846474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));
1847474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1848474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_create_common(&cpi->common);
1849474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1850167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    init_config(cpi, oxcf);
1851474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
1853474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.current_video_frame   = 0;
185410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    cpi->temporal_pattern_counter     = 0;
1855474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->kf_overspend_bits            = 0;
1856474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->kf_bitrate_adjustment        = 0;
1857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->frames_till_gf_update_due      = 0;
1858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->gf_overspend_bits            = 0;
1859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->non_gf_bitrate_adjustment     = 0;
1860474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->prob_last_coded              = 128;
1861474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->prob_gf_coded                = 128;
1862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->prob_intra_coded             = 63;
1863474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1864ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Prime the recent reference frame usage counters.
1865ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * Hereafter they will be maintained as a sort of moving average
1866ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->recent_ref_frame_usage[INTRA_FRAME]  = 1;
1868474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->recent_ref_frame_usage[LAST_FRAME]   = 1;
1869474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1870474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1871474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1872ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
1873474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1874474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1875474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->twopass.gf_decay_rate = 0;
1876474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1877474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1878474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->gold_is_last = 0 ;
1879474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->alt_is_last  = 0 ;
1880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->gold_is_alt  = 0 ;
1881474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1882474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->active_map_enabled = 0;
1883474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1884474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
1885ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Experimental code for lagged and one pass */
1886ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Initialise one_pass GF frames stats */
1887ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Update stats used for GF selection */
1888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass == 0)
1889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1890474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_index = 0;
1891474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1892474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (i = 0; i < MAX_LAG_BUFFERS; i++)
1893474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frames_so_far = 0;
1895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1896474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1897474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1899474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1900474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1901474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1903474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1904474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1905474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1906474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1907ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Should we use the cyclic refresh method.
1908ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * Currently this is tied to error resilliant mode
1909ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
1911ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 5;
191241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (cpi->oxcf.number_of_layers == 1) {
191341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        cpi->cyclic_refresh_mode_max_mbs_perframe =
191441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
191541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    } else if (cpi->oxcf.number_of_layers == 2) {
191641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        cpi->cyclic_refresh_mode_max_mbs_perframe =
191741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
191841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
1919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->cyclic_refresh_mode_index = 0;
1920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->cyclic_refresh_q = 32;
1921474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1922474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->cyclic_refresh_mode_enabled)
1923474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1924474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1925474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1926474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->cyclic_refresh_map = (signed char *) NULL;
1928474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
192941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    CHECK_MEM_ERROR(cpi->consec_zero_last,
193041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
193141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
19321cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS
1933474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    init_context_counters();
1934474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /*Initialize the feed-forward activity masking.*/
1937474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->activity_avg = 90<<12;
1938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1939ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Give a sensible default for the first frame. */
1940ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->frames_since_key = 8;
1941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->key_frame_frequency = cpi->oxcf.key_freq;
1942167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->this_key_frame_forced = 0;
1943167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->next_key_frame_forced = 0;
1944474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1945167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->source_alt_ref_pending = 0;
1946167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->source_alt_ref_active = 0;
1947474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.refresh_alt_ref_frame = 0;
1948474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1949474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1950474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_INTERNAL_STATS
1951474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->b_calculate_ssimg = 0;
1952474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1953474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->count = 0;
1954474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->bytes = 0;
1955474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1956474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->b_calculate_psnr)
1957474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1958474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_sq_error = 0.0;
1959474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_sq_error2 = 0.0;
1960474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_y = 0.0;
1961474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_u = 0.0;
1962474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_v = 0.0;
1963474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total = 0.0;
1964474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->totalp_y = 0.0;
1965474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->totalp_u = 0.0;
1966474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->totalp_v = 0.0;
1967474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->totalp = 0.0;
1968474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->tot_recode_hits = 0;
1969474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->summed_quality = 0;
1970474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->summed_weights = 0;
1971474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1972474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1973474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->b_calculate_ssimg)
1974474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1975474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_ssimg_y = 0;
1976474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_ssimg_u = 0;
1977474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_ssimg_v = 0;
1978474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->total_ssimg_all = 0;
1979474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1980474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1981474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1982474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1983ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->first_time_stamp_ever = 0x7FFFFFFF;
1984474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1985474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->frames_till_gf_update_due      = 0;
1986474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->key_frame_count              = 1;
1987474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1988474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->ni_av_qi                     = cpi->oxcf.worst_allowed_q;
1989474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->ni_tot_qi                    = 0;
1990474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->ni_frames                   = 0;
1991474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->total_byte_count             = 0;
1992474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1993474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->drop_frame                  = 0;
1994474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1995474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->rate_correction_factor         = 1.0;
1996474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->key_frame_rate_correction_factor = 1.0;
1997474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->gf_rate_correction_factor  = 1.0;
1998474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->twopass.est_max_qcorrection_factor  = 1.0;
1999474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2000474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < KEY_FRAME_CONTEXT; i++)
2001474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
200247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
2003474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2004474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2005474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef OUTPUT_YUV_SRC
2006474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    yuv_file = fopen("bd.yuv", "ab");
2007474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
200888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef OUTPUT_YUV_DENOISED
200988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    yuv_denoised_file = fopen("denoised.yuv", "ab");
201088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
2011474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2012474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
2013474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    framepsnr = fopen("framepsnr.stt", "a");
2014474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    kf_list = fopen("kf_list.stt", "w");
2015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2017474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->output_pkt_list = oxcf->output_pkt_list;
2018474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2019474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
2020474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2021474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass == 1)
2022474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2023474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_init_first_pass(cpi);
2024474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2025474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->pass == 2)
2026474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2027474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        size_t packet_sz = sizeof(FIRSTPASS_STATS);
2028ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
2029474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2030474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
2031474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->twopass.stats_in = cpi->twopass.stats_in_start;
2032474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->twopass.stats_in_end = (void*)((char *)cpi->twopass.stats_in
2033474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            + (packets - 1) * packet_sz);
2034474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_init_second_pass(cpi);
2035474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2036474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2037474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2038474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2039474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->compressor_speed == 2)
2040474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2041474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->avg_encode_time      = 0;
2042474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->avg_pick_mode_time    = 0;
2043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2044474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_set_speed_features(cpi);
2046474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2047ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set starting values of RD threshold multipliers (128 = *1) */
2048474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < MAX_MODES; i++)
2049474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2050d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        cpi->mb.rd_thresh_mult[i] = 128;
2051474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2052474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
20531cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS
2054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    init_mv_ref_counts();
2055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2057474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
2058ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if(vp8cx_create_encoder_threads(cpi))
2059ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
2060ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_remove_compressor(&cpi);
2061ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        return 0;
2062ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
2063474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2064474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
20655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].sdf            = vp8_sad16x16;
20665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].vf             = vp8_variance16x16;
20675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].svf            = vp8_sub_pixel_variance16x16;
20685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h  = vp8_variance_halfpixvar16x16_h;
20695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v  = vp8_variance_halfpixvar16x16_v;
20705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = vp8_variance_halfpixvar16x16_hv;
20715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].sdx3f          = vp8_sad16x16x3;
20725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].sdx8f          = vp8_sad16x16x8;
20735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].sdx4df         = vp8_sad16x16x4d;
20745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
20755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].sdf            = vp8_sad16x8;
20765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].vf             = vp8_variance16x8;
20775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].svf            = vp8_sub_pixel_variance16x8;
2078474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h  = NULL;
2079474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v  = NULL;
2080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
20815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].sdx3f          = vp8_sad16x8x3;
20825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].sdx8f          = vp8_sad16x8x8;
20835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].sdx4df         = vp8_sad16x8x4d;
2084474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
20855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].sdf            = vp8_sad8x16;
20865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].vf             = vp8_variance8x16;
20875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].svf            = vp8_sub_pixel_variance8x16;
2088474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h  = NULL;
2089474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v  = NULL;
2090474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
20915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].sdx3f          = vp8_sad8x16x3;
20925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].sdx8f          = vp8_sad8x16x8;
20935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].sdx4df         = vp8_sad8x16x4d;
2094474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
20955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].sdf            = vp8_sad8x8;
20965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].vf             = vp8_variance8x8;
20975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].svf            = vp8_sub_pixel_variance8x8;
2098474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h  = NULL;
2099474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v  = NULL;
2100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
21015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].sdx3f          = vp8_sad8x8x3;
21025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].sdx8f          = vp8_sad8x8x8;
21035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].sdx4df         = vp8_sad8x8x4d;
2104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
21055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].sdf            = vp8_sad4x4;
21065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].vf             = vp8_variance4x4;
21075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].svf            = vp8_sub_pixel_variance4x4;
2108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h  = NULL;
2109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v  = NULL;
2110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
21115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].sdx3f          = vp8_sad4x4x3;
21125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].sdx8f          = vp8_sad4x4x8;
21135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].sdx4df         = vp8_sad4x4x4d;
2114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if ARCH_X86 || ARCH_X86_64
21165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X16].copymem      = vp8_copy32xn;
21175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_16X8].copymem       = vp8_copy32xn;
21185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X16].copymem       = vp8_copy32xn;
21195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_8X8].copymem        = vp8_copy32xn;
21205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->fn_ptr[BLOCK_4X4].copymem        = vp8_copy32xn;
2121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
21235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->full_search_sad = vp8_full_search_sad;
21245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->diamond_search_sad = vp8_diamond_search_sad;
21255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->refining_search_sad = vp8_refining_search_sad;
2126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2127ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* make sure frame 1 is okay */
2128d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    cpi->mb.error_bins[0] = cpi->common.MBs;
2129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2130ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* vp8cx_init_quantizer() is first called here. Add check in
2131ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
2132ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * called later when needed. This will avoid unnecessary calls of
2133ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * vp8cx_init_quantizer() for every frame.
2134ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
2135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8cx_init_quantizer(cpi);
2136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_init(cm);
2138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.error.setjmp = 0;
2140167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
2141167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING
2142ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2143167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* Calculate # of MBs in a row in lower-resolution level image. */
2144167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->oxcf.mr_encoder_id > 0)
2145167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        vp8_cal_low_res_mb_cols(cpi);
2146ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2147167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif
2148167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
2149ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* setup RD costs to MACROBLOCK struct */
2150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max+1];
2152ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max+1];
2153ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max+1];
2154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max+1];
2155ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cal_mvsadcosts(cpi->mb.mvsadcost);
2157c1e5cf4c65bbfa134110b17fba3246ad3d7323b0hclam@chromium.org
2158ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
2159ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
2160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
2161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
2162ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->mb.token_costs = cpi->rd_costs.token_costs;
2163ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2164ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* setup block ptrs & offsets */
2165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_setup_block_ptrs(&cpi->mb);
2166ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_setup_block_dptrs(&cpi->mb.e_mbd);
2167ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    return  cpi;
2169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2172167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_remove_compressor(VP8_COMP **ptr)
2173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2174167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    VP8_COMP *cpi = *ptr;
2175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi)
2177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return;
2178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi && (cpi->common.current_video_frame > 0))
2180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
2182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->pass == 2)
2184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_end_second_pass(cpi);
2186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
21901cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS
2191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        print_context_counters();
2192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        print_tree_update_probs();
2193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        print_mode_context();
2194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_INTERNAL_STATS
2197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->pass != 1)
2199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            FILE *f = fopen("opsnr.stt", "a");
2201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            double time_encoded = (cpi->last_end_time_stamp_seen
2202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                   - cpi->first_time_stamp_ever) / 10000000.000;
2203167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            double total_encode_time = (cpi->time_receive_data +
2204167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                            cpi->time_compress_data) / 1000.000;
2205167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
2206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->b_calculate_psnr)
2208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
2209167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                YV12_BUFFER_CONFIG *lst_yv12 =
2210167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                              &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
2211167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
2212167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                if (cpi->oxcf.number_of_layers > 1)
2213167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
2214167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    int i;
2215167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
2216167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    fprintf(f, "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2217167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                               "GLPsnrP\tVPXSSIM\t\n");
2218ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
2219167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    {
2220167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        double dr = (double)cpi->bytes_in_layer[i] *
2221167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                              8.0 / 1000.0  / time_encoded;
2222167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
2223167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                         lst_yv12->y_width * lst_yv12->y_height;
2224411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                        double total_psnr =
2225411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                            vpx_sse_to_psnr(samples, 255.0,
2226411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                                            cpi->total_error2[i]);
2227411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                        double total_psnr2 =
2228411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                            vpx_sse_to_psnr(samples, 255.0,
2229411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                                            cpi->total_error2_p[i]);
2230167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        double total_ssim = 100 * pow(cpi->sum_ssim[i] /
2231167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                      cpi->sum_weights[i], 8.0);
2232167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
2233167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        fprintf(f, "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2234167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                   "%7.3f\t%7.3f\n",
2235167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                   i, dr,
2236167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                   cpi->sum_psnr[i] / cpi->frames_in_layer[i],
2237167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                   total_psnr,
2238167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                   cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
2239167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                   total_psnr2, total_ssim);
2240167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    }
2241167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
2242167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                else
2243167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
2244167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    double samples = 3.0 / 2 * cpi->count *
2245167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                        lst_yv12->y_width * lst_yv12->y_height;
2246411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                    double total_psnr = vpx_sse_to_psnr(samples, 255.0,
2247411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                                                        cpi->total_sq_error);
2248411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                    double total_psnr2 = vpx_sse_to_psnr(samples, 255.0,
2249167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                         cpi->total_sq_error2);
2250167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    double total_ssim = 100 * pow(cpi->summed_quality /
2251167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                                      cpi->summed_weights, 8.0);
2252167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
2253167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2254167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                               "GLPsnrP\tVPXSSIM\t  Time(us)\n");
2255167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2256167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                               "%7.3f\t%8.0f\n",
2257167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                               dr, cpi->total / cpi->count, total_psnr,
2258167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                               cpi->totalp / cpi->count, total_psnr2,
2259167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                               total_ssim, total_encode_time);
2260167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
2261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
2262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->b_calculate_ssimg)
2264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
2265167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                if (cpi->oxcf.number_of_layers > 1)
2266167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
2267167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    int i;
2268167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
2269167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    fprintf(f, "Layer\tBitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
2270167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                               "Time(us)\n");
2271ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
2272167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    {
2273167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        double dr = (double)cpi->bytes_in_layer[i] *
2274167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                    8.0 / 1000.0  / time_encoded;
2275167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        fprintf(f, "%5d\t%7.3f\t%6.4f\t"
2276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                "%6.4f\t%6.4f\t%6.4f\t%8.0f\n",
2277167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                i, dr,
2278167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                cpi->total_ssimg_y_in_layer[i] /
2279167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                     cpi->frames_in_layer[i],
2280167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                cpi->total_ssimg_u_in_layer[i] /
2281167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                     cpi->frames_in_layer[i],
2282167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                cpi->total_ssimg_v_in_layer[i] /
2283167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                     cpi->frames_in_layer[i],
2284167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                cpi->total_ssimg_all_in_layer[i] /
2285167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                     cpi->frames_in_layer[i],
2286167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                total_encode_time);
2287167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    }
2288167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
2289167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                else
2290167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
2291167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
2292167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                               "Time(us)\n");
2293167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
2294167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                            cpi->total_ssimg_y / cpi->count,
2295167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                            cpi->total_ssimg_u / cpi->count,
2296167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                            cpi->total_ssimg_v / cpi->count,
2297167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                            cpi->total_ssimg_all / cpi->count, total_encode_time);
2298167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
2299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
2300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(f);
2302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
2303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            f = fopen("qskip.stt", "a");
2304167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(f);
2306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef SPEEDSTATS
2314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->compressor_speed == 2)
2316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int i;
2318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            FILE *f = fopen("cxspeed.stt", "a");
2319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cnt_pm /= cpi->common.MBs;
2320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (i = 0; i < 16; i++)
2322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fprintf(f, "%5d", frames_at_speed[i]);
2323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "\n");
2325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(f);
2326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
2332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            extern int count_mb_seg[4];
2334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            FILE *f = fopen("modes.stt", "a");
233547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org            double dr = (double)cpi->framerate * (double)bytes * (double)8 / (double)count / (double)1000 ;
2336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "intra_mode in Intra Frames:\n");
2337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
2338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
2339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "B: ");
2340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
2341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int i;
2342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                for (i = 0; i < 10; i++)
2344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    fprintf(f, "%8d, ", b_modes[i]);
2345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fprintf(f, "\n");
2347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
2349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "Modes in Inter Frames:\n");
2351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
2353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
2354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "B: ");
2356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
2357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int i;
2358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                for (i = 0; i < 15; i++)
2360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    fprintf(f, "%8d, ", inter_b_modes[i]);
2361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fprintf(f, "\n");
2363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
2365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
2366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);
2367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(f);
2371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
23741cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#ifdef VP8_ENTROPY_STATS
2375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int i, j, k;
2377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            FILE *fmode = fopen("modecontext.c", "w");
2378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
2380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
2381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
2382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (i = 0; i < 10; i++)
2384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
2385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2386ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                fprintf(fmode, "    { /* Above Mode :  %d */\n", i);
2387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                for (j = 0; j < 10; j++)
2389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
2390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    fprintf(fmode, "        {");
2392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    for (k = 0; k < 10; k++)
2394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
2395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        if (!intra_mode_stats[i][j][k])
2396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            fprintf(fmode, " %5d, ", 1);
2397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        else
2398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
2400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2401ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    fprintf(fmode, "}, /* left_mode %d */\n", j);
2402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
2404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fprintf(fmode, "    },\n");
2406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
2408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(fmode, "};\n");
2410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(fmode);
2411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if defined(SECTIONBITS_OUTPUT)
2416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (0)
2418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int i;
2420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            FILE *f = fopen("tokenbits.stt", "a");
2421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (i = 0; i < 28; i++)
2423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "\n");
2426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(f);
2427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
2432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
2435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame, cpi->time_receive_data / 1000, cpi->time_encode_mb_row / 1000, cpi->time_compress_data / 1000, (cpi->time_receive_data + cpi->time_compress_data) / 1000);
2436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2438474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
2442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8cx_remove_encoder_threads(cpi);
2443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
24455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING
24465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_denoiser_free(&cpi->denoiser);
24475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
2448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    dealloc_compressor_data(cpi);
2449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->mb.ss);
2450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->tok);
2451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi->cyclic_refresh_map);
245241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    vpx_free(cpi->consec_zero_last);
2453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_remove_common(&cpi->common);
2455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_free(cpi);
2456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    *ptr = 0;
2457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef OUTPUT_YUV_SRC
2459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    fclose(yuv_file);
2460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
246188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef OUTPUT_YUV_DENOISED
246288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    fclose(yuv_denoised_file);
246388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
2464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
2466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (keyfile)
2468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fclose(keyfile);
2469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (framepsnr)
2471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fclose(framepsnr);
2472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (kf_list)
2474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fclose(kf_list);
2475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                 unsigned char *recon, int recon_stride,
24835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                                 unsigned int cols, unsigned int rows)
2484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int row, col;
2486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    uint64_t total_sse = 0;
2487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int diff;
2488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (row = 0; row + 16 <= rows; row += 16)
2490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (col = 0; col + 16 <= cols; col += 16)
2492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            unsigned int sse;
2494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
24955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_mse16x16(orig + col, orig_stride,
2496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                            recon + col, recon_stride,
2497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                            &sse);
2498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            total_sse += sse;
2499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* Handle odd-sized width */
2502474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (col < cols)
2503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            unsigned int   border_row, border_col;
2505474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            unsigned char *border_orig = orig;
2506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            unsigned char *border_recon = recon;
2507474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2508474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (border_row = 0; border_row < 16; border_row++)
2509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
2510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                for (border_col = col; border_col < cols; border_col++)
2511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
2512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    diff = border_orig[border_col] - border_recon[border_col];
2513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    total_sse += diff * diff;
2514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
2515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                border_orig += orig_stride;
2517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                border_recon += recon_stride;
2518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
2519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        orig += orig_stride * 16;
2522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        recon += recon_stride * 16;
2523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* Handle odd-sized height */
2526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (; row < rows; row++)
2527474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (col = 0; col < cols; col++)
2529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            diff = orig[col] - recon[col];
2531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            total_sse += diff * diff;
2532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        orig += orig_stride;
2535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        recon += recon_stride;
2536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2538167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vp8_clear_system_state();
2539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return total_sse;
2540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void generate_psnr_packet(VP8_COMP *cpi)
2544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG      *orig = cpi->Source;
2546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG      *recon = cpi->common.frame_to_show;
2547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct vpx_codec_cx_pkt  pkt;
2548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    uint64_t                 sse;
2549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int                      i;
2550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int             width = cpi->common.Width;
2551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int             height = cpi->common.Height;
2552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.kind = VPX_CODEC_PSNR_PKT;
2554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sse = calc_plane_error(orig->y_buffer, orig->y_stride,
2555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           recon->y_buffer, recon->y_stride,
25565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                           width, height);
2557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.sse[0] = sse;
2558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.sse[1] = sse;
2559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.samples[0] = width * height;
2560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.samples[1] = width * height;
2561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    width = (width + 1) / 2;
2563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    height = (height + 1) / 2;
2564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
2566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           recon->u_buffer, recon->uv_stride,
25675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                           width, height);
2568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.sse[0] += sse;
2569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.sse[2] = sse;
2570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.samples[0] += width * height;
2571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.samples[2] = width * height;
2572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
2574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                           recon->v_buffer, recon->uv_stride,
25755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                           width, height);
2576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.sse[0] += sse;
2577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.sse[3] = sse;
2578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.samples[0] += width * height;
2579474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pkt.data.psnr.samples[3] = width * height;
2580474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < 4; i++)
2582411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org        pkt.data.psnr.psnr[i] = vpx_sse_to_psnr(pkt.data.psnr.samples[i], 255.0,
2583411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                                                (double)(pkt.data.psnr.sse[i]));
2584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2589167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags)
2590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (ref_frame_flags > 7)
2592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1 ;
2593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->ref_frame_flags = ref_frame_flags;
2595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
2596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2597167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags)
2598474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (ref_frame_flags > 7)
2600474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1 ;
2601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.refresh_golden_frame = 0;
2603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.refresh_alt_ref_frame = 0;
2604474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.refresh_last_frame   = 0;
2605474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2606ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (ref_frame_flags & VP8_LAST_FRAME)
2607474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->common.refresh_last_frame = 1;
2608474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2609ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (ref_frame_flags & VP8_GOLD_FRAME)
2610474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->common.refresh_golden_frame = 1;
2611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2612ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (ref_frame_flags & VP8_ALTR_FRAME)
2613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->common.refresh_alt_ref_frame = 1;
2614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
2616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2618ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgint vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2619474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ref_fb_idx;
2622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2623ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (ref_frame_flag == VP8_LAST_FRAME)
2624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ref_fb_idx = cm->lst_fb_idx;
2625ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else if (ref_frame_flag == VP8_GOLD_FRAME)
2626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ref_fb_idx = cm->gld_fb_idx;
2627ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else if (ref_frame_flag == VP8_ALTR_FRAME)
2628474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ref_fb_idx = cm->alt_fb_idx;
2629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
2630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1;
2631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
26325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
2633474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2634474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
2635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2636ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgint vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ref_fb_idx;
2641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2642ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (ref_frame_flag == VP8_LAST_FRAME)
2643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ref_fb_idx = cm->lst_fb_idx;
2644ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else if (ref_frame_flag == VP8_GOLD_FRAME)
2645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ref_fb_idx = cm->gld_fb_idx;
2646ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else if (ref_frame_flag == VP8_ALTR_FRAME)
2647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ref_fb_idx = cm->alt_fb_idx;
2648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
2649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1;
2650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
26515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
2652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
2654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2655167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_update_entropy(VP8_COMP *cpi, int update)
2656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->refresh_entropy_probs = update;
2659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
2661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2663474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
266488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if defined(OUTPUT_YUV_SRC) || defined(OUTPUT_YUV_DENOISED)
266588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid vp8_write_yuv_frame(FILE *yuv_file, YV12_BUFFER_CONFIG *s)
2666474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2667474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *src = s->y_buffer;
2668474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int h = s->y_height;
2669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    do
2671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2672474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fwrite(src, s->y_width, 1,  yuv_file);
2673474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        src += s->y_stride;
2674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    while (--h);
2676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    src = s->u_buffer;
2678474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    h = s->uv_height;
2679474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2680474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    do
2681474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fwrite(src, s->uv_width, 1,  yuv_file);
2683474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        src += s->uv_stride;
2684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    while (--h);
2686474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2687474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    src = s->v_buffer;
2688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    h = s->uv_height;
2689474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    do
2691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fwrite(src, s->uv_width, 1, yuv_file);
2693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        src += s->uv_stride;
2694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2695474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    while (--h);
2696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2697474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
2700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2703ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* are we resizing the image */
2704474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->horiz_scale != 0 || cm->vert_scale != 0)
2705474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2706474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_SPATIAL_RESAMPLING
2707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2708474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int tmp_height;
2710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cm->vert_scale == 3)
2712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            tmp_height = 9;
2713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
2714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            tmp_height = 11;
2715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Scale2Ratio(cm->horiz_scale, &hr, &hs);
2717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Scale2Ratio(cm->vert_scale, &vr, &vs);
2718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2719d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        tmp_height, hs, hr, vs, vr, 0);
2721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->Source = &cpi->scaled_source;
2724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
2727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->Source = sd;
2728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2730474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2731ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic int resize_key_frame(VP8_COMP *cpi)
2732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_SPATIAL_RESAMPLING
2734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2736ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Do we need to apply resampling for one pass cbr.
2737411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org     * In one pass this is more limited than in two pass cbr.
2738411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org     * The test and any change is only made once per key frame sequence.
2739ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
2740474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
2741474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2742474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2743474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2744474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int new_width, new_height;
2745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2746ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* If we are below the resample DOWN watermark then scale down a
2747ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * notch.
2748ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
2749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2750474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2751474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2752474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2754ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Should we now start scaling back up */
2755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2757474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2758474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2759474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2761411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org        /* Get the new height and width */
2762474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Scale2Ratio(cm->horiz_scale, &hr, &hs);
2763474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Scale2Ratio(cm->vert_scale, &vr, &vs);
2764474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2767ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* If the image size has changed we need to reallocate the buffers
2768ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * and resample the source image
2769ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
2770474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ((cm->Width != new_width) || (cm->Height != new_height))
2771474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2772474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->Width = new_width;
2773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->Height = new_height;
2774474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_alloc_compressor_data(cpi);
2775474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            scale_and_extend_source(cpi->un_scaled_source, cpi);
2776ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            return 1;
2777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2778474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2779474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2780474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
2781ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    return 0;
2782474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2783474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void update_alt_ref_frame_stats(VP8_COMP *cpi)
2786474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2787474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2788474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2789ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Select an interval before next GF or altref */
2790474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi->auto_gold)
2791ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2792474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
2794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2795474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2797ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Set the bits per frame that we should try and recover in
2798ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * subsequent inter frames to account for the extra GF spend...
2799ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * note that his does not apply for GF updates that occur
2800ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * coincident with a key frame as the extra cost of key frames is
2801ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * dealt with elsewhere.
2802ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
2803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->gf_overspend_bits += cpi->projected_frame_size;
2804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2806474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2807ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Update data structure that monitors level of reference to last GF */
2808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2811ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* this frame refreshes means next frames don't unless specified by user */
281247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    cpi->frames_since_golden = 0;
2813474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2814ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear the alternate reference update pending flag. */
2815167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->source_alt_ref_pending = 0;
2816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
281710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    /* Set the alternate reference frame active flag */
2818167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->source_alt_ref_active = 1;
2819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2821474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2822474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void update_golden_frame_stats(VP8_COMP *cpi)
2823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2826ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Update the Golden frame usage counts. */
2827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->refresh_golden_frame)
2828474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2829ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Select an interval before next GF */
2830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (!cpi->auto_gold)
2831ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
2834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2836474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2837ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Set the bits per frame that we should try and recover in
2838ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * subsequent inter frames to account for the extra GF spend...
2839ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * note that his does not apply for GF updates that occur
2840ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * coincident with a key frame as the extra cost of key frames
2841ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * is dealt with elsewhere.
2842ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
2843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
2844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
2845ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Calcluate GF bits to be recovered
2846ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * Projected size - av frame bits available for inter
2847ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * frames for clip as a whole
2848ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
2849474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
2850474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
2851474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2853474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2854474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2855474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2856ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Update data structure that monitors level of reference to last GF */
2857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2860ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* this frame refreshes means next frames don't unless specified by
2861ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * user
2862ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
2863474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_golden_frame = 0;
286447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        cpi->frames_since_golden = 0;
2865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2866474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2868474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2869474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2870ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2871ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* ******** Fixed Q test code only ************ */
2872ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* If we are going to use the ALT reference for the next group of
2873ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * frames set a flag to say so.
2874ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
2875474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.fixed_q >= 0 &&
2876474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
2877474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2878167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->source_alt_ref_pending = 1;
2879474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2881474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2882474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (!cpi->source_alt_ref_pending)
2883167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->source_alt_ref_active = 0;
2884474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2885ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Decrement count down till next gf */
2886474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->frames_till_gf_update_due > 0)
2887474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->frames_till_gf_update_due--;
2888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2890474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (!cpi->common.refresh_alt_ref_frame)
2891474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2892ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Decrement count down till next gf */
2893474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->frames_till_gf_update_due > 0)
2894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->frames_till_gf_update_due--;
2895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
289647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        if (cpi->frames_till_alt_ref_frame)
289747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org            cpi->frames_till_alt_ref_frame --;
2898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
289947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        cpi->frames_since_golden ++;
2900474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
290147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        if (cpi->frames_since_golden > 1)
2902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
2903d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->recent_ref_frame_usage[INTRA_FRAME] +=
2904d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
2905d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->recent_ref_frame_usage[LAST_FRAME] +=
2906d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
2907d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
2908d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
2909d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
2910d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
2911474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
2912474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2913474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2914474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2915ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* This function updates the reference frame probability estimates that
2916ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * will be used during mode selection
2917ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
2918474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void update_rd_ref_frame_probs(VP8_COMP *cpi)
2919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2921474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2922d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
2923474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const int rf_intra = rfct[INTRA_FRAME];
2924474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2925474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2926474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
2927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2928474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->prob_intra_coded = 255;
2929474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->prob_last_coded  = 128;
2930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->prob_gf_coded  = 128;
2931474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2932474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (!(rf_intra + rf_inter))
2933474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2934474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->prob_intra_coded = 63;
2935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->prob_last_coded  = 128;
2936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->prob_gf_coded    = 128;
2937474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2939ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* update reference frame costs since we can do better than what we got
2940ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * last frame.
2941ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
2942167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->oxcf.number_of_layers == 1)
2943474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2944167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (cpi->common.refresh_alt_ref_frame)
2945167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
2946167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->prob_intra_coded += 40;
29474b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org            if (cpi->prob_intra_coded > 255)
29484b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org                cpi->prob_intra_coded = 255;
2949167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->prob_last_coded = 200;
2950167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->prob_gf_coded = 1;
2951167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
295247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        else if (cpi->frames_since_golden == 0)
2953167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
2954167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->prob_last_coded = 214;
2955167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
295647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        else if (cpi->frames_since_golden == 1)
2957167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
2958167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->prob_last_coded = 192;
2959167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->prob_gf_coded = 220;
2960167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
2961167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        else if (cpi->source_alt_ref_active)
2962167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
2963167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->prob_gf_coded -= 20;
2964474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2965167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (cpi->prob_gf_coded < 10)
2966167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->prob_gf_coded = 10;
2967167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
2968167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (!cpi->source_alt_ref_active)
2969167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->prob_gf_coded = 255;
2970474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
2971474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
2972474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2973474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2974ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* 1 = key, 0 = inter */
2975474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int decide_key_frame(VP8_COMP *cpi)
2976474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
2977474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
2978474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2979167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int code_key_frame = 0;
2980474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2981474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->kf_boost = 0;
2982474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2983474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->Speed > 11)
2984167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        return 0;
2985474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2986ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear down mmx registers */
2987ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_clear_system_state();
2988474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2989474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
2990474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
2991d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        double change = 1.0 * abs((int)(cpi->mb.intra_error -
2992d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->last_intra_error)) / (1 + cpi->last_intra_error);
2993d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        double change2 = 1.0 * abs((int)(cpi->mb.prediction_error -
2994d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
2995474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double minerror = cm->MBs * 256;
2996474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2997d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        cpi->last_intra_error = cpi->mb.intra_error;
2998d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        cpi->last_prediction_error = cpi->mb.prediction_error;
29996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3000d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15
3001d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            && cpi->mb.prediction_error > minerror
3002474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            && (change > .25 || change2 > .25))
3003474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3004474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
3005167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            return 1;
3006474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3007474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3008167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        return 0;
3009474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3010474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3011474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3012ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* If the following are true we might as well code a key frame */
3013474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (((cpi->this_frame_percent_intra == 100) &&
3014474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
3015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ((cpi->this_frame_percent_intra > 95) &&
3016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
3017474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3018167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        code_key_frame = 1;
3019474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3020ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* in addition if the following are true and this is not a golden frame
3021ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * then code a key frame Note that on golden frames there often seems
3022ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * to be a pop in intra useage anyway hence this restriction is
3023ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * designed to prevent spurious key frames. The Intra pop needs to be
3024ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * investigated.
3025ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3026474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (((cpi->this_frame_percent_intra > 60) &&
3027474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
3028474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             ((cpi->this_frame_percent_intra > 75) &&
3029474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
3030474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             ((cpi->this_frame_percent_intra > 90) &&
3031474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
3032474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3033474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (!cm->refresh_golden_frame)
3034167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            code_key_frame = 1;
3035474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3036474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3037474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return code_key_frame;
3038474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3039474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
3040474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3041474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
3042474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
3043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
3044474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    (void) size;
3045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    (void) dest;
3046474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    (void) frame_flags;
3047474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_set_quantizer(cpi, 26);
3048474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3049474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_first_pass(cpi);
3050474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
3051474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
3052474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3053474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
3054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
3055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
3056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3057ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* write the frame */
3058474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    FILE *yframe;
3059474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i;
3060474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    char filename[255];
3061474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3062474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sprintf(filename, "cx\\y%04d.raw", this_frame);
3063474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    yframe = fopen(filename, "wb");
3064474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3065474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < frame->y_height; i++)
3066474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
3067474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3068474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    fclose(yframe);
3069474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sprintf(filename, "cx\\u%04d.raw", this_frame);
3070474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    yframe = fopen(filename, "wb");
3071474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3072474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < frame->uv_height; i++)
3073474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3074474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3075474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    fclose(yframe);
3076474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sprintf(filename, "cx\\v%04d.raw", this_frame);
3077474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    yframe = fopen(filename, "wb");
3078474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3079474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < frame->uv_height; i++)
3080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3081474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3082474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    fclose(yframe);
3083474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
3084474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
3085ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* return of 0 means drop frame */
3086474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3087ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Function to test for conditions that indeicate we should loop
3088ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * back and recode a frame.
3089ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
3090167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic int recode_loop_test( VP8_COMP *cpi,
3091474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                              int high_limit, int low_limit,
3092474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                              int q, int maxq, int minq )
3093474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
3094167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int force_recode = 0;
3095474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
3096474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3097ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Is frame recode allowed at all
3098ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * Yes if either recode mode 1 is selected or mode two is selcted
3099ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * and the frame is a key frame. golden frame or alt_ref_frame
3100ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ( (cpi->sf.recode_loop == 1) ||
3102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         ( (cpi->sf.recode_loop == 2) &&
3103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org           ( (cm->frame_type == KEY_FRAME) ||
3104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             cm->refresh_golden_frame ||
3105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             cm->refresh_alt_ref_frame ) ) )
3106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3107ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* General over and under shoot tests */
3108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
3109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             ((cpi->projected_frame_size < low_limit) && (q > minq)) )
3110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3111167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            force_recode = 1;
3112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Special Constrained quality tests */
3114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Undershoot and below auto cq level */
3117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ( (q > cpi->cq_target_quality) &&
3118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                 (cpi->projected_frame_size <
3119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                     ((cpi->this_frame_target * 7) >> 3)))
3120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3121167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                force_recode = 1;
3122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3123ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Severe undershoot and between auto and user cq level */
3124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else if ( (q > cpi->oxcf.cq_level) &&
3125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                      (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
3126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                      (cpi->active_best_quality > cpi->oxcf.cq_level))
3127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3128167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                force_recode = 1;
3129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->active_best_quality = cpi->oxcf.cq_level;
3130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return force_recode;
3135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
3136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3137ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic void update_reference_frames(VP8_COMP *cpi)
3138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
3139ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    VP8_COMMON *cm = &cpi->common;
3140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
3141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3142ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* At this point the new frame has been encoded.
3143ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * If any buffer copy / swapping is signaled it should be done here.
3144ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
3147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3148ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME ;
3149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
3154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3155ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
3156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
3157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else    /* For non key frames */
3159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cm->refresh_alt_ref_frame)
3161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            assert(!cm->copy_buffer_to_arf);
3163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3164ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
3165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->alt_fb_idx = cm->new_fb_idx;
3167ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
3169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cm->copy_buffer_to_arf)
3171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            assert(!(cm->copy_buffer_to_arf & ~0x3));
3173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cm->copy_buffer_to_arf == 1)
3175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if(cm->alt_fb_idx != cm->lst_fb_idx)
3177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
3178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
3179ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cm->alt_fb_idx = cm->lst_fb_idx;
3181ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3182ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    cpi->current_ref_frames[ALTREF_FRAME] =
3183ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        cpi->current_ref_frames[LAST_FRAME];
3184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
3185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else /* if (cm->copy_buffer_to_arf == 2) */
3187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if(cm->alt_fb_idx != cm->gld_fb_idx)
3189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
3190ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
3191ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cm->alt_fb_idx = cm->gld_fb_idx;
3193ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3194ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    cpi->current_ref_frames[ALTREF_FRAME] =
3195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        cpi->current_ref_frames[GOLDEN_FRAME];
3196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
3197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cm->refresh_golden_frame)
3201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            assert(!cm->copy_buffer_to_gf);
3203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3204ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
3205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->gld_fb_idx = cm->new_fb_idx;
3207ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
3209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cm->copy_buffer_to_gf)
3211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            assert(!(cm->copy_buffer_to_arf & ~0x3));
3213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cm->copy_buffer_to_gf == 1)
3215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if(cm->gld_fb_idx != cm->lst_fb_idx)
3217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
3218ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
3219ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cm->gld_fb_idx = cm->lst_fb_idx;
3221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    cpi->current_ref_frames[GOLDEN_FRAME] =
3223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        cpi->current_ref_frames[LAST_FRAME];
3224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
3225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else /* if (cm->copy_buffer_to_gf == 2) */
3227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if(cm->alt_fb_idx != cm->gld_fb_idx)
3229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
3230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
3231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cm->gld_fb_idx = cm->alt_fb_idx;
3233ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3234ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    cpi->current_ref_frames[GOLDEN_FRAME] =
3235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        cpi->current_ref_frames[ALTREF_FRAME];
3236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
3237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->refresh_last_frame)
3242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3243ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
3244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
3245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->lst_fb_idx = cm->new_fb_idx;
3246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3247ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
3248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3249d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
3250d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#if CONFIG_TEMPORAL_DENOISING
3251d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    if (cpi->oxcf.noise_sensitivity)
3252d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    {
3253d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        /* we shouldn't have to keep multiple copies as we know in advance which
3254d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org         * buffer we should start - for now to get something up and running
3255d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org         * I've chosen to copy the buffers
3256d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org         */
3257d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        if (cm->frame_type == KEY_FRAME)
3258d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        {
3259d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            int i;
32603983288b51bb3c8f48a2d5f77523ef3ff1e94cd2johannkoenig@chromium.org            for (i = LAST_FRAME; i < MAX_REF_FRAMES; ++i)
32613983288b51bb3c8f48a2d5f77523ef3ff1e94cd2johannkoenig@chromium.org              vp8_yv12_copy_frame(cpi->Source,
32623983288b51bb3c8f48a2d5f77523ef3ff1e94cd2johannkoenig@chromium.org                                  &cpi->denoiser.yv12_running_avg[i]);
3263d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        }
3264d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        else /* For non key frames */
3265d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        {
3266d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            vp8_yv12_extend_frame_borders(
3267d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
3268d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
3269d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf)
3270d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            {
3271d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                vp8_yv12_copy_frame(
3272d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3273d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
3274d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            }
3275d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            if (cm->refresh_golden_frame || cm->copy_buffer_to_gf)
3276d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            {
3277d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                vp8_yv12_copy_frame(
3278d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3279d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
3280d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            }
3281d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            if(cm->refresh_last_frame)
3282d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            {
3283d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                vp8_yv12_copy_frame(
3284d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3285d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3286d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            }
3287d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        }
328841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        if (cpi->oxcf.noise_sensitivity == 4)
328941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_last_source);
3290d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
3291d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    }
3292d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#endif
3293d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
3294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
3295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3296d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_TEMPORAL_DENOISING
329741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void process_denoiser_mode_change(VP8_COMP *cpi) {
329841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const VP8_COMMON *const cm = &cpi->common;
329941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int i, j;
330041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int total = 0;
330141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int num_blocks = 0;
330241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Number of blocks skipped along row/column in computing the
330341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // nmse (normalized mean square error) of source.
330441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int skip = 2;
330541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Only select blocks for computing nmse that have been encoded
330641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // as ZERO LAST min_consec_zero_last frames in a row.
3307ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org  // Scale with number of temporal layers.
3308ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org  int min_consec_zero_last = 8 / cpi->oxcf.number_of_layers;
330941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Decision is tested for changing the denoising mode every
331041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // num_mode_change times this function is called. Note that this
331141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // function called every 8 frames, so (8 * num_mode_change) is number
331241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // of frames where denoising mode change is tested for switch.
331341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int num_mode_change = 15;
331441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Framerate factor, to compensate for larger mse at lower framerates.
3315ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org  // Use ref_framerate, which is full source framerate for temporal layers.
3316ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org  // TODO(marpan): Adjust this factor.
3317ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org  int fac_framerate = cpi->ref_framerate < 25.0f ? 80 : 100;
331841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int tot_num_blocks = cm->mb_rows * cm->mb_cols;
331941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int ystride = cpi->Source->y_stride;
332041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  unsigned char *src = cpi->Source->y_buffer;
332141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  unsigned char *dst = cpi->denoiser.yv12_last_source.y_buffer;
332241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static const unsigned char const_source[16] = {
332341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
332441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      128, 128, 128};
332541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
332641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Loop through the Y plane, every skip blocks along rows and columns,
332741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // summing the normalized mean square error, only for blocks that have
332841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // been encoded as ZEROMV LAST at least min_consec_zero_last least frames in
332941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // a row and have small sum difference between current and previous frame.
333041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Normalization here is by the contrast of the current frame block.
333141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  for (i = 0; i < cm->Height; i += 16 * skip) {
333241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    int block_index_row = (i >> 4) * cm->mb_cols;
333341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    for (j = 0; j < cm->Width; j += 16 * skip) {
333441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      int index = block_index_row + (j >> 4);
333541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
333641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        unsigned int sse;
333741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        const unsigned int mse = vp8_mse16x16(src + j,
333841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                              ystride,
333941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                              dst + j,
334041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                              ystride,
334141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                              &sse);
334241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        const unsigned int var = vp8_variance16x16(src + j,
334341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                                   ystride,
334441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                                   dst + j,
334541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                                   ystride,
334641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                                   &sse);
334741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        // Only consider this block as valid for noise measurement
334841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        // if the sum_diff average of the current and previous frame
334941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        // is small (to avoid effects from lighting change).
335041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        if ((mse - var) < 256) {
335141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          const unsigned int act = vp8_variance16x16(src + j,
335241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                                     ystride,
335341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                                     const_source,
335441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                                     0,
335541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                                                     &sse);
335641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          if (act > 0)
335741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            total += mse / act;
335841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          num_blocks++;
335941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
336041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
336141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
336241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    src += 16 * skip * ystride;
336341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    dst += 16 * skip * ystride;
336441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
336541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  total = total * fac_framerate / 100;
336641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
336741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Only consider this frame as valid sample if we have computed nmse over
336841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // at least ~1/16 blocks, and Total > 0 (Total == 0 can happen if the
336941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // application inputs duplicate frames, or contrast is all zero).
337041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  if (total > 0 &&
337141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      (num_blocks > (tot_num_blocks >> 4))) {
337241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Update the recursive mean square source_diff.
337387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (cpi->denoiser.nmse_source_diff_count == 0) {
337441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      // First sample in new interval.
337541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      cpi->denoiser.nmse_source_diff = total;
337687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      cpi->denoiser.qp_avg = cm->base_qindex;
337787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    } else {
337841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      // For subsequent samples, use average with weight ~1/4 for new sample.
337941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      cpi->denoiser.nmse_source_diff = (int)((total >> 2) +
338041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          3 * (cpi->denoiser.nmse_source_diff >> 2));
338187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      cpi->denoiser.qp_avg = (int)((cm->base_qindex >> 2) +
338287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          3 * (cpi->denoiser.qp_avg >> 2));
338387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
338441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    cpi->denoiser.nmse_source_diff_count++;
338541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
338641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Check for changing the denoiser mode, when we have obtained #samples =
338787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // num_mode_change. Condition the change also on the bitrate and QP.
338841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  if (cpi->denoiser.nmse_source_diff_count == num_mode_change) {
338941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Check for going up: from normal to aggressive mode.
3390ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org    if ((cpi->denoiser.denoiser_mode == kDenoiserOnYUV) &&
339141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        (cpi->denoiser.nmse_source_diff >
339287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        cpi->denoiser.threshold_aggressive_mode) &&
339387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        (cpi->denoiser.qp_avg < cpi->denoiser.qp_threshold_up &&
339487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org         cpi->target_bandwidth > cpi->denoiser.bitrate_threshold)) {
339541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUVAggressive);
339641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    } else {
339741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      // Check for going down: from aggressive to normal mode.
339887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
339941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          (cpi->denoiser.nmse_source_diff <
340087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          cpi->denoiser.threshold_aggressive_mode)) ||
340187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          ((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
340287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (cpi->denoiser.qp_avg > cpi->denoiser.qp_threshold_down ||
340387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org           cpi->target_bandwidth < cpi->denoiser.bitrate_threshold))) {
340441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
340541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
340641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
340741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Reset metric and counter for next interval.
340841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    cpi->denoiser.nmse_source_diff = 0;
340987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    cpi->denoiser.qp_avg = 0;
341041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    cpi->denoiser.nmse_source_diff_count = 0;
341141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
341241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
3413d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif
341441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
34155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
3416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
34175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    const FRAME_TYPE frame_type = cm->frame_type;
34185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
3419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->no_lpf)
3420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->filter_level = 0;
3422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
3424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        struct vpx_usec_timer timer;
3426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_clear_system_state();
3428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_usec_timer_start(&timer);
3430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->sf.auto_filter == 0)
3431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
3434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8cx_pick_filter_level(cpi->Source, cpi);
3435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
34365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if (cm->filter_level > 0)
34375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
34385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8cx_set_alt_lf_level(cpi, cm->filter_level);
34395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
34405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
3441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_usec_timer_mark(&timer);
3442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3445474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
3446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->b_multi_threaded)
3447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
3449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->filter_level > 0)
3451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
34525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
3453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
34555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_yv12_extend_frame_borders(cm->frame_to_show);
3456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
3458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void encode_frame_to_data_rate
3460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
3461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMP *cpi,
3462474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned long *size,
3463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *dest,
3464167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    unsigned char* dest_end,
3465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int *frame_flags
3466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org)
3467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
3468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Q;
3469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int frame_over_shoot_limit;
3470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int frame_under_shoot_limit;
3471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3472167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int Loop = 0;
3473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int loop_count;
3474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
34755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
34765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    int active_worst_qchanged = 0;
34775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
34785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
3479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int q_low;
3480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int q_high;
3481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int zbin_oq_high;
3482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int zbin_oq_low = 0;
3483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int top_index;
3484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int bottom_index;
3485167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int overshoot_seen = 0;
3486167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int undershoot_seen = 0;
34875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
34885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
3489ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
3490ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                          cpi->oxcf.optimal_buffer_level / 100);
3491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int drop_mark75 = drop_mark * 2 / 3;
3492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int drop_mark50 = drop_mark / 4;
3493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int drop_mark25 = drop_mark / 8;
3494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear down mmx registers to allow floating point in what follows */
3497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_clear_system_state();
3498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
34995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_MULTITHREAD
35005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    /*  wait for the last picture loopfilter thread done */
35015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if (cpi->b_lpf_running)
35025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    {
35035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        sem_wait(&cpi->h_event_end_lpf);
35045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->b_lpf_running = 0;
35055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    }
35065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
35075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
35085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if(cpi->force_next_frame_intra)
3509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
35105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cm->frame_type = KEY_FRAME;  /* delayed intra frame */
3511167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->force_next_frame_intra = 0;
3512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3514ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* For an alt ref frame in 2 pass we skip the call to the second pass
3515ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * function that sets the target bandwidth
3516ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
3518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass == 2)
3520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->common.refresh_alt_ref_frame)
3522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Per frame bit target for the alt ref frame */
3524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
3525ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* per second target bitrate */
3526ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->target_bandwidth = (int)(cpi->twopass.gf_bits *
352747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                                          cpi->output_framerate);
3528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
3531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
353247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        cpi->per_frame_bandwidth  = (int)(cpi->target_bandwidth / cpi->output_framerate);
3533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3534ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Default turn off buffer to buffer copying */
3535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->copy_buffer_to_gf = 0;
3536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->copy_buffer_to_arf = 0;
3537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3538ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear zbin over-quant value and mode boost values. */
3539d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    cpi->mb.zbin_over_quant = 0;
3540d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    cpi->mb.zbin_mode_boost = 0;
3541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3542ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Enable or disable mode based tweaking of the zbin
3543ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * For 2 Pass Only used where GF/ARF prediction quality
3544ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * is above a threshold
3545ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3546d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    cpi->mb.zbin_mode_boost_enabled = 1;
3547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass == 2)
3548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ( cpi->gfu_boost <= 400 )
3550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3551d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->mb.zbin_mode_boost_enabled = 0;
3552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3555ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Current default encoder behaviour for the altref sign bias */
3556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->source_alt_ref_active)
3557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
3559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
356110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    /* Check to see if a key frame is signaled
3562ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * For two pass with auto key frame enabled cm->frame_type may already
3563ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * be set, but not for one pass.
3564ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ((cm->current_video_frame == 0) ||
3566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        (cm->frame_flags & FRAMEFLAGS_KEY) ||
3567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
3568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3569ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Key frame from VFW/auto-keyframe/first frame */
3570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->frame_type = KEY_FRAME;
357141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if CONFIG_TEMPORAL_DENOISING
357241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        if (cpi->oxcf.noise_sensitivity == 4) {
357341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          // For adaptive mode, reset denoiser to normal mode on key frame.
357441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
357541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
357641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
3577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3579ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_MULTI_RES_ENCODING
3580ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* In multi-resolution encoding, frame_type is decided by lowest-resolution
3581ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * encoder. Same frame_type is adopted while encoding at other resolution.
3582ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3583ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cpi->oxcf.mr_encoder_id)
3584ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
3585ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        LOWER_RES_FRAME_INFO* low_res_frame_info
3586ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info;
3587ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3588ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cm->frame_type = low_res_frame_info->frame_type;
3589ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3590ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if(cm->frame_type != KEY_FRAME)
3591ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
3592ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->mr_low_res_mv_avail = 1;
3593ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);
3594ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3595ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (cpi->ref_frame_flags & VP8_LAST_FRAME)
3596ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[LAST_FRAME]
3597ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         == low_res_frame_info->low_res_ref_frames[LAST_FRAME]);
3598ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3599ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
3600ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[GOLDEN_FRAME]
3601ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         == low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);
3602ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3603ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
3604ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
3605ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
3606ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
3607ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
3608ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif
3609474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
361041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Find the reference frame closest to the current frame.
361141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    cpi->closest_reference_frame = LAST_FRAME;
361241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (cm->frame_type != KEY_FRAME) {
361341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      int i;
361441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      MV_REFERENCE_FRAME closest_ref = INTRA_FRAME;
361541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
361641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        closest_ref = LAST_FRAME;
361741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      } else if (cpi->ref_frame_flags & VP8_GOLD_FRAME) {
361841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        closest_ref = GOLDEN_FRAME;
361941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      } else if (cpi->ref_frame_flags & VP8_ALTR_FRAME) {
362041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        closest_ref = ALTREF_FRAME;
362141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
362241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      for (i = 1; i <= 3; i++) {
362341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        vpx_ref_frame_type_t ref_frame_type = (vpx_ref_frame_type_t)
362441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            ((i == 3) ? 4 : i);
362541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        if (cpi->ref_frame_flags & ref_frame_type) {
362641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          if ((cm->current_video_frame - cpi->current_ref_frames[i]) <
362741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            (cm->current_video_frame - cpi->current_ref_frames[closest_ref])) {
362841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            closest_ref = i;
362941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org          }
363041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        }
363141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
363241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      cpi->closest_reference_frame = closest_ref;
363341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
363441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3635ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set various flags etc to special state if it is a key frame */
3636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
3637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int i;
3639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3640ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        // Set the loop filter deltas and segmentation map update
3641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        setup_features(cpi);
3642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3643ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* The alternate reference frame cannot be active for a key frame */
3644167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->source_alt_ref_active = 0;
3645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3646ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Reset the RD threshold multipliers to default of * 1 (128) */
3647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (i = 0; i < MAX_MODES; i++)
3648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3649d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->mb.rd_thresh_mult[i] = 128;
3650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
365141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
365241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        // Reset the zero_last counter to 0 on key frame.
365341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        vpx_memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
3654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
3657ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Experimental code for lagged compress and one pass
3658ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * Initialise one_pass GF frames stats
3659ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * Update stats used for GF selection
3660ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3663474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3664474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3665474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3666474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3667474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3668474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3672474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3673474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
3675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    update_rd_ref_frame_probs(cpi);
3677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3678474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->drop_frames_allowed)
3679474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3680ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* The reset to decimation 0 is only done here for one pass.
3681ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * Once it is set two pass leaves decimation on till the next kf.
3682ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
3683474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
3684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->decimation_factor --;
3685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3686474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
3687474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->decimation_factor = 1;
3688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3689474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
3690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->decimation_factor = 3;
3692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
3694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3695474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->decimation_factor = 2;
3696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3697474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
3698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->decimation_factor = 1;
3700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3703ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* The following decimates the frame rate according to a regular
3704ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
3705ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * prevent buffer under-run in CBR mode. Alternatively it might be
3706ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * desirable in some situations to drop frame rate but throw more bits
3707ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * at each frame.
3708ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     *
3709ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * Note that dropping a key frame can be problematic if spatial
3710ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * resampling is also active
3711ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->decimation_factor > 0)
3713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        switch (cpi->decimation_factor)
3715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 1:
3717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 3 / 2;
3718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
3719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 2:
3720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 5 / 4;
3721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
3722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 3:
3723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 5 / 4;
3724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
3725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3727ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Note that we should not throw out a key frame (especially when
3728ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * spatial resampling is enabled).
3729ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
373075acc2625d84919aa626fdd5da082f0c30cd121bwjia@chromium.org        if (cm->frame_type == KEY_FRAME)
3731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->decimation_count = cpi->decimation_factor;
3733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cpi->decimation_count > 0)
3735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3736474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->decimation_count --;
3737167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
3738474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3739167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
3740167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
3741167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
3742ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_MULTI_RES_ENCODING
3743ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_store_drop_frame_info(cpi);
3744ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif
3745ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->current_video_frame++;
3747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->frames_since_key++;
374810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            // We advance the temporal pattern for dropped frames.
374910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            cpi->temporal_pattern_counter++;
3750474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3751474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_INTERNAL_STATS
3752474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->count ++;
3753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
3754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->buffer_level = cpi->bits_off_target;
3756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3757167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (cpi->oxcf.number_of_layers > 1)
3758167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            {
3759167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                unsigned int i;
3760167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
3761ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Propagate bits saved by dropping the frame to higher
3762ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * layers
3763ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
3764167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
3765167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
3766167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    LAYER_CONTEXT *lc = &cpi->layer_context[i];
3767d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                    lc->bits_off_target += (int)(lc->target_bandwidth /
3768d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                                                 lc->framerate);
3769167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    if (lc->bits_off_target > lc->maximum_buffer_size)
3770167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        lc->bits_off_target = lc->maximum_buffer_size;
3771167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    lc->buffer_level = lc->bits_off_target;
3772167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
3773167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            }
3774167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
3775474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            return;
3776474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
3778474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->decimation_count = cpi->decimation_factor;
3779474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3780ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else
3781ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->decimation_count = 0;
3782474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3783ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Decide how big to make the frame */
3784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!vp8_pick_frame_size(cpi))
3785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3786ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /*TODO: 2 drop_frame and return code could be put together. */
3787ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_MULTI_RES_ENCODING
3788ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_store_drop_frame_info(cpi);
3789ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif
3790474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->current_video_frame++;
3791474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->frames_since_key++;
379210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        // We advance the temporal pattern for dropped frames.
379310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        cpi->temporal_pattern_counter++;
3794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return;
3795474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3797ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
3798ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * This has a knock on effect on active best quality as well.
3799ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * For CBR if the buffer reaches its maximum level then we can no longer
3800ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * save up bits for later frames so we might as well use them up
3801ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * on the current frame.
3802ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
3804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
3805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3806ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Max adjustment is 1/4 */
3807ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int Adjustment = cpi->active_worst_quality / 4;
3808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Adjustment)
3810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3811474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int buff_lvl_step;
3812474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3813474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
3814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3815ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                buff_lvl_step = (int)
3816ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                ((cpi->oxcf.maximum_buffer_size -
3817ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                  cpi->oxcf.optimal_buffer_level) /
3818ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                  Adjustment);
3819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (buff_lvl_step)
3821ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    Adjustment = (int)
3822ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 ((cpi->buffer_level -
3823ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 cpi->oxcf.optimal_buffer_level) /
3824ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 buff_lvl_step);
3825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
3826474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Adjustment = 0;
3827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3828474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3829474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->active_worst_quality -= Adjustment;
3830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if(cpi->active_worst_quality < cpi->active_best_quality)
3832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->active_worst_quality = cpi->active_best_quality;
3833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3836ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set an active best quality and if necessary active worst quality
3837ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * There is some odd behavior for one pass here that needs attention.
3838ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3839474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
3840474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_clear_system_state();
3842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Q = cpi->active_worst_quality;
3844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3845474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ( cm->frame_type == KEY_FRAME )
3846474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3847474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ( cpi->pass == 2 )
3848474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3849474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (cpi->gfu_boost > 600)
3850474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   cpi->active_best_quality = kf_low_motion_minq[Q];
3851474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
3852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   cpi->active_best_quality = kf_high_motion_minq[Q];
3853474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3854ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Special case for key frames forced because we have reached
3855ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * the maximum key frame interval. Here force the Q to a range
3856ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * based on the ambient Q to reduce the risk of popping
3857ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
3858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ( cpi->this_key_frame_forced )
3859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
3860474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
3861474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
3862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
3863474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3864474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
3865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3866ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* One pass more conservative */
3867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
3868474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org               cpi->active_best_quality = kf_high_motion_minq[Q];
3869474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3870474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3871167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        else if (cpi->oxcf.number_of_layers==1 &&
3872167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame))
3873474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3874ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Use the lower of cpi->active_worst_quality and recent
3875ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * average Q as basis for GF/ARF Q limit unless last frame was
3876ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * a key frame.
3877ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
3878474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ( (cpi->frames_since_key > 1) &&
3879167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org               (cpi->avg_frame_qindex < cpi->active_worst_quality) )
3880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3881474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Q = cpi->avg_frame_qindex;
3882167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            }
3883474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3884ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* For constrained quality dont allow Q less than the cq level */
3885167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3886167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                 (Q < cpi->cq_target_quality) )
3887167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            {
3888167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                Q = cpi->cq_target_quality;
3889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3890474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3891474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ( cpi->pass == 2 )
3892474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3893474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ( cpi->gfu_boost > 1000 )
3894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->active_best_quality = gf_low_motion_minq[Q];
3895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if ( cpi->gfu_boost < 400 )
3896474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->active_best_quality = gf_high_motion_minq[Q];
3897474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
3898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->active_best_quality = gf_mid_motion_minq[Q];
3899167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
3900ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Constrained quality use slightly lower active best. */
3901167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
3902167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
3903167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    cpi->active_best_quality =
3904167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        cpi->active_best_quality * 15/16;
3905167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
3906474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3907ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* One pass more conservative */
3908474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
3909474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->active_best_quality = gf_high_motion_minq[Q];
3910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3911474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
3912474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3913474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->active_best_quality = inter_minq[Q];
3914474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3915ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* For the constant/constrained quality mode we dont want
3916ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * q to fall below the cq level.
3917ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
3918474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                (cpi->active_best_quality < cpi->cq_target_quality) )
3920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3921ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* If we are strongly undershooting the target rate in the last
3922ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * frames then use the user passed in cq value not the auto
3923ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * cq value.
3924ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
3925474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
3926474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->active_best_quality = cpi->oxcf.cq_level;
3927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
3928474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->active_best_quality = cpi->cq_target_quality;
3929474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3931474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3932ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* If CBR and the buffer is as full then it is reasonable to allow
3933ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * higher quality on the frames to prevent bits just going to waste.
3934ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
3935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3937ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Note that the use of >= here elliminates the risk of a devide
3938ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * by 0 error in the else if clause
3939ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
3940474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
3941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->active_best_quality = cpi->best_quality;
3942474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3943474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
3944474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
3945ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                int Fraction = (int)
3946ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  (((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128)
3947ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  / (cpi->oxcf.maximum_buffer_size -
3948ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  cpi->oxcf.optimal_buffer_level));
3949ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                int min_qadjustment = ((cpi->active_best_quality -
3950ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                        cpi->best_quality) * Fraction) / 128;
3951474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3952474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->active_best_quality -= min_qadjustment;
3953474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
3954474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3955474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3956ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Make sure constrained quality mode limits are adhered to for the first
3957ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * few frames of one pass encodes
3958ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
3959474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3960474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
3961474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ( (cm->frame_type == KEY_FRAME) ||
3962474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
3963474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3964474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             cpi->active_best_quality = cpi->best_quality;
3965474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3966474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cpi->active_best_quality < cpi->cq_target_quality)
3967474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
3968474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->active_best_quality = cpi->cq_target_quality;
3969474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
3970474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
3971474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3972ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clip the active best and worst quality values to limits */
3973474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->active_worst_quality > cpi->worst_quality)
3974474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->active_worst_quality = cpi->worst_quality;
3975474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3976474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->active_best_quality < cpi->best_quality)
3977474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->active_best_quality = cpi->best_quality;
3978167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
3979167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if ( cpi->active_worst_quality < cpi->active_best_quality )
3980167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->active_worst_quality = cpi->active_best_quality;
3981474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3982ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Determine initial Q to try */
3983474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    Q = vp8_regulate_q(cpi, cpi->this_frame_target);
39845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
39855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
3986474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3987ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set highest allowed value for Zbin over quant */
3988474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
3989ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        zbin_oq_high = 0;
3990167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    else if ((cpi->oxcf.number_of_layers == 1) && ((cm->refresh_alt_ref_frame ||
3991167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org              (cm->refresh_golden_frame && !cpi->source_alt_ref_active))))
3992167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
3993167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org          zbin_oq_high = 16;
3994167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
3995474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
3996474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        zbin_oq_high = ZBIN_OQ_MAX;
39975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
3998474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3999ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Setup background Q adjustment for error resilient mode.
4000ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * For multi-layer encodes only enable this for the base layer.
4001d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    */
4002ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cpi->cyclic_refresh_mode_enabled)
4003ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
4004ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      if (cpi->current_layer==0)
4005474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cyclic_background_refresh(cpi, Q, 0);
4006ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      else
4007ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        disable_segmentation(cpi);
4008ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
4009474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4010474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
4011474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
40125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
4013ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Limit Q range for the adaptive loop. */
4014474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    bottom_index = cpi->active_best_quality;
4015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    top_index    = cpi->active_worst_quality;
4016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    q_low  = cpi->active_best_quality;
4017474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    q_high = cpi->active_worst_quality;
40185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
4019474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4020474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_save_coding_context(cpi);
4021474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4022474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    loop_count = 0;
4023474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4024474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    scale_and_extend_source(cpi->un_scaled_source, cpi);
40255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
402687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_TEMPORAL_DENOISING && CONFIG_POSTPROC
402787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    // Option to apply spatial blur under the aggressive or adaptive
402887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    // (temporal denoising) mode.
402987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (cpi->oxcf.noise_sensitivity >= 3) {
403087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (cpi->denoiser.denoise_pars.spatial_blur != 0) {
403187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        vp8_de_noise(cm, cpi->Source, cpi->Source,
403287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            cpi->denoiser.denoise_pars.spatial_blur, 1, 0, 0);
403387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
403487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
403587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
403687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
40375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
4038474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4039474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.noise_sensitivity > 0)
4040474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4041474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char *src;
4042474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int l = 0;
4043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4044474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        switch (cpi->oxcf.noise_sensitivity)
4045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4046474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 1:
4047474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            l = 20;
4048474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
4049474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 2:
4050474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            l = 40;
4051474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
4052474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 3:
4053474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            l = 60;
4054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
4055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 4:
4056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            l = 80;
4057474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
4058474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 5:
4059474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            l = 100;
4060474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
4061474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        case 6:
4062474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            l = 150;
4063474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            break;
4064474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4065474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4066474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4067474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cm->frame_type == KEY_FRAME)
4068474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
406987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1,  0, 1);
4070474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4071474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
4072474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
407387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1,  0, 1);
4074474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4075474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            src = cpi->Source->y_buffer;
4076474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4077474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->Source->y_stride < 0)
4078474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4079474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
4080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4081474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4082474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4083474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4084474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4085474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
408641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4087474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef OUTPUT_YUV_SRC
408888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vp8_write_yuv_frame(yuv_file, cpi->Source);
4089474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4090474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4091474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    do
4092474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4093ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_clear_system_state();
4094474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4095474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_set_quantizer(cpi, Q);
4096474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4097ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* setup skip prob for costing in mode/mv decision */
4098474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->common.mb_no_coeff_skip)
4099474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
4101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cm->frame_type != KEY_FRAME)
4103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (cpi->common.refresh_alt_ref_frame)
4105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
4106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (cpi->last_skip_false_probs[2] != 0)
4107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->prob_skip_false = cpi->last_skip_false_probs[2];
4108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    /*
4110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                        if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
4111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->prob_skip_false = cpi->last_skip_false_probs[2];
4112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                        else if (cpi->last_skip_false_probs[2]!=0)
4113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->prob_skip_false = (cpi->last_skip_false_probs[2]  + cpi->prob_skip_false ) / 2;
4114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       */
4115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
4116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if (cpi->common.refresh_golden_frame)
4117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
4118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (cpi->last_skip_false_probs[1] != 0)
4119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->prob_skip_false = cpi->last_skip_false_probs[1];
4120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    /*
4122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                        if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
4123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->prob_skip_false = cpi->last_skip_false_probs[1];
4124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                        else if (cpi->last_skip_false_probs[1]!=0)
4125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->prob_skip_false = (cpi->last_skip_false_probs[1]  + cpi->prob_skip_false ) / 2;
4126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       */
4127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
4128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
4129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
4130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (cpi->last_skip_false_probs[0] != 0)
4131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->prob_skip_false = cpi->last_skip_false_probs[0];
4132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    /*
4134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
4135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->prob_skip_false = cpi->last_skip_false_probs[0];
4136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else if(cpi->last_skip_false_probs[0]!=0)
4137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->prob_skip_false = (cpi->last_skip_false_probs[0]  + cpi->prob_skip_false ) / 2;
4138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        */
4139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
4140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4141ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* as this is for cost estimate, let's make sure it does not
4142ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * go extreme eitehr way
4143ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
4144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (cpi->prob_skip_false < 5)
4145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->prob_skip_false = 5;
4146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (cpi->prob_skip_false > 250)
4148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->prob_skip_false = 250;
4149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4150167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref)
4151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->prob_skip_false = 1;
4152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
4155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->pass != 1)
4157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                FILE *f = fopen("skip.stt", "a");
4159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
4160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fclose(f);
4161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cm->frame_type == KEY_FRAME)
4168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4169ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if(resize_key_frame(cpi))
4170ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            {
4171ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              /* If the frame size has changed, need to reset Q, quantizer,
4172ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org               * and background refresh.
4173ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org               */
4174ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4175ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              if (cpi->cyclic_refresh_mode_enabled)
4176ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              {
4177ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                if (cpi->current_layer==0)
4178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  cyclic_background_refresh(cpi, Q, 0);
4179ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                else
4180ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  disable_segmentation(cpi);
4181ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              }
418241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              // Reset the consec_zero_last counter on key frame.
418341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              vpx_memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
4184ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              vp8_set_quantizer(cpi, Q);
4185ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            }
4186ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
4187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_setup_key_frame(cpi);
4188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
41905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
41915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
41925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
41935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
41945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            if(cpi->oxcf.error_resilient_mode)
41955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                cm->refresh_entropy_probs = 0;
41965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
41975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
41985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            {
41995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                if (cm->frame_type == KEY_FRAME)
42005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                    cm->refresh_entropy_probs = 1;
42015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            }
42025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
42035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            if (cm->refresh_entropy_probs == 0)
42045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            {
4205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* save a copy for later refresh */
42065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                vpx_memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
42075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            }
42085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
42095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_update_coef_context(cpi);
42105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
42115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_update_coef_probs(cpi);
42125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
4213ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* transform / motion compensation build reconstruction frame
4214ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * +pack coef partitions
4215ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
42165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_encode_frame(cpi);
42175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
42185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            /* cpi->projected_frame_size is not needed for RT mode */
42195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
42205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#else
4221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* transform / motion compensation build reconstruction frame */
4222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_encode_frame(cpi);
4223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
4225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
42265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
4227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_clear_system_state();
4228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Test to see if the stats generated for this frame indicate that
4230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * we should have coded a key frame (assuming that we didn't)!
4231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
4232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4233ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME
4234ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            && cpi->compressor_speed != 2)
4235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
42365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
4237ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (decide_key_frame(cpi))
4238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Reset all our sizing numbers and recode */
4240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cm->frame_type = KEY_FRAME;
4241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                vp8_pick_frame_size(cpi);
4243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Clear the Alt reference frame active flag when we have
4245ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * a key frame
4246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
4247167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->source_alt_ref_active = 0;
4248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4249ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                // Set the loop filter deltas and segmentation map update
4250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                setup_features(cpi);
4251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                vp8_restore_coding_context(cpi);
4253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
4257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4258ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Limit Q range for the adaptive loop. */
4259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                bottom_index = cpi->active_best_quality;
4260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                top_index    = cpi->active_worst_quality;
4261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                q_low  = cpi->active_best_quality;
4262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                q_high = cpi->active_worst_quality;
4263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                loop_count++;
4265167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                Loop = 1;
4266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                continue;
4268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
42695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
4270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_clear_system_state();
4273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (frame_over_shoot_limit == 0)
4275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            frame_over_shoot_limit = 1;
4276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4277ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Are we are overshooting and up against the limit of active max Q. */
4278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
4279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            (Q == cpi->active_worst_quality)                     &&
4280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            (cpi->active_worst_quality < cpi->worst_quality)      &&
4281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            (cpi->projected_frame_size > frame_over_shoot_limit))
4282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;
4284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4285ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* If so is there any scope for relaxing it */
4286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
4287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->active_worst_quality++;
4289ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Assume 1 qstep = about 4% on frame size. */
4290ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                over_size_percent = (int)(over_size_percent * 0.96);
4291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
42925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
42935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            top_index = cpi->active_worst_quality;
42945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
4295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* If we have updated the active max Q do not call
4296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * vp8_update_rate_correction_factors() this loop.
4297ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
4298167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            active_worst_qchanged = 1;
4299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
4301167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            active_worst_qchanged = 0;
4302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
4304ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Special case handling for forced key frames */
4305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
4306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int last_q = Q;
4308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int kf_err = vp8_calc_ss_err(cpi->Source,
43095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                                         &cm->yv12_fb[cm->new_fb_idx]);
4310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4311ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* The key frame is not good enough */
4312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
4313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4314ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Lower q_high */
4315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                q_high = (Q > q_low) ? (Q - 1) : q_low;
4316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4317ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Adjust Q */
4318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Q = (q_high + q_low) >> 1;
4319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4320ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* The key frame is much better than the previous frame */
4321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else if ( kf_err < (cpi->ambient_err >> 1) )
4322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4323ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Raise q_low */
4324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                q_low = (Q < q_high) ? (Q + 1) : q_high;
4325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Adjust Q */
4327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Q = (q_high + q_low + 1) >> 1;
4328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4330ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Clamp Q to upper and lower limits: */
4331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (Q > q_high)
4332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Q = q_high;
4333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else if (Q < q_low)
4334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Q = q_low;
4335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4336167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            Loop = Q != last_q;
4337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4339ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Is the projected frame size out of range and are we allowed
4340ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * to attempt to recode.
4341ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
4342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if ( recode_loop_test( cpi,
4343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               frame_over_shoot_limit, frame_under_shoot_limit,
4344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               Q, top_index, bottom_index ) )
4345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int last_q = Q;
4347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int Retries = 0;
4348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4349ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Frame size out of permitted range. Update correction factor
4350ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * & compute new Q to try...
4351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
4352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4353ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Frame is too large */
4354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->projected_frame_size > cpi->this_frame_target)
4355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4356ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Raise Qlow as to at least the current value */
4357ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                q_low = (Q < q_high) ? (Q + 1) : q_high;
4358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4359ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* If we are using over quant do the same for zbin_oq_low */
4360d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                if (cpi->mb.zbin_over_quant > 0)
4361d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
4362d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
4363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (undershoot_seen)
4365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
4366ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Update rate_correction_factor unless
4367ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * cpi->active_worst_quality has changed.
4368ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
4369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (!active_worst_qchanged)
4370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        vp8_update_rate_correction_factors(cpi, 1);
4371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Q = (q_high + q_low + 1) / 2;
4373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4374ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Adjust cpi->zbin_over_quant (only allowed when Q
4375ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * is max)
4376ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
4377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (Q < MAXQ)
4378d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb.zbin_over_quant = 0;
4379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else
4380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
4381d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
4382d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                            (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
4383d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb.zbin_over_quant =
4384d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                            (zbin_oq_high + zbin_oq_low) / 2;
4385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
4386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
4387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
4388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
4389ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Update rate_correction_factor unless
4390ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * cpi->active_worst_quality has changed.
4391ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
4392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (!active_worst_qchanged)
4393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        vp8_update_rate_correction_factors(cpi, 0);
4394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4397d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    while (((Q < q_low) ||
4398d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
4399d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        (Retries < 10))
4400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
4401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        vp8_update_rate_correction_factors(cpi, 0);
4402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        Retries ++;
4404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
4405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
4406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4407167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                overshoot_seen = 1;
4408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4409ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Frame is too small */
4410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
4411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4412d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                if (cpi->mb.zbin_over_quant == 0)
4413ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Lower q_high if not using over quant */
4414ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    q_high = (Q > q_low) ? (Q - 1) : q_low;
4415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                else
4416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* else lower zbin_oq_high */
4417d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low) ?
4418d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        (cpi->mb.zbin_over_quant - 1) : zbin_oq_low;
4419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (overshoot_seen)
4421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
4422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Update rate_correction_factor unless
4423ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * cpi->active_worst_quality has changed.
4424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
4425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (!active_worst_qchanged)
4426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        vp8_update_rate_correction_factors(cpi, 1);
4427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Q = (q_high + q_low) / 2;
4429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4430ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Adjust cpi->zbin_over_quant (only allowed when Q
4431ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * is max)
4432ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
4433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (Q < MAXQ)
4434d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb.zbin_over_quant = 0;
4435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else
4436d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb.zbin_over_quant =
4437d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                            (zbin_oq_high + zbin_oq_low) / 2;
4438474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
4439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
4440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
4441ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Update rate_correction_factor unless
4442ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * cpi->active_worst_quality has changed.
4443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
4444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (!active_worst_qchanged)
4445474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        vp8_update_rate_correction_factors(cpi, 0);
4446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4449ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Special case reset for qlow for constrained quality.
4450ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * This should only trigger where there is very substantial
4451ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * undershoot on a frame and the auto cq level is above
4452ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * the user passsed in value.
4453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
4454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                         (Q < q_low) )
4456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
4457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        q_low = Q;
4458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
4459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4460d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    while (((Q > q_high) ||
4461d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
4462d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        (Retries < 10))
4463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
4464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        vp8_update_rate_correction_factors(cpi, 0);
4465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        Retries ++;
4467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
4468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
4469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4470167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                undershoot_seen = 1;
4471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4473ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Clamp Q to upper and lower limits: */
4474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (Q > q_high)
4475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Q = q_high;
4476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else if (Q < q_low)
4477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Q = q_low;
4478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4479ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Clamp cpi->zbin_over_quant */
4480d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low) ?
4481d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                zbin_oq_low : (cpi->mb.zbin_over_quant > zbin_oq_high) ?
4482d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    zbin_oq_high : cpi->mb.zbin_over_quant;
4483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4484167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            Loop = Q != last_q;
4485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
4487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4488167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            Loop = 0;
4489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->is_src_frame_alt_ref)
4491167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            Loop = 0;
4492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4493167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (Loop == 1)
4494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_restore_coding_context(cpi);
4496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            loop_count++;
4497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_INTERNAL_STATS
4498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->tot_recode_hits++;
4499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4502167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    while (Loop == 1);
4503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
4505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Experimental code for lagged and one pass
4506ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * Update stats used for one pass GF selection
4507ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
4509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4515ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Special case code to reduce pulsing when key frames are forced at a
4516ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * fixed interval. Note the reconstruction error if it is the frame before
4517ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * the force key frame
4518ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ( cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0) )
4520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
45225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                                           &cm->yv12_fb[cm->new_fb_idx]);
4523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4525167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    /* This frame's MVs are saved and will be used in next frame's MV predictor.
4526167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org     * Last frame has one more line(add to bottom) and one more column(add to
4527167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org     * right) than cm->mip. The edge elements are initialized to 0.
4528167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org     */
4529167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING
4530167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if(!cpi->oxcf.mr_encoder_id && cm->show_frame)
4531167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#else
4532167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if(cm->show_frame)   /* do not save for altref frame */
4533167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif
4534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int mb_row;
4536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int mb_col;
4537167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        /* Point to beginning of allocated MODE_INFO arrays. */
4538167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        MODE_INFO *tmp = cm->mip;
4539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if(cm->frame_type != KEY_FRAME)
4541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
4543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
4545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
4546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if(tmp->mbmi.ref_frame != INTRA_FRAME)
4547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;
4548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
4551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    tmp++;
4552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
4553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4557ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Count last ref frame 0,0 usage on current encoded frame. */
4558ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
4559ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int mb_row;
4560ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int mb_col;
4561ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Point to beginning of MODE_INFO arrays. */
4562ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        MODE_INFO *tmp = cm->mi;
4563ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
4564ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->zeromv_count = 0;
4565ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
4566ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if(cm->frame_type != KEY_FRAME)
4567ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
4568ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
4569ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            {
4570ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++)
4571ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                {
457241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                    if (tmp->mbmi.mode == ZEROMV &&
457341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                       tmp->mbmi.ref_frame == LAST_FRAME)
4574ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        cpi->zeromv_count++;
4575ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    tmp++;
4576ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                }
4577ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                tmp++;
4578ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            }
4579ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
4580ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
4581ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
4582167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING
4583167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vp8_cal_dissimilarity(cpi);
4584167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif
4585167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
4586ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Update the GF useage maps.
4587ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * This is done after completing the compression of a frame when all
4588ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * modes etc. are finalized but before loop filter
4589ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4590167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->oxcf.number_of_layers == 1)
4591167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
4594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_last_frame = 1;
4595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
4597474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4598474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        FILE *f = fopen("gfactive.stt", "a");
4599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fprintf(f, "%8d %8d %8d %8d %8d\n", cm->current_video_frame, (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols), cpi->this_iiratio, cpi->next_iiratio, cm->refresh_golden_frame);
4600474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fclose(f);
4601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4604ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* For inter frames the current default behavior is that when
4605ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4606ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * This is purely an encoder decision at present.
4607ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4608474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
4609474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->copy_buffer_to_arf  = 2;
4610474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
4611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->copy_buffer_to_arf  = 0;
4612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
461541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if CONFIG_TEMPORAL_DENOISING
461641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // For the adaptive denoising mode (noise_sensitivity == 4), sample the mse
461741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // of source diff (between current and previous frame), and determine if we
461841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // should switch the denoiser mode. Sampling refers to computing the mse for
461941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // a sub-sample of the frame (i.e., skip x blocks along row/column), and
462041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // only for blocks in that set that have used ZEROMV LAST, along with some
462141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // constraint on the sum diff between blocks. This process is called every
462241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // ~8 frames, to further reduce complexity.
462341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (cpi->oxcf.noise_sensitivity == 4 &&
462441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        cpi->frames_since_key % 8 == 0 &&
462541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        cm->frame_type != KEY_FRAME) {
462641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      process_denoiser_mode_change(cpi);
462741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
462841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
462941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
4631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->b_multi_threaded)
4632474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4633ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* start loopfilter in separate thread */
4634ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        sem_post(&cpi->h_event_start_lpf);
46355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->b_lpf_running = 1;
4636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
4638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
46405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_loopfilter_frame(cpi, cm);
4641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4643ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    update_reference_frames(cpi);
4644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
464588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef OUTPUT_YUV_DENOISED
464688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vp8_write_yuv_frame(yuv_denoised_file,
464788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
464888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
464988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
46505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
4651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.error_resilient_mode)
4652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_entropy_probs = 0;
4654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
46555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
4656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
4658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* wait that filter_level is picked so that we can continue with stream packing */
4659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->b_multi_threaded)
4660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sem_wait(&cpi->h_event_end_lpf);
4661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4663ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* build the bitstream */
4664167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vp8_pack_bitstream(cpi, dest, dest_end, size);
4665474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4666474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
46675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    /* if PSNR packets are generated we have to wait for the lpf */
46685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if (cpi->b_lpf_running && cpi->b_calculate_psnr)
4669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sem_wait(&cpi->h_event_end_lpf);
46715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->b_lpf_running = 0;
4672474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4673474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* Move storing frame_type out of the above loop since it is also
4676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     * needed in motion search besides loopfilter */
4677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->last_frame_type = cm->frame_type;
4678474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4679ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Update rate control heuristics */
4680474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->total_byte_count += (*size);
4681474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->projected_frame_size = (*size) << 3;
4682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4683167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->oxcf.number_of_layers > 1)
4684167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
4685167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        unsigned int i;
4686167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
4687167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org          cpi->layer_context[i].total_byte_count += (*size);
4688167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
4689167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
4690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!active_worst_qchanged)
4691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_update_rate_correction_factors(cpi, 2);
4692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->last_q[cm->frame_type] = cm->base_qindex;
4694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4695474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
4696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4697474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_adjust_key_frame_context(cpi);
4698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4700ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Keep a record of ambient average Q. */
4701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type != KEY_FRAME)
4702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4703474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4704ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Keep a record from which we can calculate the average Q excluding
4705ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * GF updates and key frames
4706ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4707167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if ((cm->frame_type != KEY_FRAME) && ((cpi->oxcf.number_of_layers > 1) ||
4708167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)))
4709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->ni_frames++;
4711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4712ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Calculate the average Q for normal inter frames (not key or GFU
4713ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * frames).
4714ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
4715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ( cpi->pass == 2 )
4716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->ni_tot_qi += Q;
4718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
4721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4722ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Damp value for first few frames */
4723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->ni_frames > 150 )
4724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->ni_tot_qi += Q;
4726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4728ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* For one pass, early in the clip ... average the current frame Q
4729ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * value with the worstq entered by the user as a dampening measure
4730ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
4731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
4732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->ni_tot_qi += Q;
4734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
4736474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4737ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* If the average Q is higher than what was used in the last
4738ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * frame (after going through the recode loop to keep the frame
4739ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * size within range) then use the last frame value - 1. The -1
4740ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * is designed to stop Q and hence the data rate, from
4741ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * progressively falling away during difficult sections, but at
4742ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * the same time reduce the number of itterations around the
4743ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * recode loop.
4744ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
4745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (Q > cpi->ni_av_qi)
4746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->ni_av_qi = Q - 1;
4747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4748474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4750ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Update the buffer level variable. */
4751ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Non-viewable frames are a special case and are treated as pure overhead. */
4752474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ( !cm->show_frame )
4753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->bits_off_target -= cpi->projected_frame_size;
4754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
4755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4757ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clip the buffer level to the maximum specified buffer size */
4758167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
4759167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
4760167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
4761ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Rolling monitors of whether we are over or underspending used to
4762ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * help regulate min and Max Q in two pass.
4763ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4764474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
4765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
4766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
4767474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;
4768474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4769ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Actual bits spent */
4770167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->total_actual_bits += cpi->projected_frame_size;
4771474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4772ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Debug stats */
4773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);
4774474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4775474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->buffer_level = cpi->bits_off_target;
4776474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4777ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Propagate values to higher temporal layers */
4778167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->oxcf.number_of_layers > 1)
4779167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
4780167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        unsigned int i;
4781167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
4782167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
4783167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
4784167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            LAYER_CONTEXT *lc = &cpi->layer_context[i];
4785ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            int bits_off_for_this_layer =
478647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org               (int)(lc->target_bandwidth / lc->framerate -
4787ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     cpi->projected_frame_size);
4788167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
4789167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            lc->bits_off_target += bits_off_for_this_layer;
4790167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
4791ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Clip buffer level to maximum buffer size for the layer */
4792167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (lc->bits_off_target > lc->maximum_buffer_size)
4793167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                lc->bits_off_target = lc->maximum_buffer_size;
4794167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
4795167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            lc->total_actual_bits += cpi->projected_frame_size;
4796167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            lc->total_target_vs_actual += bits_off_for_this_layer;
4797167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            lc->buffer_level = lc->bits_off_target;
4798167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
4799167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
4800167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
4801ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Update bits left to the kf and gf groups to account for overshoot
4802ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * or undershoot on these frames
4803ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
4805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4806474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->twopass.kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4807474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->twopass.kf_group_bits < 0)
4809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->twopass.kf_group_bits = 0 ;
4810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4811474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4812474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4813474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->twopass.gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->twopass.gf_group_bits < 0)
4816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->twopass.gf_group_bits = 0 ;
4817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4818474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type != KEY_FRAME)
4820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4821474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->common.refresh_alt_ref_frame)
4822474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->last_skip_probs_q[2] = cm->base_qindex;
4825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4826474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (cpi->common.refresh_golden_frame)
4827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4828474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4829474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->last_skip_probs_q[1] = cm->base_qindex;
4830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
4832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->last_skip_probs_q[0] = cm->base_qindex;
4835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4836ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* update the baseline */
4837474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4838474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4839474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4840474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0 && CONFIG_INTERNAL_STATS
4843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        FILE *f = fopen("tmp.stt", "a");
4845474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4846ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_clear_system_state();
4847474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4848167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (cpi->twopass.total_left_stats.coded_error != 0.0)
4849d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org            fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
4850d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
4851d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       "%8.2lf %"PRId64" %10.3lf %10"PRId64" %8d\n",
4852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->common.current_video_frame, cpi->this_frame_target,
4853474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->projected_frame_size,
4854474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       (cpi->projected_frame_size - cpi->this_frame_target),
4855d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       cpi->total_target_vs_actual,
4856167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->buffer_level,
4857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4858d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       cpi->total_actual_bits, cm->base_qindex,
4859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->active_best_quality, cpi->active_worst_quality,
4860167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->ni_av_qi, cpi->cq_target_quality,
4861474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cm->frame_type, cpi->gfu_boost,
4863167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->twopass.est_max_qcorrection_factor,
4864d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       cpi->twopass.bits_left,
4865167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->twopass.total_left_stats.coded_error,
4866167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       (double)cpi->twopass.bits_left /
4867167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                           cpi->twopass.total_left_stats.coded_error,
4868474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->tot_recode_hits);
4869474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
4870d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org            fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
4871d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
4872d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       "%8.2lf %"PRId64" %10.3lf %8d\n",
4873d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       cpi->common.current_video_frame, cpi->this_frame_target,
4874d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       cpi->projected_frame_size,
4875474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       (cpi->projected_frame_size - cpi->this_frame_target),
4876d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       cpi->total_target_vs_actual,
4877167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->buffer_level,
4878474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4879d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       cpi->total_actual_bits, cm->base_qindex,
4880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cpi->active_best_quality, cpi->active_worst_quality,
4881167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->ni_av_qi, cpi->cq_target_quality,
4882474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4883474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                       cm->frame_type, cpi->gfu_boost,
4884167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->twopass.est_max_qcorrection_factor,
4885d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                       cpi->twopass.bits_left,
4886167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->twopass.total_left_stats.coded_error,
4887167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                       cpi->tot_recode_hits);
4888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fclose(f);
4890474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4891474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
4892474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            FILE *fmodes = fopen("Modes.stt", "a");
4893474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->common.current_video_frame,
4896474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cm->frame_type, cm->refresh_golden_frame,
4897474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cm->refresh_alt_ref_frame);
4898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4899474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(fmodes, "\n");
4900474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4901474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(fmodes);
4902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
4903474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4904474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4905474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
4906474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4907474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->refresh_golden_frame == 1)
4908474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4909474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
4910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
4911474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4912474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->refresh_alt_ref_frame == 1)
4913474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4914474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
4915474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
4916474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4917474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4918ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cm->refresh_last_frame & cm->refresh_golden_frame)
4919ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* both refreshed */
4920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->gold_is_last = 1;
4921ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else if (cm->refresh_last_frame ^ cm->refresh_golden_frame)
4922ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* 1 refreshed but not the other */
4923474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->gold_is_last = 0;
4924474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4925ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cm->refresh_last_frame & cm->refresh_alt_ref_frame)
4926ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* both refreshed */
4927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->alt_is_last = 1;
4928ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame)
4929ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* 1 refreshed but not the other */
4930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->alt_is_last = 0;
4931474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4932ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame)
4933ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* both refreshed */
4934474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->gold_is_alt = 1;
4935ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame)
4936ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* 1 refreshed but not the other */
4937474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->gold_is_alt = 0;
4938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4939ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
4940474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->gold_is_last)
4942ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;
4943474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4944474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->alt_is_last)
4945ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4946474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4947474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->gold_is_alt)
4948ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4949474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4950474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4951474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi->oxcf.error_resilient_mode)
4952474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4953474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
4954ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Update the alternate reference frame stats as appropriate. */
4955474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            update_alt_ref_frame_stats(cpi);
4956474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
4957ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Update the Golden frame stats as appropriate. */
4958474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            update_golden_frame_stats(cpi);
4959474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4960474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4961474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
4962474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4963ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Tell the caller that the frame was coded as a key frame */
4964474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4965474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4966ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* As this frame is a key frame  the next defaults to an inter frame. */
4967474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->frame_type = INTER_FRAME;
4968474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4969474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->last_frame_percent_intra = 100;
4970474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4971474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
4972474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4973474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
4974474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4975474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4976474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4977474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4978ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear the one shot update flags for segmentation map and mode/ref
4979ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * loop filter deltas.
4980ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4981474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4982474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4983474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4984474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4985474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4986ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Dont increment frame counters if this was an altref buffer update
4987ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * not a real frame
4988ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
4989474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->show_frame)
4990474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4991474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->current_video_frame++;
4992474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->frames_since_key++;
499310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        cpi->temporal_pattern_counter++;
4994474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
4995474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4996ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* reset to normal state now that we are done. */
4997474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4998474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
4999474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5000474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
5001474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5002474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        char filename[512];
5003474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        FILE *recon_file;
5004474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
5005474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        recon_file = fopen(filename, "wb");
5006474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
5007474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org               cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
5008474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fclose(recon_file);
5009474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5010474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5011474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5012ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* DEBUG */
5013ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
5014474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5017474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
5018167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned char * dest_end, unsigned int *frame_flags)
5019474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5020474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5021474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi->common.refresh_alt_ref_frame)
5022474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_second_pass(cpi);
5023474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5024167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
5025474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->twopass.bits_left -= 8 * *size;
5026474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5027474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi->common.refresh_alt_ref_frame)
5028474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5029474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
5030474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            *cpi->oxcf.two_pass_vbrmin_section / 100);
503147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
5032474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5033474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5034474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5035474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5036167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time)
5037474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5038474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct vpx_usec_timer  timer;
5039474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int                    res = 0;
5040474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5041474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_usec_timer_start(&timer);
50425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
50435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    /* Reinit the lookahead buffer if the frame size changes */
50445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height)
50455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    {
50465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        assert(cpi->oxcf.lag_in_frames < 2);
50475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        dealloc_raw_frame_buffers(cpi);
50485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        alloc_raw_frame_buffers(cpi);
50495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    }
50505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
5051474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if(vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
5052167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                          frame_flags, cpi->active_map_enabled ? cpi->active_map : NULL))
5053474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        res = -1;
5054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_usec_timer_mark(&timer);
5055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
5056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5057474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return res;
5058474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5059474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5060474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5061474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int frame_is_reference(const VP8_COMP *cpi)
5062474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5063474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const VP8_COMMON *cm = &cpi->common;
5064474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const MACROBLOCKD *xd = &cpi->mb.e_mbd;
5065474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5066474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return cm->frame_type == KEY_FRAME || cm->refresh_last_frame
5067474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org           || cm->refresh_golden_frame || cm->refresh_alt_ref_frame
5068474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org           || cm->copy_buffer_to_gf || cm->copy_buffer_to_arf
5069474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org           || cm->refresh_entropy_probs
5070474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org           || xd->mode_ref_lf_delta_update
5071474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org           || xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
5072474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5073474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5074474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5075167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, unsigned char *dest_end, int64_t *time_stamp, int64_t *time_end, int flush)
5076474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5077167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    VP8_COMMON *cm;
5078474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct vpx_usec_timer  tsctimer;
5079474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct vpx_usec_timer  ticktimer;
5080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    struct vpx_usec_timer  cmptimer;
5081474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG    *force_src_buffer = NULL;
5082474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5083474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi)
5084474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1;
5085474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5086167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cm = &cpi->common;
5087167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5088167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (setjmp(cpi->common.error.jmp))
5089167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
5090167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->common.error.setjmp = 0;
509195aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com        vp8_clear_system_state();
5092167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        return VPX_CODEC_CORRUPT_FRAME;
5093167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
5094167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5095167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->common.error.setjmp = 1;
5096167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5097474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_usec_timer_start(&cmptimer);
5098474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5099474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->source = NULL;
5100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
5102ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Should we code an alternate reference frame */
5103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.error_resilient_mode == 0 &&
5104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->oxcf.play_alternate &&
5105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->source_alt_ref_pending)
5106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ((cpi->source = vp8_lookahead_peek(cpi->lookahead,
51085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                                              cpi->frames_till_gf_update_due,
51095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                                              PEEK_FORWARD)))
5110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->alt_ref_source = cpi->source;
5112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->oxcf.arnr_max_frames > 0)
5113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
5114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                vp8_temporal_filter_prepare_c(cpi,
5115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                              cpi->frames_till_gf_update_due);
5116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                force_src_buffer = &cpi->alt_ref_buffer;
5117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
511847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org            cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
5119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->refresh_alt_ref_frame = 1;
5120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->refresh_golden_frame = 0;
5121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->refresh_last_frame = 0;
5122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->show_frame = 0;
5123ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Clear Pending alt Ref flag. */
5124ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->source_alt_ref_pending = 0;
5125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->is_src_frame_alt_ref = 0;
5126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi->source)
5131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
51325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        /* Read last frame source if we are encoding first pass. */
51335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if (cpi->pass == 1 && cm->current_video_frame > 0)
51345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
51355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            if((cpi->last_source = vp8_lookahead_peek(cpi->lookahead, 1,
51365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                                                      PEEK_BACKWARD)) == NULL)
51375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org              return -1;
51385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
51395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
51405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
5141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush)))
5142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cm->show_frame = 1;
5144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->is_src_frame_alt_ref = cpi->alt_ref_source
5146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                        && (cpi->source == cpi->alt_ref_source);
5147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if(cpi->is_src_frame_alt_ref)
5149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->alt_ref_source = NULL;
5150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->source)
5154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
5156167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->un_scaled_source = cpi->Source;
5157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        *time_stamp = cpi->source->ts_start;
5158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        *time_end = cpi->source->ts_end;
5159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        *frame_flags = cpi->source->flags;
51605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
51615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if (cpi->pass == 1 && cm->current_video_frame > 0)
51625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
51635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            cpi->last_frame_unscaled_source = &cpi->last_source->img;
51645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
5165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
5167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        *size = 0;
5169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
5170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done)
5172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_end_first_pass(cpi);    /* get last stats packet */
5174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->twopass.first_pass_done = 1;
5175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1;
5180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->source->ts_start < cpi->first_time_stamp_ever)
5183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->first_time_stamp_ever = cpi->source->ts_start;
5185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->last_end_time_stamp_seen = cpi->source->ts_start;
5186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5188ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* adjust frame rates based on timestamps given */
51895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if (cm->show_frame)
5190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int64_t this_duration;
5192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int step = 0;
5193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->source->ts_start == cpi->first_time_stamp_ever)
5195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_duration = cpi->source->ts_end - cpi->source->ts_start;
5197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            step = 1;
5198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
5200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int64_t last_duration;
5202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
5204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            last_duration = cpi->last_end_time_stamp_seen
5205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            - cpi->last_time_stamp_seen;
5206ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* do a step update if the duration changes by 10% */
5207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (last_duration)
5208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                step = (int)(((this_duration - last_duration) *
5209ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                            10 / last_duration));
5210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (this_duration)
5213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (step)
521547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                cpi->ref_framerate = 10000000.0 / this_duration;
5216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
5217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
5218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                double avg_duration, interval;
5219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                /* Average this frame's rate into the last second's average
5221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                 * frame rate. If we haven't seen 1 second yet, then average
5222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                 * over the whole interval seen.
5223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                 */
5224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                interval = (double)(cpi->source->ts_end -
5225ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                    cpi->first_time_stamp_ever);
5226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if(interval > 10000000.0)
5227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    interval = 10000000;
5228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
522947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                avg_duration = 10000000.0 / cpi->ref_framerate;
5230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                avg_duration *= (interval - avg_duration + this_duration);
5231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                avg_duration /= interval;
5232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
523347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                cpi->ref_framerate = 10000000.0 / avg_duration;
5234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
5235167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5236167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (cpi->oxcf.number_of_layers > 1)
5237167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            {
52380f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com                unsigned int i;
5239167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Update frame rates for each layer */
524193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                assert(cpi->oxcf.number_of_layers <= VPX_TS_MAX_LAYERS);
52423983288b51bb3c8f48a2d5f77523ef3ff1e94cd2johannkoenig@chromium.org                for (i = 0; i < cpi->oxcf.number_of_layers &&
52433983288b51bb3c8f48a2d5f77523ef3ff1e94cd2johannkoenig@chromium.org                     i < VPX_TS_MAX_LAYERS; ++i)
5244167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
5245167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    LAYER_CONTEXT *lc = &cpi->layer_context[i];
524647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                    lc->framerate = cpi->ref_framerate /
524747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                                    cpi->oxcf.rate_decimator[i];
5248167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
5249167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            }
5250167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            else
525147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                vp8_new_framerate(cpi, cpi->ref_framerate);
5252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->last_time_stamp_seen = cpi->source->ts_start;
5255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->last_end_time_stamp_seen = cpi->source->ts_end;
5256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5258167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->oxcf.number_of_layers > 1)
5259167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
5260167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        int layer;
5261167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5262167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        update_layer_contexts (cpi);
5263167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5264ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Restore layer specific context & set frame rate */
5265167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        layer = cpi->oxcf.layer_id[
526610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
5267167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        restore_layer_context (cpi, layer);
526847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
5269167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
5270167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->compressor_speed == 2)
5272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_usec_timer_start(&tsctimer);
5274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_usec_timer_start(&ticktimer);
5275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5277ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->lf_zeromv_pct = (cpi->zeromv_count * 100)/cm->MBs;
5278ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
52795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
52805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    {
52815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        int i;
52825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        const int num_part = (1 << cm->multi_token_partition);
52835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        /* the available bytes in dest */
52845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        const unsigned long dest_size = dest_end - dest;
52855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
52865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
52875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        unsigned char *dp = dest;
52885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
52895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->partition_d[0] = dp;
52905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        dp += dest_size/10;         /* reserve 1/10 for control partition */
52915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        cpi->partition_d_end[0] = dp;
52925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
52935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        for(i = 0; i < num_part; i++)
52945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
52955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            cpi->partition_d[i + 1] = dp;
52965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            dp += tok_part_buff_size;
52975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            cpi->partition_d_end[i + 1] = dp;
52985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
52995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    }
53005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
53015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
5302ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* start with a 0 size frame */
5303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    *size = 0;
5304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5305ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear down mmx registers */
5306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_clear_system_state();
5307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->frame_type = INTER_FRAME;
5309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cm->frame_flags = *frame_flags;
5310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
5312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->refresh_alt_ref_frame)
5314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_golden_frame = 0;
5316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_last_frame = 0;
5317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
5319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_golden_frame = 0;
5321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_last_frame = 1;
5322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* find a free buffer for the new frame */
5326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int i = 0;
5328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for(; i < NUM_YV12_BUFFERS; i++)
5329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if(!cm->yv12_fb[i].flags)
5331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
5332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cm->new_fb_idx = i;
5333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                break;
5334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
5335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        assert(i < NUM_YV12_BUFFERS );
5338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_REALTIME_ONLY)
5340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass == 1)
5342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Pass1Encode(cpi, size, dest, frame_flags);
5344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->pass == 2)
5346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5347167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        Pass2Encode(cpi, size, dest, dest_end, frame_flags);
5348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
5350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5351167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
5352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->compressor_speed == 2)
5354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int duration, duration2;
5356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_usec_timer_mark(&tsctimer);
5357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_usec_timer_mark(&ticktimer);
5358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5359ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
5360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        duration2 = (unsigned int)((double)duration / 2);
5361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cm->frame_type != KEY_FRAME)
5363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->avg_encode_time == 0)
5365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->avg_encode_time = duration;
5366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
5367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
5368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (duration2)
5371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
5373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (cpi->avg_pick_mode_time == 0)
5375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->avg_pick_mode_time = duration2;
5376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
5377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
5378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
5379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->refresh_entropy_probs == 0)
5384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
5386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5388ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Save the contexts separately for alt ref, gold and last. */
5389ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
5390167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if(cm->refresh_alt_ref_frame)
5391167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        vpx_memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
5392167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5393167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if(cm->refresh_golden_frame)
5394167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        vpx_memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
5395167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5396167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if(cm->refresh_last_frame)
5397167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        vpx_memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
5398167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5399ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if its a dropped frame honor the requests on subsequent frames */
5400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (*size > 0)
5401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->droppable = !frame_is_reference(cpi);
5403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5404ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* return to normal state */
5405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_entropy_probs = 1;
5406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_alt_ref_frame = 0;
5407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_golden_frame = 0;
5408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->refresh_last_frame = 1;
5409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cm->frame_type = INTER_FRAME;
5410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5413ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Save layer specific state */
5414167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (cpi->oxcf.number_of_layers > 1)
5415167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        save_layer_context (cpi);
5416167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_usec_timer_mark(&cmptimer);
5418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
5419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
5421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        generate_psnr_packet(cpi);
5423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_INTERNAL_STATS
5426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass != 1)
5428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->bytes += *size;
5430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cm->show_frame)
5432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
543310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            cpi->common.show_frame_mi = cpi->common.mi;
5434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->count ++;
5435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->b_calculate_psnr)
5437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
5438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                uint64_t ye,ue,ve;
5439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                double frame_psnr;
5440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                YV12_BUFFER_CONFIG      *orig = cpi->Source;
5441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                YV12_BUFFER_CONFIG      *recon = cpi->common.frame_to_show;
5442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int y_samples = orig->y_height * orig->y_width ;
5443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int uv_samples = orig->uv_height * orig->uv_width ;
5444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int t_samples = y_samples + 2 * uv_samples;
5445810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                double sq_error;
5446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                ye = calc_plane_error(orig->y_buffer, orig->y_stride,
54485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                  recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height);
5449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
54515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                  recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);
5452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
54545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                  recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);
5455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5456ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                sq_error = (double)(ye + ue + ve);
5457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5458411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                frame_psnr = vpx_sse_to_psnr(t_samples, 255.0, sq_error);
5459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5460411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                cpi->total_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
5461411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                cpi->total_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
5462411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                cpi->total_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
5463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->total_sq_error += sq_error;
5464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->total  += frame_psnr;
54655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_POSTPROC
5466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
54675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                    YV12_BUFFER_CONFIG      *pp = &cm->post_proc_buffer;
5468810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                    double sq_error2;
5469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    double frame_psnr2, frame_ssim2 = 0;
5470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    double weight = 0;
5471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0);
5473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    vp8_clear_system_state();
5474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    ye = calc_plane_error(orig->y_buffer, orig->y_stride,
54765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                      pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height);
5477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
54795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                      pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);
5480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
54825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                      pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);
5483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    sq_error2 = (double)(ye + ue + ve);
5485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5486411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                    frame_psnr2 = vpx_sse_to_psnr(t_samples, 255.0, sq_error2);
5487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5488411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                    cpi->totalp_y += vpx_sse_to_psnr(y_samples,
5489411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                                                     255.0, (double)ye);
5490411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                    cpi->totalp_u += vpx_sse_to_psnr(uv_samples,
5491411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                                                     255.0, (double)ue);
5492411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                    cpi->totalp_v += vpx_sse_to_psnr(uv_samples,
5493411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org                                                     255.0, (double)ve);
5494167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    cpi->total_sq_error2 += sq_error2;
5495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->totalp  += frame_psnr2;
5496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    frame_ssim2 = vp8_calc_ssim(cpi->Source,
54985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                      &cm->post_proc_buffer, 1, &weight);
5499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->summed_quality += frame_ssim2 * weight;
5501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->summed_weights += weight;
5502474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5503167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    if (cpi->oxcf.number_of_layers > 1)
5504167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    {
5505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         unsigned int i;
5506167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5507167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                         for (i=cpi->current_layer;
5508167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                       i<cpi->oxcf.number_of_layers; i++)
5509167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                         {
5510167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                             cpi->frames_in_layer[i]++;
5511167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5512167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                             cpi->bytes_in_layer[i] += *size;
5513167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                             cpi->sum_psnr[i]       += frame_psnr;
5514167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                             cpi->sum_psnr_p[i]     += frame_psnr2;
5515167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                             cpi->total_error2[i]   += sq_error;
5516167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                             cpi->total_error2_p[i] += sq_error2;
5517167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                             cpi->sum_ssim[i]       += frame_ssim2 * weight;
5518167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                             cpi->sum_weights[i]    += weight;
5519167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                         }
5520167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    }
5521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
55225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
5523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
5524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->b_calculate_ssimg)
5526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
5527474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                double y, u, v, frame_all;
5528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                frame_all =  vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
55295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                    &y, &u, &v);
5530167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5531167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                if (cpi->oxcf.number_of_layers > 1)
5532167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
5533ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    unsigned int i;
5534167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5535167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    for (i=cpi->current_layer;
5536167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                         i<cpi->oxcf.number_of_layers; i++)
5537167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    {
5538167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        if (!cpi->b_calculate_psnr)
5539167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                            cpi->frames_in_layer[i]++;
5540167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5541167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        cpi->total_ssimg_y_in_layer[i] += y;
5542167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        cpi->total_ssimg_u_in_layer[i] += u;
5543167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        cpi->total_ssimg_v_in_layer[i] += v;
5544167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        cpi->total_ssimg_all_in_layer[i] += frame_all;
5545167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    }
5546167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
5547167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                else
5548167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                {
5549167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    cpi->total_ssimg_y += y;
5550167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    cpi->total_ssimg_u += u;
5551167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    cpi->total_ssimg_v += v;
5552167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    cpi->total_ssimg_all += frame_all;
5553167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                }
5554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
5555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
5560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
5562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        skiptruecount += cpi->skip_true_count;
5564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        skipfalsecount += cpi->skip_false_count;
5565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
5569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass != 1)
5571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        FILE *f = fopen("skip.stt", "a");
5573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fprintf(f, "frame:%4d flags:%4x Q:%4d P:%4d Size:%5d\n", cpi->common.current_video_frame, *frame_flags, cpi->common.base_qindex, cpi->prob_skip_false, *size);
5574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->is_src_frame_alt_ref == 1)
5576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
5577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fclose(f);
5579474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5580474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5582474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
5583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5584167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->common.error.setjmp = 0;
5585167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
5586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
5587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5589167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
5590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->common.refresh_alt_ref_frame)
5592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1;
5593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
5594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int ret;
55965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
55975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_MULTITHREAD
55985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if(cpi->b_lpf_running)
55995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
56005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            sem_wait(&cpi->h_event_end_lpf);
56015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            cpi->b_lpf_running = 0;
56025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
56035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
56045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
5605474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_POSTPROC
5606da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org        cpi->common.show_frame_mi = cpi->common.mi;
5607474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5608474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
5609474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5610474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->common.frame_to_show)
5611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            *dest = *cpi->common.frame_to_show;
5613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            dest->y_width = cpi->common.Width;
5614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            dest->y_height = cpi->common.Height;
5615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            dest->uv_height = cpi->common.Height / 2;
5616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ret = 0;
5617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
5619474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ret = -1;
5621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5623ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif
5624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_clear_system_state();
5625474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return ret;
5626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5628474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5629167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4])
5630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5632ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int internal_delta_q[MAX_MB_SEGMENTS];
5633ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    const int range = 63;
5634ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int i;
5635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5636ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // This method is currently incompatible with the cyclic refresh method
5637ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if ( cpi->cyclic_refresh_mode_enabled )
5638ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        return -1;
5639ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
5640ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // Check number of rows and columns match
5641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
5642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1;
5643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5644ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // Range check the delta Q values and convert the external Q range values
5645ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // to internal ones.
5646ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if ( (abs(delta_q[0]) > range) || (abs(delta_q[1]) > range) ||
5647ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         (abs(delta_q[2]) > range) || (abs(delta_q[3]) > range) )
5648ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        return -1;
5649ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
5650ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // Range check the delta lf values
5651ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if ( (abs(delta_lf[0]) > range) || (abs(delta_lf[1]) > range) ||
5652ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         (abs(delta_lf[2]) > range) || (abs(delta_lf[3]) > range) )
5653ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        return -1;
5654ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
5655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!map)
5656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5657167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        disable_segmentation(cpi);
5658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return 0;
5659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5661ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // Translate the external delta q values to internal values.
5662ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    for ( i = 0; i < MAX_MB_SEGMENTS; i++ )
5663ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        internal_delta_q[i] =
5664ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            ( delta_q[i] >= 0 ) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];
5665ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
5666ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set the segmentation Map */
5667167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    set_segmentation_map(cpi, map);
5668474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5669ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Activate segmentation. */
5670167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    enable_segmentation(cpi);
5671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5672ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set up the quant segment data */
5673ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
5674ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
5675ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
5676ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];
5677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5678ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set up the loop segment data s */
5679474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5680474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5681474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5683474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->segment_encode_breakout[0] = threshold[0];
5685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->segment_encode_breakout[1] = threshold[1];
5686474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->segment_encode_breakout[2] = threshold[2];
5687474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->segment_encode_breakout[3] = threshold[3];
5688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5689ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Initialise the feature data structure */
5690167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
5693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5695167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols)
5696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5697474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols)
5698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (map)
5700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vpx_memcpy(cpi->active_map, map, rows * cols);
5702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->active_map_enabled = 1;
5703474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5704474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
5705474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->active_map_enabled = 0;
5706474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return 0;
5708474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
5710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1 ;
5712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5715167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
5716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (horiz_mode <= ONETWO)
5718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->common.horiz_scale = horiz_mode;
5719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
5720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1;
5721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (vert_mode <= ONETWO)
5723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->common.vert_scale  = vert_mode;
5724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
5725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return -1;
5726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 0;
5728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5730474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
57325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgint vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest)
5733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i, j;
5735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Total = 0;
5736474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5737474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *src = source->y_buffer;
5738474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *dst = dest->y_buffer;
5739474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5740ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Loop through the Y plane raw and reconstruction data summing
5741ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * (square differences)
5742ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
5743474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < source->y_height; i += 16)
5744474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
5745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (j = 0; j < source->y_width; j += 16)
5746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            unsigned int sse;
57485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            Total += vp8_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
5749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
5750474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5751474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        src += 16 * source->y_stride;
5752474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        dst += 16 * dest->y_stride;
5753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
5754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return Total;
5756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5757474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5758474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5759167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgint vp8_get_quantizer(VP8_COMP *cpi)
5760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
5761474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return cpi->common.base_qindex;
5762474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
5763