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