190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
111b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h"
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_scale_rtcd.h"
137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h"
147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vp8_rtcd.h"
15df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#include "bitstream.h"
1679f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/onyxc_int.h"
171b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/blockd.h"
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyx_int.h"
1979f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/systemdependent.h"
20df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#include "vp8/common/vp8_skin_detection.h"
217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vp8/encoder/quantize.h"
2279f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/alloccommon.h"
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "mcomp.h"
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "firstpass.h"
257bc9febe8749e98a3812a0dc4380ceae75c29450Johann#include "vpx_dsp/psnr.h"
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_scale/vpx_scale.h"
2779f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/extend.h"
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "ratectrl.h"
2979f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/quant_common.h"
30f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "segmentation.h"
311b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_POSTPROC
3279f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/postproc.h"
331b362b15af34006e6a11974088a46d42b903418eJohann#endif
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h"
35c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#include "vp8/common/reconintra.h"
3679f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/swapyv12buffer.h"
3779f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/threading.h"
387bc9febe8749e98a3812a0dc4380ceae75c29450Johann#include "vpx_ports/system_state.h"
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_ports/vpx_timer.h"
40df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#include "vpx_util/vpx_write_yuv_frame.h"
41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if ARCH_ARM
42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "vpx_ports/arm.h"
43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
441b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING
451b362b15af34006e6a11974088a46d42b903418eJohann#include "mr_dissim.h"
461b362b15af34006e6a11974088a46d42b903418eJohann#endif
471b362b15af34006e6a11974088a46d42b903418eJohann#include "encodeframe.h"
48df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTITHREAD
49df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#include "ethreading.h"
50df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
51df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#include "picklpf.h"
52df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if !CONFIG_REALTIME_ONLY
53df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#include "temporal_filter.h"
54df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
55f71323e297a928af368937089d3ed71239786f86Andreas Huber
560a39d0a697ff3603e8c100300fda363658e10b23James Zern#include <assert.h>
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <math.h>
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdio.h>
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <limits.h>
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
611b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
621b362b15af34006e6a11974088a46d42b903418eJohannextern int vp8_update_coef_context(VP8_COMP *cpi);
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
657bc9febe8749e98a3812a0dc4380ceae75c29450Johannextern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source,
667bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              YV12_BUFFER_CONFIG *post, int filt_lvl,
677bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              int low_var_thresh, int flag);
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void print_parms(VP8_CONFIG *ocf, char *filenam);
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern unsigned int vp8_get_processor_freq();
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void print_tree_update_probs();
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
721b362b15af34006e6a11974088a46d42b903418eJohannint vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
731b362b15af34006e6a11974088a46d42b903418eJohann
74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic void set_default_lf_deltas(VP8_COMP *cpi);
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern const int vp8_gf_interval_table[101];
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
781b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_INTERNAL_STATS
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "math.h"
807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_dsp/ssim.h"
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef OUTPUT_YUV_SRC
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberFILE *yuv_file;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
86ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifdef OUTPUT_YUV_DENOISED
87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianFILE *yuv_denoised_file;
88ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
89df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#ifdef OUTPUT_YUV_SKINMAP
90df37111358d02836cb29bbcb9c6e4c95dff90a16Johannstatic FILE *yuv_skinmap_file = NULL;
91df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberFILE *framepsnr;
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberFILE *kf_list;
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberFILE *keyfile;
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int skip_true_count;
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int skip_false_count;
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int intra_mode_stats[10][10][10];
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef SPEEDSTATS
1097bc9febe8749e98a3812a0dc4380ceae75c29450Johannunsigned int frames_at_speed[16] = { 0, 0, 0, 0, 0, 0, 0, 0,
1107bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                     0, 0, 0, 0, 0, 0, 0, 0 };
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int tot_pm = 0;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int cnt_pm = 0;
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int tot_ef = 0;
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int cnt_ef = 0;
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern unsigned __int64 Sectionbits[50];
1197bc9febe8749e98a3812a0dc4380ceae75c29450Johannextern int y_modes[5];
1207bc9febe8749e98a3812a0dc4380ceae75c29450Johannextern int uv_modes[4];
1217bc9febe8749e98a3812a0dc4380ceae75c29450Johannextern int b_modes[10];
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1237bc9febe8749e98a3812a0dc4380ceae75c29450Johannextern int inter_y_modes[10];
1247bc9febe8749e98a3812a0dc4380ceae75c29450Johannextern int inter_uv_modes[4];
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern unsigned int inter_b_modes[15];
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern const int vp8_bits_per_mb[2][QINDEX_RANGE];
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern const int qrounding_factors[129];
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern const int qzbin_factors[129];
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8cx_init_quantizer(VP8_COMP *cpi);
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern const int vp8cx_base_skip_false_prob[128];
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1351b362b15af34006e6a11974088a46d42b903418eJohann/* Tables relating active max Q to active min Q */
1367bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const unsigned char kf_low_motion_minq[QINDEX_RANGE] = {
1377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
1387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
1397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
1407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  4,  4,  4,  5,  5,  5,
1417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  5,  5,  6,  6,  6,  6,  7,  7,  8,  8,  8,  8,  9,  9,  10, 10, 10, 10, 11,
1427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
1437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  17, 17, 18, 18, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23
144538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
1457bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const unsigned char kf_high_motion_minq[QINDEX_RANGE] = {
1467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
1477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,
1487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  5,
1497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  5,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  8,  8,  8,  8,  9,  9,  10, 10,
1507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16,
1517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  16, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21,
1527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30
153538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
1547bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const unsigned char gf_low_motion_minq[QINDEX_RANGE] = {
1557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,
1567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  3,  4,  4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,
1577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  8,  8,  9,  9,  9,  9,  10, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15,
1587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
1597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34,
1607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 44,
1617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58
162538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
1637bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const unsigned char gf_mid_motion_minq[QINDEX_RANGE] = {
1647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  2,  2,  3,  3,  3,  4,  4,  4,  5,
1657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  5,  5,  6,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9,  10, 10, 10, 10, 11,
1667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18,
1677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
1687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37,
1697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  37, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 45, 46, 47, 48, 49, 50,
1707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
171538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
1727bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const unsigned char gf_high_motion_minq[QINDEX_RANGE] = {
1737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  2,  2,  3,  3,  3,  4,  4,  4,  5,
1747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  5,  5,  6,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9,  10, 10, 10, 11, 11,
1757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21,
1767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30,
1777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40,
1787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  40, 41, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
1797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  57, 58, 59, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80
180538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
1817bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const unsigned char inter_minq[QINDEX_RANGE] = {
1827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  0,  1,  1,  2,  3,  3,  4,  4,  5,  6,  6,  7,  8,  8,  9,  9,  10, 11,
1837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24,
1847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38,
1857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  39, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 50, 51, 52, 53,
1867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  54, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69,
1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 86,
1887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100
189538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef PACKET_TESTING
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern FILE *vpxlogc;
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1957bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void save_layer_context(VP8_COMP *cpi) {
1967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
1977bc9febe8749e98a3812a0dc4380ceae75c29450Johann
1987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Save layer dependent coding state */
1997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->target_bandwidth = cpi->target_bandwidth;
2007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->starting_buffer_level = cpi->oxcf.starting_buffer_level;
2017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level;
2027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size;
2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->starting_buffer_level_in_ms = cpi->oxcf.starting_buffer_level_in_ms;
2047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->optimal_buffer_level_in_ms = cpi->oxcf.optimal_buffer_level_in_ms;
2057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->maximum_buffer_size_in_ms = cpi->oxcf.maximum_buffer_size_in_ms;
2067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->buffer_level = cpi->buffer_level;
2077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->bits_off_target = cpi->bits_off_target;
2087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->total_actual_bits = cpi->total_actual_bits;
2097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->worst_quality = cpi->worst_quality;
2107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->active_worst_quality = cpi->active_worst_quality;
2117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->best_quality = cpi->best_quality;
2127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->active_best_quality = cpi->active_best_quality;
2137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->ni_av_qi = cpi->ni_av_qi;
2147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->ni_tot_qi = cpi->ni_tot_qi;
2157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->ni_frames = cpi->ni_frames;
2167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->avg_frame_qindex = cpi->avg_frame_qindex;
2177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->rate_correction_factor = cpi->rate_correction_factor;
2187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
2197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor;
2207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->zbin_over_quant = cpi->mb.zbin_over_quant;
2217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->inter_frame_target = cpi->inter_frame_target;
2227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->total_byte_count = cpi->total_byte_count;
2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->filter_level = cpi->common.filter_level;
224df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  lc->frames_since_last_drop_overshoot = cpi->frames_since_last_drop_overshoot;
225df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  lc->force_maxqp = cpi->force_maxqp;
2267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->last_frame_percent_intra = cpi->last_frame_percent_intra;
2277bc9febe8749e98a3812a0dc4380ceae75c29450Johann
2287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(lc->count_mb_ref_frame_usage, cpi->mb.count_mb_ref_frame_usage,
2297bc9febe8749e98a3812a0dc4380ceae75c29450Johann         sizeof(cpi->mb.count_mb_ref_frame_usage));
2301b362b15af34006e6a11974088a46d42b903418eJohann}
2311b362b15af34006e6a11974088a46d42b903418eJohann
2327bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void restore_layer_context(VP8_COMP *cpi, const int layer) {
2337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  LAYER_CONTEXT *lc = &cpi->layer_context[layer];
2347bc9febe8749e98a3812a0dc4380ceae75c29450Johann
2357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Restore layer dependent coding state */
2367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->current_layer = layer;
2377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->target_bandwidth = lc->target_bandwidth;
2387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.target_bandwidth = lc->target_bandwidth;
2397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.starting_buffer_level = lc->starting_buffer_level;
2407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level;
2417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size;
2427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
2437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms;
2447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms;
2457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->buffer_level = lc->buffer_level;
2467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->bits_off_target = lc->bits_off_target;
2477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->total_actual_bits = lc->total_actual_bits;
2487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->active_worst_quality = lc->active_worst_quality;
2497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->active_best_quality = lc->active_best_quality;
2507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ni_av_qi = lc->ni_av_qi;
2517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ni_tot_qi = lc->ni_tot_qi;
2527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ni_frames = lc->ni_frames;
2537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->avg_frame_qindex = lc->avg_frame_qindex;
2547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->rate_correction_factor = lc->rate_correction_factor;
2557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
2567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor;
2577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.zbin_over_quant = lc->zbin_over_quant;
2587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->inter_frame_target = lc->inter_frame_target;
2597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->total_byte_count = lc->total_byte_count;
2607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.filter_level = lc->filter_level;
261df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  cpi->frames_since_last_drop_overshoot = lc->frames_since_last_drop_overshoot;
262df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  cpi->force_maxqp = lc->force_maxqp;
2637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->last_frame_percent_intra = lc->last_frame_percent_intra;
2647bc9febe8749e98a3812a0dc4380ceae75c29450Johann
2657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(cpi->mb.count_mb_ref_frame_usage, lc->count_mb_ref_frame_usage,
2667bc9febe8749e98a3812a0dc4380ceae75c29450Johann         sizeof(cpi->mb.count_mb_ref_frame_usage));
267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2697bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int rescale(int val, int num, int denom) {
2707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int64_t llnum = num;
2717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int64_t llden = denom;
2727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int64_t llval = val;
273ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return (int)(llval * llnum / llden);
275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2777bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void init_temporal_layer_context(VP8_COMP *cpi, VP8_CONFIG *oxcf,
278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                        const int layer,
2797bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        double prev_layer_framerate) {
2807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  LAYER_CONTEXT *lc = &cpi->layer_context[layer];
281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[layer];
2837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->target_bandwidth = cpi->oxcf.target_bitrate[layer] * 1000;
284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
2867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->optimal_buffer_level_in_ms = oxcf->optimal_buffer_level;
2877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->maximum_buffer_size_in_ms = oxcf->maximum_buffer_size;
288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->starting_buffer_level =
2907bc9febe8749e98a3812a0dc4380ceae75c29450Johann      rescale((int)(oxcf->starting_buffer_level), lc->target_bandwidth, 1000);
291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (oxcf->optimal_buffer_level == 0) {
2937bc9febe8749e98a3812a0dc4380ceae75c29450Johann    lc->optimal_buffer_level = lc->target_bandwidth / 8;
2947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
2957bc9febe8749e98a3812a0dc4380ceae75c29450Johann    lc->optimal_buffer_level =
2967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        rescale((int)(oxcf->optimal_buffer_level), lc->target_bandwidth, 1000);
2977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (oxcf->maximum_buffer_size == 0) {
3007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    lc->maximum_buffer_size = lc->target_bandwidth / 8;
3017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
3027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    lc->maximum_buffer_size =
3037bc9febe8749e98a3812a0dc4380ceae75c29450Johann        rescale((int)(oxcf->maximum_buffer_size), lc->target_bandwidth, 1000);
3047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
3057bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Work out the average size of a frame within this layer */
3077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (layer > 0) {
3087bc9febe8749e98a3812a0dc4380ceae75c29450Johann    lc->avg_frame_size_for_layer =
3097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (int)((cpi->oxcf.target_bitrate[layer] -
3107bc9febe8749e98a3812a0dc4380ceae75c29450Johann               cpi->oxcf.target_bitrate[layer - 1]) *
3117bc9febe8749e98a3812a0dc4380ceae75c29450Johann              1000 / (lc->framerate - prev_layer_framerate));
3127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
3137bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->active_worst_quality = cpi->oxcf.worst_allowed_q;
3157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->active_best_quality = cpi->oxcf.best_allowed_q;
3167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
3177bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->buffer_level = lc->starting_buffer_level;
3197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->bits_off_target = lc->starting_buffer_level;
3207bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->total_actual_bits = 0;
3227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->ni_av_qi = 0;
3237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->ni_tot_qi = 0;
3247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->ni_frames = 0;
3257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->rate_correction_factor = 1.0;
3267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->key_frame_rate_correction_factor = 1.0;
3277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->gf_rate_correction_factor = 1.0;
3287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  lc->inter_frame_target = 0;
329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// Upon a run-time change in temporal layers, reset the layer context parameters
332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// for any "new" layers. For "existing" layers, let them inherit the parameters
333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// from the previous layer state (at the same layer #). In future we may want
334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// to better map the previous layer state(s) to the "new" ones.
3357bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void reset_temporal_layer_change(VP8_COMP *cpi, VP8_CONFIG *oxcf,
3367bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        const int prev_num_layers) {
3377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i;
3387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  double prev_layer_framerate = 0;
3397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const int curr_num_layers = cpi->oxcf.number_of_layers;
3407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // If the previous state was 1 layer, get current layer context from cpi.
3417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // We need this to set the layer context for the new layers below.
3427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (prev_num_layers == 1) {
3437bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->current_layer = 0;
3447bc9febe8749e98a3812a0dc4380ceae75c29450Johann    save_layer_context(cpi);
3457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
3467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < curr_num_layers; ++i) {
3477bc9febe8749e98a3812a0dc4380ceae75c29450Johann    LAYER_CONTEXT *lc = &cpi->layer_context[i];
3487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (i >= prev_num_layers) {
3497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
3507bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
3517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // The initial buffer levels are set based on their starting levels.
3527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // We could set the buffer levels based on the previous state (normalized
3537bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // properly by the layer bandwidths) but we would need to keep track of
3547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // the previous set of layer bandwidths (i.e., target_bitrate[i])
3557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // before the layer change. For now, reset to the starting levels.
3567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    lc->buffer_level =
3577bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->oxcf.starting_buffer_level_in_ms * cpi->oxcf.target_bitrate[i];
3587bc9febe8749e98a3812a0dc4380ceae75c29450Johann    lc->bits_off_target = lc->buffer_level;
3597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // TDOD(marpan): Should we set the rate_correction_factor and
3607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // active_worst/best_quality to values derived from the previous layer
3617bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // state (to smooth-out quality dips/rate fluctuation at transition)?
3627bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // We need to treat the 1 layer case separately: oxcf.target_bitrate[i]
3647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // is not set for 1 layer, and the restore_layer_context/save_context()
3657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // are not called in the encoding loop, so we need to call it here to
3667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // pass the layer context state to |cpi|.
3677bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (curr_num_layers == 1) {
3687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->target_bandwidth = cpi->oxcf.target_bandwidth;
3697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->buffer_level =
3707bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->oxcf.starting_buffer_level_in_ms * lc->target_bandwidth / 1000;
3717bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->bits_off_target = lc->buffer_level;
3727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      restore_layer_context(cpi, 0);
3737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
3747bc9febe8749e98a3812a0dc4380ceae75c29450Johann    prev_layer_framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[i];
3757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
3761b362b15af34006e6a11974088a46d42b903418eJohann}
3771b362b15af34006e6a11974088a46d42b903418eJohann
3787bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void setup_features(VP8_COMP *cpi) {
3797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // If segmentation enabled set the update flags
3807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->mb.e_mbd.segmentation_enabled) {
3817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
3847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.e_mbd.update_mb_segmentation_map = 0;
3857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.e_mbd.update_mb_segmentation_data = 0;
3867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
3897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
3907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
3917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
3927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0,
3937bc9febe8749e98a3812a0dc4380ceae75c29450Johann         sizeof(cpi->mb.e_mbd.ref_lf_deltas));
3947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0,
3957bc9febe8749e98a3812a0dc4380ceae75c29450Johann         sizeof(cpi->mb.e_mbd.mode_lf_deltas));
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  set_default_lf_deltas(cpi);
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4001b362b15af34006e6a11974088a46d42b903418eJohannstatic void dealloc_raw_frame_buffers(VP8_COMP *cpi);
4011b362b15af34006e6a11974088a46d42b903418eJohann
4027bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_initialize_enc(void) {
4037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  static volatile int init_done = 0;
404c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
4057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!init_done) {
4067bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_dsp_rtcd();
4077bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_init_intra_predictors();
4087bc9febe8749e98a3812a0dc4380ceae75c29450Johann    init_done = 1;
4097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
410c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann}
4111b362b15af34006e6a11974088a46d42b903418eJohann
4127bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void dealloc_compressor_data(VP8_COMP *cpi) {
4137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->tplist);
4147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->tplist = NULL;
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Delete last frame MV storage buffers */
4177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->lfmv);
4187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->lfmv = 0;
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->lf_ref_frame_sign_bias);
4217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->lf_ref_frame_sign_bias = 0;
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->lf_ref_frame);
4247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->lf_ref_frame = 0;
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Delete sementation map */
4277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->segmentation_map);
4287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->segmentation_map = 0;
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->active_map);
4317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->active_map = 0;
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_de_alloc_frame_buffers(&cpi->common);
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
4367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
4377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dealloc_raw_frame_buffers(cpi);
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->tok);
4407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->tok = 0;
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Structure used to monitor GF usage */
4437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->gf_active_flags);
4447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gf_active_flags = 0;
445f71323e297a928af368937089d3ed71239786f86Andreas Huber
4467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Activity mask based per mb zbin adjustments */
4477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->mb_activity_map);
4487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb_activity_map = 0;
4491b362b15af34006e6a11974088a46d42b903418eJohann
4507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->mb.pip);
4517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.pip = 0;
452f71323e297a928af368937089d3ed71239786f86Andreas Huber
4531b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD
4547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->mt_current_mb_col);
4557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mt_current_mb_col = NULL;
45679f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4597bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void enable_segmentation(VP8_COMP *cpi) {
4607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set the appropriate feature bit */
4617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.segmentation_enabled = 1;
4627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.update_mb_segmentation_map = 1;
4637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.update_mb_segmentation_data = 1;
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
4657bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void disable_segmentation(VP8_COMP *cpi) {
4667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear the appropriate feature bit */
4677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.segmentation_enabled = 0;
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4701b362b15af34006e6a11974088a46d42b903418eJohann/* Valid values for a segment are 0 to 3
4711b362b15af34006e6a11974088a46d42b903418eJohann * Segmentation map is arrange as [Rows][Columns]
4721b362b15af34006e6a11974088a46d42b903418eJohann */
4737bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void set_segmentation_map(VP8_COMP *cpi,
4747bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                 unsigned char *segmentation_map) {
4757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Copy in the new segmentation map */
4767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(cpi->segmentation_map, segmentation_map,
4777bc9febe8749e98a3812a0dc4380ceae75c29450Johann         (cpi->common.mb_rows * cpi->common.mb_cols));
4787bc9febe8749e98a3812a0dc4380ceae75c29450Johann
4797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Signal that the map should be updated. */
4807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.update_mb_segmentation_map = 1;
4817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.update_mb_segmentation_data = 1;
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4841b362b15af34006e6a11974088a46d42b903418eJohann/* The values given for each segment can be either deltas (from the default
4851b362b15af34006e6a11974088a46d42b903418eJohann * value chosen for the frame) or absolute values.
4861b362b15af34006e6a11974088a46d42b903418eJohann *
4871b362b15af34006e6a11974088a46d42b903418eJohann * Valid range for abs values is:
4881b362b15af34006e6a11974088a46d42b903418eJohann *    (0-127 for MB_LVL_ALT_Q), (0-63 for SEGMENT_ALT_LF)
4891b362b15af34006e6a11974088a46d42b903418eJohann * Valid range for delta values are:
4901b362b15af34006e6a11974088a46d42b903418eJohann *    (+/-127 for MB_LVL_ALT_Q), (+/-63 for SEGMENT_ALT_LF)
4911b362b15af34006e6a11974088a46d42b903418eJohann *
4921b362b15af34006e6a11974088a46d42b903418eJohann * abs_delta = SEGMENT_DELTADATA (deltas)
4931b362b15af34006e6a11974088a46d42b903418eJohann * abs_delta = SEGMENT_ABSDATA (use the absolute values given).
4941b362b15af34006e6a11974088a46d42b903418eJohann *
4951b362b15af34006e6a11974088a46d42b903418eJohann */
4967bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void set_segment_data(VP8_COMP *cpi, signed char *feature_data,
4977bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             unsigned char abs_delta) {
4987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
4997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(cpi->segment_feature_data, feature_data,
5007bc9febe8749e98a3812a0dc4380ceae75c29450Johann         sizeof(cpi->segment_feature_data));
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5031b362b15af34006e6a11974088a46d42b903418eJohann/* A simple function to cyclically refresh the background at a lower Q */
5047bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment) {
5057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned char *seg_map = cpi->segmentation_map;
5067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i;
5087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
5097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
5107bc9febe8749e98a3812a0dc4380ceae75c29450Johann
5117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->cyclic_refresh_q = Q / 2;
5127bc9febe8749e98a3812a0dc4380ceae75c29450Johann
5137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.screen_content_mode) {
5147bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // Modify quality ramp-up based on Q. Above some Q level, increase the
5157bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // number of blocks to be refreshed, and reduce it below the thredhold.
5167bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // Turn-off under certain conditions (i.e., away from key frame, and if
5177bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // we are at good quality (low Q) and most of the blocks were
5187bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // skipped-encoded
5197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // in previous frame.
5207bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int qp_thresh = (cpi->oxcf.screen_content_mode == 2) ? 80 : 100;
5217bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (Q >= qp_thresh) {
5227bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->cyclic_refresh_mode_max_mbs_perframe =
5237bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
5247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->frames_since_key > 250 && Q < 20 &&
5257bc9febe8749e98a3812a0dc4380ceae75c29450Johann               cpi->mb.skip_true_count > (int)(0.95 * mbs_in_frame)) {
5267bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->cyclic_refresh_mode_max_mbs_perframe = 0;
5277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
5287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->cyclic_refresh_mode_max_mbs_perframe =
5297bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
5307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
5317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
5327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
5337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
5347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Set every macroblock to be eligible for update.
5357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // For key frame this will reset seg map to 0.
5367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->segmentation_map, 0, mbs_in_frame);
5377bc9febe8749e98a3812a0dc4380ceae75c29450Johann
5387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->common.frame_type != KEY_FRAME && block_count > 0) {
5397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Cycle through the macro_block rows */
5407bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* MB loop to set local segmentation map */
5417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    i = cpi->cyclic_refresh_mode_index;
5427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    assert(i < mbs_in_frame);
5437bc9febe8749e98a3812a0dc4380ceae75c29450Johann    do {
5447bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* If the MB is as a candidate for clean up then mark it for
5457bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * possible boost/refresh (segment 1) The segment id may get
5467bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * reset to 0 later if the MB gets coded anything other than
5477bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * last frame 0,0 as only (last frame 0,0) MBs are eligable for
5487bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * refresh : that is to say Mbs likely to be background blocks.
5497bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
5507bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->cyclic_refresh_map[i] == 0) {
5517bc9febe8749e98a3812a0dc4380ceae75c29450Johann        seg_map[i] = 1;
5527bc9febe8749e98a3812a0dc4380ceae75c29450Johann        block_count--;
5537bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else if (cpi->cyclic_refresh_map[i] < 0) {
5547bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->cyclic_refresh_map[i]++;
5557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
5561b362b15af34006e6a11974088a46d42b903418eJohann
5577bc9febe8749e98a3812a0dc4380ceae75c29450Johann      i++;
5587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (i == mbs_in_frame) i = 0;
55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } while (block_count && i != cpi->cyclic_refresh_mode_index);
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5627bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->cyclic_refresh_mode_index = i;
563ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
564ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_TEMPORAL_DENOISING
5657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.noise_sensitivity > 0) {
5667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive &&
5677bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Q < (int)cpi->denoiser.denoise_pars.qp_thresh &&
5687bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->frames_since_key >
5697bc9febe8749e98a3812a0dc4380ceae75c29450Johann           2 * cpi->denoiser.denoise_pars.consec_zerolast)) {
5707bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Under aggressive denoising, use segmentation to turn off loop
5717bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // filter below some qp thresh. The filter is reduced for all
5727bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // blocks that have been encoded as ZEROMV LAST x frames in a row,
5737bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // where x is set by cpi->denoiser.denoise_pars.consec_zerolast.
5747bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // This is to avoid "dot" artifacts that can occur from repeated
5757bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // loop filtering on noisy input source.
5767bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->cyclic_refresh_q = Q;
5777bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // lf_adjustment = -MAX_LOOP_FILTER;
5787bc9febe8749e98a3812a0dc4380ceae75c29450Johann        lf_adjustment = -40;
5797bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (i = 0; i < mbs_in_frame; ++i) {
5807bc9febe8749e98a3812a0dc4380ceae75c29450Johann          seg_map[i] = (cpi->consec_zero_last[i] >
5817bc9febe8749e98a3812a0dc4380ceae75c29450Johann                        cpi->denoiser.denoise_pars.consec_zerolast)
5827bc9febe8749e98a3812a0dc4380ceae75c29450Johann                           ? 1
5837bc9febe8749e98a3812a0dc4380ceae75c29450Johann                           : 0;
584ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian        }
5857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
5877bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif
5887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Activate segmentation. */
5917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.update_mb_segmentation_map = 1;
5927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.update_mb_segmentation_data = 1;
5937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  enable_segmentation(cpi);
5947bc9febe8749e98a3812a0dc4380ceae75c29450Johann
5957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set up the quant segment data */
5967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_Q][0] = 0;
5977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
5987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_Q][2] = 0;
5997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_Q][3] = 0;
6007bc9febe8749e98a3812a0dc4380ceae75c29450Johann
6017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set up the loop segment data */
6027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_LF][0] = 0;
6037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
6047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_LF][2] = 0;
6057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_LF][3] = 0;
6067bc9febe8749e98a3812a0dc4380ceae75c29450Johann
6077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Initialise the feature data structure */
6087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
611df37111358d02836cb29bbcb9c6e4c95dff90a16Johannstatic void compute_skin_map(VP8_COMP *cpi) {
612df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  int mb_row, mb_col, num_bl;
613df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  VP8_COMMON *cm = &cpi->common;
614df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  const uint8_t *src_y = cpi->Source->y_buffer;
615df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  const uint8_t *src_u = cpi->Source->u_buffer;
616df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  const uint8_t *src_v = cpi->Source->v_buffer;
617df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  const int src_ystride = cpi->Source->y_stride;
618df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  const int src_uvstride = cpi->Source->uv_stride;
619df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
620df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  const SKIN_DETECTION_BLOCK_SIZE bsize =
621df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      (cm->Width * cm->Height <= 352 * 288) ? SKIN_8X8 : SKIN_16X16;
622df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
623df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) {
624df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    num_bl = 0;
625df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) {
626df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      const int bl_index = mb_row * cm->mb_cols + mb_col;
627df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      cpi->skin_map[bl_index] =
628df37111358d02836cb29bbcb9c6e4c95dff90a16Johann          vp8_compute_skin_block(src_y, src_u, src_v, src_ystride, src_uvstride,
629df37111358d02836cb29bbcb9c6e4c95dff90a16Johann                                 bsize, cpi->consec_zero_last[bl_index], 0);
630df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      num_bl++;
631df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      src_y += 16;
632df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      src_u += 8;
633df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      src_v += 8;
634df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    }
635df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    src_y += (src_ystride << 4) - (num_bl << 4);
636df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    src_u += (src_uvstride << 3) - (num_bl << 3);
637df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    src_v += (src_uvstride << 3) - (num_bl << 3);
638df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  }
639df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
640df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  // Remove isolated skin blocks (none of its neighbors are skin) and isolated
641df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  // non-skin blocks (all of its neighbors are skin). Skip the boundary.
642df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  for (mb_row = 1; mb_row < cm->mb_rows - 1; mb_row++) {
643df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    for (mb_col = 1; mb_col < cm->mb_cols - 1; mb_col++) {
644df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      const int bl_index = mb_row * cm->mb_cols + mb_col;
645df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      int num_neighbor = 0;
646df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      int mi, mj;
647df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      int non_skin_threshold = 8;
648df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
649df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      for (mi = -1; mi <= 1; mi += 1) {
650df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        for (mj = -1; mj <= 1; mj += 1) {
651df37111358d02836cb29bbcb9c6e4c95dff90a16Johann          int bl_neighbor_index = (mb_row + mi) * cm->mb_cols + mb_col + mj;
652df37111358d02836cb29bbcb9c6e4c95dff90a16Johann          if (cpi->skin_map[bl_neighbor_index]) num_neighbor++;
653df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        }
654df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      }
655df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
656df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      if (cpi->skin_map[bl_index] && num_neighbor < 2)
657df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        cpi->skin_map[bl_index] = 0;
658df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      if (!cpi->skin_map[bl_index] && num_neighbor == non_skin_threshold)
659df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        cpi->skin_map[bl_index] = 1;
660df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    }
661df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  }
662df37111358d02836cb29bbcb9c6e4c95dff90a16Johann}
663df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
6647bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void set_default_lf_deltas(VP8_COMP *cpi) {
6657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
6667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
6697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Test of ref frame deltas */
6727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
6737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
6747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
6757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mode_lf_deltas[0] = 4; /* BPRED */
6781b362b15af34006e6a11974088a46d42b903418eJohann
6797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.Mode == MODE_REALTIME) {
6807bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.e_mbd.mode_lf_deltas[1] = -12; /* Zero */
6817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
6827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.e_mbd.mode_lf_deltas[1] = -2; /* Zero */
6837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
6841b362b15af34006e6a11974088a46d42b903418eJohann
6857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mode_lf_deltas[2] = 2; /* New mv */
6867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mode_lf_deltas[3] = 4; /* Split mv */
6871b362b15af34006e6a11974088a46d42b903418eJohann}
6881b362b15af34006e6a11974088a46d42b903418eJohann
6891b362b15af34006e6a11974088a46d42b903418eJohann/* Convenience macros for mapping speed and mode into a continuous
6901b362b15af34006e6a11974088a46d42b903418eJohann * range
6911b362b15af34006e6a11974088a46d42b903418eJohann */
6927bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define GOOD(x) (x + 1)
6937bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define RT(x) (x + 7)
6941b362b15af34006e6a11974088a46d42b903418eJohann
6957bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int speed_map(int speed, const int *map) {
6967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int res;
6971b362b15af34006e6a11974088a46d42b903418eJohann
6987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  do {
6997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    res = *map++;
7007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } while (speed >= *map++);
7017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return res;
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7041b362b15af34006e6a11974088a46d42b903418eJohannstatic const int thresh_mult_map_znn[] = {
7057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* map common to zero, nearest, and near */
7067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
7071b362b15af34006e6a11974088a46d42b903418eJohann};
7081b362b15af34006e6a11974088a46d42b903418eJohann
7097bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int thresh_mult_map_vhpred[] = { 1000, GOOD(2), 1500,    GOOD(3),
7107bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                              2000, RT(0),   1000,    RT(1),
7117bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                              2000, RT(7),   INT_MAX, INT_MAX };
7121b362b15af34006e6a11974088a46d42b903418eJohann
7137bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int thresh_mult_map_bpred[] = { 2000,    GOOD(0), 2500, GOOD(2),
7147bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                             5000,    GOOD(3), 7500, RT(0),
7157bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                             2500,    RT(1),   5000, RT(6),
7167bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                             INT_MAX, INT_MAX };
7171b362b15af34006e6a11974088a46d42b903418eJohann
7187bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int thresh_mult_map_tm[] = { 1000,    GOOD(2), 1500, GOOD(3),
7197bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                          2000,    RT(0),   0,    RT(1),
7207bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                          1000,    RT(2),   2000, RT(7),
7217bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                          INT_MAX, INT_MAX };
7221b362b15af34006e6a11974088a46d42b903418eJohann
7237bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int thresh_mult_map_new1[] = { 1000,  GOOD(2), 2000,
7247bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                            RT(0), 2000,    INT_MAX };
7251b362b15af34006e6a11974088a46d42b903418eJohann
7267bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int thresh_mult_map_new2[] = { 1000, GOOD(2), 2000, GOOD(3),
7277bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                            2500, GOOD(5), 4000, RT(0),
7287bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                            2000, RT(2),   2500, RT(5),
7297bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                            4000, INT_MAX };
7301b362b15af34006e6a11974088a46d42b903418eJohann
7311b362b15af34006e6a11974088a46d42b903418eJohannstatic const int thresh_mult_map_split1[] = {
7327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  2500,  GOOD(0), 1700,  GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
7337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  RT(0), 5000,    RT(1), 10000,   RT(2), 25000,   RT(3), INT_MAX, INT_MAX
7341b362b15af34006e6a11974088a46d42b903418eJohann};
7351b362b15af34006e6a11974088a46d42b903418eJohann
7361b362b15af34006e6a11974088a46d42b903418eJohannstatic const int thresh_mult_map_split2[] = {
7377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  5000,  GOOD(0), 4500,  GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
7387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  RT(0), 10000,   RT(1), 20000,   RT(2), 50000,   RT(3), INT_MAX, INT_MAX
7391b362b15af34006e6a11974088a46d42b903418eJohann};
7401b362b15af34006e6a11974088a46d42b903418eJohann
7411b362b15af34006e6a11974088a46d42b903418eJohannstatic const int mode_check_freq_map_zn2[] = {
7427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* {zero,nearest}{2,3} */
7437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0, RT(10), 1 << 1, RT(11), 1 << 2, RT(12), 1 << 3, INT_MAX
7441b362b15af34006e6a11974088a46d42b903418eJohann};
7451b362b15af34006e6a11974088a46d42b903418eJohann
7461b362b15af34006e6a11974088a46d42b903418eJohannstatic const int mode_check_freq_map_vhbpred[] = {
7477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(5), 4, INT_MAX
7481b362b15af34006e6a11974088a46d42b903418eJohann};
7491b362b15af34006e6a11974088a46d42b903418eJohann
7501b362b15af34006e6a11974088a46d42b903418eJohannstatic const int mode_check_freq_map_near2[] = {
7517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,      GOOD(5), 2,      RT(0),  0,      RT(3),  2,
7527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  RT(10), 1 << 2,  RT(11), 1 << 3, RT(12), 1 << 4, INT_MAX
7531b362b15af34006e6a11974088a46d42b903418eJohann};
7541b362b15af34006e6a11974088a46d42b903418eJohann
7551b362b15af34006e6a11974088a46d42b903418eJohannstatic const int mode_check_freq_map_new1[] = {
7567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0, RT(10), 1 << 1, RT(11), 1 << 2, RT(12), 1 << 3, INT_MAX
7571b362b15af34006e6a11974088a46d42b903418eJohann};
7581b362b15af34006e6a11974088a46d42b903418eJohann
7597bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int mode_check_freq_map_new2[] = { 0,      GOOD(5), 4,      RT(0),
7607bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                0,      RT(3),   4,      RT(10),
7617bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                1 << 3, RT(11),  1 << 4, RT(12),
7627bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                1 << 5, INT_MAX };
7631b362b15af34006e6a11974088a46d42b903418eJohann
7641b362b15af34006e6a11974088a46d42b903418eJohannstatic const int mode_check_freq_map_split1[] = {
7657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0, GOOD(2), 2, GOOD(3), 7, RT(1), 2, RT(2), 7, INT_MAX
7661b362b15af34006e6a11974088a46d42b903418eJohann};
7671b362b15af34006e6a11974088a46d42b903418eJohann
7681b362b15af34006e6a11974088a46d42b903418eJohannstatic const int mode_check_freq_map_split2[] = {
7697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
7701b362b15af34006e6a11974088a46d42b903418eJohann};
7711b362b15af34006e6a11974088a46d42b903418eJohann
7727bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_set_speed_features(VP8_COMP *cpi) {
7737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  SPEED_FEATURES *sf = &cpi->sf;
7747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Mode = cpi->compressor_speed;
7757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Speed = cpi->Speed;
7760a39d0a697ff3603e8c100300fda363658e10b23James Zern  int Speed2;
7777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i;
7787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
7797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int last_improved_quant = sf->improved_quant;
7807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int ref_frames;
7817bc9febe8749e98a3812a0dc4380ceae75c29450Johann
7827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Initialise default mode frequency sampling variables */
7837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < MAX_MODES; ++i) {
7847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mode_check_freq[i] = 0;
7857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
78690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.mbs_tested_so_far = 0;
7887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.mbs_zero_last_dot_suppress = 0;
7897bc9febe8749e98a3812a0dc4380ceae75c29450Johann
7907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* best quality defaults */
7917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->RD = 1;
7927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->search_method = NSTEP;
7937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->improved_quant = 1;
7947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->improved_dct = 1;
7957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->auto_filter = 1;
7967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->recode_loop = 1;
7977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->quarter_pixel_search = 1;
7987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->half_pixel_search = 1;
7997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->iterative_sub_pixel = 1;
8007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->optimize_coefficients = 1;
8017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->use_fastquant_for_pick = 0;
8027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->no_skip_block4x4_search = 1;
8037bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->first_step = 0;
8057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
8067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->improved_mv_pred = 1;
8077bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* default thresholds to 0 */
8097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < MAX_MODES; ++i) sf->thresh_mult[i] = 0;
8107bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Count enabled references */
8127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  ref_frames = 1;
8137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->ref_frame_flags & VP8_LAST_FRAME) ref_frames++;
8147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->ref_frame_flags & VP8_GOLD_FRAME) ref_frames++;
8157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->ref_frame_flags & VP8_ALTR_FRAME) ref_frames++;
8167bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Convert speed to continuous range, with clamping */
8187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (Mode == 0) {
8197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Speed = 0;
8207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (Mode == 2) {
8217bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Speed = RT(Speed);
8227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
8237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (Speed > 5) Speed = 5;
8247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Speed = GOOD(Speed);
8257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
8261b362b15af34006e6a11974088a46d42b903418eJohann
8277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_ZERO1] = sf->thresh_mult[THR_NEAREST1] =
8287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->thresh_mult[THR_NEAR1] = sf->thresh_mult[THR_DC] = 0; /* always */
8297bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO3] =
8317bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST3] =
8327bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR3] =
8337bc9febe8749e98a3812a0dc4380ceae75c29450Johann              speed_map(Speed, thresh_mult_map_znn);
8347bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_V_PRED] = sf->thresh_mult[THR_H_PRED] =
8367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      speed_map(Speed, thresh_mult_map_vhpred);
8377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
8387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_TM] = speed_map(Speed, thresh_mult_map_tm);
8397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_NEW1] = speed_map(Speed, thresh_mult_map_new1);
8407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_NEW2] = sf->thresh_mult[THR_NEW3] =
8417bc9febe8749e98a3812a0dc4380ceae75c29450Johann      speed_map(Speed, thresh_mult_map_new2);
8427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
8437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sf->thresh_mult[THR_SPLIT2] = sf->thresh_mult[THR_SPLIT3] =
8447bc9febe8749e98a3812a0dc4380ceae75c29450Johann      speed_map(Speed, thresh_mult_map_split2);
8457bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Special case for temporal layers.
8477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Reduce the thresholds for zero/nearest/near for GOLDEN, if GOLDEN is
8487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // used as second reference. We don't modify thresholds for ALTREF case
8497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // since ALTREF is usually used as long-term reference in temporal layers.
8507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cpi->Speed <= 6) && (cpi->oxcf.number_of_layers > 1) &&
8517bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->ref_frame_flags & VP8_LAST_FRAME) &&
8527bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->ref_frame_flags & VP8_GOLD_FRAME)) {
8537bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->closest_reference_frame == GOLDEN_FRAME) {
8547bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 3;
8557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 3;
8567bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 3;
8577bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
8587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 1;
8597bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 1;
8607bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 1;
8617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
8627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
8637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mode_check_freq[THR_ZERO1] = cpi->mode_check_freq[THR_NEAREST1] =
8657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->mode_check_freq[THR_NEAR1] = cpi->mode_check_freq[THR_TM] =
8667bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->mode_check_freq[THR_DC] = 0; /* always */
8677bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mode_check_freq[THR_ZERO2] = cpi->mode_check_freq[THR_ZERO3] =
8697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->mode_check_freq[THR_NEAREST2] = cpi->mode_check_freq[THR_NEAREST3] =
8707bc9febe8749e98a3812a0dc4380ceae75c29450Johann          speed_map(Speed, mode_check_freq_map_zn2);
8717bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mode_check_freq[THR_NEAR2] = cpi->mode_check_freq[THR_NEAR3] =
8737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      speed_map(Speed, mode_check_freq_map_near2);
8747bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mode_check_freq[THR_V_PRED] = cpi->mode_check_freq[THR_H_PRED] =
8767bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->mode_check_freq[THR_B_PRED] =
8777bc9febe8749e98a3812a0dc4380ceae75c29450Johann          speed_map(Speed, mode_check_freq_map_vhbpred);
8780a39d0a697ff3603e8c100300fda363658e10b23James Zern
8790a39d0a697ff3603e8c100300fda363658e10b23James Zern  // For real-time mode at speed 10 keep the mode_check_freq threshold
8800a39d0a697ff3603e8c100300fda363658e10b23James Zern  // for NEW1 similar to that of speed 9.
8810a39d0a697ff3603e8c100300fda363658e10b23James Zern  Speed2 = Speed;
8820a39d0a697ff3603e8c100300fda363658e10b23James Zern  if (cpi->Speed == 10 && Mode == 2) Speed2 = RT(9);
8830a39d0a697ff3603e8c100300fda363658e10b23James Zern  cpi->mode_check_freq[THR_NEW1] = speed_map(Speed2, mode_check_freq_map_new1);
8840a39d0a697ff3603e8c100300fda363658e10b23James Zern
8857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mode_check_freq[THR_NEW2] = cpi->mode_check_freq[THR_NEW3] =
8867bc9febe8749e98a3812a0dc4380ceae75c29450Johann      speed_map(Speed, mode_check_freq_map_new2);
8870a39d0a697ff3603e8c100300fda363658e10b23James Zern
8887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mode_check_freq[THR_SPLIT1] =
8897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      speed_map(Speed, mode_check_freq_map_split1);
8907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mode_check_freq[THR_SPLIT2] = cpi->mode_check_freq[THR_SPLIT3] =
8917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      speed_map(Speed, mode_check_freq_map_split2);
8927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  Speed = cpi->Speed;
8937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  switch (Mode) {
894c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
8951b362b15af34006e6a11974088a46d42b903418eJohann    case 0: /* best quality mode */
8967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->first_step = 0;
8977bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
8987bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
89990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 1:
90090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 3:
9017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 0) {
9027bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Disable coefficient optimization above speed 0 */
9037bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->optimize_coefficients = 0;
9047bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->use_fastquant_for_pick = 1;
9057bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->no_skip_block4x4_search = 0;
90679f15823c34ae1e423108295e416213200bb280fAndreas Huber
9077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->first_step = 1;
9087bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
90990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 2) {
9117bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->improved_quant = 0;
9127bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->improved_dct = 0;
91390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9147bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Only do recode loop on key frames, golden frames and
9157bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * alt ref frames
9167bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
9177bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->recode_loop = 2;
9187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
91979f15823c34ae1e423108295e416213200bb280fAndreas Huber
9207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 3) {
9217bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->auto_filter = 1;
9227bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->recode_loop = 0; /* recode loop off */
9237bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->RD = 0;          /* Turn rd off */
9247bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
92590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9267bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 4) {
9277bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->auto_filter = 0; /* Faster selection of loop filter */
9287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
92990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
93190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
93290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 2:
9337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->optimize_coefficients = 0;
9347bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->recode_loop = 0;
9357bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->auto_filter = 1;
9367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->iterative_sub_pixel = 1;
9377bc9febe8749e98a3812a0dc4380ceae75c29450Johann      sf->search_method = NSTEP;
93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9397bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 0) {
9407bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->improved_quant = 0;
9417bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->improved_dct = 0;
94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9437bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->use_fastquant_for_pick = 1;
9447bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->no_skip_block4x4_search = 0;
9457bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->first_step = 1;
9467bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9487bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 2) sf->auto_filter = 0; /* Faster selection of loop filter */
94990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9507bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 3) {
9517bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->RD = 0;
9527bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->auto_filter = 1;
9537bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
95490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 4) {
9567bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->auto_filter = 0; /* Faster selection of loop filter */
9577bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->search_method = HEX;
9587bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->iterative_sub_pixel = 0;
9597bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
96090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9617bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 6) {
9627bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int sum = 0;
9637bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int total_mbs = cm->MBs;
9647bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int thresh;
9657bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int total_skip;
96690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9677bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int min = 2000;
96890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9697bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->oxcf.encode_breakout > 2000) min = cpi->oxcf.encode_breakout;
97090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9717bc9febe8749e98a3812a0dc4380ceae75c29450Johann        min >>= 7;
97290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9737bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (i = 0; i < min; ++i) {
9747bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sum += cpi->mb.error_bins[i];
9757bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
97690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9777bc9febe8749e98a3812a0dc4380ceae75c29450Johann        total_skip = sum;
9787bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sum = 0;
97990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9807bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* i starts from 2 to make sure thresh started from 2048 */
9817bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (; i < 1024; ++i) {
9827bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sum += cpi->mb.error_bins[i];
98390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9847bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (10 * sum >=
9857bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (unsigned int)(cpi->Speed - 6) * (total_mbs - total_skip)) {
9867bc9febe8749e98a3812a0dc4380ceae75c29450Johann            break;
9877bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
9887bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
98990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9907bc9febe8749e98a3812a0dc4380ceae75c29450Johann        i--;
9917bc9febe8749e98a3812a0dc4380ceae75c29450Johann        thresh = (i << 7);
99290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9937bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (thresh < 2000) thresh = 2000;
99490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9957bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (ref_frames > 1) {
9967bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEW1] = thresh;
9977bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEAREST1] = thresh >> 1;
9987bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEAR1] = thresh >> 1;
9997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
100090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10017bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (ref_frames > 2) {
10027bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEW2] = thresh << 1;
10037bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEAREST2] = thresh;
10047bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEAR2] = thresh;
10057bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
100690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (ref_frames > 3) {
10087bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEW3] = thresh << 1;
10097bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEAREST3] = thresh;
10107bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sf->thresh_mult[THR_NEAR3] = thresh;
101190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
101290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10137bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sf->improved_mv_pred = 0;
10147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
101590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed > 8) sf->quarter_pixel_search = 0;
101790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->version == 0) {
10197bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cm->filter_type = NORMAL_LOOPFILTER;
102090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10217bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (Speed >= 14) cm->filter_type = SIMPLE_LOOPFILTER;
10227bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
10237bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cm->filter_type = SIMPLE_LOOPFILTER;
10247bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10267bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* This has a big hit on quality. Last resort */
10277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Speed >= 15) sf->half_pixel_search = 0;
102890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
103079f15823c34ae1e423108295e416213200bb280fAndreas Huber
10317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }; /* switch */
103290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Slow quant, dct and trellis not worthwhile for first pass
10347bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * so make sure they are always turned off.
10357bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
10367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass == 1) {
10377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    sf->improved_quant = 0;
10387bc9febe8749e98a3812a0dc4380ceae75c29450Johann    sf->optimize_coefficients = 0;
10397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    sf->improved_dct = 0;
10407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
104190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->sf.search_method == NSTEP) {
10437bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_init3smotion_compensation(&cpi->mb,
10447bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                  cm->yv12_fb[cm->lst_fb_idx].y_stride);
10457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cpi->sf.search_method == DIAMOND) {
10467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_init_dsmotion_compensation(&cpi->mb,
10477bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                   cm->yv12_fb[cm->lst_fb_idx].y_stride);
10487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
104990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->sf.improved_dct) {
10517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
10527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
10537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
10547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* No fast FDCT defined for any platform at this time. */
10557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
10567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
10577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
105890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
106090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->sf.improved_quant) {
10627bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.quantize_b = vp8_regular_quantize_b;
10637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
10647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.quantize_b = vp8_fast_quantize_b;
10657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
10667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->sf.improved_quant != last_improved_quant) vp8cx_init_quantizer(cpi);
10677bc9febe8749e98a3812a0dc4380ceae75c29450Johann
10687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->sf.iterative_sub_pixel == 1) {
10697bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
10707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cpi->sf.quarter_pixel_search) {
10717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
10727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cpi->sf.half_pixel_search) {
10737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
10747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
10757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
10767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
107790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->sf.optimize_coefficients == 1 && cpi->pass != 1) {
10797bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.optimize = 1;
10807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
10817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.optimize = 0;
10827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
108390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->common.full_pixel) {
10857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
10867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
108790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
108890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef SPEEDSTATS
10897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  frames_at_speed[cpi->Speed]++;
109090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
109190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
10921b362b15af34006e6a11974088a46d42b903418eJohann#undef GOOD
10931b362b15af34006e6a11974088a46d42b903418eJohann#undef RT
10941b362b15af34006e6a11974088a46d42b903418eJohann
10957bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void alloc_raw_frame_buffers(VP8_COMP *cpi) {
10961b362b15af34006e6a11974088a46d42b903418eJohann#if VP8_TEMPORAL_ALT_REF
10977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int width = (cpi->oxcf.Width + 15) & ~15;
10987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int height = (cpi->oxcf.Height + 15) & ~15;
10991b362b15af34006e6a11974088a46d42b903418eJohann#endif
110090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
11027bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      cpi->oxcf.lag_in_frames);
11037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->lookahead) {
11047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
11057bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       "Failed to allocate lag buffers");
11067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
110790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if VP8_TEMPORAL_ALT_REF
110990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer, width, height,
11117bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                  VP8BORDERINPIXELS)) {
11127bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
11137bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       "Failed to allocate altref buffer");
11147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
111590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
111690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
11171b362b15af34006e6a11974088a46d42b903418eJohann}
111890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11197bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void dealloc_raw_frame_buffers(VP8_COMP *cpi) {
11201b362b15af34006e6a11974088a46d42b903418eJohann#if VP8_TEMPORAL_ALT_REF
11217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
11221b362b15af34006e6a11974088a46d42b903418eJohann#endif
11237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_lookahead_destroy(cpi->lookahead);
112490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
1125f71323e297a928af368937089d3ed71239786f86Andreas Huber
11267bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int vp8_alloc_partition_data(VP8_COMP *cpi) {
11277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->mb.pip);
11281b362b15af34006e6a11974088a46d42b903418eJohann
11297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.pip =
11307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vpx_calloc((cpi->common.mb_cols + 1) * (cpi->common.mb_rows + 1),
11317bc9febe8749e98a3812a0dc4380ceae75c29450Johann                 sizeof(PARTITION_INFO));
11327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->mb.pip) return 1;
1133f71323e297a928af368937089d3ed71239786f86Andreas Huber
11347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1135f71323e297a928af368937089d3ed71239786f86Andreas Huber
11367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
1137f71323e297a928af368937089d3ed71239786f86Andreas Huber}
1138f71323e297a928af368937089d3ed71239786f86Andreas Huber
11397bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_alloc_compressor_data(VP8_COMP *cpi) {
11407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
114190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int width = cm->Width;
11437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int height = cm->Height;
114490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (vp8_alloc_frame_buffers(cm, width, height)) {
11467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
11477bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       "Failed to allocate frame buffers");
11487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
1149f71323e297a928af368937089d3ed71239786f86Andreas Huber
11507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (vp8_alloc_partition_data(cpi)) {
11517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
11527bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       "Failed to allocate partition data");
11537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
115490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((width & 0xf) != 0) width += 16 - (width & 0xf);
115690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((height & 0xf) != 0) height += 16 - (height & 0xf);
115890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame, width, height,
11607bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                  VP8BORDERINPIXELS)) {
11617bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
11627bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       "Failed to allocate last frame buffer");
11637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
116490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source, width, height,
11667bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                  VP8BORDERINPIXELS)) {
11677bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
11687bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       "Failed to allocate scaled source buffer");
11697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
117090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->tok);
117290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
11741b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
11757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
11761b362b15af34006e6a11974088a46d42b903418eJohann#else
11777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
11781b362b15af34006e6a11974088a46d42b903418eJohann#endif
11797bc9febe8749e98a3812a0dc4380ceae75c29450Johann    CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
11807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
118190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Data used for real time vc mode to see if gf needs refreshing */
11837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->zeromv_count = 0;
11847bc9febe8749e98a3812a0dc4380ceae75c29450Johann
11857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Structures used to monitor GF usage */
11867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->gf_active_flags);
11877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(
11887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->gf_active_flags,
11897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vpx_calloc(sizeof(*cpi->gf_active_flags), cm->mb_rows * cm->mb_cols));
11907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
11917bc9febe8749e98a3812a0dc4380ceae75c29450Johann
11927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->mb_activity_map);
11937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(
11947bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->mb_activity_map,
11957bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vpx_calloc(sizeof(*cpi->mb_activity_map), cm->mb_rows * cm->mb_cols));
11967bc9febe8749e98a3812a0dc4380ceae75c29450Johann
11977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* allocate memory for storing last frame's MVs for MV prediction. */
11987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->lfmv);
11997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
12007bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        sizeof(*cpi->lfmv)));
12017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->lf_ref_frame_sign_bias);
12027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
12037bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
12047bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             sizeof(*cpi->lf_ref_frame_sign_bias)));
12057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->lf_ref_frame);
12067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(cpi->lf_ref_frame,
12077bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
12087bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             sizeof(*cpi->lf_ref_frame)));
12097bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Create the encoder segmentation map and set all entries to 0 */
12117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->segmentation_map);
12127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(
12137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->segmentation_map,
12147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->segmentation_map)));
12157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->cyclic_refresh_mode_index = 0;
12167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->active_map);
12177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cm->mb_rows * cm->mb_cols,
12187bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                              sizeof(*cpi->active_map)));
12197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->active_map, 1, (cm->mb_rows * cm->mb_cols));
1220f71323e297a928af368937089d3ed71239786f86Andreas Huber
12217bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if CONFIG_MULTITHREAD
12227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (width < 640) {
12237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mt_sync_range = 1;
12247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (width <= 1280) {
12257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mt_sync_range = 4;
12267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (width <= 2560) {
12277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mt_sync_range = 8;
12287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
12297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mt_sync_range = 16;
12307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
1231f71323e297a928af368937089d3ed71239786f86Andreas Huber
12327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.multi_threaded > 1) {
12337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;
1234538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
12357bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_free(cpi->mt_current_mb_col);
12367bc9febe8749e98a3812a0dc4380ceae75c29450Johann    CHECK_MEM_ERROR(cpi->mt_current_mb_col,
12371b362b15af34006e6a11974088a46d42b903418eJohann                    vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
1238df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    for (i = 0; i < cm->mb_rows; ++i)
1239df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      vpx_atomic_init(&cpi->mt_current_mb_col[i], 0);
12407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
12411b362b15af34006e6a11974088a46d42b903418eJohann
12421b362b15af34006e6a11974088a46d42b903418eJohann#endif
124390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->tplist);
12457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
1246ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
1247ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_TEMPORAL_DENOISING
12487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.noise_sensitivity > 0) {
12497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_denoiser_free(&cpi->denoiser);
12507bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (vp8_denoiser_allocate(&cpi->denoiser, width, height, cm->mb_rows,
12517bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              cm->mb_cols, cpi->oxcf.noise_sensitivity)) {
12527bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
12537bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         "Failed to allocate denoiser");
1254ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    }
12557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
1256ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
125779f15823c34ae1e423108295e416213200bb280fAndreas Huber}
125890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12591b362b15af34006e6a11974088a46d42b903418eJohann/* Quant MOD */
12607bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int q_trans[] = {
12617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  0,  1,  2,  3,  4,  5,  7,   8,   9,   10,  12,  13,  15,  17,  18,  19,
12627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  20, 21, 23, 24, 25, 26, 27,  28,  29,  30,  31,  33,  35,  37,  39,  41,
12637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  43, 45, 47, 49, 51, 53, 55,  57,  59,  61,  64,  67,  70,  73,  76,  79,
12647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127,
126579f15823c34ae1e423108295e416213200bb280fAndreas Huber};
126690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12677bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_reverse_trans(int x) {
12687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i;
126990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < 64; ++i) {
12717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (q_trans[i] >= x) return i;
12727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
127390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 63;
12751b362b15af34006e6a11974088a46d42b903418eJohann}
12767bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_new_framerate(VP8_COMP *cpi, double framerate) {
12777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (framerate < .1) framerate = 30;
127890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->framerate = framerate;
12807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->output_framerate = framerate;
12817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->per_frame_bandwidth =
12827bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (int)(cpi->oxcf.target_bandwidth / cpi->output_framerate);
12837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
12847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth *
12857bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                   cpi->oxcf.two_pass_vbrmin_section / 100);
128690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set Maximum gf/arf interval */
12887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);
128990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->max_gf_interval < 12) cpi->max_gf_interval = 12;
129190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Extended interval for genuinely static scenes */
12937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
129490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Special conditions when altr ref frame enabled in lagged compress mode */
12967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames) {
12977bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1) {
12987bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
12997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
130079f15823c34ae1e423108295e416213200bb280fAndreas Huber
13017bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->twopass.static_scene_max_gf_interval >
13027bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->oxcf.lag_in_frames - 1) {
13037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
130490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
13057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
130690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval) {
13087bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
13097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
131079f15823c34ae1e423108295e416213200bb280fAndreas Huber}
131190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13127bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
13137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
131490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf = *oxcf;
131679f15823c34ae1e423108295e416213200bb280fAndreas Huber
13177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->auto_gold = 1;
13187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->auto_adjust_gold_quantizer = 1;
131979f15823c34ae1e423108295e416213200bb280fAndreas Huber
13207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->version = oxcf->Version;
13217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_setup_version(cm);
132279f15823c34ae1e423108295e416213200bb280fAndreas Huber
13237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Frame rate is not available on the first frame, as it's derived from
13247bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * the observed timestamps. The actual value used here doesn't matter
13257bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * too much, as it will adapt quickly.
13267bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
13277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (oxcf->timebase.num > 0) {
13287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->framerate =
13297bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (double)(oxcf->timebase.den) / (double)(oxcf->timebase.num);
13307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
13317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->framerate = 30;
13327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
13331b362b15af34006e6a11974088a46d42b903418eJohann
13347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* If the reciprocal of the timebase seems like a reasonable framerate,
13357bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * then use that as a guess, otherwise use 30.
13367bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
13377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->framerate > 180) cpi->framerate = 30;
13381b362b15af34006e6a11974088a46d42b903418eJohann
13397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ref_framerate = cpi->framerate;
134079f15823c34ae1e423108295e416213200bb280fAndreas Huber
13417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
13427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
13437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->refresh_golden_frame = 0;
13447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->refresh_last_frame = 1;
13457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->refresh_entropy_probs = 1;
13467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
13477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* change includes all joint functionality */
13487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_change_config(cpi, oxcf);
13491b362b15af34006e6a11974088a46d42b903418eJohann
13507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Initialize active best and worst q and average q values. */
13517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
13527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->active_best_quality = cpi->oxcf.best_allowed_q;
13537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
135479f15823c34ae1e423108295e416213200bb280fAndreas Huber
13557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Initialise the starting buffer levels */
13567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->buffer_level = cpi->oxcf.starting_buffer_level;
13577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
135879f15823c34ae1e423108295e416213200bb280fAndreas Huber
13597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
13607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
13617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
13627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
136379f15823c34ae1e423108295e416213200bb280fAndreas Huber
13647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->total_actual_bits = 0;
13657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->total_target_vs_actual = 0;
1366538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
13677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Temporal scalabilty */
13687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers > 1) {
13697bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int i;
13707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double prev_layer_framerate = 0;
13711b362b15af34006e6a11974088a46d42b903418eJohann
13727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
13737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
13747bc9febe8749e98a3812a0dc4380ceae75c29450Johann      prev_layer_framerate =
13757bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->output_framerate / cpi->oxcf.rate_decimator[i];
13761b362b15af34006e6a11974088a46d42b903418eJohann    }
13777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
13781b362b15af34006e6a11974088a46d42b903418eJohann
137979f15823c34ae1e423108295e416213200bb280fAndreas Huber#if VP8_TEMPORAL_ALT_REF
13807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
13817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;
138290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13837bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->fixed_divide[0] = 0;
138490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 1; i < 512; ++i) cpi->fixed_divide[i] = 0x80000 / i;
13867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
138790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
138890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
138990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13907bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void update_layer_contexts(VP8_COMP *cpi) {
13917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_CONFIG *oxcf = &cpi->oxcf;
13921b362b15af34006e6a11974088a46d42b903418eJohann
13937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Update snapshots of the layer contexts to reflect new parameters */
13947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (oxcf->number_of_layers > 1) {
13957bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int i;
13967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double prev_layer_framerate = 0;
13971b362b15af34006e6a11974088a46d42b903418eJohann
13987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    assert(oxcf->number_of_layers <= VPX_TS_MAX_LAYERS);
13997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < oxcf->number_of_layers && i < VPX_TS_MAX_LAYERS; ++i) {
14007bc9febe8749e98a3812a0dc4380ceae75c29450Johann      LAYER_CONTEXT *lc = &cpi->layer_context[i];
14011b362b15af34006e6a11974088a46d42b903418eJohann
14027bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->framerate = cpi->ref_framerate / oxcf->rate_decimator[i];
14037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
14041b362b15af34006e6a11974088a46d42b903418eJohann
14057bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->starting_buffer_level = rescale(
14067bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (int)oxcf->starting_buffer_level_in_ms, lc->target_bandwidth, 1000);
140790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14087bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (oxcf->optimal_buffer_level == 0) {
14097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        lc->optimal_buffer_level = lc->target_bandwidth / 8;
14107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
14117bc9febe8749e98a3812a0dc4380ceae75c29450Johann        lc->optimal_buffer_level = rescale(
14127bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (int)oxcf->optimal_buffer_level_in_ms, lc->target_bandwidth, 1000);
14137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
14141b362b15af34006e6a11974088a46d42b903418eJohann
14157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (oxcf->maximum_buffer_size == 0) {
14167bc9febe8749e98a3812a0dc4380ceae75c29450Johann        lc->maximum_buffer_size = lc->target_bandwidth / 8;
14177bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
14187bc9febe8749e98a3812a0dc4380ceae75c29450Johann        lc->maximum_buffer_size = rescale((int)oxcf->maximum_buffer_size_in_ms,
14197bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                          lc->target_bandwidth, 1000);
14207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
14217bc9febe8749e98a3812a0dc4380ceae75c29450Johann
14227bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Work out the average size of a frame within this layer */
14237bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (i > 0) {
14247bc9febe8749e98a3812a0dc4380ceae75c29450Johann        lc->avg_frame_size_for_layer =
14257bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (int)((oxcf->target_bitrate[i] - oxcf->target_bitrate[i - 1]) *
14267bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  1000 / (lc->framerate - prev_layer_framerate));
14277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
14287bc9febe8749e98a3812a0dc4380ceae75c29450Johann
14297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      prev_layer_framerate = lc->framerate;
14301b362b15af34006e6a11974088a46d42b903418eJohann    }
14317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
14321b362b15af34006e6a11974088a46d42b903418eJohann}
14331b362b15af34006e6a11974088a46d42b903418eJohann
14347bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
14357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
14367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int last_w, last_h;
14377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned int prev_number_of_layers;
143890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi) return;
144090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!oxcf) return;
144290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->version != oxcf->Version) {
14447bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->version = oxcf->Version;
14457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_setup_version(cm);
14467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
14471b362b15af34006e6a11974088a46d42b903418eJohann
14487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  last_w = cpi->oxcf.Width;
14497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  last_h = cpi->oxcf.Height;
14507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  prev_number_of_layers = cpi->oxcf.number_of_layers;
145190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf = *oxcf;
145390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  switch (cpi->oxcf.Mode) {
145590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case MODE_REALTIME:
14567bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->pass = 0;
14577bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->compressor_speed = 2;
145890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14597bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.cpu_used < -16) {
14607bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->oxcf.cpu_used = -16;
14617bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
146290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14637bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.cpu_used > 16) cpi->oxcf.cpu_used = 16;
146490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
146690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
146790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case MODE_GOODQUALITY:
14687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->pass = 0;
14697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->compressor_speed = 1;
147090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14717bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.cpu_used < -5) {
14727bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->oxcf.cpu_used = -5;
14737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
147490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14757bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.cpu_used > 5) cpi->oxcf.cpu_used = 5;
147690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14777bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
147890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
147990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case MODE_BESTQUALITY:
14807bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->pass = 0;
14817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->compressor_speed = 0;
14827bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
148390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
148490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case MODE_FIRSTPASS:
14857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->pass = 1;
14867bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->compressor_speed = 1;
14877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
148890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case MODE_SECONDPASS:
14897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->pass = 2;
14907bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->compressor_speed = 1;
149190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14927bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.cpu_used < -5) {
14937bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->oxcf.cpu_used = -5;
14947bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
149590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.cpu_used > 5) cpi->oxcf.cpu_used = 5;
149790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14987bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
149990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case MODE_SECONDPASS_BEST:
15007bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->pass = 2;
15017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->compressor_speed = 0;
15027bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
15037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
150490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass == 0) cpi->auto_worst_q = 1;
150690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
15087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
15097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
151090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (oxcf->fixed_q >= 0) {
15127bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (oxcf->worst_allowed_q < 0) {
15137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.fixed_q = q_trans[0];
15147bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
15157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
15167bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
151790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15187bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (oxcf->alt_q < 0) {
15197bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.alt_q = q_trans[0];
15207bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
15217bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
15227bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
152390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (oxcf->key_q < 0) {
15257bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.key_q = q_trans[0];
15267bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
15277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.key_q = q_trans[oxcf->key_q];
15287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
152990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15307bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (oxcf->gold_q < 0) {
15317bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.gold_q = q_trans[0];
15327bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
15337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
153490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
15357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
153690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->baseline_gf_interval =
15387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
15397bc9febe8749e98a3812a0dc4380ceae75c29450Johann
15407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // GF behavior for 1 pass CBR, used when error_resilience is off.
15417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->oxcf.error_resilient_mode &&
15427bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
15437bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.Mode == MODE_REALTIME)
15447bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
154590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15461b362b15af34006e6a11974088a46d42b903418eJohann#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
15477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.token_partitions = 3;
15481b362b15af34006e6a11974088a46d42b903418eJohann#endif
15491b362b15af34006e6a11974088a46d42b903418eJohann
15507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3) {
15517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->multi_token_partition = (TOKEN_PARTITION)cpi->oxcf.token_partitions;
15527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
155390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  setup_features(cpi);
155590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1556df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (!cpi->use_roi_static_threshold) {
15577bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;
15587bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
15597bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
156090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
15617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
156290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* At the moment the first order values may not be > MAXQ */
15647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.fixed_q > MAXQ) cpi->oxcf.fixed_q = MAXQ;
15657bc9febe8749e98a3812a0dc4380ceae75c29450Johann
15667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* local file playback mode == really big buffer */
15677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) {
15687bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.starting_buffer_level = 60000;
15697bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.optimal_buffer_level = 60000;
15707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.maximum_buffer_size = 240000;
15717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.starting_buffer_level_in_ms = 60000;
15727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.optimal_buffer_level_in_ms = 60000;
15737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.maximum_buffer_size_in_ms = 240000;
15747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
157590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Convert target bandwidth from Kbit/s to Bit/s */
15777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.target_bandwidth *= 1000;
157890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->oxcf.starting_buffer_level = rescale(
15807bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (int)cpi->oxcf.starting_buffer_level, cpi->oxcf.target_bandwidth, 1000);
15811b362b15af34006e6a11974088a46d42b903418eJohann
15827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set or reset optimal and maximum buffer levels. */
15837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.optimal_buffer_level == 0) {
15847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
15857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
15867bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.optimal_buffer_level = rescale(
15877bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (int)cpi->oxcf.optimal_buffer_level, cpi->oxcf.target_bandwidth, 1000);
15887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
158990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.maximum_buffer_size == 0) {
15917bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
15927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
15937bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.maximum_buffer_size = rescale((int)cpi->oxcf.maximum_buffer_size,
15947bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                            cpi->oxcf.target_bandwidth, 1000);
15957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
15967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Under a configuration change, where maximum_buffer_size may change,
15977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // keep buffer level clipped to the maximum allowed buffer size.
15987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
15997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
16007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->buffer_level = cpi->bits_off_target;
16017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
160290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set up frame rate and related parameters rate control values. */
16047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_new_framerate(cpi, cpi->framerate);
160579f15823c34ae1e423108295e416213200bb280fAndreas Huber
16067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set absolute upper and lower quality limits */
16077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->worst_quality = cpi->oxcf.worst_allowed_q;
16087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->best_quality = cpi->oxcf.best_allowed_q;
160990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* active values should only be modified if out of new range */
16117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q) {
16127bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
16137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
16147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* less likely */
16157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q) {
16167bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
16177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
16187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->active_best_quality < cpi->oxcf.best_allowed_q) {
16197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->active_best_quality = cpi->oxcf.best_allowed_q;
16207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
16217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* less likely */
16227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q) {
16237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
16247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
162590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
162779f15823c34ae1e423108295e416213200bb280fAndreas Huber
16287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->cq_target_quality = cpi->oxcf.cq_level;
162990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Only allow dropped frames in buffered mode */
16317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
163290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
163490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Check if the number of temporal layers has changed, and if so reset the
16367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // pattern counter and set/initialize the temporal layer context for the
16377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // new layer configuration.
16387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers != prev_number_of_layers) {
16397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // If the number of temporal layers are changed we must start at the
16407bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // base of the pattern cycle, so set the layer id to 0 and reset
16417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // the temporal pattern counter.
16427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->temporal_layer_id > 0) {
16437bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->temporal_layer_id = 0;
1644ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
16457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->temporal_pattern_counter = 0;
16467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
16477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
164890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->initial_width) {
16507bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->initial_width = cpi->oxcf.Width;
16517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->initial_height = cpi->oxcf.Height;
16527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
16537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
16547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->Width = cpi->oxcf.Width;
16557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->Height = cpi->oxcf.Height;
16567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  assert(cm->Width <= cpi->initial_width);
16577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  assert(cm->Height <= cpi->initial_height);
165890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* TODO(jkoleszar): if an internal spatial resampling is active,
16607bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * and we downsize the input image, maybe we should clear the
16617bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * internal scale immediately rather than waiting for it to
16627bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * correct.
16637bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
166490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
16667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.Sharpness > 7) cpi->oxcf.Sharpness = 7;
166790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->sharpness_level = cpi->oxcf.Sharpness;
166990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL) {
16710a39d0a697ff3603e8c100300fda363658e10b23James Zern    int hr, hs, vr, vs;
167290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Scale2Ratio(cm->horiz_scale, &hr, &hs);
16747bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Scale2Ratio(cm->vert_scale, &vr, &vs);
167590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* always go to the next whole number */
16777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
16787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
16797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
168090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height) {
16827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->force_next_frame_intra = 1;
16837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
16841b362b15af34006e6a11974088a46d42b903418eJohann
16857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (((cm->Width + 15) & ~15) != cm->yv12_fb[cm->lst_fb_idx].y_width ||
16867bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cm->Height + 15) & ~15) != cm->yv12_fb[cm->lst_fb_idx].y_height ||
16877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->yv12_fb[cm->lst_fb_idx].y_width == 0) {
16887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    dealloc_raw_frame_buffers(cpi);
16897bc9febe8749e98a3812a0dc4380ceae75c29450Johann    alloc_raw_frame_buffers(cpi);
16907bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_alloc_compressor_data(cpi);
16917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
169290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.fixed_q >= 0) {
16947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_q[0] = cpi->oxcf.fixed_q;
16957bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_q[1] = cpi->oxcf.fixed_q;
16967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
169790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->Speed = cpi->oxcf.cpu_used;
169990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* force to allowlag to 0 if lag_in_frames is 0; */
17017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.lag_in_frames == 0) {
17027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.allow_lag = 0;
17037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
17047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Limit on lag buffers as these are not currently dynamically allocated */
17057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS) {
17067bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
17077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
170890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* YX Temp */
17107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->alt_ref_source = NULL;
17117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->is_src_frame_alt_ref = 0;
17121b362b15af34006e6a11974088a46d42b903418eJohann
17131b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING
17147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.noise_sensitivity) {
17157bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc) {
17167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int width = (cpi->oxcf.Width + 15) & ~15;
17177bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int height = (cpi->oxcf.Height + 15) & ~15;
17187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (vp8_denoiser_allocate(&cpi->denoiser, width, height, cm->mb_rows,
17197bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                cm->mb_cols, cpi->oxcf.noise_sensitivity)) {
17207bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
17217bc9febe8749e98a3812a0dc4380ceae75c29450Johann                           "Failed to allocate denoiser");
17221b362b15af34006e6a11974088a46d42b903418eJohann      }
17231b362b15af34006e6a11974088a46d42b903418eJohann    }
17247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
17251b362b15af34006e6a11974088a46d42b903418eJohann#endif
172690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
172790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
17281b362b15af34006e6a11974088a46d42b903418eJohann    /* Experimental RD Code */
172990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frame_distortion = 0;
173090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->last_frame_distortion = 0;
173190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
173290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
173390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1734ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifndef M_LOG2_E
173590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define M_LOG2_E 0.693147180559945309417
1736ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
17377bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define log2f(x) (log(x) / (float)M_LOG2_E)
1738ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
17397bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void cal_mvsadcosts(int *mvsadcost[2]) {
17407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i = 1;
174190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  mvsadcost[0][0] = 300;
17437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  mvsadcost[1][0] = 300;
174490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  do {
17467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double z = 256 * (2 * (log2f(8 * i) + .6));
17477bc9febe8749e98a3812a0dc4380ceae75c29450Johann    mvsadcost[0][i] = (int)z;
17487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    mvsadcost[1][i] = (int)z;
17497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    mvsadcost[0][-i] = (int)z;
17507bc9febe8749e98a3812a0dc4380ceae75c29450Johann    mvsadcost[1][-i] = (int)z;
17517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } while (++i <= mvfp_max);
175290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
175390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17547bc9febe8749e98a3812a0dc4380ceae75c29450Johannstruct VP8_COMP *vp8_create_compressor(VP8_CONFIG *oxcf) {
17557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i;
1756f71323e297a928af368937089d3ed71239786f86Andreas Huber
17577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMP *cpi;
17587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm;
175990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi = vpx_memalign(32, sizeof(VP8_COMP));
17617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Check that the CPI instance is valid */
17627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi) return 0;
176390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm = &cpi->common;
176590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi, 0, sizeof(VP8_COMP));
176790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (setjmp(cm->error.jmp)) {
17697bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->common.error.setjmp = 0;
17707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_remove_compressor(&cpi);
17717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return 0;
17727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
177390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.error.setjmp = 1;
177590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site),
17777bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                         (MAX_MVSEARCH_STEPS * 8) + 1));
177890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_create_common(&cpi->common);
178090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  init_config(cpi, oxcf);
178290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob,
17847bc9febe8749e98a3812a0dc4380ceae75c29450Johann         sizeof(vp8cx_base_skip_false_prob));
17857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.current_video_frame = 0;
17867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->temporal_pattern_counter = 0;
17877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->temporal_layer_id = -1;
17887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->kf_overspend_bits = 0;
17897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->kf_bitrate_adjustment = 0;
17907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->frames_till_gf_update_due = 0;
17917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gf_overspend_bits = 0;
17927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->non_gf_bitrate_adjustment = 0;
17937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->prob_last_coded = 128;
17947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->prob_gf_coded = 128;
17957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->prob_intra_coded = 63;
179690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Prime the recent reference frame usage counters.
17987bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * Hereafter they will be maintained as a sort of moving average
17997bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
18007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
18017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
18027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
18037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
180490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
18067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
180790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->twopass.gf_decay_rate = 0;
18097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
181090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gold_is_last = 0;
18127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->alt_is_last = 0;
18137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gold_is_alt = 0;
181490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->active_map_enabled = 0;
181690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1817df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  cpi->use_roi_static_threshold = 0;
1818df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
181990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
18201b362b15af34006e6a11974088a46d42b903418eJohann    /* Experimental code for lagged and one pass */
18211b362b15af34006e6a11974088a46d42b903418eJohann    /* Initialise one_pass GF frames stats */
18221b362b15af34006e6a11974088a46d42b903418eJohann    /* Update stats used for GF selection */
182390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass == 0)
182490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
182590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_index = 0;
182690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18277bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (i = 0; i < MAX_LAG_BUFFERS; ++i)
182890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
182990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frames_so_far = 0;
183090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
183190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
183290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
183390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
183490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
183590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
183690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
183790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
183890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
183990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
184090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
184190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mse_source_denoised = 0;
18437bc9febe8749e98a3812a0dc4380ceae75c29450Johann
18447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Should we use the cyclic refresh method.
18457bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * Currently there is no external control for this.
18467bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * Enable it for error_resilient_mode, or for 1 pass CBR mode.
18477bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
18487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->cyclic_refresh_mode_enabled =
18497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->oxcf.error_resilient_mode ||
18507bc9febe8749e98a3812a0dc4380ceae75c29450Johann       (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
18517bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->oxcf.Mode <= 2));
18527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->cyclic_refresh_mode_max_mbs_perframe =
18537bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->common.mb_rows * cpi->common.mb_cols) / 7;
18547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers == 1) {
18557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->cyclic_refresh_mode_max_mbs_perframe =
18567bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
18577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cpi->oxcf.number_of_layers == 2) {
18587bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->cyclic_refresh_mode_max_mbs_perframe =
18597bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
18607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
18617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->cyclic_refresh_mode_index = 0;
18627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->cyclic_refresh_q = 32;
18637bc9febe8749e98a3812a0dc4380ceae75c29450Johann
18647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // GF behavior for 1 pass CBR, used when error_resilience is off.
18657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gf_update_onepass_cbr = 0;
18667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gf_noboost_onepass_cbr = 0;
18677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->oxcf.error_resilient_mode &&
18687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER && cpi->oxcf.Mode <= 2) {
18697bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gf_update_onepass_cbr = 1;
18707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gf_noboost_onepass_cbr = 1;
18717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gf_interval_onepass_cbr =
18727bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->cyclic_refresh_mode_max_mbs_perframe > 0
18737bc9febe8749e98a3812a0dc4380ceae75c29450Johann            ? (2 * (cpi->common.mb_rows * cpi->common.mb_cols) /
18747bc9febe8749e98a3812a0dc4380ceae75c29450Johann               cpi->cyclic_refresh_mode_max_mbs_perframe)
18757bc9febe8749e98a3812a0dc4380ceae75c29450Johann            : 10;
18767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gf_interval_onepass_cbr =
18777bc9febe8749e98a3812a0dc4380ceae75c29450Johann        VPXMIN(40, VPXMAX(6, cpi->gf_interval_onepass_cbr));
18787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
18797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
188090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->cyclic_refresh_mode_enabled) {
18827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    CHECK_MEM_ERROR(cpi->cyclic_refresh_map,
18837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                    vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
18847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
18857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->cyclic_refresh_map = (signed char *)NULL;
18867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
18877bc9febe8749e98a3812a0dc4380ceae75c29450Johann
1888df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  CHECK_MEM_ERROR(cpi->skin_map, vpx_calloc(cm->mb_rows * cm->mb_cols,
1889df37111358d02836cb29bbcb9c6e4c95dff90a16Johann                                            sizeof(cpi->skin_map[0])));
1890df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
18917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(cpi->consec_zero_last,
18927bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  vpx_calloc(cm->mb_rows * cm->mb_cols, 1));
18937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CHECK_MEM_ERROR(cpi->consec_zero_last_mvbias,
18947bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1895ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
1896ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
18977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  init_context_counters();
189890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
189990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /*Initialize the feed-forward activity masking.*/
19017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->activity_avg = 90 << 12;
190290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Give a sensible default for the first frame. */
19047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->frames_since_key = 8;
19057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->key_frame_frequency = cpi->oxcf.key_freq;
19067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->this_key_frame_forced = 0;
19077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->next_key_frame_forced = 0;
190890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->source_alt_ref_pending = 0;
19107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->source_alt_ref_active = 0;
19117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.refresh_alt_ref_frame = 0;
191290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->force_maxqp = 0;
1914df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  cpi->frames_since_last_drop_overshoot = 0;
19157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
19167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
19171b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_INTERNAL_STATS
19187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->b_calculate_ssimg = 0;
19197bc9febe8749e98a3812a0dc4380ceae75c29450Johann
19207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->count = 0;
19217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->bytes = 0;
19227bc9febe8749e98a3812a0dc4380ceae75c29450Johann
19237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->b_calculate_psnr) {
19247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->total_sq_error = 0.0;
19257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->total_sq_error2 = 0.0;
19267bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->total_y = 0.0;
19277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->total_u = 0.0;
19287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->total_v = 0.0;
19297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->total = 0.0;
19307bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->totalp_y = 0.0;
19317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->totalp_u = 0.0;
19327bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->totalp_v = 0.0;
19337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->totalp = 0.0;
19347bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->tot_recode_hits = 0;
19357bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->summed_quality = 0;
19367bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->summed_weights = 0;
19377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
193890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
193990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
194090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->first_time_stamp_ever = 0x7FFFFFFF;
194290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->frames_till_gf_update_due = 0;
19447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->key_frame_count = 1;
194590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
19477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ni_tot_qi = 0;
19487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ni_frames = 0;
19497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->total_byte_count = 0;
195090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->drop_frame = 0;
195290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->rate_correction_factor = 1.0;
19547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->key_frame_rate_correction_factor = 1.0;
19557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gf_rate_correction_factor = 1.0;
19567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->twopass.est_max_qcorrection_factor = 1.0;
195790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < KEY_FRAME_CONTEXT; ++i) {
19597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
19607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
196190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
196290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef OUTPUT_YUV_SRC
19637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  yuv_file = fopen("bd.yuv", "ab");
196490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
1965ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifdef OUTPUT_YUV_DENOISED
19667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  yuv_denoised_file = fopen("denoised.yuv", "ab");
1967ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
1968df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#ifdef OUTPUT_YUV_SKINMAP
1969df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  yuv_skinmap_file = fopen("skinmap.yuv", "wb");
1970df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
197190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
197290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
197390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    framepsnr = fopen("framepsnr.stt", "a");
197490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    kf_list = fopen("kf_list.stt", "w");
197590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
197690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->output_pkt_list = oxcf->output_pkt_list;
197890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1979c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
198090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass == 1) {
19827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_init_first_pass(cpi);
19837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cpi->pass == 2) {
19847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    size_t packet_sz = sizeof(FIRSTPASS_STATS);
19857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
19867bc9febe8749e98a3812a0dc4380ceae75c29450Johann
19877bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
19887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->twopass.stats_in = cpi->twopass.stats_in_start;
19897bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->twopass.stats_in_end =
19907bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (void *)((char *)cpi->twopass.stats_in + (packets - 1) * packet_sz);
19917bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_init_second_pass(cpi);
19927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
199390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
199490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
199590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->compressor_speed == 2) {
19977bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->avg_encode_time = 0;
19987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->avg_pick_mode_time = 0;
19997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
200090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_set_speed_features(cpi);
200290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set starting values of RD threshold multipliers (128 = *1) */
20047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < MAX_MODES; ++i) {
20057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mb.rd_thresh_mult[i] = 128;
20067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
200790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2008ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
20097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  init_mv_ref_counts();
201090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
201190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
201279f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_MULTITHREAD
20137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (vp8cx_create_encoder_threads(cpi)) {
20147bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_remove_compressor(&cpi);
20157bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return 0;
20167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
201779f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
201890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X16].sdf = vpx_sad16x16;
20207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X16].vf = vpx_variance16x16;
20217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X16].svf = vpx_sub_pixel_variance16x16;
20227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X16].sdx3f = vpx_sad16x16x3;
20237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X16].sdx8f = vpx_sad16x16x8;
20247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X16].sdx4df = vpx_sad16x16x4d;
20257bc9febe8749e98a3812a0dc4380ceae75c29450Johann
20267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X8].sdf = vpx_sad16x8;
20277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X8].vf = vpx_variance16x8;
20287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X8].svf = vpx_sub_pixel_variance16x8;
20297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X8].sdx3f = vpx_sad16x8x3;
20307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X8].sdx8f = vpx_sad16x8x8;
20317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X8].sdx4df = vpx_sad16x8x4d;
20327bc9febe8749e98a3812a0dc4380ceae75c29450Johann
20337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X16].sdf = vpx_sad8x16;
20347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X16].vf = vpx_variance8x16;
20357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X16].svf = vpx_sub_pixel_variance8x16;
20367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X16].sdx3f = vpx_sad8x16x3;
20377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X16].sdx8f = vpx_sad8x16x8;
20387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X16].sdx4df = vpx_sad8x16x4d;
20397bc9febe8749e98a3812a0dc4380ceae75c29450Johann
20407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X8].sdf = vpx_sad8x8;
20417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X8].vf = vpx_variance8x8;
20427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X8].svf = vpx_sub_pixel_variance8x8;
20437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X8].sdx3f = vpx_sad8x8x3;
20447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X8].sdx8f = vpx_sad8x8x8;
20457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X8].sdx4df = vpx_sad8x8x4d;
20467bc9febe8749e98a3812a0dc4380ceae75c29450Johann
20477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_4X4].sdf = vpx_sad4x4;
20487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_4X4].vf = vpx_variance4x4;
20497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_4X4].svf = vpx_sub_pixel_variance4x4;
20507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_4X4].sdx3f = vpx_sad4x4x3;
20517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_4X4].sdx8f = vpx_sad4x4x8;
20527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_4X4].sdx4df = vpx_sad4x4x4d;
20531b362b15af34006e6a11974088a46d42b903418eJohann
20541b362b15af34006e6a11974088a46d42b903418eJohann#if ARCH_X86 || ARCH_X86_64
20557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X16].copymem = vp8_copy32xn;
20567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_16X8].copymem = vp8_copy32xn;
20577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn;
20587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn;
20597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn;
206090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
206190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->full_search_sad = vp8_full_search_sad;
20637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->diamond_search_sad = vp8_diamond_search_sad;
20647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->refining_search_sad = vp8_refining_search_sad;
206590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* make sure frame 1 is okay */
20677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.error_bins[0] = cpi->common.MBs;
206890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* vp8cx_init_quantizer() is first called here. Add check in
20707bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
20717bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * called later when needed. This will avoid unnecessary calls of
20727bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * vp8cx_init_quantizer() for every frame.
20737bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
20747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8cx_init_quantizer(cpi);
20751b362b15af34006e6a11974088a46d42b903418eJohann
20767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_loop_filter_init(cm);
20771b362b15af34006e6a11974088a46d42b903418eJohann
20787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.error.setjmp = 0;
207990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20801b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING
20811b362b15af34006e6a11974088a46d42b903418eJohann
20827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Calculate # of MBs in a row in lower-resolution level image. */
20837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.mr_encoder_id > 0) vp8_cal_low_res_mb_cols(cpi);
20841b362b15af34006e6a11974088a46d42b903418eJohann
20851b362b15af34006e6a11974088a46d42b903418eJohann#endif
20861b362b15af34006e6a11974088a46d42b903418eJohann
20877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* setup RD costs to MACROBLOCK struct */
20881b362b15af34006e6a11974088a46d42b903418eJohann
20897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max + 1];
20907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max + 1];
20917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max + 1];
20927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max + 1];
20931b362b15af34006e6a11974088a46d42b903418eJohann
20947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cal_mvsadcosts(cpi->mb.mvsadcost);
20951b362b15af34006e6a11974088a46d42b903418eJohann
20967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
20977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
20987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
20997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
21007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.token_costs = cpi->rd_costs.token_costs;
21011b362b15af34006e6a11974088a46d42b903418eJohann
21027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* setup block ptrs & offsets */
21037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_setup_block_ptrs(&cpi->mb);
21047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_setup_block_dptrs(&cpi->mb.e_mbd);
21051b362b15af34006e6a11974088a46d42b903418eJohann
21067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return cpi;
210790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
210890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21097bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_remove_compressor(VP8_COMP **ptr) {
21107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMP *cpi = *ptr;
211190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi) return;
211390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi && (cpi->common.current_video_frame > 0)) {
2115c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
211690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21177bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->pass == 2) {
21187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_end_second_pass(cpi);
21197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
212090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
212190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
212290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
21247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    print_context_counters();
21257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    print_tree_update_probs();
21267bc9febe8749e98a3812a0dc4380ceae75c29450Johann    print_mode_context();
212790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
212890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21291b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_INTERNAL_STATS
213090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->pass != 1) {
21327bc9febe8749e98a3812a0dc4380ceae75c29450Johann      FILE *f = fopen("opsnr.stt", "a");
21337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      double time_encoded =
21347bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->last_end_time_stamp_seen - cpi->first_time_stamp_ever) /
21357bc9febe8749e98a3812a0dc4380ceae75c29450Johann          10000000.000;
21367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
21377bc9febe8749e98a3812a0dc4380ceae75c29450Johann
21387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->b_calculate_psnr) {
21397bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->oxcf.number_of_layers > 1) {
21407bc9febe8749e98a3812a0dc4380ceae75c29450Johann          int i;
21417bc9febe8749e98a3812a0dc4380ceae75c29450Johann
21427bc9febe8749e98a3812a0dc4380ceae75c29450Johann          fprintf(f,
21437bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
21447bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  "GLPsnrP\tVPXSSIM\n");
21457bc9febe8749e98a3812a0dc4380ceae75c29450Johann          for (i = 0; i < (int)cpi->oxcf.number_of_layers; ++i) {
21467bc9febe8749e98a3812a0dc4380ceae75c29450Johann            double dr =
21477bc9febe8749e98a3812a0dc4380ceae75c29450Johann                (double)cpi->bytes_in_layer[i] * 8.0 / 1000.0 / time_encoded;
21487bc9febe8749e98a3812a0dc4380ceae75c29450Johann            double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
21497bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             cpi->common.Width * cpi->common.Height;
21507bc9febe8749e98a3812a0dc4380ceae75c29450Johann            double total_psnr =
21517bc9febe8749e98a3812a0dc4380ceae75c29450Johann                vpx_sse_to_psnr(samples, 255.0, cpi->total_error2[i]);
21527bc9febe8749e98a3812a0dc4380ceae75c29450Johann            double total_psnr2 =
21537bc9febe8749e98a3812a0dc4380ceae75c29450Johann                vpx_sse_to_psnr(samples, 255.0, cpi->total_error2_p[i]);
21547bc9febe8749e98a3812a0dc4380ceae75c29450Johann            double total_ssim =
21557bc9febe8749e98a3812a0dc4380ceae75c29450Johann                100 * pow(cpi->sum_ssim[i] / cpi->sum_weights[i], 8.0);
21567bc9febe8749e98a3812a0dc4380ceae75c29450Johann
21577bc9febe8749e98a3812a0dc4380ceae75c29450Johann            fprintf(f,
21587bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
21597bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    "%7.3f\t%7.3f\n",
21607bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    i, dr, cpi->sum_psnr[i] / cpi->frames_in_layer[i],
21617bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    total_psnr, cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
21627bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    total_psnr2, total_ssim);
21637bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
21647bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
21657bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double samples =
21667bc9febe8749e98a3812a0dc4380ceae75c29450Johann              3.0 / 2 * cpi->count * cpi->common.Width * cpi->common.Height;
21677bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double total_psnr =
21687bc9febe8749e98a3812a0dc4380ceae75c29450Johann              vpx_sse_to_psnr(samples, 255.0, cpi->total_sq_error);
21697bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double total_psnr2 =
21707bc9febe8749e98a3812a0dc4380ceae75c29450Johann              vpx_sse_to_psnr(samples, 255.0, cpi->total_sq_error2);
21717bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double total_ssim =
21727bc9febe8749e98a3812a0dc4380ceae75c29450Johann              100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
21737bc9febe8749e98a3812a0dc4380ceae75c29450Johann
21747bc9febe8749e98a3812a0dc4380ceae75c29450Johann          fprintf(f,
21757bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
21767bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  "GLPsnrP\tVPXSSIM\n");
21777bc9febe8749e98a3812a0dc4380ceae75c29450Johann          fprintf(f,
21787bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
21797bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  "%7.3f\n",
21807bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  dr, cpi->total / cpi->count, total_psnr,
21817bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  cpi->totalp / cpi->count, total_psnr2, total_ssim);
21827bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
21837bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
21847bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fclose(f);
218590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
218690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            f = fopen("qskip.stt", "a");
21871b362b15af34006e6a11974088a46d42b903418eJohann            fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
218890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(f);
218990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
21907bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
219190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
219290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
219390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
219490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef SPEEDSTATS
219590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->compressor_speed == 2) {
21977bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int i;
21987bc9febe8749e98a3812a0dc4380ceae75c29450Johann      FILE *f = fopen("cxspeed.stt", "a");
21997bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cnt_pm /= cpi->common.MBs;
220090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      for (i = 0; i < 16; ++i) fprintf(f, "%5d", frames_at_speed[i]);
220290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "\n");
22047bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fclose(f);
22057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
220690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
220790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
220890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
220990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
22107bc9febe8749e98a3812a0dc4380ceae75c29450Johann    {
22117bc9febe8749e98a3812a0dc4380ceae75c29450Johann      extern int count_mb_seg[4];
22127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      FILE *f = fopen("modes.stt", "a");
22137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      double dr = (double)cpi->framerate * (double)bytes * (double)8 /
22147bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  (double)count / (double)1000;
22157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "intra_mode in Intra Frames:\n");
22167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1],
22177bc9febe8749e98a3812a0dc4380ceae75c29450Johann              y_modes[2], y_modes[3], y_modes[4]);
22187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1],
22197bc9febe8749e98a3812a0dc4380ceae75c29450Johann              uv_modes[2], uv_modes[3]);
22207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "B: ");
22217bc9febe8749e98a3812a0dc4380ceae75c29450Johann      {
22227bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int i;
222390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22247bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (i = 0; i < 10; ++i) fprintf(f, "%8d, ", b_modes[i]);
222590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22267bc9febe8749e98a3812a0dc4380ceae75c29450Johann        fprintf(f, "\n");
22277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
222890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "Modes in Inter Frames:\n");
22307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
22317bc9febe8749e98a3812a0dc4380ceae75c29450Johann              inter_y_modes[0], inter_y_modes[1], inter_y_modes[2],
22327bc9febe8749e98a3812a0dc4380ceae75c29450Johann              inter_y_modes[3], inter_y_modes[4], inter_y_modes[5],
22337bc9febe8749e98a3812a0dc4380ceae75c29450Johann              inter_y_modes[6], inter_y_modes[7], inter_y_modes[8],
22347bc9febe8749e98a3812a0dc4380ceae75c29450Johann              inter_y_modes[9]);
22357bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0],
22367bc9febe8749e98a3812a0dc4380ceae75c29450Johann              inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
22377bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "B: ");
22387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      {
22397bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int i;
224090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22417bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (i = 0; i < 15; ++i) fprintf(f, "%8d, ", inter_b_modes[i]);
224290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22437bc9febe8749e98a3812a0dc4380ceae75c29450Johann        fprintf(f, "\n");
22447bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
22457bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1],
22467bc9febe8749e98a3812a0dc4380ceae75c29450Johann              count_mb_seg[2], count_mb_seg[3]);
22477bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4],
22487bc9febe8749e98a3812a0dc4380ceae75c29450Johann              inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4],
22497bc9febe8749e98a3812a0dc4380ceae75c29450Johann              inter_b_modes[NEW4X4]);
225090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22517bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fclose(f);
22527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
225390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
225490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
22567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    {
22577bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int i, j, k;
22587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      FILE *fmode = fopen("modecontext.c", "w");
225990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22607bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
22617bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
22627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(fmode,
22637bc9febe8749e98a3812a0dc4380ceae75c29450Johann              "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
226490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      for (i = 0; i < 10; ++i) {
22667bc9febe8749e98a3812a0dc4380ceae75c29450Johann        fprintf(fmode, "    { /* Above Mode :  %d */\n", i);
226790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22687bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (j = 0; j < 10; ++j) {
22697bc9febe8749e98a3812a0dc4380ceae75c29450Johann          fprintf(fmode, "        {");
227090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22717bc9febe8749e98a3812a0dc4380ceae75c29450Johann          for (k = 0; k < 10; ++k) {
22727bc9febe8749e98a3812a0dc4380ceae75c29450Johann            if (!intra_mode_stats[i][j][k])
22737bc9febe8749e98a3812a0dc4380ceae75c29450Johann              fprintf(fmode, " %5d, ", 1);
22747bc9febe8749e98a3812a0dc4380ceae75c29450Johann            else
22757bc9febe8749e98a3812a0dc4380ceae75c29450Johann              fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
22767bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
227790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22787bc9febe8749e98a3812a0dc4380ceae75c29450Johann          fprintf(fmode, "}, /* left_mode %d */\n", j);
22797bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
228090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22817bc9febe8749e98a3812a0dc4380ceae75c29450Johann        fprintf(fmode, "    },\n");
22827bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
228390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22847bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(fmode, "};\n");
22857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fclose(fmode);
22867bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
228790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
228890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
228990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(SECTIONBITS_OUTPUT)
229090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22917bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (0) {
22927bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int i;
22937bc9febe8749e98a3812a0dc4380ceae75c29450Johann      FILE *f = fopen("tokenbits.stt", "a");
229490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22957bc9febe8749e98a3812a0dc4380ceae75c29450Johann      for (i = 0; i < 28; ++i) fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
229690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22977bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fprintf(f, "\n");
22987bc9febe8749e98a3812a0dc4380ceae75c29450Johann      fclose(f);
22997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
230090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
230190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
230290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
230390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
230490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
230590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
230690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
230790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            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);
230890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
230990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
23107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
231190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
231279f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_MULTITHREAD
23137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8cx_remove_encoder_threads(cpi);
231479f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
231590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23161b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING
23177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_denoiser_free(&cpi->denoiser);
23181b362b15af34006e6a11974088a46d42b903418eJohann#endif
23197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  dealloc_compressor_data(cpi);
23207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->mb.ss);
23217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->tok);
2322df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  vpx_free(cpi->skin_map);
23237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->cyclic_refresh_map);
23247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->consec_zero_last);
23257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi->consec_zero_last_mvbias);
232690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_remove_common(&cpi->common);
23287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_free(cpi);
23297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  *ptr = 0;
233090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
233190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef OUTPUT_YUV_SRC
23327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  fclose(yuv_file);
233390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
2334ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifdef OUTPUT_YUV_DENOISED
23357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  fclose(yuv_denoised_file);
2336ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
2337df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#ifdef OUTPUT_YUV_SKINMAP
2338df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  fclose(yuv_skinmap_file);
2339df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
234090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
234190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
234290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
234390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (keyfile)
234490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(keyfile);
234590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
234690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (framepsnr)
234790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(framepsnr);
234890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
234990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (kf_list)
235090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(kf_list);
235190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
235290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
235390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
235490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
235590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
235690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                 unsigned char *recon, int recon_stride,
23577bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                 unsigned int cols, unsigned int rows) {
23587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned int row, col;
23597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint64_t total_sse = 0;
23607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int diff;
236190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (row = 0; row + 16 <= rows; row += 16) {
23637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (col = 0; col + 16 <= cols; col += 16) {
23647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      unsigned int sse;
236590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vpx_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse);
23677bc9febe8749e98a3812a0dc4380ceae75c29450Johann      total_sse += sse;
23687bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
236990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Handle odd-sized width */
23717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (col < cols) {
23727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      unsigned int border_row, border_col;
23737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      unsigned char *border_orig = orig;
23747bc9febe8749e98a3812a0dc4380ceae75c29450Johann      unsigned char *border_recon = recon;
237590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23767bc9febe8749e98a3812a0dc4380ceae75c29450Johann      for (border_row = 0; border_row < 16; ++border_row) {
23777bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (border_col = col; border_col < cols; ++border_col) {
23787bc9febe8749e98a3812a0dc4380ceae75c29450Johann          diff = border_orig[border_col] - border_recon[border_col];
23797bc9febe8749e98a3812a0dc4380ceae75c29450Johann          total_sse += diff * diff;
238090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
238190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23827bc9febe8749e98a3812a0dc4380ceae75c29450Johann        border_orig += orig_stride;
23837bc9febe8749e98a3812a0dc4380ceae75c29450Johann        border_recon += recon_stride;
23847bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
238590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
238690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23877bc9febe8749e98a3812a0dc4380ceae75c29450Johann    orig += orig_stride * 16;
23887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    recon += recon_stride * 16;
23897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
239090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Handle odd-sized height */
23927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (; row < rows; ++row) {
23937bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (col = 0; col < cols; ++col) {
23947bc9febe8749e98a3812a0dc4380ceae75c29450Johann      diff = orig[col] - recon[col];
23957bc9febe8749e98a3812a0dc4380ceae75c29450Johann      total_sse += diff * diff;
239690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
239790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    orig += orig_stride;
23997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    recon += recon_stride;
24007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
24017bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_clear_system_state();
24037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return total_sse;
240490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
240590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24067bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void generate_psnr_packet(VP8_COMP *cpi) {
24077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  YV12_BUFFER_CONFIG *orig = cpi->Source;
24087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
24097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  struct vpx_codec_cx_pkt pkt;
24107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint64_t sse;
24117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i;
24127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned int width = cpi->common.Width;
24137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned int height = cpi->common.Height;
24147bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.kind = VPX_CODEC_PSNR_PKT;
24167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sse = calc_plane_error(orig->y_buffer, orig->y_stride, recon->y_buffer,
24177bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         recon->y_stride, width, height);
24187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.sse[0] = sse;
24197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.sse[1] = sse;
24207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.samples[0] = width * height;
24217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.samples[1] = width * height;
24227bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  width = (width + 1) / 2;
24247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  height = (height + 1) / 2;
24257bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sse = calc_plane_error(orig->u_buffer, orig->uv_stride, recon->u_buffer,
24277bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         recon->uv_stride, width, height);
24287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.sse[0] += sse;
24297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.sse[2] = sse;
24307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.samples[0] += width * height;
24317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.samples[2] = width * height;
24327bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  sse = calc_plane_error(orig->v_buffer, orig->uv_stride, recon->v_buffer,
24347bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         recon->uv_stride, width, height);
24357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.sse[0] += sse;
24367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.sse[3] = sse;
24377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.samples[0] += width * height;
24387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  pkt.data.psnr.samples[3] = width * height;
24397bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < 4; ++i) {
24417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    pkt.data.psnr.psnr[i] = vpx_sse_to_psnr(pkt.data.psnr.samples[i], 255.0,
24427bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                            (double)(pkt.data.psnr.sse[i]));
24437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
244490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
244690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
244790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24487bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags) {
24497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (ref_frame_flags > 7) return -1;
245090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ref_frame_flags = ref_frame_flags;
24527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
245390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
24547bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags) {
24557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (ref_frame_flags > 7) return -1;
245690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.refresh_golden_frame = 0;
24587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.refresh_alt_ref_frame = 0;
24597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.refresh_last_frame = 0;
246090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (ref_frame_flags & VP8_LAST_FRAME) cpi->common.refresh_last_frame = 1;
246290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (ref_frame_flags & VP8_GOLD_FRAME) cpi->common.refresh_golden_frame = 1;
246490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (ref_frame_flags & VP8_ALTR_FRAME) cpi->common.refresh_alt_ref_frame = 1;
246690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
246890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
246990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24707bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag,
24717bc9febe8749e98a3812a0dc4380ceae75c29450Johann                      YV12_BUFFER_CONFIG *sd) {
24727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
24737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int ref_fb_idx;
24747bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (ref_frame_flag == VP8_LAST_FRAME) {
24767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    ref_fb_idx = cm->lst_fb_idx;
24777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (ref_frame_flag == VP8_GOLD_FRAME) {
24787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    ref_fb_idx = cm->gld_fb_idx;
24797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (ref_frame_flag == VP8_ALTR_FRAME) {
24807bc9febe8749e98a3812a0dc4380ceae75c29450Johann    ref_fb_idx = cm->alt_fb_idx;
24817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
24827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
24837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
248490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
2486f71323e297a928af368937089d3ed71239786f86Andreas Huber
24877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
248890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
24897bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag,
24907bc9febe8749e98a3812a0dc4380ceae75c29450Johann                      YV12_BUFFER_CONFIG *sd) {
24917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
24927bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int ref_fb_idx;
24947bc9febe8749e98a3812a0dc4380ceae75c29450Johann
24957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (ref_frame_flag == VP8_LAST_FRAME) {
24967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    ref_fb_idx = cm->lst_fb_idx;
24977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (ref_frame_flag == VP8_GOLD_FRAME) {
24987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    ref_fb_idx = cm->gld_fb_idx;
24997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (ref_frame_flag == VP8_ALTR_FRAME) {
25007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    ref_fb_idx = cm->alt_fb_idx;
25017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
25027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
25037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
250490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
2506f71323e297a928af368937089d3ed71239786f86Andreas Huber
25077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
250890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
25097bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_update_entropy(VP8_COMP *cpi, int update) {
25107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
25117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->refresh_entropy_probs = update;
251290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
251490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
251590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25167bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi) {
25177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
251890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* are we resizing the image */
25207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->horiz_scale != 0 || cm->vert_scale != 0) {
252190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_SPATIAL_RESAMPLING
25220a39d0a697ff3603e8c100300fda363658e10b23James Zern    int hr, hs, vr, vs;
25237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int tmp_height;
252490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->vert_scale == 3) {
25267bc9febe8749e98a3812a0dc4380ceae75c29450Johann      tmp_height = 9;
25277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
25287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      tmp_height = 11;
25297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
253090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Scale2Ratio(cm->horiz_scale, &hr, &hs);
25327bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Scale2Ratio(cm->vert_scale, &vr, &vs);
253390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25347bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
25357bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    tmp_height, hs, hr, vs, vr, 0);
253690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_yv12_extend_frame_borders(&cpi->scaled_source);
25387bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->Source = &cpi->scaled_source;
253990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
25407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
25417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->Source = sd;
25427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
25431b362b15af34006e6a11974088a46d42b903418eJohann}
254490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25457bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int resize_key_frame(VP8_COMP *cpi) {
254690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_SPATIAL_RESAMPLING
25477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
25487bc9febe8749e98a3812a0dc4380ceae75c29450Johann
25497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Do we need to apply resampling for one pass cbr.
25507bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * In one pass this is more limited than in two pass cbr.
25517bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * The test and any change is only made once per key frame sequence.
25527bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
25537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.allow_spatial_resampling &&
25547bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) {
25550a39d0a697ff3603e8c100300fda363658e10b23James Zern    int hr, hs, vr, vs;
25567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int new_width, new_height;
25577bc9febe8749e98a3812a0dc4380ceae75c29450Johann
25587bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* If we are below the resample DOWN watermark then scale down a
25597bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * notch.
25601b362b15af34006e6a11974088a46d42b903418eJohann     */
25617bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark *
25627bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             cpi->oxcf.optimal_buffer_level / 100)) {
25637bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->horiz_scale =
25647bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
25657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
25667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
25677bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Should we now start scaling back up */
25687bc9febe8749e98a3812a0dc4380ceae75c29450Johann    else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark *
25697bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                  cpi->oxcf.optimal_buffer_level / 100)) {
25707bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->horiz_scale =
25717bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
25727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
25737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
25747bc9febe8749e98a3812a0dc4380ceae75c29450Johann
25757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Get the new height and width */
25767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Scale2Ratio(cm->horiz_scale, &hr, &hs);
25777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Scale2Ratio(cm->vert_scale, &vr, &vs);
25787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
25797bc9febe8749e98a3812a0dc4380ceae75c29450Johann    new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
25807bc9febe8749e98a3812a0dc4380ceae75c29450Johann
25817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* If the image size has changed we need to reallocate the buffers
25827bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * and resample the source image
25837bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
25847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if ((cm->Width != new_width) || (cm->Height != new_height)) {
25857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->Width = new_width;
25867bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->Height = new_height;
25877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_alloc_compressor_data(cpi);
25887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      scale_and_extend_source(cpi->un_scaled_source, cpi);
25897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      return 1;
259090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
25917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
259290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
259390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
25947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
259590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
259679f15823c34ae1e423108295e416213200bb280fAndreas Huber
25977bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void update_alt_ref_frame_stats(VP8_COMP *cpi) {
25987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
259990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Select an interval before next GF or altref */
26017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->auto_gold) cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
260290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cpi->pass != 2) && cpi->frames_till_gf_update_due) {
26047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->current_gf_interval = cpi->frames_till_gf_update_due;
260590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26067bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Set the bits per frame that we should try and recover in
26077bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * subsequent inter frames to account for the extra GF spend...
26087bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * note that his does not apply for GF updates that occur
26097bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * coincident with a key frame as the extra cost of key frames is
26107bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * dealt with elsewhere.
26117bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
26127bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gf_overspend_bits += cpi->projected_frame_size;
26137bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->non_gf_bitrate_adjustment =
26147bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
26157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
261690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Update data structure that monitors level of reference to last GF */
26187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
26197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
26207bc9febe8749e98a3812a0dc4380ceae75c29450Johann
26217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* this frame refreshes means next frames don't unless specified by user */
26227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->frames_since_golden = 0;
26237bc9febe8749e98a3812a0dc4380ceae75c29450Johann
26247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear the alternate reference update pending flag. */
26257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->source_alt_ref_pending = 0;
26267bc9febe8749e98a3812a0dc4380ceae75c29450Johann
26277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set the alternate reference frame active flag */
26287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->source_alt_ref_active = 1;
26297bc9febe8749e98a3812a0dc4380ceae75c29450Johann}
26307bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void update_golden_frame_stats(VP8_COMP *cpi) {
26317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
26327bc9febe8749e98a3812a0dc4380ceae75c29450Johann
26337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Update the Golden frame usage counts. */
26347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_golden_frame) {
26357bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Select an interval before next GF */
26367bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (!cpi->auto_gold) cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
26377bc9febe8749e98a3812a0dc4380ceae75c29450Johann
26387bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0)) {
26397bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->current_gf_interval = cpi->frames_till_gf_update_due;
26407bc9febe8749e98a3812a0dc4380ceae75c29450Johann
26417bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Set the bits per frame that we should try and recover in
26427bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * subsequent inter frames to account for the extra GF spend...
26437bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * note that his does not apply for GF updates that occur
26447bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * coincident with a key frame as the extra cost of key frames
26457bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * is dealt with elsewhere.
26467bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
26477bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active) {
26487bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Calcluate GF bits to be recovered
26497bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * Projected size - av frame bits available for inter
26507bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * frames for clip as a whole
26511b362b15af34006e6a11974088a46d42b903418eJohann         */
26527bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->gf_overspend_bits +=
26537bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cpi->projected_frame_size - cpi->inter_frame_target);
26547bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
26557bc9febe8749e98a3812a0dc4380ceae75c29450Johann
26567bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->non_gf_bitrate_adjustment =
26577bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
265890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
265990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26601b362b15af34006e6a11974088a46d42b903418eJohann    /* Update data structure that monitors level of reference to last GF */
26617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2662f71323e297a928af368937089d3ed71239786f86Andreas Huber    cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
266390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* this frame refreshes means next frames don't unless specified by
26657bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * user
26667bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
26677bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->refresh_golden_frame = 0;
266891037db265ecdd914a26e056cf69207b4f50924ehkuang    cpi->frames_since_golden = 0;
266990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
26717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
26727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
26737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
26741b362b15af34006e6a11974088a46d42b903418eJohann
26757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* ******** Fixed Q test code only ************ */
26767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* If we are going to use the ALT reference for the next group of
26777bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * frames set a flag to say so.
26787bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
26797bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.fixed_q >= 0 && cpi->oxcf.play_alternate &&
26807bc9febe8749e98a3812a0dc4380ceae75c29450Johann        !cpi->common.refresh_alt_ref_frame) {
26817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->source_alt_ref_pending = 1;
26827bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
26837bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
268490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (!cpi->source_alt_ref_pending) cpi->source_alt_ref_active = 0;
268690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26877bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Decrement count down till next gf */
26887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->frames_till_gf_update_due > 0) cpi->frames_till_gf_update_due--;
268990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (!cpi->common.refresh_alt_ref_frame) {
26917bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Decrement count down till next gf */
26927bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->frames_till_gf_update_due > 0) cpi->frames_till_gf_update_due--;
269390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->frames_till_alt_ref_frame) cpi->frames_till_alt_ref_frame--;
269590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->frames_since_golden++;
269790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->frames_since_golden > 1) {
26997bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->recent_ref_frame_usage[INTRA_FRAME] +=
27007bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
27017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->recent_ref_frame_usage[LAST_FRAME] +=
27027bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
27037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
27047bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
27057bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
27067bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
270790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
27087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
270990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
271090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27111b362b15af34006e6a11974088a46d42b903418eJohann/* This function updates the reference frame probability estimates that
27121b362b15af34006e6a11974088a46d42b903418eJohann * will be used during mode selection
27131b362b15af34006e6a11974088a46d42b903418eJohann */
27147bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void update_rd_ref_frame_probs(VP8_COMP *cpi) {
27157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
27167bc9febe8749e98a3812a0dc4380ceae75c29450Johann
27177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
27187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const int rf_intra = rfct[INTRA_FRAME];
27197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const int rf_inter =
27207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
27217bc9febe8749e98a3812a0dc4380ceae75c29450Johann
27227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) {
27237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->prob_intra_coded = 255;
27247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->prob_last_coded = 128;
27257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->prob_gf_coded = 128;
27267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (!(rf_intra + rf_inter)) {
27277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->prob_intra_coded = 63;
27287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->prob_last_coded = 128;
27297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->prob_gf_coded = 128;
27307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
273190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* update reference frame costs since we can do better than what we got
27337bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * last frame.
27347bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
27357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers == 1) {
27367bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->common.refresh_alt_ref_frame) {
27377bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->prob_intra_coded += 40;
27387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->prob_intra_coded > 255) cpi->prob_intra_coded = 255;
27397bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->prob_last_coded = 200;
27407bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->prob_gf_coded = 1;
27417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->frames_since_golden == 0) {
27427bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->prob_last_coded = 214;
27437bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->frames_since_golden == 1) {
27447bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->prob_last_coded = 192;
27457bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->prob_gf_coded = 220;
27467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->source_alt_ref_active) {
27477bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->prob_gf_coded -= 20;
27487bc9febe8749e98a3812a0dc4380ceae75c29450Johann
27497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->prob_gf_coded < 10) cpi->prob_gf_coded = 10;
27507bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
27517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (!cpi->source_alt_ref_active) cpi->prob_gf_coded = 255;
27527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
275390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
275490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2755c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
27561b362b15af34006e6a11974088a46d42b903418eJohann/* 1 = key, 0 = inter */
27577bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int decide_key_frame(VP8_COMP *cpi) {
27587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
275990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int code_key_frame = 0;
276190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->kf_boost = 0;
276390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->Speed > 11) return 0;
276590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear down mmx registers */
27677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_clear_system_state();
276890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0)) {
27707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double change = 1.0 *
27717bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    abs((int)(cpi->mb.intra_error - cpi->last_intra_error)) /
27727bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    (1 + cpi->last_intra_error);
27737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double change2 =
27747bc9febe8749e98a3812a0dc4380ceae75c29450Johann        1.0 *
27757bc9febe8749e98a3812a0dc4380ceae75c29450Johann        abs((int)(cpi->mb.prediction_error - cpi->last_prediction_error)) /
27767bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (1 + cpi->last_prediction_error);
27777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double minerror = cm->MBs * 256;
277890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27797bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_intra_error = cpi->mb.intra_error;
27807bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_prediction_error = cpi->mb.prediction_error;
278190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15 &&
27837bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->mb.prediction_error > minerror &&
27847bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (change > .25 || change2 > .25)) {
27857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra >
27867bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * cpi->last_frame_percent_intra + 3*/
27877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      return 1;
278890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
278990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27907bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return 0;
27917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
279290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* If the following are true we might as well code a key frame */
27947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (((cpi->this_frame_percent_intra == 100) &&
27957bc9febe8749e98a3812a0dc4380ceae75c29450Johann       (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
27967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cpi->this_frame_percent_intra > 95) &&
27977bc9febe8749e98a3812a0dc4380ceae75c29450Johann       (cpi->this_frame_percent_intra >=
27987bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->last_frame_percent_intra + 5)))) {
27997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    code_key_frame = 1;
28007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
28017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* in addition if the following are true and this is not a golden frame
28027bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * then code a key frame Note that on golden frames there often seems
28037bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * to be a pop in intra useage anyway hence this restriction is
28047bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * designed to prevent spurious key frames. The Intra pop needs to be
28057bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * investigated.
28067bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
28077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  else if (((cpi->this_frame_percent_intra > 60) &&
28087bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cpi->this_frame_percent_intra >
28097bc9febe8749e98a3812a0dc4380ceae75c29450Johann             (cpi->last_frame_percent_intra * 2))) ||
28107bc9febe8749e98a3812a0dc4380ceae75c29450Johann           ((cpi->this_frame_percent_intra > 75) &&
28117bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cpi->this_frame_percent_intra >
28127bc9febe8749e98a3812a0dc4380ceae75c29450Johann             (cpi->last_frame_percent_intra * 3 / 2))) ||
28137bc9febe8749e98a3812a0dc4380ceae75c29450Johann           ((cpi->this_frame_percent_intra > 90) &&
28147bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cpi->this_frame_percent_intra >
28157bc9febe8749e98a3812a0dc4380ceae75c29450Johann             (cpi->last_frame_percent_intra + 10)))) {
28167bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (!cm->refresh_golden_frame) code_key_frame = 1;
28177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
281890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return code_key_frame;
282090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
282190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28227bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void Pass1Encode(VP8_COMP *cpi, size_t *size, unsigned char *dest,
28237bc9febe8749e98a3812a0dc4380ceae75c29450Johann                        unsigned int *frame_flags) {
28247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)size;
28257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)dest;
28267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  (void)frame_flags;
28277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_set_quantizer(cpi, 26);
282890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_first_pass(cpi);
283090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
283190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
283290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
283390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
283490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
283590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
283690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28371b362b15af34006e6a11974088a46d42b903418eJohann    /* write the frame */
283890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    FILE *yframe;
283990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
284090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    char filename[255];
284190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
284290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    sprintf(filename, "cx\\y%04d.raw", this_frame);
284390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yframe = fopen(filename, "wb");
284490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < frame->y_height; ++i)
284690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
284790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
284890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fclose(yframe);
284990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    sprintf(filename, "cx\\u%04d.raw", this_frame);
285090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yframe = fopen(filename, "wb");
285190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < frame->uv_height; ++i)
285390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
285490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
285590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fclose(yframe);
285690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    sprintf(filename, "cx\\v%04d.raw", this_frame);
285790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yframe = fopen(filename, "wb");
285890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < frame->uv_height; ++i)
286090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
286190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
286290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fclose(yframe);
286390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
286479f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
28651b362b15af34006e6a11974088a46d42b903418eJohann/* return of 0 means drop frame */
286679f15823c34ae1e423108295e416213200bb280fAndreas Huber
2867c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
28681b362b15af34006e6a11974088a46d42b903418eJohann/* Function to test for conditions that indeicate we should loop
28691b362b15af34006e6a11974088a46d42b903418eJohann * back and recode a frame.
28701b362b15af34006e6a11974088a46d42b903418eJohann */
28717bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int recode_loop_test(VP8_COMP *cpi, int high_limit, int low_limit, int q,
28727bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            int maxq, int minq) {
28737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int force_recode = 0;
28747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
28757bc9febe8749e98a3812a0dc4380ceae75c29450Johann
28767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Is frame recode allowed at all
28777bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * Yes if either recode mode 1 is selected or mode two is selcted
28787bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * and the frame is a key frame. golden frame or alt_ref_frame
28797bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
28807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cpi->sf.recode_loop == 1) ||
28817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cpi->sf.recode_loop == 2) &&
28827bc9febe8749e98a3812a0dc4380ceae75c29450Johann       ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame ||
28837bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cm->refresh_alt_ref_frame))) {
28847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* General over and under shoot tests */
28857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
28867bc9febe8749e98a3812a0dc4380ceae75c29450Johann        ((cpi->projected_frame_size < low_limit) && (q > minq))) {
28877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      force_recode = 1;
28887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
28897bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Special Constrained quality tests */
28907bc9febe8749e98a3812a0dc4380ceae75c29450Johann    else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
28917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Undershoot and below auto cq level */
28927bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((q > cpi->cq_target_quality) &&
28937bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->projected_frame_size < ((cpi->this_frame_target * 7) >> 3))) {
28947bc9febe8749e98a3812a0dc4380ceae75c29450Johann        force_recode = 1;
28957bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
28967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Severe undershoot and between auto and user cq level */
28977bc9febe8749e98a3812a0dc4380ceae75c29450Johann      else if ((q > cpi->oxcf.cq_level) &&
28987bc9febe8749e98a3812a0dc4380ceae75c29450Johann               (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
28997bc9febe8749e98a3812a0dc4380ceae75c29450Johann               (cpi->active_best_quality > cpi->oxcf.cq_level)) {
29007bc9febe8749e98a3812a0dc4380ceae75c29450Johann        force_recode = 1;
29017bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_best_quality = cpi->oxcf.cq_level;
29027bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
290379f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
29047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
290579f15823c34ae1e423108295e416213200bb280fAndreas Huber
29067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return force_recode;
290779f15823c34ae1e423108295e416213200bb280fAndreas Huber}
2908c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#endif  // !CONFIG_REALTIME_ONLY
290979f15823c34ae1e423108295e416213200bb280fAndreas Huber
29107bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void update_reference_frames(VP8_COMP *cpi) {
29117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
29127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
29131b362b15af34006e6a11974088a46d42b903418eJohann
29147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* At this point the new frame has been encoded.
29157bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * If any buffer copy / swapping is signaled it should be done here.
29167bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
29171b362b15af34006e6a11974088a46d42b903418eJohann
29187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) {
29197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME;
29201b362b15af34006e6a11974088a46d42b903418eJohann
29217bc9febe8749e98a3812a0dc4380ceae75c29450Johann    yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
29227bc9febe8749e98a3812a0dc4380ceae75c29450Johann    yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
29231b362b15af34006e6a11974088a46d42b903418eJohann
29247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
29251b362b15af34006e6a11974088a46d42b903418eJohann
29267bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
29277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
2928df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  } else {
29297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->refresh_alt_ref_frame) {
29307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      assert(!cm->copy_buffer_to_arf);
29317bc9febe8749e98a3812a0dc4380ceae75c29450Johann
29327bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
29337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
29347bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->alt_fb_idx = cm->new_fb_idx;
29357bc9febe8749e98a3812a0dc4380ceae75c29450Johann
29367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
29377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cm->copy_buffer_to_arf) {
29387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      assert(!(cm->copy_buffer_to_arf & ~0x3));
29391b362b15af34006e6a11974088a46d42b903418eJohann
29407bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->copy_buffer_to_arf == 1) {
29417bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cm->alt_fb_idx != cm->lst_fb_idx) {
29427bc9febe8749e98a3812a0dc4380ceae75c29450Johann          yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
29437bc9febe8749e98a3812a0dc4380ceae75c29450Johann          yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
29447bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cm->alt_fb_idx = cm->lst_fb_idx;
29451b362b15af34006e6a11974088a46d42b903418eJohann
29467bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->current_ref_frames[ALTREF_FRAME] =
29477bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->current_ref_frames[LAST_FRAME];
29481b362b15af34006e6a11974088a46d42b903418eJohann        }
2949df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      } else {
29507bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cm->alt_fb_idx != cm->gld_fb_idx) {
29517bc9febe8749e98a3812a0dc4380ceae75c29450Johann          yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
29527bc9febe8749e98a3812a0dc4380ceae75c29450Johann          yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
29537bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cm->alt_fb_idx = cm->gld_fb_idx;
29541b362b15af34006e6a11974088a46d42b903418eJohann
29557bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->current_ref_frames[ALTREF_FRAME] =
29567bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->current_ref_frames[GOLDEN_FRAME];
29571b362b15af34006e6a11974088a46d42b903418eJohann        }
29587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
29597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
29601b362b15af34006e6a11974088a46d42b903418eJohann
29617bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->refresh_golden_frame) {
29627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      assert(!cm->copy_buffer_to_gf);
29637bc9febe8749e98a3812a0dc4380ceae75c29450Johann
29647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
29657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
29667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->gld_fb_idx = cm->new_fb_idx;
29671b362b15af34006e6a11974088a46d42b903418eJohann
29687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
29697bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cm->copy_buffer_to_gf) {
29707bc9febe8749e98a3812a0dc4380ceae75c29450Johann      assert(!(cm->copy_buffer_to_arf & ~0x3));
29711b362b15af34006e6a11974088a46d42b903418eJohann
29727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->copy_buffer_to_gf == 1) {
29737bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cm->gld_fb_idx != cm->lst_fb_idx) {
29747bc9febe8749e98a3812a0dc4380ceae75c29450Johann          yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
29757bc9febe8749e98a3812a0dc4380ceae75c29450Johann          yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
29767bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cm->gld_fb_idx = cm->lst_fb_idx;
29777bc9febe8749e98a3812a0dc4380ceae75c29450Johann
29787bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->current_ref_frames[GOLDEN_FRAME] =
29797bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->current_ref_frames[LAST_FRAME];
29801b362b15af34006e6a11974088a46d42b903418eJohann        }
2981df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      } else {
29827bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cm->alt_fb_idx != cm->gld_fb_idx) {
29837bc9febe8749e98a3812a0dc4380ceae75c29450Johann          yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
29847bc9febe8749e98a3812a0dc4380ceae75c29450Johann          yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
29857bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cm->gld_fb_idx = cm->alt_fb_idx;
29861b362b15af34006e6a11974088a46d42b903418eJohann
29877bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->current_ref_frames[GOLDEN_FRAME] =
29887bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->current_ref_frames[ALTREF_FRAME];
29891b362b15af34006e6a11974088a46d42b903418eJohann        }
29907bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
29911b362b15af34006e6a11974088a46d42b903418eJohann    }
29927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
29931b362b15af34006e6a11974088a46d42b903418eJohann
29947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_last_frame) {
29957bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
29967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
29977bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->lst_fb_idx = cm->new_fb_idx;
29981b362b15af34006e6a11974088a46d42b903418eJohann
29997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
30007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
3001ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3002ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_TEMPORAL_DENOISING
30037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.noise_sensitivity) {
30047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* we shouldn't have to keep multiple copies as we know in advance which
30057bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * buffer we should start - for now to get something up and running
30067bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * I've chosen to copy the buffers
30077bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
30087bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type == KEY_FRAME) {
30097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int i;
30107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      for (i = LAST_FRAME; i < MAX_REF_FRAMES; ++i)
30117bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_running_avg[i]);
3012df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    } else {
30137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_yv12_extend_frame_borders(
30147bc9febe8749e98a3812a0dc4380ceae75c29450Johann          &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
3015ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
30167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf) {
30177bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
30187bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
30197bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
30207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->refresh_golden_frame || cm->copy_buffer_to_gf) {
30217bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
30227bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
30237bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
30247bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->refresh_last_frame) {
30257bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
30267bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
30277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
3028ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
30297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.noise_sensitivity == 4)
30307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_last_source);
30317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
3032ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
30331b362b15af34006e6a11974088a46d42b903418eJohann}
30341b362b15af34006e6a11974088a46d42b903418eJohann
30357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic int measure_square_diff_partial(YV12_BUFFER_CONFIG *source,
30367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                       YV12_BUFFER_CONFIG *dest,
30377bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                       VP8_COMP *cpi) {
30387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i, j;
30397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Total = 0;
30407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int num_blocks = 0;
30417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int skip = 2;
30427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int min_consec_zero_last = 10;
30437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int tot_num_blocks = (source->y_height * source->y_width) >> 8;
30447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned char *src = source->y_buffer;
30457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned char *dst = dest->y_buffer;
30467bc9febe8749e98a3812a0dc4380ceae75c29450Johann
30477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Loop through the Y plane, every |skip| blocks along rows and colmumns,
30487bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * summing the square differences, and only for blocks that have been
30497bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * zero_last mode at least |x| frames in a row.
30507bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
30517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < source->y_height; i += 16 * skip) {
30527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int block_index_row = (i >> 4) * cpi->common.mb_cols;
30537bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (j = 0; j < source->y_width; j += 16 * skip) {
30547bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int index = block_index_row + (j >> 4);
30557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
30567bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int sse;
30577bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Total += vpx_mse16x16(src + j, source->y_stride, dst + j,
30587bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              dest->y_stride, &sse);
30597bc9febe8749e98a3812a0dc4380ceae75c29450Johann        num_blocks++;
30607bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
30617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
30627bc9febe8749e98a3812a0dc4380ceae75c29450Johann    src += 16 * skip * source->y_stride;
30637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    dst += 16 * skip * dest->y_stride;
30647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
30657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Only return non-zero if we have at least ~1/16 samples for estimate.
30667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (num_blocks > (tot_num_blocks >> 4)) {
30670a39d0a697ff3603e8c100300fda363658e10b23James Zern    assert(num_blocks != 0);
30687bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return (Total / num_blocks);
30697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
30707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return 0;
30717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
30727bc9febe8749e98a3812a0dc4380ceae75c29450Johann}
30737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
30747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_TEMPORAL_DENOISING
30757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic void process_denoiser_mode_change(VP8_COMP *cpi) {
30767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const VP8_COMMON *const cm = &cpi->common;
30777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, j;
30787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int total = 0;
30797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int num_blocks = 0;
30807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Number of blocks skipped along row/column in computing the
30817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // nmse (normalized mean square error) of source.
30827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int skip = 2;
30837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Only select blocks for computing nmse that have been encoded
30847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // as ZERO LAST min_consec_zero_last frames in a row.
30857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Scale with number of temporal layers.
30867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int min_consec_zero_last = 12 / cpi->oxcf.number_of_layers;
30877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Decision is tested for changing the denoising mode every
30887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // num_mode_change times this function is called. Note that this
30897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // function called every 8 frames, so (8 * num_mode_change) is number
30907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // of frames where denoising mode change is tested for switch.
30917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int num_mode_change = 20;
30927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Framerate factor, to compensate for larger mse at lower framerates.
30937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Use ref_framerate, which is full source framerate for temporal layers.
30947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // TODO(marpan): Adjust this factor.
30957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int fac_framerate = cpi->ref_framerate < 25.0f ? 80 : 100;
30967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int tot_num_blocks = cm->mb_rows * cm->mb_cols;
30977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int ystride = cpi->Source->y_stride;
30987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  unsigned char *src = cpi->Source->y_buffer;
30997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  unsigned char *dst = cpi->denoiser.yv12_last_source.y_buffer;
31007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  static const unsigned char const_source[16] = { 128, 128, 128, 128, 128, 128,
31017bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                  128, 128, 128, 128, 128, 128,
31027bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                  128, 128, 128, 128 };
31037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int bandwidth = (int)(cpi->target_bandwidth);
31047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // For temporal layers, use full bandwidth (top layer).
31057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  if (cpi->oxcf.number_of_layers > 1) {
31067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    LAYER_CONTEXT *lc = &cpi->layer_context[cpi->oxcf.number_of_layers - 1];
31077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bandwidth = (int)(lc->target_bandwidth);
31087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
31097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Loop through the Y plane, every skip blocks along rows and columns,
31107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // summing the normalized mean square error, only for blocks that have
31117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // been encoded as ZEROMV LAST at least min_consec_zero_last least frames in
31127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // a row and have small sum difference between current and previous frame.
31137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Normalization here is by the contrast of the current frame block.
31147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < cm->Height; i += 16 * skip) {
31157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    int block_index_row = (i >> 4) * cm->mb_cols;
31167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (j = 0; j < cm->Width; j += 16 * skip) {
31177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      int index = block_index_row + (j >> 4);
31187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
31197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        unsigned int sse;
31207bc9febe8749e98a3812a0dc4380ceae75c29450Johann        const unsigned int var =
31217bc9febe8749e98a3812a0dc4380ceae75c29450Johann            vpx_variance16x16(src + j, ystride, dst + j, ystride, &sse);
31227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        // Only consider this block as valid for noise measurement
31237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        // if the sum_diff average of the current and previous frame
31247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        // is small (to avoid effects from lighting change).
31257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        if ((sse - var) < 128) {
31267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          unsigned int sse2;
31277bc9febe8749e98a3812a0dc4380ceae75c29450Johann          const unsigned int act =
31287bc9febe8749e98a3812a0dc4380ceae75c29450Johann              vpx_variance16x16(src + j, ystride, const_source, 0, &sse2);
31297bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (act > 0) total += sse / act;
31307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          num_blocks++;
31317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        }
31327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      }
31337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
31347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    src += 16 * skip * ystride;
31357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dst += 16 * skip * ystride;
31367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
31377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  total = total * fac_framerate / 100;
31387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
31397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Only consider this frame as valid sample if we have computed nmse over
31407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // at least ~1/16 blocks, and Total > 0 (Total == 0 can happen if the
31417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // application inputs duplicate frames, or contrast is all zero).
31427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (total > 0 && (num_blocks > (tot_num_blocks >> 4))) {
31437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    // Update the recursive mean square source_diff.
31447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    total = (total << 8) / num_blocks;
31457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (cpi->denoiser.nmse_source_diff_count == 0) {
31467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // First sample in new interval.
31477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cpi->denoiser.nmse_source_diff = total;
31487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cpi->denoiser.qp_avg = cm->base_qindex;
31497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    } else {
31507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // For subsequent samples, use average with weight ~1/4 for new sample.
31517bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->denoiser.nmse_source_diff =
31527bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (int)((total + 3 * cpi->denoiser.nmse_source_diff) >> 2);
31537bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->denoiser.qp_avg =
31547bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (int)((cm->base_qindex + 3 * cpi->denoiser.qp_avg) >> 2);
31557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
31567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cpi->denoiser.nmse_source_diff_count++;
31577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
31587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // Check for changing the denoiser mode, when we have obtained #samples =
31597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // num_mode_change. Condition the change also on the bitrate and QP.
31607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  if (cpi->denoiser.nmse_source_diff_count == num_mode_change) {
31617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    // Check for going up: from normal to aggressive mode.
31627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if ((cpi->denoiser.denoiser_mode == kDenoiserOnYUV) &&
31637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        (cpi->denoiser.nmse_source_diff >
31647bc9febe8749e98a3812a0dc4380ceae75c29450Johann         cpi->denoiser.threshold_aggressive_mode) &&
31657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        (cpi->denoiser.qp_avg < cpi->denoiser.qp_threshold_up &&
31667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian         bandwidth > cpi->denoiser.bitrate_threshold)) {
31677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUVAggressive);
31687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    } else {
31697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // Check for going down: from aggressive to normal mode.
31707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      if (((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
31717bc9febe8749e98a3812a0dc4380ceae75c29450Johann           (cpi->denoiser.nmse_source_diff <
31727bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->denoiser.threshold_aggressive_mode)) ||
31737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          ((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
31747bc9febe8749e98a3812a0dc4380ceae75c29450Johann           (cpi->denoiser.qp_avg > cpi->denoiser.qp_threshold_down ||
31757bc9febe8749e98a3812a0dc4380ceae75c29450Johann            bandwidth < cpi->denoiser.bitrate_threshold))) {
31767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
31777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      }
31787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
31797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    // Reset metric and counter for next interval.
31807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cpi->denoiser.nmse_source_diff = 0;
31817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cpi->denoiser.qp_avg = 0;
31827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cpi->denoiser.nmse_source_diff_count = 0;
31837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
31847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
31857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
31867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
31877bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) {
31887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const FRAME_TYPE frame_type = cm->frame_type;
31891b362b15af34006e6a11974088a46d42b903418eJohann
31907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int update_any_ref_buffers = 1;
31917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->common.refresh_last_frame == 0 &&
31927bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->common.refresh_golden_frame == 0 &&
31937bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->common.refresh_alt_ref_frame == 0) {
31947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    update_any_ref_buffers = 0;
31957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
31967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
31977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->no_lpf) {
31987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->filter_level = 0;
31997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
32007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    struct vpx_usec_timer timer;
320179f15823c34ae1e423108295e416213200bb280fAndreas Huber
32027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_clear_system_state();
320379f15823c34ae1e423108295e416213200bb280fAndreas Huber
32047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_usec_timer_start(&timer);
32057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->sf.auto_filter == 0) {
32067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_TEMPORAL_DENOISING
32077bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
32087bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Use the denoised buffer for selecting base loop filter level.
32097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Denoised signal for current frame is stored in INTRA_FRAME.
32107bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // No denoising on key frames.
32117bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8cx_pick_filter_level_fast(
32127bc9febe8749e98a3812a0dc4380ceae75c29450Johann            &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi);
32137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
32147bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8cx_pick_filter_level_fast(cpi->Source, cpi);
32157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
32167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
32177bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8cx_pick_filter_level_fast(cpi->Source, cpi);
32187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
32197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
32207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_TEMPORAL_DENOISING
32217bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
32227bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Use the denoised buffer for selecting base loop filter level.
32237bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Denoised signal for current frame is stored in INTRA_FRAME.
32247bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // No denoising on key frames.
32257bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8cx_pick_filter_level(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
32267bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                cpi);
32277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
32287bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8cx_pick_filter_level(cpi->Source, cpi);
32297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
32307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
32317bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8cx_pick_filter_level(cpi->Source, cpi);
32327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
32337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
32341b362b15af34006e6a11974088a46d42b903418eJohann
32357bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->filter_level > 0) {
32367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8cx_set_alt_lf_level(cpi, cm->filter_level);
323779f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
323879f15823c34ae1e423108295e416213200bb280fAndreas Huber
32397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_usec_timer_mark(&timer);
32407bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
32417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
32427bc9febe8749e98a3812a0dc4380ceae75c29450Johann
324379f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_MULTITHREAD
3244df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (vpx_atomic_load_acquire(&cpi->b_multi_threaded)) {
32457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
32467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
324779f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
324879f15823c34ae1e423108295e416213200bb280fAndreas Huber
32497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // No need to apply loop-filter if the encoded frame does not update
32507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // any reference buffers.
32517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->filter_level > 0 && update_any_ref_buffers) {
32527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
32537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
32541b362b15af34006e6a11974088a46d42b903418eJohann
32557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_yv12_extend_frame_borders(cm->frame_to_show);
325679f15823c34ae1e423108295e416213200bb280fAndreas Huber}
3257f71323e297a928af368937089d3ed71239786f86Andreas Huber
32587bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
32597bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      unsigned char *dest,
32607bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      unsigned char *dest_end,
32617bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      unsigned int *frame_flags) {
32627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Q;
32637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int frame_over_shoot_limit;
32647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int frame_under_shoot_limit;
326590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Loop = 0;
32677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int loop_count;
326890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
32707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int active_worst_qchanged = 0;
32711b362b15af34006e6a11974088a46d42b903418eJohann
3272c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
32737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int q_low;
32747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int q_high;
32757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int zbin_oq_high;
32767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int zbin_oq_low = 0;
32777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int top_index;
32787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int bottom_index;
32797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int overshoot_seen = 0;
32807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int undershoot_seen = 0;
32811b362b15af34006e6a11974088a46d42b903418eJohann#endif
328290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
32847bc9febe8749e98a3812a0dc4380ceae75c29450Johann                        cpi->oxcf.optimal_buffer_level / 100);
32857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int drop_mark75 = drop_mark * 2 / 3;
32867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int drop_mark50 = drop_mark / 4;
32877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int drop_mark25 = drop_mark / 8;
328879f15823c34ae1e423108295e416213200bb280fAndreas Huber
32897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear down mmx registers to allow floating point in what follows */
32907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_clear_system_state();
329190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->force_next_frame_intra) {
32937bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->frame_type = KEY_FRAME; /* delayed intra frame */
32947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->force_next_frame_intra = 0;
32957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
32961b362b15af34006e6a11974088a46d42b903418eJohann
32977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* For an alt ref frame in 2 pass we skip the call to the second pass
32987bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * function that sets the target bandwidth
32997bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
33007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  switch (cpi->pass) {
3301c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
33027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    case 2:
33037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->common.refresh_alt_ref_frame) {
33047bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Per frame bit target for the alt ref frame */
33057bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
33067bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* per second target bitrate */
33077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->target_bandwidth =
33087bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (int)(cpi->twopass.gf_bits * cpi->output_framerate);
33097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
33107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
33117bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif  // !CONFIG_REALTIME_ONLY
33127bc9febe8749e98a3812a0dc4380ceae75c29450Johann    default:
33137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->per_frame_bandwidth =
33147bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (int)(cpi->target_bandwidth / cpi->output_framerate);
33157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
33167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
331790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Default turn off buffer to buffer copying */
33197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->copy_buffer_to_gf = 0;
33207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->copy_buffer_to_arf = 0;
332190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear zbin over-quant value and mode boost values. */
33237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.zbin_over_quant = 0;
33247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.zbin_mode_boost = 0;
332590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Enable or disable mode based tweaking of the zbin
33277bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * For 2 Pass Only used where GF/ARF prediction quality
33287bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * is above a threshold
33297bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
33307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.zbin_mode_boost_enabled = 1;
33317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass == 2) {
33327bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->gfu_boost <= 400) {
33337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->mb.zbin_mode_boost_enabled = 0;
333479f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
33357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
333690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Current default encoder behaviour for the altref sign bias */
33387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->source_alt_ref_active) {
33397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
33407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
33417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
33427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
334390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Check to see if a key frame is signaled
33457bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * For two pass with auto key frame enabled cm->frame_type may already
33467bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * be set, but not for one pass.
33477bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
33487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cm->current_video_frame == 0) || (cm->frame_flags & FRAMEFLAGS_KEY) ||
33497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->oxcf.auto_key &&
33507bc9febe8749e98a3812a0dc4380ceae75c29450Johann       (cpi->frames_since_key % cpi->key_frame_frequency == 0))) {
33517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Key frame from VFW/auto-keyframe/first frame */
33527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->frame_type = KEY_FRAME;
33537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_TEMPORAL_DENOISING
33547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.noise_sensitivity == 4) {
33557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // For adaptive mode, reset denoiser to normal mode on key frame.
33567bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
335790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
33587bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif
33597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
336090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33611b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING
33627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.mr_total_resolutions > 1) {
33637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    LOWER_RES_FRAME_INFO *low_res_frame_info =
33647bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
33657bc9febe8749e98a3812a0dc4380ceae75c29450Johann
33667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.mr_encoder_id) {
33677bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // TODO(marpan): This constraint shouldn't be needed, as we would like
33687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // to allow for key frame setting (forced or periodic) defined per
33697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // spatial layer. For now, keep this in.
33707bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->frame_type = low_res_frame_info->frame_type;
33717bc9febe8749e98a3812a0dc4380ceae75c29450Johann
33727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // Check if lower resolution is available for motion vector reuse.
33737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->frame_type != KEY_FRAME) {
33747bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->mr_low_res_mv_avail = 1;
33757bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);
33767bc9febe8749e98a3812a0dc4380ceae75c29450Johann
33777bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->ref_frame_flags & VP8_LAST_FRAME)
33787bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->mr_low_res_mv_avail &=
33797bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (cpi->current_ref_frames[LAST_FRAME] ==
33807bc9febe8749e98a3812a0dc4380ceae75c29450Johann               low_res_frame_info->low_res_ref_frames[LAST_FRAME]);
33817bc9febe8749e98a3812a0dc4380ceae75c29450Johann
33827bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
33837bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->mr_low_res_mv_avail &=
33847bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (cpi->current_ref_frames[GOLDEN_FRAME] ==
33857bc9febe8749e98a3812a0dc4380ceae75c29450Johann               low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);
33867bc9febe8749e98a3812a0dc4380ceae75c29450Johann
33877bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Don't use altref to determine whether low res is available.
33887bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // TODO (marpan): Should we make this type of condition on a
33897bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // per-reference frame basis?
33907bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /*
33917bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
33927bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
33937bc9febe8749e98a3812a0dc4380ceae75c29450Johann                     == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
33947bc9febe8749e98a3812a0dc4380ceae75c29450Johann        */
33957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      }
33967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
339790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // On a key frame: For the lowest resolution, keep track of the key frame
33997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // counter value. For the higher resolutions, reset the current video
34007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // frame counter to that of the lowest resolution.
34017bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // This is done to the handle the case where we may stop/start encoding
34027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // higher layer(s). The restart-encoding of higher layer is only signaled
34037bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // by a key frame for now.
34047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // TODO (marpan): Add flag to indicate restart-encoding of higher layer.
34057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type == KEY_FRAME) {
34067bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.mr_encoder_id) {
34077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // If the initial starting value of the buffer level is zero (this can
34087bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // happen because we may have not started encoding this higher stream),
34097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // then reset it to non-zero value based on |starting_buffer_level|.
34107bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->common.current_video_frame == 0 && cpi->buffer_level == 0) {
34117bc9febe8749e98a3812a0dc4380ceae75c29450Johann          unsigned int i;
34127bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
34137bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->buffer_level = cpi->oxcf.starting_buffer_level;
34147bc9febe8749e98a3812a0dc4380ceae75c29450Johann          for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
34157bc9febe8749e98a3812a0dc4380ceae75c29450Johann            LAYER_CONTEXT *lc = &cpi->layer_context[i];
34167bc9febe8749e98a3812a0dc4380ceae75c29450Johann            lc->bits_off_target = lc->starting_buffer_level;
34177bc9febe8749e98a3812a0dc4380ceae75c29450Johann            lc->buffer_level = lc->starting_buffer_level;
34187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          }
34197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        }
34207bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->common.current_video_frame =
34217bc9febe8749e98a3812a0dc4380ceae75c29450Johann            low_res_frame_info->key_frame_counter_value;
34227bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
34237bc9febe8749e98a3812a0dc4380ceae75c29450Johann        low_res_frame_info->key_frame_counter_value =
34247bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->common.current_video_frame;
34257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      }
34267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
34277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
34287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
34291b362b15af34006e6a11974088a46d42b903418eJohann
34307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Find the reference frame closest to the current frame.
34317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->closest_reference_frame = LAST_FRAME;
34327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type != KEY_FRAME) {
34337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;
34347bc9febe8749e98a3812a0dc4380ceae75c29450Johann    MV_REFERENCE_FRAME closest_ref = INTRA_FRAME;
34357bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
34367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      closest_ref = LAST_FRAME;
34377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->ref_frame_flags & VP8_GOLD_FRAME) {
34387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      closest_ref = GOLDEN_FRAME;
34397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->ref_frame_flags & VP8_ALTR_FRAME) {
34407bc9febe8749e98a3812a0dc4380ceae75c29450Johann      closest_ref = ALTREF_FRAME;
34417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
34427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 1; i <= 3; ++i) {
34437bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vpx_ref_frame_type_t ref_frame_type =
34447bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (vpx_ref_frame_type_t)((i == 3) ? 4 : i);
34457bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->ref_frame_flags & ref_frame_type) {
34467bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if ((cm->current_video_frame - cpi->current_ref_frames[i]) <
34477bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cm->current_video_frame - cpi->current_ref_frames[closest_ref])) {
34487bc9febe8749e98a3812a0dc4380ceae75c29450Johann          closest_ref = i;
34491b362b15af34006e6a11974088a46d42b903418eJohann        }
34507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      }
34511b362b15af34006e6a11974088a46d42b903418eJohann    }
34527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->closest_reference_frame = closest_ref;
34537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
34541b362b15af34006e6a11974088a46d42b903418eJohann
34557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set various flags etc to special state if it is a key frame */
34567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) {
34577bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;
3458538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
34597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // Set the loop filter deltas and segmentation map update
34607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    setup_features(cpi);
346190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34627bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* The alternate reference frame cannot be active for a key frame */
34637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->source_alt_ref_active = 0;
3464ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
34657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Reset the RD threshold multipliers to default of * 1 (128) */
34667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < MAX_MODES; ++i) {
34677bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->mb.rd_thresh_mult[i] = 128;
346890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
346990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // Reset the zero_last counter to 0 on key frame.
34717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
34727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    memset(cpi->consec_zero_last_mvbias, 0,
34737bc9febe8749e98a3812a0dc4380ceae75c29450Johann           (cpi->common.mb_rows * cpi->common.mb_cols));
34747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
34757bc9febe8749e98a3812a0dc4380ceae75c29450Johann
347690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
34771b362b15af34006e6a11974088a46d42b903418eJohann    /* Experimental code for lagged compress and one pass
34781b362b15af34006e6a11974088a46d42b903418eJohann     * Initialise one_pass GF frames stats
34791b362b15af34006e6a11974088a46d42b903418eJohann     * Update stats used for GF selection
34801b362b15af34006e6a11974088a46d42b903418eJohann     */
348190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
348290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
348390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
348490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
348590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
348690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
348790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
348890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
348990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
349090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
349190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
349290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
349390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
349490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
349590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  update_rd_ref_frame_probs(cpi);
349790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->drop_frames_allowed) {
34997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* The reset to decimation 0 is only done here for one pass.
35007bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * Once it is set two pass leaves decimation on till the next kf.
35017bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
35027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0)) {
35037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->decimation_factor--;
35047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
350590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35067bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0) {
35077bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->decimation_factor = 1;
350890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35097bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->buffer_level < drop_mark25 &&
35107bc9febe8749e98a3812a0dc4380ceae75c29450Johann               (cpi->decimation_factor == 2 || cpi->decimation_factor == 3)) {
35117bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->decimation_factor = 3;
35127bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->buffer_level < drop_mark50 &&
35137bc9febe8749e98a3812a0dc4380ceae75c29450Johann               (cpi->decimation_factor == 1 || cpi->decimation_factor == 2)) {
35147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->decimation_factor = 2;
35157bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->buffer_level < drop_mark75 &&
35167bc9febe8749e98a3812a0dc4380ceae75c29450Johann               (cpi->decimation_factor == 0 || cpi->decimation_factor == 1)) {
35177bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->decimation_factor = 1;
351890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
35197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
352090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* The following decimates the frame rate according to a regular
35227bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
35237bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * prevent buffer under-run in CBR mode. Alternatively it might be
35247bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * desirable in some situations to drop frame rate but throw more bits
35257bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * at each frame.
35267bc9febe8749e98a3812a0dc4380ceae75c29450Johann   *
35277bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * Note that dropping a key frame can be problematic if spatial
35287bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * resampling is also active
35297bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
35307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->decimation_factor > 0) {
35317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    switch (cpi->decimation_factor) {
35327bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 1:
35337bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
35347bc9febe8749e98a3812a0dc4380ceae75c29450Johann        break;
35357bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 2:
35367bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
35377bc9febe8749e98a3812a0dc4380ceae75c29450Johann        break;
35387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 3:
35397bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
35407bc9febe8749e98a3812a0dc4380ceae75c29450Johann        break;
35417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
354290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35437bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Note that we should not throw out a key frame (especially when
35447bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * spatial resampling is enabled).
35457bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
35467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type == KEY_FRAME) {
35477bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->decimation_count = cpi->decimation_factor;
35487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->decimation_count > 0) {
35497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->decimation_count--;
35501b362b15af34006e6a11974088a46d42b903418eJohann
35517bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->bits_off_target += cpi->av_per_frame_bandwidth;
35527bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
35537bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
35547bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
35551b362b15af34006e6a11974088a46d42b903418eJohann
35561b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING
35577bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_store_drop_frame_info(cpi);
35581b362b15af34006e6a11974088a46d42b903418eJohann#endif
35591b362b15af34006e6a11974088a46d42b903418eJohann
35607bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->current_video_frame++;
35617bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->frames_since_key++;
35627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // We advance the temporal pattern for dropped frames.
35637bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->temporal_pattern_counter++;
356490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35651b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_INTERNAL_STATS
35667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->count++;
356790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
356890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->buffer_level = cpi->bits_off_target;
357090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35717bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.number_of_layers > 1) {
35727bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int i;
35731b362b15af34006e6a11974088a46d42b903418eJohann
35747bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Propagate bits saved by dropping the frame to higher
35757bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * layers
35767bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
35777bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
35787bc9febe8749e98a3812a0dc4380ceae75c29450Johann          LAYER_CONTEXT *lc = &cpi->layer_context[i];
35797bc9febe8749e98a3812a0dc4380ceae75c29450Johann          lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate);
35807bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (lc->bits_off_target > lc->maximum_buffer_size) {
35817bc9febe8749e98a3812a0dc4380ceae75c29450Johann            lc->bits_off_target = lc->maximum_buffer_size;
35827bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
35837bc9febe8749e98a3812a0dc4380ceae75c29450Johann          lc->buffer_level = lc->bits_off_target;
358490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
35857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
35867bc9febe8749e98a3812a0dc4380ceae75c29450Johann
35877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      return;
35887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
35897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->decimation_count = cpi->decimation_factor;
359090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
35917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
35927bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->decimation_count = 0;
35937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
359490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Decide how big to make the frame */
35967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!vp8_pick_frame_size(cpi)) {
35977bc9febe8749e98a3812a0dc4380ceae75c29450Johann/*TODO: 2 drop_frame and return code could be put together. */
35981b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING
35997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_store_drop_frame_info(cpi);
36001b362b15af34006e6a11974088a46d42b903418eJohann#endif
36017bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->current_video_frame++;
36027bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->frames_since_key++;
36037bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // We advance the temporal pattern for dropped frames.
36047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->temporal_pattern_counter++;
36057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return;
36067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
360790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
36097bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * This has a knock on effect on active best quality as well.
36107bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * For CBR if the buffer reaches its maximum level then we can no longer
36117bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * save up bits for later frames so we might as well use them up
36127bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * on the current frame.
36137bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
36147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
36157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) &&
36167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->buffered_mode) {
36177bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Max adjustment is 1/4 */
36187bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int Adjustment = cpi->active_worst_quality / 4;
36197bc9febe8749e98a3812a0dc4380ceae75c29450Johann
36207bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (Adjustment) {
36217bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int buff_lvl_step;
36227bc9febe8749e98a3812a0dc4380ceae75c29450Johann
36237bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size) {
36247bc9febe8749e98a3812a0dc4380ceae75c29450Johann        buff_lvl_step = (int)((cpi->oxcf.maximum_buffer_size -
36257bc9febe8749e98a3812a0dc4380ceae75c29450Johann                               cpi->oxcf.optimal_buffer_level) /
36267bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              Adjustment);
36277bc9febe8749e98a3812a0dc4380ceae75c29450Johann
36287bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (buff_lvl_step) {
36297bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Adjustment =
36307bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (int)((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) /
36317bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    buff_lvl_step);
36327bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
36337bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Adjustment = 0;
36347bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
36357bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
36361b362b15af34006e6a11974088a46d42b903418eJohann
36377bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_worst_quality -= Adjustment;
36381b362b15af34006e6a11974088a46d42b903418eJohann
36397bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->active_worst_quality < cpi->active_best_quality) {
36407bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_worst_quality = cpi->active_best_quality;
36417bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
364290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
36437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
364490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set an active best quality and if necessary active worst quality
36467bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * There is some odd behavior for one pass here that needs attention.
36477bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
36487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cpi->pass == 2) || (cpi->ni_frames > 150)) {
36497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_clear_system_state();
365090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Q = cpi->active_worst_quality;
365290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36537bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type == KEY_FRAME) {
36547bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->pass == 2) {
36557bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->gfu_boost > 600) {
36567bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_best_quality = kf_low_motion_minq[Q];
36577bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
36587bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_best_quality = kf_high_motion_minq[Q];
365979f15823c34ae1e423108295e416213200bb280fAndreas Huber        }
366079f15823c34ae1e423108295e416213200bb280fAndreas Huber
36617bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Special case for key frames forced because we have reached
36627bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * the maximum key frame interval. Here force the Q to a range
36637bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * based on the ambient Q to reduce the risk of popping
36647bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
36657bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->this_key_frame_forced) {
36667bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->active_best_quality > cpi->avg_frame_qindex * 7 / 8) {
36677bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->active_best_quality = cpi->avg_frame_qindex * 7 / 8;
36687bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else if (cpi->active_best_quality<cpi->avg_frame_qindex>> 2) {
36697bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
36707bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
36717bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
36727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
36737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* One pass more conservative */
36747bc9febe8749e98a3812a0dc4380ceae75c29450Johann      else {
36757bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_best_quality = kf_high_motion_minq[Q];
36767bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
36777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
367879f15823c34ae1e423108295e416213200bb280fAndreas Huber
36797bc9febe8749e98a3812a0dc4380ceae75c29450Johann    else if (cpi->oxcf.number_of_layers == 1 &&
36807bc9febe8749e98a3812a0dc4380ceae75c29450Johann             (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame)) {
36817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Use the lower of cpi->active_worst_quality and recent
36827bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * average Q as basis for GF/ARF Q limit unless last frame was
36837bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * a key frame.
36847bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
36857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((cpi->frames_since_key > 1) &&
36867bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->avg_frame_qindex < cpi->active_worst_quality)) {
36877bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = cpi->avg_frame_qindex;
36887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
368990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36907bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* For constrained quality dont allow Q less than the cq level */
36917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
36927bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (Q < cpi->cq_target_quality)) {
36937bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = cpi->cq_target_quality;
36947bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
369579f15823c34ae1e423108295e416213200bb280fAndreas Huber
36967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->pass == 2) {
36977bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->gfu_boost > 1000) {
36987bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_best_quality = gf_low_motion_minq[Q];
36997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else if (cpi->gfu_boost < 400) {
37007bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_best_quality = gf_high_motion_minq[Q];
37017bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
37027bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_best_quality = gf_mid_motion_minq[Q];
370390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
370490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37057bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Constrained quality use slightly lower active best. */
37067bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
37077bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_best_quality = cpi->active_best_quality * 15 / 16;
37087bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
37097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
37107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* One pass more conservative */
37117bc9febe8749e98a3812a0dc4380ceae75c29450Johann      else {
37127bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_best_quality = gf_high_motion_minq[Q];
37137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
37147bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
37157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_best_quality = inter_minq[Q];
37167bc9febe8749e98a3812a0dc4380ceae75c29450Johann
37177bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* For the constant/constrained quality mode we dont want
37187bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * q to fall below the cq level.
37197bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
37207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
37217bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->active_best_quality < cpi->cq_target_quality)) {
37227bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* If we are strongly undershooting the target rate in the last
37237bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * frames then use the user passed in cq value not the auto
37247bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * cq value.
37251b362b15af34006e6a11974088a46d42b903418eJohann         */
37267bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->rolling_actual_bits < cpi->min_frame_bandwidth) {
37277bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_best_quality = cpi->oxcf.cq_level;
37287bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
37297bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_best_quality = cpi->cq_target_quality;
373079f15823c34ae1e423108295e416213200bb280fAndreas Huber        }
37317bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
373279f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
37337bc9febe8749e98a3812a0dc4380ceae75c29450Johann
37347bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* If CBR and the buffer is as full then it is reasonable to allow
37357bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * higher quality on the frames to prevent bits just going to waste.
37361b362b15af34006e6a11974088a46d42b903418eJohann     */
37377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
37387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Note that the use of >= here elliminates the risk of a devide
37397bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * by 0 error in the else if clause
37407bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
37417bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size) {
37427bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_best_quality = cpi->best_quality;
37437bc9febe8749e98a3812a0dc4380ceae75c29450Johann
37447bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level) {
37457bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int Fraction =
37467bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (int)(((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128) /
37477bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  (cpi->oxcf.maximum_buffer_size -
37487bc9febe8749e98a3812a0dc4380ceae75c29450Johann                   cpi->oxcf.optimal_buffer_level));
37497bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int min_qadjustment =
37507bc9febe8749e98a3812a0dc4380ceae75c29450Johann            ((cpi->active_best_quality - cpi->best_quality) * Fraction) / 128;
37517bc9febe8749e98a3812a0dc4380ceae75c29450Johann
37527bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_best_quality -= min_qadjustment;
37537bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
37547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
37557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
37567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Make sure constrained quality mode limits are adhered to for the first
37577bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * few frames of one pass encodes
37587bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
37597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
37607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame ||
37617bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->common.refresh_alt_ref_frame) {
37627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_best_quality = cpi->best_quality;
37637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->active_best_quality < cpi->cq_target_quality) {
37647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_best_quality = cpi->cq_target_quality;
376590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
37667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
376790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clip the active best and worst quality values to limits */
37697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->active_worst_quality > cpi->worst_quality) {
37707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->active_worst_quality = cpi->worst_quality;
37717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
377290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->active_best_quality < cpi->best_quality) {
37747bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->active_best_quality = cpi->best_quality;
37757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
377690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->active_worst_quality < cpi->active_best_quality) {
37787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->active_worst_quality = cpi->active_best_quality;
37797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
37801b362b15af34006e6a11974088a46d42b903418eJohann
37817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Determine initial Q to try */
37827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  Q = vp8_regulate_q(cpi, cpi->this_frame_target);
378390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3784c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
37851b362b15af34006e6a11974088a46d42b903418eJohann
37867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set highest allowed value for Zbin over quant */
37877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) {
37887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    zbin_oq_high = 0;
37897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if ((cpi->oxcf.number_of_layers == 1) &&
37907bc9febe8749e98a3812a0dc4380ceae75c29450Johann             ((cm->refresh_alt_ref_frame ||
37917bc9febe8749e98a3812a0dc4380ceae75c29450Johann               (cm->refresh_golden_frame && !cpi->source_alt_ref_active)))) {
37927bc9febe8749e98a3812a0dc4380ceae75c29450Johann    zbin_oq_high = 16;
37937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
37947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    zbin_oq_high = ZBIN_OQ_MAX;
37957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
37961b362b15af34006e6a11974088a46d42b903418eJohann#endif
379790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3798df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  compute_skin_map(cpi);
3799df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
38007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Setup background Q adjustment for error resilient mode.
38017bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * For multi-layer encodes only enable this for the base layer.
38027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  */
38037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->cyclic_refresh_mode_enabled) {
38047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // Special case for screen_content_mode with golden frame updates.
38057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int disable_cr_gf =
38067bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->oxcf.screen_content_mode == 2 && cm->refresh_golden_frame);
38077bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->current_layer == 0 && cpi->force_maxqp == 0 && !disable_cr_gf) {
38087bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cyclic_background_refresh(cpi, Q, 0);
38097bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
38107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      disable_segmentation(cpi);
38111b362b15af34006e6a11974088a46d42b903418eJohann    }
38127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
381390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
38157bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                &frame_over_shoot_limit);
381690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3817c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
38187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Limit Q range for the adaptive loop. */
38197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  bottom_index = cpi->active_best_quality;
38207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  top_index = cpi->active_worst_quality;
38217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q_low = cpi->active_best_quality;
38227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  q_high = cpi->active_worst_quality;
38231b362b15af34006e6a11974088a46d42b903418eJohann#endif
382490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_save_coding_context(cpi);
382690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  loop_count = 0;
382890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  scale_and_extend_source(cpi->un_scaled_source, cpi);
38301b362b15af34006e6a11974088a46d42b903418eJohann
38317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_TEMPORAL_DENOISING && CONFIG_POSTPROC
38327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Option to apply spatial blur under the aggressive or adaptive
38337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // (temporal denoising) mode.
38347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.noise_sensitivity >= 3) {
38357bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->denoiser.denoise_pars.spatial_blur != 0) {
38367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_de_noise(cm, cpi->Source, cpi->Source,
38377bc9febe8749e98a3812a0dc4380ceae75c29450Johann                   cpi->denoiser.denoise_pars.spatial_blur, 1, 0, 0);
38387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
38397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
38407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
38417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
38421b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
384390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.noise_sensitivity > 0) {
38457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned char *src;
38467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int l = 0;
384790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    switch (cpi->oxcf.noise_sensitivity) {
38497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 1: l = 20; break;
38507bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 2: l = 40; break;
38517bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 3: l = 60; break;
38527bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 4: l = 80; break;
38537bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 5: l = 100; break;
38547bc9febe8749e98a3812a0dc4380ceae75c29450Johann      case 6: l = 150; break;
38557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
385690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38577bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type == KEY_FRAME) {
38587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_de_noise(cm, cpi->Source, cpi->Source, l, 1, 0, 1);
38597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
38607bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_de_noise(cm, cpi->Source, cpi->Source, l, 1, 0, 1);
386190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      src = cpi->Source->y_buffer;
386390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->Source->y_stride < 0) {
38657bc9febe8749e98a3812a0dc4380ceae75c29450Johann        src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
38667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
386790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
38687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
386990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
387090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
387190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
387290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef OUTPUT_YUV_SRC
3873df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  vpx_write_yuv_frame(yuv_file, cpi->Source);
387490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
387590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  do {
38777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_clear_system_state();
387890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38797bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_set_quantizer(cpi, Q);
388090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* setup skip prob for costing in mode/mv decision */
38827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->common.mb_no_coeff_skip) {
38837bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
388490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->frame_type != KEY_FRAME) {
38867bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->common.refresh_alt_ref_frame) {
38877bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->last_skip_false_probs[2] != 0) {
38887bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->prob_skip_false = cpi->last_skip_false_probs[2];
38897bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
38907bc9febe8749e98a3812a0dc4380ceae75c29450Johann
38917bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /*
38927bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              if(cpi->last_skip_false_probs[2]!=0 && abs(Q-
38937bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->last_skip_probs_q[2])<=16 )
38947bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->prob_skip_false = cpi->last_skip_false_probs[2];
38957bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              else if (cpi->last_skip_false_probs[2]!=0)
38967bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->prob_skip_false = (cpi->last_skip_false_probs[2]  +
38977bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->prob_skip_false ) / 2;
38987bc9febe8749e98a3812a0dc4380ceae75c29450Johann             */
38997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else if (cpi->common.refresh_golden_frame) {
39007bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->last_skip_false_probs[1] != 0) {
39017bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->prob_skip_false = cpi->last_skip_false_probs[1];
39027bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
39037bc9febe8749e98a3812a0dc4380ceae75c29450Johann
39047bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /*
39057bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              if(cpi->last_skip_false_probs[1]!=0 && abs(Q-
39067bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->last_skip_probs_q[1])<=16 )
39077bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->prob_skip_false = cpi->last_skip_false_probs[1];
39087bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              else if (cpi->last_skip_false_probs[1]!=0)
39097bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->prob_skip_false = (cpi->last_skip_false_probs[1]  +
39107bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->prob_skip_false ) / 2;
39117bc9febe8749e98a3812a0dc4380ceae75c29450Johann             */
39127bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
39137bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->last_skip_false_probs[0] != 0) {
39147bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->prob_skip_false = cpi->last_skip_false_probs[0];
39157bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
39167bc9febe8749e98a3812a0dc4380ceae75c29450Johann
39177bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /*
39187bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if(cpi->last_skip_false_probs[0]!=0 && abs(Q-
39197bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->last_skip_probs_q[0])<=16 )
39207bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->prob_skip_false = cpi->last_skip_false_probs[0];
39217bc9febe8749e98a3812a0dc4380ceae75c29450Johann          else if(cpi->last_skip_false_probs[0]!=0)
39227bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->prob_skip_false = (cpi->last_skip_false_probs[0]  +
39237bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->prob_skip_false ) / 2;
39247bc9febe8749e98a3812a0dc4380ceae75c29450Johann              */
39257bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
39267bc9febe8749e98a3812a0dc4380ceae75c29450Johann
39277bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* as this is for cost estimate, let's make sure it does not
39287bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * go extreme eitehr way
39297bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
39307bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->prob_skip_false < 5) cpi->prob_skip_false = 5;
39317bc9febe8749e98a3812a0dc4380ceae75c29450Johann
39327bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->prob_skip_false > 250) cpi->prob_skip_false = 250;
39337bc9febe8749e98a3812a0dc4380ceae75c29450Johann
39347bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref) {
39357bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->prob_skip_false = 1;
39367bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
39377bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
393890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
393990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
394090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
394190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->pass != 1)
394290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
394390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                FILE *f = fopen("skip.stt", "a");
394490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
394590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fclose(f);
394690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
394790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
394890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
39497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
395090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type == KEY_FRAME) {
39527bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (resize_key_frame(cpi)) {
39537bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* If the frame size has changed, need to reset Q, quantizer,
39547bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * and background refresh.
39557bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
39567bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = vp8_regulate_q(cpi, cpi->this_frame_target);
39577bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->cyclic_refresh_mode_enabled) {
39587bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->current_layer == 0) {
39597bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cyclic_background_refresh(cpi, Q, 0);
39607bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else {
39617bc9febe8749e98a3812a0dc4380ceae75c29450Johann            disable_segmentation(cpi);
39627bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
396390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
39647bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Reset the zero_last counter to 0 on key frame.
39657bc9febe8749e98a3812a0dc4380ceae75c29450Johann        memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
39667bc9febe8749e98a3812a0dc4380ceae75c29450Johann        memset(cpi->consec_zero_last_mvbias, 0,
39677bc9febe8749e98a3812a0dc4380ceae75c29450Johann               (cpi->common.mb_rows * cpi->common.mb_cols));
39687bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_set_quantizer(cpi, Q);
39697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
397090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39717bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_setup_key_frame(cpi);
39727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
397379f15823c34ae1e423108295e416213200bb280fAndreas Huber
39741b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
39757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    {
39767bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.error_resilient_mode) cm->refresh_entropy_probs = 0;
397779f15823c34ae1e423108295e416213200bb280fAndreas Huber
39787bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) {
39797bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cm->frame_type == KEY_FRAME) cm->refresh_entropy_probs = 1;
39807bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
39811b362b15af34006e6a11974088a46d42b903418eJohann
39827bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cm->refresh_entropy_probs == 0) {
39837bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* save a copy for later refresh */
39847bc9febe8749e98a3812a0dc4380ceae75c29450Johann        memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
39857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
39861b362b15af34006e6a11974088a46d42b903418eJohann
39877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_update_coef_context(cpi);
39881b362b15af34006e6a11974088a46d42b903418eJohann
39897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_update_coef_probs(cpi);
39901b362b15af34006e6a11974088a46d42b903418eJohann
39917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* transform / motion compensation build reconstruction frame
39927bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * +pack coef partitions
39937bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
39947bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_encode_frame(cpi);
39951b362b15af34006e6a11974088a46d42b903418eJohann
39967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* cpi->projected_frame_size is not needed for RT mode */
39977bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
399879f15823c34ae1e423108295e416213200bb280fAndreas Huber#else
39997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* transform / motion compensation build reconstruction frame */
40007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_encode_frame(cpi);
4001df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
4002df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
40037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (vp8_drop_encodedframe_overshoot(cpi, Q)) return;
40047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
40057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
40067bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
40077bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->projected_frame_size =
40087bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
40091b362b15af34006e6a11974088a46d42b903418eJohann#endif
40107bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_clear_system_state();
40111b362b15af34006e6a11974088a46d42b903418eJohann
40127bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Test to see if the stats generated for this frame indicate that
40137bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * we should have coded a key frame (assuming that we didn't)!
40147bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
40151b362b15af34006e6a11974088a46d42b903418eJohann
40167bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME &&
40177bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->compressor_speed != 2) {
4018c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
40197bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (decide_key_frame(cpi)) {
40207bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Reset all our sizing numbers and recode */
40217bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cm->frame_type = KEY_FRAME;
402290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40237bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_pick_frame_size(cpi);
402490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40257bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Clear the Alt reference frame active flag when we have
40267bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * a key frame
40277bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
40287bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->source_alt_ref_active = 0;
4029538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
40307bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Set the loop filter deltas and segmentation map update
40317bc9febe8749e98a3812a0dc4380ceae75c29450Johann        setup_features(cpi);
403290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40337bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_restore_coding_context(cpi);
403490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40357bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = vp8_regulate_q(cpi, cpi->this_frame_target);
403690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40377bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
40387bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      &frame_over_shoot_limit);
403990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40407bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Limit Q range for the adaptive loop. */
40417bc9febe8749e98a3812a0dc4380ceae75c29450Johann        bottom_index = cpi->active_best_quality;
40427bc9febe8749e98a3812a0dc4380ceae75c29450Johann        top_index = cpi->active_worst_quality;
40437bc9febe8749e98a3812a0dc4380ceae75c29450Johann        q_low = cpi->active_best_quality;
40447bc9febe8749e98a3812a0dc4380ceae75c29450Johann        q_high = cpi->active_worst_quality;
404590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40467bc9febe8749e98a3812a0dc4380ceae75c29450Johann        loop_count++;
40477bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Loop = 1;
404890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40497bc9febe8749e98a3812a0dc4380ceae75c29450Johann        continue;
40507bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
405179f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
40527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
405390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_clear_system_state();
405590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (frame_over_shoot_limit == 0) frame_over_shoot_limit = 1;
405790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40587bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Are we are overshooting and up against the limit of active max Q. */
40597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (((cpi->pass != 2) ||
40607bc9febe8749e98a3812a0dc4380ceae75c29450Johann         (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
40617bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (Q == cpi->active_worst_quality) &&
40627bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->active_worst_quality < cpi->worst_quality) &&
40637bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->projected_frame_size > frame_over_shoot_limit)) {
40647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int over_size_percent =
40657bc9febe8749e98a3812a0dc4380ceae75c29450Johann          ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) /
40667bc9febe8749e98a3812a0dc4380ceae75c29450Johann          frame_over_shoot_limit;
406790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* If so is there any scope for relaxing it */
40697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      while ((cpi->active_worst_quality < cpi->worst_quality) &&
40707bc9febe8749e98a3812a0dc4380ceae75c29450Johann             (over_size_percent > 0)) {
40717bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_worst_quality++;
40727bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Assume 1 qstep = about 4% on frame size. */
40737bc9febe8749e98a3812a0dc4380ceae75c29450Johann        over_size_percent = (int)(over_size_percent * 0.96);
40747bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
4075c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
40767bc9febe8749e98a3812a0dc4380ceae75c29450Johann      top_index = cpi->active_worst_quality;
4077c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#endif  // !CONFIG_REALTIME_ONLY
40780a39d0a697ff3603e8c100300fda363658e10b23James Zern      /* If we have updated the active max Q do not call
40790a39d0a697ff3603e8c100300fda363658e10b23James Zern       * vp8_update_rate_correction_factors() this loop.
40800a39d0a697ff3603e8c100300fda363658e10b23James Zern       */
40817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      active_worst_qchanged = 1;
40827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
40837bc9febe8749e98a3812a0dc4380ceae75c29450Johann      active_worst_qchanged = 0;
40847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
40857bc9febe8749e98a3812a0dc4380ceae75c29450Johann
40867bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if CONFIG_REALTIME_ONLY
40877bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Loop = 0;
40887bc9febe8749e98a3812a0dc4380ceae75c29450Johann#else
40897bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Special case handling for forced key frames */
40907bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
40917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int last_q = Q;
40927bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int kf_err = vp8_calc_ss_err(cpi->Source, &cm->yv12_fb[cm->new_fb_idx]);
40937bc9febe8749e98a3812a0dc4380ceae75c29450Johann
40947bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* The key frame is not good enough */
40957bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (kf_err > ((cpi->ambient_err * 7) >> 3)) {
40967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Lower q_high */
40977bc9febe8749e98a3812a0dc4380ceae75c29450Johann        q_high = (Q > q_low) ? (Q - 1) : q_low;
40987bc9febe8749e98a3812a0dc4380ceae75c29450Johann
40997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Adjust Q */
41007bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = (q_high + q_low) >> 1;
41017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
41027bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* The key frame is much better than the previous frame */
41037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      else if (kf_err < (cpi->ambient_err >> 1)) {
41047bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Raise q_low */
41057bc9febe8749e98a3812a0dc4380ceae75c29450Johann        q_low = (Q < q_high) ? (Q + 1) : q_high;
41067bc9febe8749e98a3812a0dc4380ceae75c29450Johann
41077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Adjust Q */
41087bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = (q_high + q_low + 1) >> 1;
41097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
41107bc9febe8749e98a3812a0dc4380ceae75c29450Johann
41117bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Clamp Q to upper and lower limits: */
41127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Q > q_high) {
41137bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = q_high;
41147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else if (Q < q_low) {
41157bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = q_low;
41167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
41177bc9febe8749e98a3812a0dc4380ceae75c29450Johann
41187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Loop = Q != last_q;
41197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
41207bc9febe8749e98a3812a0dc4380ceae75c29450Johann
41217bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Is the projected frame size out of range and are we allowed
41227bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * to attempt to recode.
41237bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
41247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    else if (recode_loop_test(cpi, frame_over_shoot_limit,
41257bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              frame_under_shoot_limit, Q, top_index,
41267bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              bottom_index)) {
41277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int last_q = Q;
41287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int Retries = 0;
41297bc9febe8749e98a3812a0dc4380ceae75c29450Johann
41307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Frame size out of permitted range. Update correction factor
41317bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * & compute new Q to try...
41327bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
41337bc9febe8749e98a3812a0dc4380ceae75c29450Johann
41347bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Frame is too large */
41357bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->projected_frame_size > cpi->this_frame_target) {
41367bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Raise Qlow as to at least the current value */
41377bc9febe8749e98a3812a0dc4380ceae75c29450Johann        q_low = (Q < q_high) ? (Q + 1) : q_high;
41387bc9febe8749e98a3812a0dc4380ceae75c29450Johann
41397bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* If we are using over quant do the same for zbin_oq_low */
41407bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->mb.zbin_over_quant > 0) {
41417bc9febe8749e98a3812a0dc4380ceae75c29450Johann          zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high)
41427bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            ? (cpi->mb.zbin_over_quant + 1)
41437bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            : zbin_oq_high;
414490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
414590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41467bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (undershoot_seen) {
41477bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Update rate_correction_factor unless
41487bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * cpi->active_worst_quality has changed.
41497bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
41507bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (!active_worst_qchanged) {
41517bc9febe8749e98a3812a0dc4380ceae75c29450Johann            vp8_update_rate_correction_factors(cpi, 1);
41527bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
415379f15823c34ae1e423108295e416213200bb280fAndreas Huber
41547bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Q = (q_high + q_low + 1) / 2;
415579f15823c34ae1e423108295e416213200bb280fAndreas Huber
41567bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Adjust cpi->zbin_over_quant (only allowed when Q
41577bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * is max)
41587bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
41597bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (Q < MAXQ) {
41607bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->mb.zbin_over_quant = 0;
41617bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else {
41627bc9febe8749e98a3812a0dc4380ceae75c29450Johann            zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high)
41637bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              ? (cpi->mb.zbin_over_quant + 1)
41647bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              : zbin_oq_high;
41657bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->mb.zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
41667bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
41677bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
41687bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Update rate_correction_factor unless
41697bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * cpi->active_worst_quality has changed.
41707bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
41717bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (!active_worst_qchanged) {
41727bc9febe8749e98a3812a0dc4380ceae75c29450Johann            vp8_update_rate_correction_factors(cpi, 0);
41737bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
417479f15823c34ae1e423108295e416213200bb280fAndreas Huber
41757bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Q = vp8_regulate_q(cpi, cpi->this_frame_target);
417679f15823c34ae1e423108295e416213200bb280fAndreas Huber
41777bc9febe8749e98a3812a0dc4380ceae75c29450Johann          while (((Q < q_low) || (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
41787bc9febe8749e98a3812a0dc4380ceae75c29450Johann                 (Retries < 10)) {
41797bc9febe8749e98a3812a0dc4380ceae75c29450Johann            vp8_update_rate_correction_factors(cpi, 0);
41807bc9febe8749e98a3812a0dc4380ceae75c29450Johann            Q = vp8_regulate_q(cpi, cpi->this_frame_target);
41817bc9febe8749e98a3812a0dc4380ceae75c29450Johann            Retries++;
41827bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
41837bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
418479f15823c34ae1e423108295e416213200bb280fAndreas Huber
41857bc9febe8749e98a3812a0dc4380ceae75c29450Johann        overshoot_seen = 1;
41867bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
41877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Frame is too small */
41887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      else {
41897bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->mb.zbin_over_quant == 0) {
41907bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Lower q_high if not using over quant */
41917bc9febe8749e98a3812a0dc4380ceae75c29450Johann          q_high = (Q > q_low) ? (Q - 1) : q_low;
41927bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
41937bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* else lower zbin_oq_high */
41947bc9febe8749e98a3812a0dc4380ceae75c29450Johann          zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low)
41957bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             ? (cpi->mb.zbin_over_quant - 1)
41967bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             : zbin_oq_low;
419779f15823c34ae1e423108295e416213200bb280fAndreas Huber        }
419890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (overshoot_seen) {
42007bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Update rate_correction_factor unless
42017bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * cpi->active_worst_quality has changed.
42027bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
42037bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (!active_worst_qchanged) {
42047bc9febe8749e98a3812a0dc4380ceae75c29450Johann            vp8_update_rate_correction_factors(cpi, 1);
42057bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
420690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42077bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Q = (q_high + q_low) / 2;
420879f15823c34ae1e423108295e416213200bb280fAndreas Huber
42097bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Adjust cpi->zbin_over_quant (only allowed when Q
42107bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * is max)
42117bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
42127bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (Q < MAXQ) {
42137bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->mb.zbin_over_quant = 0;
42147bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else {
42157bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->mb.zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
42167bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
42177bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
42187bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Update rate_correction_factor unless
42197bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * cpi->active_worst_quality has changed.
42207bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
42217bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (!active_worst_qchanged) {
42227bc9febe8749e98a3812a0dc4380ceae75c29450Johann            vp8_update_rate_correction_factors(cpi, 0);
42237bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
422490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42257bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Q = vp8_regulate_q(cpi, cpi->this_frame_target);
422690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42277bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Special case reset for qlow for constrained quality.
42287bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * This should only trigger where there is very substantial
42297bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * undershoot on a frame and the auto cq level is above
42307bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * the user passsed in value.
42317bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
42327bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
42337bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (Q < q_low)) {
42347bc9febe8749e98a3812a0dc4380ceae75c29450Johann            q_low = Q;
42357bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
423690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42377bc9febe8749e98a3812a0dc4380ceae75c29450Johann          while (((Q > q_high) || (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
42387bc9febe8749e98a3812a0dc4380ceae75c29450Johann                 (Retries < 10)) {
42397bc9febe8749e98a3812a0dc4380ceae75c29450Johann            vp8_update_rate_correction_factors(cpi, 0);
42407bc9febe8749e98a3812a0dc4380ceae75c29450Johann            Q = vp8_regulate_q(cpi, cpi->this_frame_target);
42417bc9febe8749e98a3812a0dc4380ceae75c29450Johann            Retries++;
42427bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
424390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
424490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42457bc9febe8749e98a3812a0dc4380ceae75c29450Johann        undershoot_seen = 1;
42467bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
424790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42487bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Clamp Q to upper and lower limits: */
42497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Q > q_high) {
42507bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = q_high;
42517bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else if (Q < q_low) {
42527bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Q = q_low;
42537bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
42547bc9febe8749e98a3812a0dc4380ceae75c29450Johann
42557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Clamp cpi->zbin_over_quant */
42567bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low)
42577bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                    ? zbin_oq_low
42587bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                    : (cpi->mb.zbin_over_quant > zbin_oq_high)
42597bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                          ? zbin_oq_high
42607bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                          : cpi->mb.zbin_over_quant;
42617bc9febe8749e98a3812a0dc4380ceae75c29450Johann
42627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Loop = Q != last_q;
42637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
42647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Loop = 0;
42657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
42667bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif  // CONFIG_REALTIME_ONLY
42677bc9febe8749e98a3812a0dc4380ceae75c29450Johann
42687bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->is_src_frame_alt_ref) Loop = 0;
42697bc9febe8749e98a3812a0dc4380ceae75c29450Johann
42707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (Loop == 1) {
42717bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_restore_coding_context(cpi);
42727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      loop_count++;
42731b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_INTERNAL_STATS
42747bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->tot_recode_hits++;
427590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
427690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
42777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } while (Loop == 1);
42787bc9febe8749e98a3812a0dc4380ceae75c29450Johann
42797bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if defined(DROP_UNCODED_FRAMES)
42807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* if there are no coded macroblocks at all drop this frame */
42817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->common.MBs == cpi->mb.skip_true_count &&
42827bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->drop_frame_count & 7) != 7 && cm->frame_type != KEY_FRAME) {
42837bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->common.current_video_frame++;
42847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->frames_since_key++;
42857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->drop_frame_count++;
42867bc9febe8749e98a3812a0dc4380ceae75c29450Johann    // We advance the temporal pattern for dropped frames.
42877bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->temporal_pattern_counter++;
42887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return;
42897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
42907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->drop_frame_count = 0;
42917bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif
429290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
429390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
42941b362b15af34006e6a11974088a46d42b903418eJohann    /* Experimental code for lagged and one pass
42951b362b15af34006e6a11974088a46d42b903418eJohann     * Update stats used for one pass GF selection
42961b362b15af34006e6a11974088a46d42b903418eJohann     */
42971b362b15af34006e6a11974088a46d42b903418eJohann    {
429890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
429990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
430090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
430190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
430290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
430390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Special case code to reduce pulsing when key frames are forced at a
43057bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * fixed interval. Note the reconstruction error if it is the frame before
43067bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * the force key frame
43077bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
43087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0)) {
43097bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->ambient_err =
43107bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_calc_ss_err(cpi->Source, &cm->yv12_fb[cm->new_fb_idx]);
43117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
431279f15823c34ae1e423108295e416213200bb280fAndreas Huber
43137bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* This frame's MVs are saved and will be used in next frame's MV predictor.
43147bc9febe8749e98a3812a0dc4380ceae75c29450Johann * Last frame has one more line(add to bottom) and one more column(add to
43157bc9febe8749e98a3812a0dc4380ceae75c29450Johann * right) than cm->mip. The edge elements are initialized to 0.
43167bc9febe8749e98a3812a0dc4380ceae75c29450Johann */
43171b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING
43187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->oxcf.mr_encoder_id && cm->show_frame)
43191b362b15af34006e6a11974088a46d42b903418eJohann#else
43207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->show_frame) /* do not save for altref frame */
43211b362b15af34006e6a11974088a46d42b903418eJohann#endif
43227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
43237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int mb_row;
43247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int mb_col;
43257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Point to beginning of allocated MODE_INFO arrays. */
43267bc9febe8749e98a3812a0dc4380ceae75c29450Johann    MODE_INFO *tmp = cm->mip;
43277bc9febe8749e98a3812a0dc4380ceae75c29450Johann
43287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type != KEY_FRAME) {
43297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      for (mb_row = 0; mb_row < cm->mb_rows + 1; ++mb_row) {
43307bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (mb_col = 0; mb_col < cm->mb_cols + 1; ++mb_col) {
43317bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (tmp->mbmi.ref_frame != INTRA_FRAME) {
43327bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->lfmv[mb_col + mb_row * (cm->mode_info_stride + 1)].as_int =
43337bc9febe8749e98a3812a0dc4380ceae75c29450Johann                tmp->mbmi.mv.as_int;
43347bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
433579f15823c34ae1e423108295e416213200bb280fAndreas Huber
43367bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->lf_ref_frame_sign_bias[mb_col +
43377bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      mb_row * (cm->mode_info_stride + 1)] =
43387bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
43397bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->lf_ref_frame[mb_col + mb_row * (cm->mode_info_stride + 1)] =
43407bc9febe8749e98a3812a0dc4380ceae75c29450Johann              tmp->mbmi.ref_frame;
43417bc9febe8749e98a3812a0dc4380ceae75c29450Johann          tmp++;
434279f15823c34ae1e423108295e416213200bb280fAndreas Huber        }
43437bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
434479f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
43457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
434679f15823c34ae1e423108295e416213200bb280fAndreas Huber
43477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Count last ref frame 0,0 usage on current encoded frame. */
43487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
43497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int mb_row;
43507bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int mb_col;
43517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Point to beginning of MODE_INFO arrays. */
43527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    MODE_INFO *tmp = cm->mi;
43531b362b15af34006e6a11974088a46d42b903418eJohann
43547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->zeromv_count = 0;
43551b362b15af34006e6a11974088a46d42b903418eJohann
43567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type != KEY_FRAME) {
43577bc9febe8749e98a3812a0dc4380ceae75c29450Johann      for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
43587bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
43597bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (tmp->mbmi.mode == ZEROMV && tmp->mbmi.ref_frame == LAST_FRAME) {
43607bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->zeromv_count++;
43617bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
43627bc9febe8749e98a3812a0dc4380ceae75c29450Johann          tmp++;
43631b362b15af34006e6a11974088a46d42b903418eJohann        }
43647bc9febe8749e98a3812a0dc4380ceae75c29450Johann        tmp++;
43657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
43661b362b15af34006e6a11974088a46d42b903418eJohann    }
43677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
43681b362b15af34006e6a11974088a46d42b903418eJohann
43691b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING
43707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_cal_dissimilarity(cpi);
43711b362b15af34006e6a11974088a46d42b903418eJohann#endif
43721b362b15af34006e6a11974088a46d42b903418eJohann
43737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Update the GF useage maps.
43747bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * This is done after completing the compression of a frame when all
43757bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * modes etc. are finalized but before loop filter
43767bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
43777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers == 1) {
43787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
43797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
438090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) cm->refresh_last_frame = 1;
438290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4383538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if 0
438490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
438590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        FILE *f = fopen("gfactive.stt", "a");
4386f71323e297a928af368937089d3ed71239786f86Andreas Huber        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);
438790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(f);
438890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
4389538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
439090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* For inter frames the current default behavior is that when
43927bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
43937bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * This is purely an encoder decision at present.
43947bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
43957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame) {
43967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->copy_buffer_to_arf = 2;
43977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
43987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->copy_buffer_to_arf = 0;
43997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
440090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
440290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_TEMPORAL_DENOISING
44047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Get some measure of the amount of noise, by measuring the (partial) mse
44057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // between source and denoised buffer, for y channel. Partial refers to
44067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // computing the sse for a sub-sample of the frame (i.e., skip x blocks along
44077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // row/column),
44087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // and only for blocks in that set that are consecutive ZEROMV_LAST mode.
44097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Do this every ~8 frames, to further reduce complexity.
44107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // TODO(marpan): Keep this for now for the case cpi->oxcf.noise_sensitivity <
44117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // 4,
44127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // should be removed in favor of the process_denoiser_mode_change() function
44137bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // below.
44147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.noise_sensitivity > 0 && cpi->oxcf.noise_sensitivity < 4 &&
44157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      !cpi->oxcf.screen_content_mode && cpi->frames_since_key % 8 == 0 &&
44167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->frame_type != KEY_FRAME) {
44177bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->mse_source_denoised = measure_square_diff_partial(
44187bc9febe8749e98a3812a0dc4380ceae75c29450Johann        &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi->Source, cpi);
44197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
44207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
44217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // For the adaptive denoising mode (noise_sensitivity == 4), sample the mse
44227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // of source diff (between current and previous frame), and determine if we
44237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // should switch the denoiser mode. Sampling refers to computing the mse for
44247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // a sub-sample of the frame (i.e., skip x blocks along row/column), and
44257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // only for blocks in that set that have used ZEROMV LAST, along with some
44267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // constraint on the sum diff between blocks. This process is called every
44277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // ~8 frames, to further reduce complexity.
44287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.noise_sensitivity == 4 && !cpi->oxcf.screen_content_mode &&
44297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->frames_since_key % 8 == 0 && cm->frame_type != KEY_FRAME) {
44307bc9febe8749e98a3812a0dc4380ceae75c29450Johann    process_denoiser_mode_change(cpi);
44317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
44327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
44337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
4434df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#ifdef OUTPUT_YUV_SKINMAP
4435df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (cpi->common.current_video_frame > 1) {
4436df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    vp8_compute_skin_map(cpi, yuv_skinmap_file);
4437df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  }
4438df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
4439df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
444079f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_MULTITHREAD
4441df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (vpx_atomic_load_acquire(&cpi->b_multi_threaded)) {
44427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* start loopfilter in separate thread */
44437bc9febe8749e98a3812a0dc4380ceae75c29450Johann    sem_post(&cpi->h_event_start_lpf);
44447bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->b_lpf_running = 1;
4445df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    /* wait for the filter_level to be picked so that we can continue with
4446df37111358d02836cb29bbcb9c6e4c95dff90a16Johann     * stream packing */
4447df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    sem_wait(&cpi->h_event_end_lpf);
44487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else
444979f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
44507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
44517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_loopfilter_frame(cpi, cm);
44527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
445390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  update_reference_frames(cpi);
44551b362b15af34006e6a11974088a46d42b903418eJohann
4456ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifdef OUTPUT_YUV_DENOISED
4457df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  vpx_write_yuv_frame(yuv_denoised_file,
44587bc9febe8749e98a3812a0dc4380ceae75c29450Johann                      &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
4459ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
4460ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
44611b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
44627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.error_resilient_mode) {
44637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->refresh_entropy_probs = 0;
44647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
44651b362b15af34006e6a11974088a46d42b903418eJohann#endif
446690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* build the bitstream */
44687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_pack_bitstream(cpi, dest, dest_end, size);
446990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Move storing frame_type out of the above loop since it is also
44717bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * needed in motion search besides loopfilter */
44727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->last_frame_type = cm->frame_type;
447390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Update rate control heuristics */
44757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->total_byte_count += (*size);
44767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->projected_frame_size = (int)(*size) << 3;
447790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers > 1) {
44797bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int i;
44807bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
44817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->layer_context[i].total_byte_count += (*size);
44821b362b15af34006e6a11974088a46d42b903418eJohann    }
44837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
44841b362b15af34006e6a11974088a46d42b903418eJohann
44857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!active_worst_qchanged) vp8_update_rate_correction_factors(cpi, 2);
448690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->last_q[cm->frame_type] = cm->base_qindex;
448890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) {
44907bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_adjust_key_frame_context(cpi);
44917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
449290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Keep a record of ambient average Q. */
44947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type != KEY_FRAME) {
44957bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->avg_frame_qindex =
44967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
44977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
449890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Keep a record from which we can calculate the average Q excluding
45007bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * GF updates and key frames
45017bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
45027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cm->frame_type != KEY_FRAME) &&
45037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cpi->oxcf.number_of_layers > 1) ||
45047bc9febe8749e98a3812a0dc4380ceae75c29450Johann       (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame))) {
45057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->ni_frames++;
450690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45077bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Calculate the average Q for normal inter frames (not key or GFU
45087bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * frames).
45097bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
45107bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->pass == 2) {
45117bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->ni_tot_qi += Q;
45127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
45137bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
45147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Damp value for first few frames */
45157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->ni_frames > 150) {
45167bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->ni_tot_qi += Q;
45177bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
45187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
45197bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* For one pass, early in the clip ... average the current frame Q
45207bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * value with the worstq entered by the user as a dampening measure
45217bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
45227bc9febe8749e98a3812a0dc4380ceae75c29450Johann      else {
45237bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->ni_tot_qi += Q;
45247bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->ni_av_qi =
45257bc9febe8749e98a3812a0dc4380ceae75c29450Johann            ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
45267bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
452790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* If the average Q is higher than what was used in the last
45297bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * frame (after going through the recode loop to keep the frame
45307bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * size within range) then use the last frame value - 1. The -1
45317bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * is designed to stop Q and hence the data rate, from
45327bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * progressively falling away during difficult sections, but at
45337bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * the same time reduce the number of itterations around the
45347bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * recode loop.
45357bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
45367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Q > cpi->ni_av_qi) cpi->ni_av_qi = Q - 1;
453790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
45387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
453990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Update the buffer level variable. */
45417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Non-viewable frames are a special case and are treated as pure overhead. */
45427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cm->show_frame) {
45437bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->bits_off_target -= cpi->projected_frame_size;
45447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
45457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->bits_off_target +=
45467bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
45477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
454890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clip the buffer level to the maximum specified buffer size */
45507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
45517bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
45527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
455390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // If the frame dropper is not enabled, don't let the buffer level go below
45557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // some threshold, given here by -|maximum_buffer_size|. For now we only do
45567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // this for screen content input.
45577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->drop_frames_allowed == 0 && cpi->oxcf.screen_content_mode &&
45587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->bits_off_target < -cpi->oxcf.maximum_buffer_size) {
45597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->bits_off_target = -cpi->oxcf.maximum_buffer_size;
45607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
456190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Rolling monitors of whether we are over or underspending used to
45637bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * help regulate min and Max Q in two pass.
45647bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
45657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->rolling_target_bits =
45667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
45677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->rolling_actual_bits =
45687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
45697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->long_rolling_target_bits =
45707bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
45717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->long_rolling_actual_bits =
45727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) /
45737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      32;
45747bc9febe8749e98a3812a0dc4380ceae75c29450Johann
45757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Actual bits spent */
45767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->total_actual_bits += cpi->projected_frame_size;
45777bc9febe8749e98a3812a0dc4380ceae75c29450Johann
45787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Debug stats */
45797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->total_target_vs_actual +=
45807bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->this_frame_target - cpi->projected_frame_size);
45817bc9febe8749e98a3812a0dc4380ceae75c29450Johann
45827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->buffer_level = cpi->bits_off_target;
45837bc9febe8749e98a3812a0dc4380ceae75c29450Johann
45847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Propagate values to higher temporal layers */
45857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers > 1) {
45867bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int i;
45871b362b15af34006e6a11974088a46d42b903418eJohann
45887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
45897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      LAYER_CONTEXT *lc = &cpi->layer_context[i];
45907bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int bits_off_for_this_layer = (int)(lc->target_bandwidth / lc->framerate -
45917bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                          cpi->projected_frame_size);
45921b362b15af34006e6a11974088a46d42b903418eJohann
45937bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->bits_off_target += bits_off_for_this_layer;
45941b362b15af34006e6a11974088a46d42b903418eJohann
45957bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Clip buffer level to maximum buffer size for the layer */
45967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (lc->bits_off_target > lc->maximum_buffer_size) {
45977bc9febe8749e98a3812a0dc4380ceae75c29450Johann        lc->bits_off_target = lc->maximum_buffer_size;
45987bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
45991b362b15af34006e6a11974088a46d42b903418eJohann
46007bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->total_actual_bits += cpi->projected_frame_size;
46017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->total_target_vs_actual += bits_off_for_this_layer;
46027bc9febe8749e98a3812a0dc4380ceae75c29450Johann      lc->buffer_level = lc->bits_off_target;
46031b362b15af34006e6a11974088a46d42b903418eJohann    }
46047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
46051b362b15af34006e6a11974088a46d42b903418eJohann
46067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Update bits left to the kf and gf groups to account for overshoot
46077bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * or undershoot on these frames
46087bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
46097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) {
46107bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->twopass.kf_group_bits +=
46117bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->this_frame_target - cpi->projected_frame_size;
461290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46137bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->twopass.kf_group_bits < 0) cpi->twopass.kf_group_bits = 0;
46147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame) {
46157bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->twopass.gf_group_bits +=
46167bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->this_frame_target - cpi->projected_frame_size;
461790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46187bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->twopass.gf_group_bits < 0) cpi->twopass.gf_group_bits = 0;
46197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
462090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type != KEY_FRAME) {
46227bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->common.refresh_alt_ref_frame) {
46237bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
46247bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->last_skip_probs_q[2] = cm->base_qindex;
46257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->common.refresh_golden_frame) {
46267bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
46277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->last_skip_probs_q[1] = cm->base_qindex;
46287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
46297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
46307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->last_skip_probs_q[0] = cm->base_qindex;
463190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46327bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* update the baseline */
46337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
463490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
46357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
463690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46371b362b15af34006e6a11974088a46d42b903418eJohann#if 0 && CONFIG_INTERNAL_STATS
463890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
463990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        FILE *f = fopen("tmp.stt", "a");
464090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46417bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vpx_clear_system_state();
464290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46431b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->twopass.total_left_stats.coded_error != 0.0)
46442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
46452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
46462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       "%8.2lf %"PRId64" %10.3lf %10"PRId64" %8d\n",
4647538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cpi->common.current_video_frame, cpi->this_frame_target,
4648538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cpi->projected_frame_size,
4649538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       (cpi->projected_frame_size - cpi->this_frame_target),
46502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       cpi->total_target_vs_actual,
46511b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->buffer_level,
4652538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
46532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       cpi->total_actual_bits, cm->base_qindex,
4654538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cpi->active_best_quality, cpi->active_worst_quality,
46551b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->ni_av_qi, cpi->cq_target_quality,
4656538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4657538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cm->frame_type, cpi->gfu_boost,
46581b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->twopass.est_max_qcorrection_factor,
46592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       cpi->twopass.bits_left,
46601b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->twopass.total_left_stats.coded_error,
46611b362b15af34006e6a11974088a46d42b903418eJohann                       (double)cpi->twopass.bits_left /
46621b362b15af34006e6a11974088a46d42b903418eJohann                           cpi->twopass.total_left_stats.coded_error,
4663538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cpi->tot_recode_hits);
466490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
46652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
46662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
46672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       "%8.2lf %"PRId64" %10.3lf %8d\n",
46682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       cpi->common.current_video_frame, cpi->this_frame_target,
46692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       cpi->projected_frame_size,
4670538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       (cpi->projected_frame_size - cpi->this_frame_target),
46712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       cpi->total_target_vs_actual,
46721b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->buffer_level,
4673538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
46742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       cpi->total_actual_bits, cm->base_qindex,
4675538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cpi->active_best_quality, cpi->active_worst_quality,
46761b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->ni_av_qi, cpi->cq_target_quality,
4677538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4678538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                       cm->frame_type, cpi->gfu_boost,
46791b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->twopass.est_max_qcorrection_factor,
46802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       cpi->twopass.bits_left,
46811b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->twopass.total_left_stats.coded_error,
46821b362b15af34006e6a11974088a46d42b903418eJohann                       cpi->tot_recode_hits);
468390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
468490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(f);
468590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
468690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
468790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            FILE *fmodes = fopen("Modes.stt", "a");
468890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4689538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4690538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        cpi->common.current_video_frame,
4691538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        cm->frame_type, cm->refresh_golden_frame,
4692538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        cm->refresh_alt_ref_frame);
469390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
469490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(fmodes, "\n");
469590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
469690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(fmodes);
469790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
469890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
469990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
470090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
470190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_golden_frame == 1) {
47037bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
47047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
47057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->frame_flags = cm->frame_flags & ~FRAMEFLAGS_GOLDEN;
47067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
470790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_alt_ref_frame == 1) {
47097bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
47107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
47117bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->frame_flags = cm->frame_flags & ~FRAMEFLAGS_ALTREF;
47127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
471390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_last_frame & cm->refresh_golden_frame) { /* both refreshed */
47157bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gold_is_last = 1;
47167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cm->refresh_last_frame ^ cm->refresh_golden_frame) {
47177bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* 1 refreshed but not the other */
47187bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gold_is_last = 0;
47197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
472090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_last_frame & cm->refresh_alt_ref_frame) { /* both refreshed */
47227bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->alt_is_last = 1;
47237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame) {
47247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* 1 refreshed but not the other */
47257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->alt_is_last = 0;
47267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
472790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_alt_ref_frame &
47297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->refresh_golden_frame) { /* both refreshed */
47307bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gold_is_alt = 1;
47317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame) {
47327bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* 1 refreshed but not the other */
47337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->gold_is_alt = 0;
47347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
473590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
473790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->gold_is_last) cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;
473990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->alt_is_last) cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
474190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->gold_is_alt) cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
474390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->oxcf.error_resilient_mode) {
47457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame &&
47467bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cm->frame_type != KEY_FRAME)) {
47477bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Update the alternate reference frame stats as appropriate. */
47487bc9febe8749e98a3812a0dc4380ceae75c29450Johann      update_alt_ref_frame_stats(cpi);
47497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
47507bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Update the Golden frame stats as appropriate. */
47517bc9febe8749e98a3812a0dc4380ceae75c29450Johann      update_golden_frame_stats(cpi);
475290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
47537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
475490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) {
47567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Tell the caller that the frame was coded as a key frame */
47577bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
475890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* As this frame is a key frame  the next defaults to an inter frame. */
47607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->frame_type = INTER_FRAME;
476190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47627bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_frame_percent_intra = 100;
47637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
47647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *frame_flags = cm->frame_flags & ~FRAMEFLAGS_KEY;
476590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
47677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
476890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear the one shot update flags for segmentation map and mode/ref
47707bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * loop filter deltas.
47717bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
47727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.update_mb_segmentation_map = 0;
47737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.update_mb_segmentation_data = 0;
47747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
47757bc9febe8749e98a3812a0dc4380ceae75c29450Johann
47767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Dont increment frame counters if this was an altref buffer update
47777bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * not a real frame
47787bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
47797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->show_frame) {
47807bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->current_video_frame++;
47817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->frames_since_key++;
47827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->temporal_pattern_counter++;
47837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
478490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47857bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* reset to normal state now that we are done. */
478690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4787538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if 0
478890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
478990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        char filename[512];
479090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        FILE *recon_file;
479190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
479290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        recon_file = fopen(filename, "wb");
4793f71323e297a928af368937089d3ed71239786f86Andreas Huber        fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4794f71323e297a928af368937089d3ed71239786f86Andreas Huber               cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
479590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(recon_file);
479690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
4797538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
479890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* DEBUG */
4800df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  /* vpx_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
480190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
4802c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
48037bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void Pass2Encode(VP8_COMP *cpi, size_t *size, unsigned char *dest,
48047bc9febe8749e98a3812a0dc4380ceae75c29450Johann                        unsigned char *dest_end, unsigned int *frame_flags) {
48057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->common.refresh_alt_ref_frame) vp8_second_pass(cpi);
48067bc9febe8749e98a3812a0dc4380ceae75c29450Johann
48077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
48087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->twopass.bits_left -= 8 * (int)(*size);
48097bc9febe8749e98a3812a0dc4380ceae75c29450Johann
48107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->common.refresh_alt_ref_frame) {
48117bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double two_pass_min_rate =
48127bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (double)(cpi->oxcf.target_bandwidth *
48137bc9febe8749e98a3812a0dc4380ceae75c29450Johann                 cpi->oxcf.two_pass_vbrmin_section / 100);
48147bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
48157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
481690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
481790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
481890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48197bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags,
48207bc9febe8749e98a3812a0dc4380ceae75c29450Johann                          YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
48217bc9febe8749e98a3812a0dc4380ceae75c29450Johann                          int64_t end_time) {
48227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  struct vpx_usec_timer timer;
48237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int res = 0;
482490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_usec_timer_start(&timer);
482690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Reinit the lookahead buffer if the frame size changes */
48287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height) {
48297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    assert(cpi->oxcf.lag_in_frames < 2);
48307bc9febe8749e98a3812a0dc4380ceae75c29450Johann    dealloc_raw_frame_buffers(cpi);
48317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    alloc_raw_frame_buffers(cpi);
48327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
483390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time, frame_flags,
48357bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         cpi->active_map_enabled ? cpi->active_map : NULL)) {
48367bc9febe8749e98a3812a0dc4380ceae75c29450Johann    res = -1;
48377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
48387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_usec_timer_mark(&timer);
48397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
484090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return res;
48421b362b15af34006e6a11974088a46d42b903418eJohann}
48431b362b15af34006e6a11974088a46d42b903418eJohann
48447bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int frame_is_reference(const VP8_COMP *cpi) {
48457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const VP8_COMMON *cm = &cpi->common;
48467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const MACROBLOCKD *xd = &cpi->mb.e_mbd;
48471b362b15af34006e6a11974088a46d42b903418eJohann
48487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return cm->frame_type == KEY_FRAME || cm->refresh_last_frame ||
48497bc9febe8749e98a3812a0dc4380ceae75c29450Johann         cm->refresh_golden_frame || cm->refresh_alt_ref_frame ||
48507bc9febe8749e98a3812a0dc4380ceae75c29450Johann         cm->copy_buffer_to_gf || cm->copy_buffer_to_arf ||
48517bc9febe8749e98a3812a0dc4380ceae75c29450Johann         cm->refresh_entropy_probs || xd->mode_ref_lf_delta_update ||
48527bc9febe8749e98a3812a0dc4380ceae75c29450Johann         xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
485390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
48541b362b15af34006e6a11974088a46d42b903418eJohann
48557bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags,
48567bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            size_t *size, unsigned char *dest,
48577bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            unsigned char *dest_end, int64_t *time_stamp,
48587bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            int64_t *time_end, int flush) {
48597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm;
48607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  struct vpx_usec_timer tsctimer;
48617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  struct vpx_usec_timer ticktimer;
48627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  struct vpx_usec_timer cmptimer;
48637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  YV12_BUFFER_CONFIG *force_src_buffer = NULL;
48641b362b15af34006e6a11974088a46d42b903418eJohann
48657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi) return -1;
486690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm = &cpi->common;
48681b362b15af34006e6a11974088a46d42b903418eJohann
48697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (setjmp(cpi->common.error.jmp)) {
48707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->common.error.setjmp = 0;
48717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_clear_system_state();
48727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return VPX_CODEC_CORRUPT_FRAME;
48737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
48741b362b15af34006e6a11974088a46d42b903418eJohann
48757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.error.setjmp = 1;
48761b362b15af34006e6a11974088a46d42b903418eJohann
48777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_usec_timer_start(&cmptimer);
487890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->source = NULL;
488090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4881c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
48827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Should we code an alternate reference frame */
48837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.error_resilient_mode == 0 && cpi->oxcf.play_alternate &&
48847bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->source_alt_ref_pending) {
48857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if ((cpi->source = vp8_lookahead_peek(
48867bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->lookahead, cpi->frames_till_gf_update_due, PEEK_FORWARD))) {
48877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->alt_ref_source = cpi->source;
48887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.arnr_max_frames > 0) {
48897bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_temporal_filter_prepare_c(cpi, cpi->frames_till_gf_update_due);
48907bc9febe8749e98a3812a0dc4380ceae75c29450Johann        force_src_buffer = &cpi->alt_ref_buffer;
48917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
48927bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
48937bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->refresh_alt_ref_frame = 1;
48947bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->refresh_golden_frame = 0;
48957bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->refresh_last_frame = 0;
48967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->show_frame = 0;
48977bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Clear Pending alt Ref flag. */
48987bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->source_alt_ref_pending = 0;
48997bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->is_src_frame_alt_ref = 0;
49001b362b15af34006e6a11974088a46d42b903418eJohann    }
49017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
490290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
49031b362b15af34006e6a11974088a46d42b903418eJohann
49047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->source) {
49057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Read last frame source if we are encoding first pass. */
49067bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->pass == 1 && cm->current_video_frame > 0) {
49077bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((cpi->last_source =
49087bc9febe8749e98a3812a0dc4380ceae75c29450Johann               vp8_lookahead_peek(cpi->lookahead, 1, PEEK_BACKWARD)) == NULL) {
49097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        return -1;
49107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
49117bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
491290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49137bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush))) {
49147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cm->show_frame = 1;
4915538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
49167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->is_src_frame_alt_ref =
49177bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->alt_ref_source && (cpi->source == cpi->alt_ref_source);
491890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49197bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->is_src_frame_alt_ref) cpi->alt_ref_source = NULL;
49201b362b15af34006e6a11974088a46d42b903418eJohann    }
49217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
492290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->source) {
49247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
49257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->un_scaled_source = cpi->Source;
49267bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *time_stamp = cpi->source->ts_start;
49277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *time_end = cpi->source->ts_end;
49287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *frame_flags = cpi->source->flags;
492990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49307bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->pass == 1 && cm->current_video_frame > 0) {
49317bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->last_frame_unscaled_source = &cpi->last_source->img;
493290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
49337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
49347bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *size = 0;
4935c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
493690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
49387bc9febe8749e98a3812a0dc4380ceae75c29450Johann      vp8_end_first_pass(cpi); /* get last stats packet */
49397bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->twopass.first_pass_done = 1;
49407bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
494190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
494290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
494390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49447bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
49457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
494690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
49487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->first_time_stamp_ever = cpi->source->ts_start;
49497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_end_time_stamp_seen = cpi->source->ts_start;
49507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
49517bc9febe8749e98a3812a0dc4380ceae75c29450Johann
49527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* adjust frame rates based on timestamps given */
49537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->show_frame) {
49547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int64_t this_duration;
49557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int step = 0;
49567bc9febe8749e98a3812a0dc4380ceae75c29450Johann
49577bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
49587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      this_duration = cpi->source->ts_end - cpi->source->ts_start;
49597bc9febe8749e98a3812a0dc4380ceae75c29450Johann      step = 1;
49607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
49617bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int64_t last_duration;
49627bc9febe8749e98a3812a0dc4380ceae75c29450Johann
49637bc9febe8749e98a3812a0dc4380ceae75c29450Johann      this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
49647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      last_duration = cpi->last_end_time_stamp_seen - cpi->last_time_stamp_seen;
49657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* do a step update if the duration changes by 10% */
49667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (last_duration) {
49677bc9febe8749e98a3812a0dc4380ceae75c29450Johann        step = (int)(((this_duration - last_duration) * 10 / last_duration));
49687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
496979f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
497090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (this_duration) {
49727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (step) {
49737bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->ref_framerate = 10000000.0 / this_duration;
49747bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
49757bc9febe8749e98a3812a0dc4380ceae75c29450Johann        double avg_duration, interval;
497690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49777bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Average this frame's rate into the last second's average
49787bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * frame rate. If we haven't seen 1 second yet, then average
49797bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * over the whole interval seen.
49807bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
49817bc9febe8749e98a3812a0dc4380ceae75c29450Johann        interval = (double)(cpi->source->ts_end - cpi->first_time_stamp_ever);
49827bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (interval > 10000000.0) interval = 10000000;
498390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49847bc9febe8749e98a3812a0dc4380ceae75c29450Johann        avg_duration = 10000000.0 / cpi->ref_framerate;
49857bc9febe8749e98a3812a0dc4380ceae75c29450Johann        avg_duration *= (interval - avg_duration + this_duration);
49867bc9febe8749e98a3812a0dc4380ceae75c29450Johann        avg_duration /= interval;
49877bc9febe8749e98a3812a0dc4380ceae75c29450Johann
49887bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->ref_framerate = 10000000.0 / avg_duration;
49897bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
49907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_MULTI_RES_ENCODING
49917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.mr_total_resolutions > 1) {
49927bc9febe8749e98a3812a0dc4380ceae75c29450Johann        LOWER_RES_FRAME_INFO *low_res_frame_info =
49937bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
49947bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Frame rate should be the same for all spatial layers in
49957bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // multi-res-encoding (simulcast), so we constrain the frame for
49967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // higher layers to be that of lowest resolution. This is needed
49977bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // as he application may decide to skip encoding a high layer and
49987bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // then start again, in which case a big jump in time-stamps will
49997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // be received for that high layer, which will yield an incorrect
50007bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // frame rate (from time-stamp adjustment in above calculation).
50017bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->oxcf.mr_encoder_id) {
50027bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->ref_framerate = low_res_frame_info->low_res_framerate;
50037bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
50047bc9febe8749e98a3812a0dc4380ceae75c29450Johann          // Keep track of frame rate for lowest resolution.
50057bc9febe8749e98a3812a0dc4380ceae75c29450Johann          low_res_frame_info->low_res_framerate = cpi->ref_framerate;
500690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
50077bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
50087bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif
50097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.number_of_layers > 1) {
50107bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int i;
501190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50127bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Update frame rates for each layer */
50137bc9febe8749e98a3812a0dc4380ceae75c29450Johann        assert(cpi->oxcf.number_of_layers <= VPX_TS_MAX_LAYERS);
50147bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (i = 0; i < cpi->oxcf.number_of_layers && i < VPX_TS_MAX_LAYERS;
50157bc9febe8749e98a3812a0dc4380ceae75c29450Johann             ++i) {
50167bc9febe8749e98a3812a0dc4380ceae75c29450Johann          LAYER_CONTEXT *lc = &cpi->layer_context[i];
50177bc9febe8749e98a3812a0dc4380ceae75c29450Johann          lc->framerate = cpi->ref_framerate / cpi->oxcf.rate_decimator[i];
50187bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
50197bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
50207bc9febe8749e98a3812a0dc4380ceae75c29450Johann        vp8_new_framerate(cpi, cpi->ref_framerate);
50217bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
50221b362b15af34006e6a11974088a46d42b903418eJohann    }
50231b362b15af34006e6a11974088a46d42b903418eJohann
50247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_time_stamp_seen = cpi->source->ts_start;
50257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_end_time_stamp_seen = cpi->source->ts_end;
50267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
50271b362b15af34006e6a11974088a46d42b903418eJohann
50287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers > 1) {
50297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int layer;
50301b362b15af34006e6a11974088a46d42b903418eJohann
50317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    update_layer_contexts(cpi);
503290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Restore layer specific context & set frame rate */
50347bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->temporal_layer_id >= 0) {
50357bc9febe8749e98a3812a0dc4380ceae75c29450Johann      layer = cpi->temporal_layer_id;
50367bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
50377bc9febe8749e98a3812a0dc4380ceae75c29450Johann      layer =
50387bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->oxcf
50397bc9febe8749e98a3812a0dc4380ceae75c29450Johann              .layer_id[cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
504090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
50417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    restore_layer_context(cpi, layer);
50427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
50437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
504490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->compressor_speed == 2) {
50467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_usec_timer_start(&tsctimer);
50477bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_usec_timer_start(&ticktimer);
50487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
50497bc9febe8749e98a3812a0dc4380ceae75c29450Johann
50507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->lf_zeromv_pct = (cpi->zeromv_count * 100) / cm->MBs;
50511b362b15af34006e6a11974088a46d42b903418eJohann
50521b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
50537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
50547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;
50557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    const int num_part = (1 << cm->multi_token_partition);
50567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* the available bytes in dest */
50577bc9febe8749e98a3812a0dc4380ceae75c29450Johann    const unsigned long dest_size = dest_end - dest;
50587bc9febe8749e98a3812a0dc4380ceae75c29450Johann    const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
50591b362b15af34006e6a11974088a46d42b903418eJohann
50607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned char *dp = dest;
50611b362b15af34006e6a11974088a46d42b903418eJohann
50627bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->partition_d[0] = dp;
50637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    dp += dest_size / 10; /* reserve 1/10 for control partition */
50647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->partition_d_end[0] = dp;
50651b362b15af34006e6a11974088a46d42b903418eJohann
50667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < num_part; ++i) {
50677bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->partition_d[i + 1] = dp;
50687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      dp += tok_part_buff_size;
50697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->partition_d_end[i + 1] = dp;
50701b362b15af34006e6a11974088a46d42b903418eJohann    }
50717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
50721b362b15af34006e6a11974088a46d42b903418eJohann#endif
50731b362b15af34006e6a11974088a46d42b903418eJohann
50747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* start with a 0 size frame */
50757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  *size = 0;
507690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear down mmx registers */
50787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_clear_system_state();
507990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->frame_type = INTER_FRAME;
50817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cm->frame_flags = *frame_flags;
508290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
508390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
508490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
508590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cm->refresh_alt_ref_frame)
508690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
508790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cm->refresh_golden_frame = 0;
508890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cm->refresh_last_frame = 0;
508990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
509090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
509190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
509290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cm->refresh_golden_frame = 0;
509390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cm->refresh_last_frame = 1;
509490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
509590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
509690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
50977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* find a free buffer for the new frame */
50987bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
50997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i = 0;
51007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (; i < NUM_YV12_BUFFERS; ++i) {
51017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (!cm->yv12_fb[i].flags) {
51027bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cm->new_fb_idx = i;
51037bc9febe8749e98a3812a0dc4380ceae75c29450Johann        break;
51047bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
51051b362b15af34006e6a11974088a46d42b903418eJohann    }
51067bc9febe8749e98a3812a0dc4380ceae75c29450Johann
51077bc9febe8749e98a3812a0dc4380ceae75c29450Johann    assert(i < NUM_YV12_BUFFERS);
51087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
51097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  switch (cpi->pass) {
5110c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#if !CONFIG_REALTIME_ONLY
51117bc9febe8749e98a3812a0dc4380ceae75c29450Johann    case 1: Pass1Encode(cpi, size, dest, frame_flags); break;
51127bc9febe8749e98a3812a0dc4380ceae75c29450Johann    case 2: Pass2Encode(cpi, size, dest, dest_end, frame_flags); break;
51137bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif  // !CONFIG_REALTIME_ONLY
51147bc9febe8749e98a3812a0dc4380ceae75c29450Johann    default:
51157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
51167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      break;
51177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
511890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->compressor_speed == 2) {
51207bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int duration, duration2;
51217bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_usec_timer_mark(&tsctimer);
51227bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_usec_timer_mark(&ticktimer);
51237bc9febe8749e98a3812a0dc4380ceae75c29450Johann
51247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
51257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    duration2 = (unsigned int)((double)duration / 2);
51267bc9febe8749e98a3812a0dc4380ceae75c29450Johann
51277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->frame_type != KEY_FRAME) {
51287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->avg_encode_time == 0) {
51297bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->avg_encode_time = duration;
51307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
51317bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
51327bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
513390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
51347bc9febe8749e98a3812a0dc4380ceae75c29450Johann
51357bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (duration2) {
51367bc9febe8749e98a3812a0dc4380ceae75c29450Johann      {
51377bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->avg_pick_mode_time == 0) {
51387bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->avg_pick_mode_time = duration2;
51397bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
51407bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->avg_pick_mode_time =
51417bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (7 * cpi->avg_pick_mode_time + duration2) >> 3;
51427bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
51437bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
514490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
51457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
514690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_entropy_probs == 0) {
51487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
51497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
515090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Save the contexts separately for alt ref, gold and last. */
51527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
51537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_alt_ref_frame) memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
515490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_golden_frame) memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
515690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->refresh_last_frame) memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
515890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* if its a dropped frame honor the requests on subsequent frames */
51607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (*size > 0) {
51617bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->droppable = !frame_is_reference(cpi);
516290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* return to normal state */
51647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->refresh_entropy_probs = 1;
51657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->refresh_alt_ref_frame = 0;
51667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->refresh_golden_frame = 0;
51677bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->refresh_last_frame = 1;
51687bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cm->frame_type = INTER_FRAME;
51697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
517090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Save layer specific state */
51727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.number_of_layers > 1) save_layer_context(cpi);
517390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_usec_timer_mark(&cmptimer);
51757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
51761b362b15af34006e6a11974088a46d42b903418eJohann
51777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame) {
51787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    generate_psnr_packet(cpi);
51797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
51801b362b15af34006e6a11974088a46d42b903418eJohann
51817bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if CONFIG_INTERNAL_STATS
51821b362b15af34006e6a11974088a46d42b903418eJohann
51837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass != 1) {
51847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->bytes += *size;
51857bc9febe8749e98a3812a0dc4380ceae75c29450Johann
51867bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cm->show_frame) {
51877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->common.show_frame_mi = cpi->common.mi;
51887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->count++;
51897bc9febe8749e98a3812a0dc4380ceae75c29450Johann
51907bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->b_calculate_psnr) {
51917bc9febe8749e98a3812a0dc4380ceae75c29450Johann        uint64_t ye, ue, ve;
51927bc9febe8749e98a3812a0dc4380ceae75c29450Johann        double frame_psnr;
51937bc9febe8749e98a3812a0dc4380ceae75c29450Johann        YV12_BUFFER_CONFIG *orig = cpi->Source;
51947bc9febe8749e98a3812a0dc4380ceae75c29450Johann        YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
51957bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int y_width = cpi->common.Width;
51967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int y_height = cpi->common.Height;
51977bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int uv_width = (y_width + 1) / 2;
51987bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int uv_height = (y_height + 1) / 2;
51997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int y_samples = y_height * y_width;
52007bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int uv_samples = uv_height * uv_width;
52017bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int t_samples = y_samples + 2 * uv_samples;
52027bc9febe8749e98a3812a0dc4380ceae75c29450Johann        double sq_error;
52037bc9febe8749e98a3812a0dc4380ceae75c29450Johann
52047bc9febe8749e98a3812a0dc4380ceae75c29450Johann        ye = calc_plane_error(orig->y_buffer, orig->y_stride, recon->y_buffer,
52057bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              recon->y_stride, y_width, y_height);
52067bc9febe8749e98a3812a0dc4380ceae75c29450Johann
52077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        ue = calc_plane_error(orig->u_buffer, orig->uv_stride, recon->u_buffer,
52087bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              recon->uv_stride, uv_width, uv_height);
52097bc9febe8749e98a3812a0dc4380ceae75c29450Johann
52107bc9febe8749e98a3812a0dc4380ceae75c29450Johann        ve = calc_plane_error(orig->v_buffer, orig->uv_stride, recon->v_buffer,
52117bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              recon->uv_stride, uv_width, uv_height);
52127bc9febe8749e98a3812a0dc4380ceae75c29450Johann
52137bc9febe8749e98a3812a0dc4380ceae75c29450Johann        sq_error = (double)(ye + ue + ve);
52147bc9febe8749e98a3812a0dc4380ceae75c29450Johann
52157bc9febe8749e98a3812a0dc4380ceae75c29450Johann        frame_psnr = vpx_sse_to_psnr(t_samples, 255.0, sq_error);
52167bc9febe8749e98a3812a0dc4380ceae75c29450Johann
52177bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->total_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
52187bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->total_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
52197bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->total_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
52207bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->total_sq_error += sq_error;
52217bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->total += frame_psnr;
52227bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if CONFIG_POSTPROC
52237bc9febe8749e98a3812a0dc4380ceae75c29450Johann        {
52247bc9febe8749e98a3812a0dc4380ceae75c29450Johann          YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
52257bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double sq_error2;
52267bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double frame_psnr2, frame_ssim2 = 0;
52277bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double weight = 0;
522890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52297bc9febe8749e98a3812a0dc4380ceae75c29450Johann          vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer,
52307bc9febe8749e98a3812a0dc4380ceae75c29450Johann                      cm->filter_level * 10 / 6, 1, 0);
52317bc9febe8749e98a3812a0dc4380ceae75c29450Johann          vpx_clear_system_state();
523290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52337bc9febe8749e98a3812a0dc4380ceae75c29450Johann          ye = calc_plane_error(orig->y_buffer, orig->y_stride, pp->y_buffer,
52347bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                pp->y_stride, y_width, y_height);
523590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52367bc9febe8749e98a3812a0dc4380ceae75c29450Johann          ue = calc_plane_error(orig->u_buffer, orig->uv_stride, pp->u_buffer,
52377bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                pp->uv_stride, uv_width, uv_height);
523890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52397bc9febe8749e98a3812a0dc4380ceae75c29450Johann          ve = calc_plane_error(orig->v_buffer, orig->uv_stride, pp->v_buffer,
52407bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                pp->uv_stride, uv_width, uv_height);
524190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52427bc9febe8749e98a3812a0dc4380ceae75c29450Johann          sq_error2 = (double)(ye + ue + ve);
524390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52447bc9febe8749e98a3812a0dc4380ceae75c29450Johann          frame_psnr2 = vpx_sse_to_psnr(t_samples, 255.0, sq_error2);
524590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52467bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->totalp_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
52477bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->totalp_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
52487bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->totalp_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
52497bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->total_sq_error2 += sq_error2;
52507bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->totalp += frame_psnr2;
525190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52527bc9febe8749e98a3812a0dc4380ceae75c29450Johann          frame_ssim2 =
52537bc9febe8749e98a3812a0dc4380ceae75c29450Johann              vpx_calc_ssim(cpi->Source, &cm->post_proc_buffer, &weight);
525490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52557bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->summed_quality += frame_ssim2 * weight;
52567bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->summed_weights += weight;
525790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52587bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->oxcf.number_of_layers > 1) {
52597bc9febe8749e98a3812a0dc4380ceae75c29450Johann            unsigned int i;
526090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52617bc9febe8749e98a3812a0dc4380ceae75c29450Johann            for (i = cpi->current_layer; i < cpi->oxcf.number_of_layers; ++i) {
52627bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->frames_in_layer[i]++;
52637bc9febe8749e98a3812a0dc4380ceae75c29450Johann
52647bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->bytes_in_layer[i] += *size;
52657bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->sum_psnr[i] += frame_psnr;
52667bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->sum_psnr_p[i] += frame_psnr2;
52677bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->total_error2[i] += sq_error;
52687bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->total_error2_p[i] += sq_error2;
52697bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->sum_ssim[i] += frame_ssim2 * weight;
52707bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->sum_weights[i] += weight;
52717bc9febe8749e98a3812a0dc4380ceae75c29450Johann            }
52727bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
527390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
52747bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif
52757bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
527690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
52777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
527890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
527990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
528090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
528190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
528290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
528390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        skiptruecount += cpi->skip_true_count;
528490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        skipfalsecount += cpi->skip_false_count;
528590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
528690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
528790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
528890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
528990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
529090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 1)
529190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
529290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        FILE *f = fopen("skip.stt", "a");
529390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        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);
529490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
529590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->is_src_frame_alt_ref == 1)
529690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
529790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
529890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(f);
529990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
530090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
530190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
530290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
530390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.error.setjmp = 0;
53051b362b15af34006e6a11974088a46d42b903418eJohann
53067bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if CONFIG_MULTITHREAD
53077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* wait for the lpf thread done */
5308df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (vpx_atomic_load_acquire(&cpi->b_multi_threaded) && cpi->b_lpf_running) {
53097bc9febe8749e98a3812a0dc4380ceae75c29450Johann    sem_wait(&cpi->h_event_end_lpf);
53107bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->b_lpf_running = 0;
53117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
53127bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif
53137bc9febe8749e98a3812a0dc4380ceae75c29450Johann
53147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
531590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
531690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53177bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest,
53187bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              vp8_ppflags_t *flags) {
53197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->common.refresh_alt_ref_frame) {
53207bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
53217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
53227bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int ret;
53231b362b15af34006e6a11974088a46d42b903418eJohann
532490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_POSTPROC
53257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->common.show_frame_mi = cpi->common.mi;
53267bc9febe8749e98a3812a0dc4380ceae75c29450Johann    ret = vp8_post_proc_frame(&cpi->common, dest, flags);
532790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
53287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    (void)flags;
53297bc9febe8749e98a3812a0dc4380ceae75c29450Johann
53307bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->common.frame_to_show) {
53317bc9febe8749e98a3812a0dc4380ceae75c29450Johann      *dest = *cpi->common.frame_to_show;
53327bc9febe8749e98a3812a0dc4380ceae75c29450Johann      dest->y_width = cpi->common.Width;
53337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      dest->y_height = cpi->common.Height;
53347bc9febe8749e98a3812a0dc4380ceae75c29450Johann      dest->uv_height = cpi->common.Height / 2;
53357bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ret = 0;
53367bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
53377bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ret = -1;
53387bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
533990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53401b362b15af34006e6a11974088a46d42b903418eJohann#endif
53417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vpx_clear_system_state();
53427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return ret;
53437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
534490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
534590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53467bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows,
53477bc9febe8749e98a3812a0dc4380ceae75c29450Johann                   unsigned int cols, int delta_q[4], int delta_lf[4],
53487bc9febe8749e98a3812a0dc4380ceae75c29450Johann                   unsigned int threshold[4]) {
53497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
53507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int internal_delta_q[MAX_MB_SEGMENTS];
53517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  const int range = 63;
53527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i;
53531b362b15af34006e6a11974088a46d42b903418eJohann
53547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Check number of rows and columns match
53557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->common.mb_rows != (int)rows || cpi->common.mb_cols != (int)cols) {
53567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
53577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
535890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Range check the delta Q values and convert the external Q range values
53607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // to internal ones.
53617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((abs(delta_q[0]) > range) || (abs(delta_q[1]) > range) ||
53627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (abs(delta_q[2]) > range) || (abs(delta_q[3]) > range)) {
53637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
53647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
53651b362b15af34006e6a11974088a46d42b903418eJohann
53667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Range check the delta lf values
53677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((abs(delta_lf[0]) > range) || (abs(delta_lf[1]) > range) ||
53687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (abs(delta_lf[2]) > range) || (abs(delta_lf[3]) > range)) {
53697bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
53707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
53711b362b15af34006e6a11974088a46d42b903418eJohann
5372df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  // Also disable segmentation if no deltas are specified.
5373df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (!map || (delta_q[0] == 0 && delta_q[1] == 0 && delta_q[2] == 0 &&
5374df37111358d02836cb29bbcb9c6e4c95dff90a16Johann               delta_q[3] == 0 && delta_lf[0] == 0 && delta_lf[1] == 0 &&
5375df37111358d02836cb29bbcb9c6e4c95dff90a16Johann               delta_lf[2] == 0 && delta_lf[3] == 0 && threshold[0] == 0 &&
5376df37111358d02836cb29bbcb9c6e4c95dff90a16Johann               threshold[1] == 0 && threshold[2] == 0 && threshold[3] == 0)) {
53777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    disable_segmentation(cpi);
53787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return 0;
53797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
538090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // Translate the external delta q values to internal values.
53827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
53837bc9febe8749e98a3812a0dc4380ceae75c29450Johann    internal_delta_q[i] =
53847bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (delta_q[i] >= 0) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];
53857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
538690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set the segmentation Map */
53887bc9febe8749e98a3812a0dc4380ceae75c29450Johann  set_segmentation_map(cpi, map);
538990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Activate segmentation. */
53917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  enable_segmentation(cpi);
539290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set up the quant segment data */
53947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
53957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
53967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
53977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];
53981b362b15af34006e6a11974088a46d42b903418eJohann
53997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set up the loop segment data s */
54007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
54017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
54027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
54037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
540490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->segment_encode_breakout[0] = threshold[0];
54067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->segment_encode_breakout[1] = threshold[1];
54077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->segment_encode_breakout[2] = threshold[2];
54087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->segment_encode_breakout[3] = threshold[3];
540990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Initialise the feature data structure */
54117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
541290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5413df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (threshold[0] != 0 || threshold[1] != 0 || threshold[2] != 0 ||
5414df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      threshold[3] != 0)
5415df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    cpi->use_roi_static_threshold = 1;
5416df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  cpi->cyclic_refresh_mode_enabled = 0;
5417df37111358d02836cb29bbcb9c6e4c95dff90a16Johann
54187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
541990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
542090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54217bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows,
54227bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       unsigned int cols) {
54237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((int)rows == cpi->common.mb_rows && (int)cols == cpi->common.mb_cols) {
54247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (map) {
54257bc9febe8749e98a3812a0dc4380ceae75c29450Johann      memcpy(cpi->active_map, map, rows * cols);
54267bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_map_enabled = 1;
54277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
54287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_map_enabled = 0;
542990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
543090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
543190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return 0;
54327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
54337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
54347bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
543590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
543690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54377bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode,
54387bc9febe8749e98a3812a0dc4380ceae75c29450Johann                          VPX_SCALING vert_mode) {
54397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (horiz_mode <= ONETWO) {
54407bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->common.horiz_scale = horiz_mode;
54417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
54427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
54437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
544490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (vert_mode <= ONETWO) {
54467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->common.vert_scale = vert_mode;
54477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
54487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return -1;
54497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
545090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 0;
54527bc9febe8749e98a3812a0dc4380ceae75c29450Johann}
545390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54547bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest) {
54557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i, j;
54567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Total = 0;
545790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned char *src = source->y_buffer;
54597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  unsigned char *dst = dest->y_buffer;
546090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Loop through the Y plane raw and reconstruction data summing
54627bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * (square differences)
54637bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
54647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  for (i = 0; i < source->y_height; i += 16) {
54657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (j = 0; j < source->y_width; j += 16) {
54667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      unsigned int sse;
54677bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Total += vpx_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride,
54687bc9febe8749e98a3812a0dc4380ceae75c29450Johann                            &sse);
546990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
547090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    src += 16 * source->y_stride;
54727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    dst += 16 * dest->y_stride;
54737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
547479f15823c34ae1e423108295e416213200bb280fAndreas Huber
54757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return Total;
547690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
54777bc9febe8749e98a3812a0dc4380ceae75c29450Johann
54787bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_get_quantizer(VP8_COMP *cpi) { return cpi->common.base_qindex; }
5479