1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h> 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits.h> 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h> 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vpx_scale_rtcd.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "block.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "onyx_int.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/variance.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "encodeintra.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/setupintrarecon.h" 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/systemdependent.h" 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "mcomp.h" 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "firstpass.h" 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_scale/vpx_scale.h" 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "encodemb.h" 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/extend.h" 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h" 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/swapyv12buffer.h" 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "rdopt.h" 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/quant_common.h" 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "encodemv.h" 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "encodeframe.h" 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* #define OUTPUT_FPF 1 */ 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan 36233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp8cx_frame_init_quantizer(VP8_COMP *cpi); 37233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv); 38233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp8_alloc_compressor_data(VP8_COMP *cpi); 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q] 41233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern int vp8_kf_boost_qadjustment[QINDEX_RANGE]; 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan 43233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern const int vp8_gf_boost_qadjustment[QINDEX_RANGE]; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define IIFACTOR 1.5 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define IIKFACTOR1 1.40 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define IIKFACTOR2 1.5 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RMAX 14.0 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GF_RMAX 48.0 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define KF_MB_INTRA_MIN 300 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GF_MB_INTRA_MIN 200 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define DOUBLE_DIVIDE_CHECK(X) ((X)<0?(X)-.000001:(X)+.000001) 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define POW2 (double)cpi->oxcf.two_pass_vbrbias/100.0 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define NEW_BOOST 1 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan 61233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int vscale_lookup[7] = {0, 1, 1, 2, 2, 3, 3}; 62233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int hscale_lookup[7] = {0, 0, 1, 1, 2, 2, 3}; 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan 65233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const int cq_level[QINDEX_RANGE] = 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9, 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20, 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31, 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43, 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56, 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70, 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85, 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame); 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Resets the first pass file to the given position using a relative seek 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan * from the current position 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 82233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void reset_fpf_position(VP8_COMP *cpi, FIRSTPASS_STATS *Position) 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.stats_in = Position; 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan 87233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int lookup_next_frame_stats(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame) 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan return EOF; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan *next_frame = *cpi->twopass.stats_in; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 1; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Read frame stats at an offset from the current position */ 97233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int read_frame_stats( VP8_COMP *cpi, 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *frame_stats, 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset ) 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS * fps_ptr = cpi->twopass.stats_in; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Check legality of offset */ 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( offset >= 0 ) 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( &fps_ptr[offset] >= cpi->twopass.stats_in_end ) 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan return EOF; 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if ( offset < 0 ) 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( &fps_ptr[offset] < cpi->twopass.stats_in_start ) 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan return EOF; 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan *frame_stats = fps_ptr[offset]; 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 1; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan 119233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int input_stats(VP8_COMP *cpi, FIRSTPASS_STATS *fps) 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan return EOF; 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan *fps = *cpi->twopass.stats_in; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.stats_in = 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void*)((char *)cpi->twopass.stats_in + sizeof(FIRSTPASS_STATS)); 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 1; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan 130233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void output_stats(const VP8_COMP *cpi, 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_codec_pkt_list *pktlist, 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *stats) 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_codec_cx_pkt pkt; 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.kind = VPX_CODEC_STATS_PKT; 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.twopass_stats.buf = stats; 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS); 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pkt_list_add(pktlist, &pkt); 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)cpi; 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* TEMP debug code */ 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if OUTPUT_FPF 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *fpfile; 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan fpfile = fopen("firstpass.stt", "a"); 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(fpfile, "%12.0f %12.0f %12.0f %12.4f %12.4f %12.4f %12.4f" 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan " %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f" 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan " %12.0f %12.0f %12.4f\n", 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->frame, 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->intra_error, 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->coded_error, 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->ssim_weighted_pred_err, 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->pcnt_inter, 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->pcnt_motion, 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->pcnt_second_ref, 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->pcnt_neutral, 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->MVr, 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->mvr_abs, 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->MVc, 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->mvc_abs, 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->MVrv, 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->MVcv, 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->mv_in_out_count, 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->new_mv_count, 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->count, 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->duration); 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(fpfile); 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan 173233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void zero_stats(FIRSTPASS_STATS *section) 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->frame = 0.0; 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->intra_error = 0.0; 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->coded_error = 0.0; 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->ssim_weighted_pred_err = 0.0; 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_inter = 0.0; 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_motion = 0.0; 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_second_ref = 0.0; 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_neutral = 0.0; 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVr = 0.0; 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvr_abs = 0.0; 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVc = 0.0; 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvc_abs = 0.0; 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVrv = 0.0; 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVcv = 0.0; 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mv_in_out_count = 0.0; 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->new_mv_count = 0.0; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->count = 0.0; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->duration = 1.0; 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan 195233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void accumulate_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->frame += frame->frame; 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->intra_error += frame->intra_error; 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->coded_error += frame->coded_error; 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err; 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_inter += frame->pcnt_inter; 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_motion += frame->pcnt_motion; 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_second_ref += frame->pcnt_second_ref; 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_neutral += frame->pcnt_neutral; 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVr += frame->MVr; 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvr_abs += frame->mvr_abs; 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVc += frame->MVc; 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvc_abs += frame->mvc_abs; 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVrv += frame->MVrv; 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVcv += frame->MVcv; 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mv_in_out_count += frame->mv_in_out_count; 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->new_mv_count += frame->new_mv_count; 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->count += frame->count; 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->duration += frame->duration; 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan 217233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void subtract_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->frame -= frame->frame; 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->intra_error -= frame->intra_error; 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->coded_error -= frame->coded_error; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err; 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_inter -= frame->pcnt_inter; 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_motion -= frame->pcnt_motion; 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_second_ref -= frame->pcnt_second_ref; 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_neutral -= frame->pcnt_neutral; 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVr -= frame->MVr; 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvr_abs -= frame->mvr_abs; 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVc -= frame->MVc; 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvc_abs -= frame->mvc_abs; 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVrv -= frame->MVrv; 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVcv -= frame->MVcv; 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mv_in_out_count -= frame->mv_in_out_count; 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->new_mv_count -= frame->new_mv_count; 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->count -= frame->count; 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->duration -= frame->duration; 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan 239233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void avg_stats(FIRSTPASS_STATS *section) 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (section->count < 1.0) 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->intra_error /= section->count; 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->coded_error /= section->count; 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->ssim_weighted_pred_err /= section->count; 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_inter /= section->count; 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_second_ref /= section->count; 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_neutral /= section->count; 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_motion /= section->count; 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVr /= section->count; 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvr_abs /= section->count; 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVc /= section->count; 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvc_abs /= section->count; 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVrv /= section->count; 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVcv /= section->count; 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mv_in_out_count /= section->count; 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->duration /= section->count; 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Calculate a modified Error used in distributing bits between easier 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan * and harder frames 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 264233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double calculate_modified_err(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan double av_err = ( cpi->twopass.total_stats.ssim_weighted_pred_err / 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.total_stats.count ); 268233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_err = this_frame->ssim_weighted_pred_err; 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan double modified_err; 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)cpi; 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_err > av_err) 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW1); 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW2); 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan return modified_err; 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan 279233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const double weight_table[256] = { 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan0.020000, 0.031250, 0.062500, 0.093750, 0.125000, 0.156250, 0.187500, 0.218750, 285233d2500723e5594f3e7c70896ffeeef32b9c950ywan0.250000, 0.281250, 0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750, 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan0.500000, 0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750, 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan0.750000, 0.781250, 0.812500, 0.843750, 0.875000, 0.906250, 0.937500, 0.968750, 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 313233d2500723e5594f3e7c70896ffeeef32b9c950ywan 314233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double simple_weight(YV12_BUFFER_CONFIG *source) 315233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan 318233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *src = source->y_buffer; 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan double sum_weights = 0.0; 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Loop throught the Y plane raw examining levels and creating a weight 322233d2500723e5594f3e7c70896ffeeef32b9c950ywan * for the image 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = source->y_height; 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan j = source->y_width; 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan do 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_weights += weight_table[ *src]; 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan src++; 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan }while(--j); 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan src -= source->y_width; 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan src += source->y_stride; 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan }while(--i); 336233d2500723e5594f3e7c70896ffeeef32b9c950ywan 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_weights /= (source->y_height * source->y_width); 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan return sum_weights; 340233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* This function returns the current per frame maximum bitrate target */ 344233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int frame_max_bits(VP8_COMP *cpi) 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Max allocation for a single frame based on the max section guidelines 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan * passed in and how many bits are left 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 349233d2500723e5594f3e7c70896ffeeef32b9c950ywan int max_bits; 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* For CBR we need to also consider buffer fullness. 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan * If we are running below the optimal level then we need to gradually 353233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tighten up on max_bits. 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan double buffer_fullness_ratio = (double)cpi->buffer_level / DOUBLE_DIVIDE_CHECK((double)cpi->oxcf.optimal_buffer_level); 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* For CBR base this on the target average bits per frame plus the 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan * maximum sedction rate passed in by the user 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_bits = (int)(cpi->av_per_frame_bandwidth * ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0)); 363233d2500723e5594f3e7c70896ffeeef32b9c950ywan 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If our buffer is below the optimum level */ 365233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (buffer_fullness_ratio < 1.0) 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* The lower of max_bits / 4 or cpi->av_per_frame_bandwidth / 4. */ 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan int min_max_bits = ((cpi->av_per_frame_bandwidth >> 2) < (max_bits >> 2)) ? cpi->av_per_frame_bandwidth >> 2 : max_bits >> 2; 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_bits = (int)(max_bits * buffer_fullness_ratio); 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan 372233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Lowest value we will set ... which should allow the buffer to 373233d2500723e5594f3e7c70896ffeeef32b9c950ywan * refill. 374233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 375233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (max_bits < min_max_bits) 376233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_bits = min_max_bits; 377233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 378233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 379233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* VBR */ 380233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 381233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 382233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* For VBR base this on the bits and frames left plus the 383233d2500723e5594f3e7c70896ffeeef32b9c950ywan * two_pass_vbrmax_section rate passed in by the user 384233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 385233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_bits = (int)(((double)cpi->twopass.bits_left / (cpi->twopass.total_stats.count - (double)cpi->common.current_video_frame)) * ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0)); 386233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 387233d2500723e5594f3e7c70896ffeeef32b9c950ywan 388233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Trap case where we are out of bits */ 389233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (max_bits < 0) 390233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_bits = 0; 391233d2500723e5594f3e7c70896ffeeef32b9c950ywan 392233d2500723e5594f3e7c70896ffeeef32b9c950ywan return max_bits; 393233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 394233d2500723e5594f3e7c70896ffeeef32b9c950ywan 395233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_init_first_pass(VP8_COMP *cpi) 396233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 397233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(&cpi->twopass.total_stats); 398233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 399233d2500723e5594f3e7c70896ffeeef32b9c950ywan 400233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_end_first_pass(VP8_COMP *cpi) 401233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 402233d2500723e5594f3e7c70896ffeeef32b9c950ywan output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats); 403233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 404233d2500723e5594f3e7c70896ffeeef32b9c950ywan 405233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void zz_motion_search( VP8_COMP *cpi, MACROBLOCK * x, 406233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG * raw_buffer, 407233d2500723e5594f3e7c70896ffeeef32b9c950ywan int * raw_motion_err, 408233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG * recon_buffer, 409233d2500723e5594f3e7c70896ffeeef32b9c950ywan int * best_motion_err, int recon_yoffset) 410233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 411233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD * const xd = & x->e_mbd; 412233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK *b = &x->block[0]; 413233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d = &x->e_mbd.block[0]; 414233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *src_ptr = (*(b->base_src) + b->src); 415233d2500723e5594f3e7c70896ffeeef32b9c950ywan int src_stride = b->src_stride; 416233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *raw_ptr; 417233d2500723e5594f3e7c70896ffeeef32b9c950ywan int raw_stride = raw_buffer->y_stride; 418233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ref_ptr; 419233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ref_stride = x->e_mbd.pre.y_stride; 420233d2500723e5594f3e7c70896ffeeef32b9c950ywan 421233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)cpi; 422233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set up pointers for this macro block raw buffer */ 423233d2500723e5594f3e7c70896ffeeef32b9c950ywan raw_ptr = (unsigned char *)(raw_buffer->y_buffer + recon_yoffset 424233d2500723e5594f3e7c70896ffeeef32b9c950ywan + d->offset); 425233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_mse16x16 ( src_ptr, src_stride, raw_ptr, raw_stride, 426233d2500723e5594f3e7c70896ffeeef32b9c950ywan (unsigned int *)(raw_motion_err)); 427233d2500723e5594f3e7c70896ffeeef32b9c950ywan 428233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set up pointers for this macro block recon buffer */ 429233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset; 430233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_ptr = (unsigned char *)(xd->pre.y_buffer + d->offset ); 431233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_mse16x16 ( src_ptr, src_stride, ref_ptr, ref_stride, 432233d2500723e5594f3e7c70896ffeeef32b9c950ywan (unsigned int *)(best_motion_err)); 433233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 434233d2500723e5594f3e7c70896ffeeef32b9c950ywan 435233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void first_pass_motion_search(VP8_COMP *cpi, MACROBLOCK *x, 436233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv *ref_mv, MV *best_mv, 437233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *recon_buffer, 438233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *best_motion_err, int recon_yoffset ) 439233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 440233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *const xd = & x->e_mbd; 441233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK *b = &x->block[0]; 442233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d = &x->e_mbd.block[0]; 443233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num00; 444233d2500723e5594f3e7c70896ffeeef32b9c950ywan 445233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv tmp_mv; 446233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv ref_mv_full; 447233d2500723e5594f3e7c70896ffeeef32b9c950ywan 448233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_err; 449233d2500723e5594f3e7c70896ffeeef32b9c950ywan int step_param = 3; /* Dont search over full range for first pass */ 450233d2500723e5594f3e7c70896ffeeef32b9c950ywan int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; 451233d2500723e5594f3e7c70896ffeeef32b9c950ywan int n; 452233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[BLOCK_16X16]; 453233d2500723e5594f3e7c70896ffeeef32b9c950ywan int new_mv_mode_penalty = 256; 454233d2500723e5594f3e7c70896ffeeef32b9c950ywan 455233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* override the default variance function to use MSE */ 456233d2500723e5594f3e7c70896ffeeef32b9c950ywan v_fn_ptr.vf = vp8_mse16x16; 457233d2500723e5594f3e7c70896ffeeef32b9c950ywan 458233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set up pointers for this macro block recon buffer */ 459233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset; 460233d2500723e5594f3e7c70896ffeeef32b9c950ywan 461233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Initial step/diamond search centred on best mv */ 462233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_mv.as_int = 0; 463233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_mv_full.as_mv.col = ref_mv->as_mv.col>>3; 464233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_mv_full.as_mv.row = ref_mv->as_mv.row>>3; 465233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, step_param, 466233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->sadperbit16, &num00, &v_fn_ptr, 467233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mvcost, ref_mv); 468233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( tmp_err < INT_MAX-new_mv_mode_penalty ) 469233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err += new_mv_mode_penalty; 470233d2500723e5594f3e7c70896ffeeef32b9c950ywan 471233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < *best_motion_err) 472233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 473233d2500723e5594f3e7c70896ffeeef32b9c950ywan *best_motion_err = tmp_err; 474233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->row = tmp_mv.as_mv.row; 475233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->col = tmp_mv.as_mv.col; 476233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 477233d2500723e5594f3e7c70896ffeeef32b9c950ywan 478233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Further step/diamond searches as necessary */ 479233d2500723e5594f3e7c70896ffeeef32b9c950ywan n = num00; 480233d2500723e5594f3e7c70896ffeeef32b9c950ywan num00 = 0; 481233d2500723e5594f3e7c70896ffeeef32b9c950ywan 482233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (n < further_steps) 483233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 484233d2500723e5594f3e7c70896ffeeef32b9c950ywan n++; 485233d2500723e5594f3e7c70896ffeeef32b9c950ywan 486233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (num00) 487233d2500723e5594f3e7c70896ffeeef32b9c950ywan num00--; 488233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 489233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 490233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, 491233d2500723e5594f3e7c70896ffeeef32b9c950ywan step_param + n, x->sadperbit16, 492233d2500723e5594f3e7c70896ffeeef32b9c950ywan &num00, &v_fn_ptr, x->mvcost, 493233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_mv); 494233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( tmp_err < INT_MAX-new_mv_mode_penalty ) 495233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err += new_mv_mode_penalty; 496233d2500723e5594f3e7c70896ffeeef32b9c950ywan 497233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < *best_motion_err) 498233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 499233d2500723e5594f3e7c70896ffeeef32b9c950ywan *best_motion_err = tmp_err; 500233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->row = tmp_mv.as_mv.row; 501233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->col = tmp_mv.as_mv.col; 502233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 503233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 504233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 505233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 506233d2500723e5594f3e7c70896ffeeef32b9c950ywan 507233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_first_pass(VP8_COMP *cpi) 508233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 509233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_row, mb_col; 510233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCK *const x = & cpi->mb; 511233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMMON *const cm = & cpi->common; 512233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *const xd = & x->e_mbd; 513233d2500723e5594f3e7c70896ffeeef32b9c950ywan 514233d2500723e5594f3e7c70896ffeeef32b9c950ywan int recon_yoffset, recon_uvoffset; 515233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *lst_yv12 = &cm->yv12_fb[cm->lst_fb_idx]; 516233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx]; 517233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *gld_yv12 = &cm->yv12_fb[cm->gld_fb_idx]; 518233d2500723e5594f3e7c70896ffeeef32b9c950ywan int recon_y_stride = lst_yv12->y_stride; 519233d2500723e5594f3e7c70896ffeeef32b9c950ywan int recon_uv_stride = lst_yv12->uv_stride; 520233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t intra_error = 0; 521233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t coded_error = 0; 522233d2500723e5594f3e7c70896ffeeef32b9c950ywan 523233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum_mvr = 0, sum_mvc = 0; 524233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum_mvr_abs = 0, sum_mvc_abs = 0; 525233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum_mvrs = 0, sum_mvcs = 0; 526233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mvcount = 0; 527233d2500723e5594f3e7c70896ffeeef32b9c950ywan int intercount = 0; 528233d2500723e5594f3e7c70896ffeeef32b9c950ywan int second_ref_count = 0; 529233d2500723e5594f3e7c70896ffeeef32b9c950ywan int intrapenalty = 256; 530233d2500723e5594f3e7c70896ffeeef32b9c950ywan int neutral_count = 0; 531233d2500723e5594f3e7c70896ffeeef32b9c950ywan int new_mv_count = 0; 532233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum_in_vectors = 0; 533233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint32_t lastmv_as_int = 0; 534233d2500723e5594f3e7c70896ffeeef32b9c950ywan 535233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv zero_ref_mv; 536233d2500723e5594f3e7c70896ffeeef32b9c950ywan 537233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_ref_mv.as_int = 0; 538233d2500723e5594f3e7c70896ffeeef32b9c950ywan 539233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 540233d2500723e5594f3e7c70896ffeeef32b9c950ywan 541233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->src = * cpi->Source; 542233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->pre = *lst_yv12; 543233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->dst = *new_yv12; 544233d2500723e5594f3e7c70896ffeeef32b9c950ywan 545233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->partition_info = x->pi; 546233d2500723e5594f3e7c70896ffeeef32b9c950ywan 547233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mode_info_context = cm->mi; 548233d2500723e5594f3e7c70896ffeeef32b9c950ywan 549233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!cm->use_bilinear_mc_filter) 550233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 551233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->subpixel_predict = vp8_sixtap_predict4x4; 552233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->subpixel_predict8x4 = vp8_sixtap_predict8x4; 553233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->subpixel_predict8x8 = vp8_sixtap_predict8x8; 554233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->subpixel_predict16x16 = vp8_sixtap_predict16x16; 555233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 556233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 557233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 558233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->subpixel_predict = vp8_bilinear_predict4x4; 559233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->subpixel_predict8x4 = vp8_bilinear_predict8x4; 560233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->subpixel_predict8x8 = vp8_bilinear_predict8x8; 561233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->subpixel_predict16x16 = vp8_bilinear_predict16x16; 562233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 563233d2500723e5594f3e7c70896ffeeef32b9c950ywan 564233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_build_block_offsets(x); 565233d2500723e5594f3e7c70896ffeeef32b9c950ywan 566233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* set up frame new frame for intra coded blocks */ 567233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_setup_intra_recon(new_yv12); 568233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8cx_frame_init_quantizer(cpi); 569233d2500723e5594f3e7c70896ffeeef32b9c950ywan 570233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Initialise the MV cost table to the defaults */ 571233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 572233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flag[2] = {1, 1}; 573233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_initialize_rd_consts(cpi, x, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q)); 574233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(cm->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context)); 575233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cm->fc.mvc, flag); 576233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 577233d2500723e5594f3e7c70896ffeeef32b9c950ywan 578233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* for each macroblock row in image */ 579233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) 580233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 581233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv best_ref_mv; 582233d2500723e5594f3e7c70896ffeeef32b9c950ywan 583233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_ref_mv.as_int = 0; 584233d2500723e5594f3e7c70896ffeeef32b9c950ywan 585233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* reset above block coeffs */ 586233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->up_available = (mb_row != 0); 587233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_yoffset = (mb_row * recon_y_stride * 16); 588233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_uvoffset = (mb_row * recon_uv_stride * 8); 589233d2500723e5594f3e7c70896ffeeef32b9c950ywan 590233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set up limit values for motion vectors to prevent them extending 591233d2500723e5594f3e7c70896ffeeef32b9c950ywan * outside the UMV borders 592233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 593233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16)); 594233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16); 595233d2500723e5594f3e7c70896ffeeef32b9c950ywan 596233d2500723e5594f3e7c70896ffeeef32b9c950ywan 597233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* for each macroblock col in image */ 598233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) 599233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 600233d2500723e5594f3e7c70896ffeeef32b9c950ywan int this_error; 601233d2500723e5594f3e7c70896ffeeef32b9c950ywan int gf_motion_error = INT_MAX; 602233d2500723e5594f3e7c70896ffeeef32b9c950ywan int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); 603233d2500723e5594f3e7c70896ffeeef32b9c950ywan 604233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset; 605233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->dst.u_buffer = new_yv12->u_buffer + recon_uvoffset; 606233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset; 607233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->left_available = (mb_col != 0); 608233d2500723e5594f3e7c70896ffeeef32b9c950ywan 609233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Copy current mb to a buffer */ 610233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16); 611233d2500723e5594f3e7c70896ffeeef32b9c950ywan 612233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* do intra 16x16 prediction */ 613233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_error = vp8_encode_intra(cpi, x, use_dc_pred); 614233d2500723e5594f3e7c70896ffeeef32b9c950ywan 615233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* "intrapenalty" below deals with situations where the intra 616233d2500723e5594f3e7c70896ffeeef32b9c950ywan * and inter error scores are very low (eg a plain black frame) 617233d2500723e5594f3e7c70896ffeeef32b9c950ywan * We do not have special cases in first pass for 0,0 and 618233d2500723e5594f3e7c70896ffeeef32b9c950ywan * nearest etc so all inter modes carry an overhead cost 619233d2500723e5594f3e7c70896ffeeef32b9c950ywan * estimate fot the mv. When the error score is very low this 620233d2500723e5594f3e7c70896ffeeef32b9c950ywan * causes us to pick all or lots of INTRA modes and throw lots 621233d2500723e5594f3e7c70896ffeeef32b9c950ywan * of key frames. This penalty adds a cost matching that of a 622233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 0,0 mv to the intra case. 623233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 624233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_error += intrapenalty; 625233d2500723e5594f3e7c70896ffeeef32b9c950ywan 626233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Cumulative intra error total */ 627233d2500723e5594f3e7c70896ffeeef32b9c950ywan intra_error += (int64_t)this_error; 628233d2500723e5594f3e7c70896ffeeef32b9c950ywan 629233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set up limit values for motion vectors to prevent them 630233d2500723e5594f3e7c70896ffeeef32b9c950ywan * extending outside the UMV borders 631233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 632233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16)); 633233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16); 634233d2500723e5594f3e7c70896ffeeef32b9c950ywan 635233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Other than for the first frame do a motion search */ 636233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cm->current_video_frame > 0) 637233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 638233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d = &x->e_mbd.block[0]; 639233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV tmp_mv = {0, 0}; 640233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_err; 641233d2500723e5594f3e7c70896ffeeef32b9c950ywan int motion_error = INT_MAX; 642233d2500723e5594f3e7c70896ffeeef32b9c950ywan int raw_motion_error = INT_MAX; 643233d2500723e5594f3e7c70896ffeeef32b9c950ywan 644233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Simple 0,0 motion with no mv overhead */ 645233d2500723e5594f3e7c70896ffeeef32b9c950ywan zz_motion_search( cpi, x, cpi->last_frame_unscaled_source, 646233d2500723e5594f3e7c70896ffeeef32b9c950ywan &raw_motion_error, lst_yv12, &motion_error, 647233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_yoffset ); 648233d2500723e5594f3e7c70896ffeeef32b9c950ywan d->bmi.mv.as_mv.row = 0; 649233d2500723e5594f3e7c70896ffeeef32b9c950ywan d->bmi.mv.as_mv.col = 0; 650233d2500723e5594f3e7c70896ffeeef32b9c950ywan 651233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (raw_motion_error < cpi->oxcf.encode_breakout) 652233d2500723e5594f3e7c70896ffeeef32b9c950ywan goto skip_motion_search; 653233d2500723e5594f3e7c70896ffeeef32b9c950ywan 654233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Test last reference frame using the previous best mv as the 655233d2500723e5594f3e7c70896ffeeef32b9c950ywan * starting point (best reference) for the search 656233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 657233d2500723e5594f3e7c70896ffeeef32b9c950ywan first_pass_motion_search(cpi, x, &best_ref_mv, 658233d2500723e5594f3e7c70896ffeeef32b9c950ywan &d->bmi.mv.as_mv, lst_yv12, 659233d2500723e5594f3e7c70896ffeeef32b9c950ywan &motion_error, recon_yoffset); 660233d2500723e5594f3e7c70896ffeeef32b9c950ywan 661233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If the current best reference mv is not centred on 0,0 662233d2500723e5594f3e7c70896ffeeef32b9c950ywan * then do a 0,0 based search as well 663233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 664233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (best_ref_mv.as_int) 665233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 666233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = INT_MAX; 667233d2500723e5594f3e7c70896ffeeef32b9c950ywan first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, 668233d2500723e5594f3e7c70896ffeeef32b9c950ywan lst_yv12, &tmp_err, recon_yoffset); 669233d2500723e5594f3e7c70896ffeeef32b9c950ywan 670233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( tmp_err < motion_error ) 671233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 672233d2500723e5594f3e7c70896ffeeef32b9c950ywan motion_error = tmp_err; 673233d2500723e5594f3e7c70896ffeeef32b9c950ywan d->bmi.mv.as_mv.row = tmp_mv.row; 674233d2500723e5594f3e7c70896ffeeef32b9c950ywan d->bmi.mv.as_mv.col = tmp_mv.col; 675233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 676233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 677233d2500723e5594f3e7c70896ffeeef32b9c950ywan 678233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Experimental search in a second reference frame ((0,0) 679233d2500723e5594f3e7c70896ffeeef32b9c950ywan * based only) 680233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 681233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cm->current_video_frame > 1) 682233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 683233d2500723e5594f3e7c70896ffeeef32b9c950ywan first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, gld_yv12, &gf_motion_error, recon_yoffset); 684233d2500723e5594f3e7c70896ffeeef32b9c950ywan 685233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((gf_motion_error < motion_error) && (gf_motion_error < this_error)) 686233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 687233d2500723e5594f3e7c70896ffeeef32b9c950ywan second_ref_count++; 688233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 689233d2500723e5594f3e7c70896ffeeef32b9c950ywan 690233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset to last frame as reference buffer */ 691233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->pre.y_buffer = lst_yv12->y_buffer + recon_yoffset; 692233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->pre.u_buffer = lst_yv12->u_buffer + recon_uvoffset; 693233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->pre.v_buffer = lst_yv12->v_buffer + recon_uvoffset; 694233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 695233d2500723e5594f3e7c70896ffeeef32b9c950ywan 696233d2500723e5594f3e7c70896ffeeef32b9c950ywanskip_motion_search: 697233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Intra assumed best */ 698233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_ref_mv.as_int = 0; 699233d2500723e5594f3e7c70896ffeeef32b9c950ywan 700233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (motion_error <= this_error) 701233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 702233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Keep a count of cases where the inter and intra were 703233d2500723e5594f3e7c70896ffeeef32b9c950ywan * very close and very low. This helps with scene cut 704233d2500723e5594f3e7c70896ffeeef32b9c950ywan * detection for example in cropped clips with black bars 705233d2500723e5594f3e7c70896ffeeef32b9c950ywan * at the sides or top and bottom. 706233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 707233d2500723e5594f3e7c70896ffeeef32b9c950ywan if( (((this_error-intrapenalty) * 9) <= 708233d2500723e5594f3e7c70896ffeeef32b9c950ywan (motion_error*10)) && 709233d2500723e5594f3e7c70896ffeeef32b9c950ywan (this_error < (2*intrapenalty)) ) 710233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 711233d2500723e5594f3e7c70896ffeeef32b9c950ywan neutral_count++; 712233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 713233d2500723e5594f3e7c70896ffeeef32b9c950ywan 714233d2500723e5594f3e7c70896ffeeef32b9c950ywan d->bmi.mv.as_mv.row *= 8; 715233d2500723e5594f3e7c70896ffeeef32b9c950ywan d->bmi.mv.as_mv.col *= 8; 716233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_error = motion_error; 717233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_set_mbmode_and_mvs(x, NEWMV, &d->bmi.mv); 718233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_encode_inter16x16y(x); 719233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvr += d->bmi.mv.as_mv.row; 720233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvr_abs += abs(d->bmi.mv.as_mv.row); 721233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvc += d->bmi.mv.as_mv.col; 722233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvc_abs += abs(d->bmi.mv.as_mv.col); 723233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvrs += d->bmi.mv.as_mv.row * d->bmi.mv.as_mv.row; 724233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvcs += d->bmi.mv.as_mv.col * d->bmi.mv.as_mv.col; 725233d2500723e5594f3e7c70896ffeeef32b9c950ywan intercount++; 726233d2500723e5594f3e7c70896ffeeef32b9c950ywan 727233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_ref_mv.as_int = d->bmi.mv.as_int; 728233d2500723e5594f3e7c70896ffeeef32b9c950ywan 729233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Was the vector non-zero */ 730233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_int) 731233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 732233d2500723e5594f3e7c70896ffeeef32b9c950ywan mvcount++; 733233d2500723e5594f3e7c70896ffeeef32b9c950ywan 734233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Was it different from the last non zero vector */ 735233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( d->bmi.mv.as_int != lastmv_as_int ) 736233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_mv_count++; 737233d2500723e5594f3e7c70896ffeeef32b9c950ywan lastmv_as_int = d->bmi.mv.as_int; 738233d2500723e5594f3e7c70896ffeeef32b9c950ywan 739233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Does the Row vector point inwards or outwards */ 740233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mb_row < cm->mb_rows / 2) 741233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 742233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_mv.row > 0) 743233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_in_vectors--; 744233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (d->bmi.mv.as_mv.row < 0) 745233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_in_vectors++; 746233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 747233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mb_row > cm->mb_rows / 2) 748233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 749233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_mv.row > 0) 750233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_in_vectors++; 751233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (d->bmi.mv.as_mv.row < 0) 752233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_in_vectors--; 753233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 754233d2500723e5594f3e7c70896ffeeef32b9c950ywan 755233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Does the Row vector point inwards or outwards */ 756233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mb_col < cm->mb_cols / 2) 757233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 758233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_mv.col > 0) 759233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_in_vectors--; 760233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (d->bmi.mv.as_mv.col < 0) 761233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_in_vectors++; 762233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 763233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mb_col > cm->mb_cols / 2) 764233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 765233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_mv.col > 0) 766233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_in_vectors++; 767233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (d->bmi.mv.as_mv.col < 0) 768233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_in_vectors--; 769233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 770233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 771233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 772233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 773233d2500723e5594f3e7c70896ffeeef32b9c950ywan 774233d2500723e5594f3e7c70896ffeeef32b9c950ywan coded_error += (int64_t)this_error; 775233d2500723e5594f3e7c70896ffeeef32b9c950ywan 776233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* adjust to the next column of macroblocks */ 777233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->src.y_buffer += 16; 778233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->src.u_buffer += 8; 779233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->src.v_buffer += 8; 780233d2500723e5594f3e7c70896ffeeef32b9c950ywan 781233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_yoffset += 16; 782233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_uvoffset += 8; 783233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 784233d2500723e5594f3e7c70896ffeeef32b9c950ywan 785233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* adjust to the next row of mbs */ 786233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols; 787233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols; 788233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols; 789233d2500723e5594f3e7c70896ffeeef32b9c950ywan 790233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* extend the recon for intra prediction */ 791233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); 792233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 793233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 794233d2500723e5594f3e7c70896ffeeef32b9c950ywan 795233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 796233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 797233d2500723e5594f3e7c70896ffeeef32b9c950ywan double weight = 0.0; 798233d2500723e5594f3e7c70896ffeeef32b9c950ywan 799233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS fps; 800233d2500723e5594f3e7c70896ffeeef32b9c950ywan 801233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.frame = cm->current_video_frame ; 802233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.intra_error = (double)(intra_error >> 8); 803233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.coded_error = (double)(coded_error >> 8); 804233d2500723e5594f3e7c70896ffeeef32b9c950ywan weight = simple_weight(cpi->Source); 805233d2500723e5594f3e7c70896ffeeef32b9c950ywan 806233d2500723e5594f3e7c70896ffeeef32b9c950ywan 807233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (weight < 0.1) 808233d2500723e5594f3e7c70896ffeeef32b9c950ywan weight = 0.1; 809233d2500723e5594f3e7c70896ffeeef32b9c950ywan 810233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.ssim_weighted_pred_err = fps.coded_error * weight; 811233d2500723e5594f3e7c70896ffeeef32b9c950ywan 812233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_inter = 0.0; 813233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_motion = 0.0; 814233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVr = 0.0; 815233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mvr_abs = 0.0; 816233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVc = 0.0; 817233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mvc_abs = 0.0; 818233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVrv = 0.0; 819233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVcv = 0.0; 820233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mv_in_out_count = 0.0; 821233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.new_mv_count = 0.0; 822233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.count = 1.0; 823233d2500723e5594f3e7c70896ffeeef32b9c950ywan 824233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_inter = 1.0 * (double)intercount / cm->MBs; 825233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_second_ref = 1.0 * (double)second_ref_count / cm->MBs; 826233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_neutral = 1.0 * (double)neutral_count / cm->MBs; 827233d2500723e5594f3e7c70896ffeeef32b9c950ywan 828233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mvcount > 0) 829233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 830233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVr = (double)sum_mvr / (double)mvcount; 831233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mvr_abs = (double)sum_mvr_abs / (double)mvcount; 832233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVc = (double)sum_mvc / (double)mvcount; 833233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mvc_abs = (double)sum_mvc_abs / (double)mvcount; 834233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / (double)mvcount)) / (double)mvcount; 835233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / (double)mvcount)) / (double)mvcount; 836233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mv_in_out_count = (double)sum_in_vectors / (double)(mvcount * 2); 837233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.new_mv_count = new_mv_count; 838233d2500723e5594f3e7c70896ffeeef32b9c950ywan 839233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_motion = 1.0 * (double)mvcount / cpi->common.MBs; 840233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 841233d2500723e5594f3e7c70896ffeeef32b9c950ywan 842233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* TODO: handle the case when duration is set to 0, or something less 843233d2500723e5594f3e7c70896ffeeef32b9c950ywan * than the full time between subsequent cpi->source_time_stamps 844233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 845233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.duration = (double)(cpi->source->ts_end 846233d2500723e5594f3e7c70896ffeeef32b9c950ywan - cpi->source->ts_start); 847233d2500723e5594f3e7c70896ffeeef32b9c950ywan 848233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* don't want to do output stats with a stack variable! */ 849233d2500723e5594f3e7c70896ffeeef32b9c950ywan memcpy(&cpi->twopass.this_frame_stats, 850233d2500723e5594f3e7c70896ffeeef32b9c950ywan &fps, 851233d2500723e5594f3e7c70896ffeeef32b9c950ywan sizeof(FIRSTPASS_STATS)); 852233d2500723e5594f3e7c70896ffeeef32b9c950ywan output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.this_frame_stats); 853233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_stats(&cpi->twopass.total_stats, &fps); 854233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 855233d2500723e5594f3e7c70896ffeeef32b9c950ywan 856233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Copy the previous Last Frame into the GF buffer if specific 857233d2500723e5594f3e7c70896ffeeef32b9c950ywan * conditions for doing so are met 858233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 859233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cm->current_video_frame > 0) && 860233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.this_frame_stats.pcnt_inter > 0.20) && 861233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->twopass.this_frame_stats.intra_error / 862233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(cpi->twopass.this_frame_stats.coded_error)) > 863233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2.0)) 864233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 865233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_yv12_copy_frame(lst_yv12, gld_yv12); 866233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 867233d2500723e5594f3e7c70896ffeeef32b9c950ywan 868233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* swap frame pointers so last frame refers to the frame we just 869233d2500723e5594f3e7c70896ffeeef32b9c950ywan * compressed 870233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 871233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_swap_yv12_buffer(lst_yv12, new_yv12); 872233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_yv12_extend_frame_borders(lst_yv12); 873233d2500723e5594f3e7c70896ffeeef32b9c950ywan 874233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Special case for the first frame. Copy into the GF buffer as a 875233d2500723e5594f3e7c70896ffeeef32b9c950ywan * second reference. 876233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 877233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cm->current_video_frame == 0) 878233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 879233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_yv12_copy_frame(lst_yv12, gld_yv12); 880233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 881233d2500723e5594f3e7c70896ffeeef32b9c950ywan 882233d2500723e5594f3e7c70896ffeeef32b9c950ywan 883233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* use this to see what the first pass reconstruction looks like */ 884233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (0) 885233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 886233d2500723e5594f3e7c70896ffeeef32b9c950ywan char filename[512]; 887233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *recon_file; 888233d2500723e5594f3e7c70896ffeeef32b9c950ywan sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame); 889233d2500723e5594f3e7c70896ffeeef32b9c950ywan 890233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cm->current_video_frame == 0) 891233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_file = fopen(filename, "wb"); 892233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 893233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_file = fopen(filename, "ab"); 894233d2500723e5594f3e7c70896ffeeef32b9c950ywan 895233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void) fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, 896233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_file); 897233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(recon_file); 898233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 899233d2500723e5594f3e7c70896ffeeef32b9c950ywan 900233d2500723e5594f3e7c70896ffeeef32b9c950ywan cm->current_video_frame++; 901233d2500723e5594f3e7c70896ffeeef32b9c950ywan 902233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 903233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern const int vp8_bits_per_mb[2][QINDEX_RANGE]; 904233d2500723e5594f3e7c70896ffeeef32b9c950ywan 905233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Estimate a cost per mb attributable to overheads such as the coding of 906233d2500723e5594f3e7c70896ffeeef32b9c950ywan * modes and motion vectors. 907233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Currently simplistic in its assumptions for testing. 908233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 909233d2500723e5594f3e7c70896ffeeef32b9c950ywan 910233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double bitcost( double prob ) 911233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 912233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (prob > 0.000122) 913233d2500723e5594f3e7c70896ffeeef32b9c950ywan return -log(prob) / log(2.0); 914233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 915233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 13.0; 916233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 917233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int64_t estimate_modemvcost(VP8_COMP *cpi, 918233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS * fpstats) 919233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 920233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_cost; 921233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t mode_cost; 922233d2500723e5594f3e7c70896ffeeef32b9c950ywan 923233d2500723e5594f3e7c70896ffeeef32b9c950ywan double av_pct_inter = fpstats->pcnt_inter / fpstats->count; 924233d2500723e5594f3e7c70896ffeeef32b9c950ywan double av_pct_motion = fpstats->pcnt_motion / fpstats->count; 925233d2500723e5594f3e7c70896ffeeef32b9c950ywan double av_intra = (1.0 - av_pct_inter); 926233d2500723e5594f3e7c70896ffeeef32b9c950ywan 927233d2500723e5594f3e7c70896ffeeef32b9c950ywan double zz_cost; 928233d2500723e5594f3e7c70896ffeeef32b9c950ywan double motion_cost; 929233d2500723e5594f3e7c70896ffeeef32b9c950ywan double intra_cost; 930233d2500723e5594f3e7c70896ffeeef32b9c950ywan 931233d2500723e5594f3e7c70896ffeeef32b9c950ywan zz_cost = bitcost(av_pct_inter - av_pct_motion); 932233d2500723e5594f3e7c70896ffeeef32b9c950ywan motion_cost = bitcost(av_pct_motion); 933233d2500723e5594f3e7c70896ffeeef32b9c950ywan intra_cost = bitcost(av_intra); 934233d2500723e5594f3e7c70896ffeeef32b9c950ywan 935233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Estimate of extra bits per mv overhead for mbs 936233d2500723e5594f3e7c70896ffeeef32b9c950ywan * << 9 is the normalization to the (bits * 512) used in vp8_bits_per_mb 937233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 938233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9; 939233d2500723e5594f3e7c70896ffeeef32b9c950ywan 940233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Crude estimate of overhead cost from modes 941233d2500723e5594f3e7c70896ffeeef32b9c950ywan * << 9 is the normalization to (bits * 512) used in vp8_bits_per_mb 942233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 943233d2500723e5594f3e7c70896ffeeef32b9c950ywan mode_cost = (int64_t)((((av_pct_inter - av_pct_motion) * zz_cost) + 944233d2500723e5594f3e7c70896ffeeef32b9c950ywan (av_pct_motion * motion_cost) + 945233d2500723e5594f3e7c70896ffeeef32b9c950ywan (av_intra * intra_cost)) * cpi->common.MBs) * 512; 946233d2500723e5594f3e7c70896ffeeef32b9c950ywan 947233d2500723e5594f3e7c70896ffeeef32b9c950ywan return mv_cost + mode_cost; 948233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 949233d2500723e5594f3e7c70896ffeeef32b9c950ywan 950233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double calc_correction_factor( double err_per_mb, 951233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_devisor, 952233d2500723e5594f3e7c70896ffeeef32b9c950ywan double pt_low, 953233d2500723e5594f3e7c70896ffeeef32b9c950ywan double pt_high, 954233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Q ) 955233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 956233d2500723e5594f3e7c70896ffeeef32b9c950ywan double power_term; 957233d2500723e5594f3e7c70896ffeeef32b9c950ywan double error_term = err_per_mb / err_devisor; 958233d2500723e5594f3e7c70896ffeeef32b9c950ywan double correction_factor; 959233d2500723e5594f3e7c70896ffeeef32b9c950ywan 960233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Adjustment based on Q to power term. */ 961233d2500723e5594f3e7c70896ffeeef32b9c950ywan power_term = pt_low + (Q * 0.01); 962233d2500723e5594f3e7c70896ffeeef32b9c950ywan power_term = (power_term > pt_high) ? pt_high : power_term; 963233d2500723e5594f3e7c70896ffeeef32b9c950ywan 964233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Adjustments to error term */ 965233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* TBD */ 966233d2500723e5594f3e7c70896ffeeef32b9c950ywan 967233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate correction factor */ 968233d2500723e5594f3e7c70896ffeeef32b9c950ywan correction_factor = pow(error_term, power_term); 969233d2500723e5594f3e7c70896ffeeef32b9c950ywan 970233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Clip range */ 971233d2500723e5594f3e7c70896ffeeef32b9c950ywan correction_factor = 972233d2500723e5594f3e7c70896ffeeef32b9c950ywan (correction_factor < 0.05) 973233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? 0.05 : (correction_factor > 5.0) ? 5.0 : correction_factor; 974233d2500723e5594f3e7c70896ffeeef32b9c950ywan 975233d2500723e5594f3e7c70896ffeeef32b9c950ywan return correction_factor; 976233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 977233d2500723e5594f3e7c70896ffeeef32b9c950ywan 978233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int estimate_max_q(VP8_COMP *cpi, 979233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS * fpstats, 980233d2500723e5594f3e7c70896ffeeef32b9c950ywan int section_target_bandwitdh, 981233d2500723e5594f3e7c70896ffeeef32b9c950ywan int overhead_bits ) 982233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 983233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Q; 984233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num_mbs = cpi->common.MBs; 985233d2500723e5594f3e7c70896ffeeef32b9c950ywan int target_norm_bits_per_mb; 986233d2500723e5594f3e7c70896ffeeef32b9c950ywan 987233d2500723e5594f3e7c70896ffeeef32b9c950ywan double section_err = (fpstats->coded_error / fpstats->count); 988233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_per_mb = section_err / num_mbs; 989233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_correction_factor; 990233d2500723e5594f3e7c70896ffeeef32b9c950ywan double speed_correction = 1.0; 991233d2500723e5594f3e7c70896ffeeef32b9c950ywan int overhead_bits_per_mb; 992233d2500723e5594f3e7c70896ffeeef32b9c950ywan 993233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (section_target_bandwitdh <= 0) 994233d2500723e5594f3e7c70896ffeeef32b9c950ywan return cpi->twopass.maxq_max_limit; /* Highest value allowed */ 995233d2500723e5594f3e7c70896ffeeef32b9c950ywan 996233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_norm_bits_per_mb = 997233d2500723e5594f3e7c70896ffeeef32b9c950ywan (section_target_bandwitdh < (1 << 20)) 998233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (512 * section_target_bandwitdh) / num_mbs 999233d2500723e5594f3e7c70896ffeeef32b9c950ywan : 512 * (section_target_bandwitdh / num_mbs); 1000233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1001233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate a corrective factor based on a rolling ratio of bits spent 1002233d2500723e5594f3e7c70896ffeeef32b9c950ywan * vs target bits 1003233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1004233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->rolling_target_bits > 0) && 1005233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->active_worst_quality < cpi->worst_quality)) 1006233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1007233d2500723e5594f3e7c70896ffeeef32b9c950ywan double rolling_ratio; 1008233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1009233d2500723e5594f3e7c70896ffeeef32b9c950ywan rolling_ratio = (double)cpi->rolling_actual_bits / 1010233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)cpi->rolling_target_bits; 1011233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1012233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rolling_ratio < 0.95) 1013233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.est_max_qcorrection_factor -= 0.005; 1014233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (rolling_ratio > 1.05) 1015233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.est_max_qcorrection_factor += 0.005; 1016233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1017233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.est_max_qcorrection_factor = 1018233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.est_max_qcorrection_factor < 0.1) 1019233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? 0.1 1020233d2500723e5594f3e7c70896ffeeef32b9c950ywan : (cpi->twopass.est_max_qcorrection_factor > 10.0) 1021233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? 10.0 : cpi->twopass.est_max_qcorrection_factor; 1022233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1023233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1024233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Corrections for higher compression speed settings 1025233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (reduced compression expected) 1026233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1027233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) 1028233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1029233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.cpu_used <= 5) 1030233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04); 1031233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1032233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction = 1.25; 1033233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1034233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1035233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Estimate of overhead bits per mb */ 1036233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Correction to overhead bits for min allowed Q. */ 1037233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits_per_mb = overhead_bits / num_mbs; 1038233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits_per_mb = (int)(overhead_bits_per_mb * 1039233d2500723e5594f3e7c70896ffeeef32b9c950ywan pow( 0.98, (double)cpi->twopass.maxq_min_limit )); 1040233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1041233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Try and pick a max Q that will be high enough to encode the 1042233d2500723e5594f3e7c70896ffeeef32b9c950ywan * content at the given rate. 1043233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1044233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (Q = cpi->twopass.maxq_min_limit; Q < cpi->twopass.maxq_max_limit; Q++) 1045233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1046233d2500723e5594f3e7c70896ffeeef32b9c950ywan int bits_per_mb_at_this_q; 1047233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1048233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Error per MB based correction factor */ 1049233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_correction_factor = 1050233d2500723e5594f3e7c70896ffeeef32b9c950ywan calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q); 1051233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1052233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_mb_at_this_q = 1053233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb; 1054233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1055233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_mb_at_this_q = (int)(.5 + err_correction_factor 1056233d2500723e5594f3e7c70896ffeeef32b9c950ywan * speed_correction * cpi->twopass.est_max_qcorrection_factor 1057233d2500723e5594f3e7c70896ffeeef32b9c950ywan * cpi->twopass.section_max_qfactor 1058233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (double)bits_per_mb_at_this_q); 1059233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1060233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Mode and motion overhead */ 1061233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* As Q rises in real encode loop rd code will force overhead down 1062233d2500723e5594f3e7c70896ffeeef32b9c950ywan * We make a crude adjustment for this here as *.98 per Q step. 1063233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1064233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98); 1065233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1066233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) 1067233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1068233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1069233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1070233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Restriction on active max q for constrained quality mode. */ 1071233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) && 1072233d2500723e5594f3e7c70896ffeeef32b9c950ywan (Q < cpi->cq_target_quality) ) 1073233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1074233d2500723e5594f3e7c70896ffeeef32b9c950ywan Q = cpi->cq_target_quality; 1075233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1076233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1077233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Adjust maxq_min_limit and maxq_max_limit limits based on 1078233d2500723e5594f3e7c70896ffeeef32b9c950ywan * average q observed in clip for non kf/gf.arf frames 1079233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Give average a chance to settle though. 1080233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1081233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( (cpi->ni_frames > 1082233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((int)cpi->twopass.total_stats.count >> 8)) && 1083233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->ni_frames > 150) ) 1084233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1085233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.maxq_max_limit = ((cpi->ni_av_qi + 32) < cpi->worst_quality) 1086233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (cpi->ni_av_qi + 32) : cpi->worst_quality; 1087233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.maxq_min_limit = ((cpi->ni_av_qi - 32) > cpi->best_quality) 1088233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (cpi->ni_av_qi - 32) : cpi->best_quality; 1089233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1090233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1091233d2500723e5594f3e7c70896ffeeef32b9c950ywan return Q; 1092233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1093233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1094233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* For cq mode estimate a cq level that matches the observed 1095233d2500723e5594f3e7c70896ffeeef32b9c950ywan * complexity and data rate. 1096233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1097233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int estimate_cq( VP8_COMP *cpi, 1098233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS * fpstats, 1099233d2500723e5594f3e7c70896ffeeef32b9c950ywan int section_target_bandwitdh, 1100233d2500723e5594f3e7c70896ffeeef32b9c950ywan int overhead_bits ) 1101233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1102233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Q; 1103233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num_mbs = cpi->common.MBs; 1104233d2500723e5594f3e7c70896ffeeef32b9c950ywan int target_norm_bits_per_mb; 1105233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1106233d2500723e5594f3e7c70896ffeeef32b9c950ywan double section_err = (fpstats->coded_error / fpstats->count); 1107233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_per_mb = section_err / num_mbs; 1108233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_correction_factor; 1109233d2500723e5594f3e7c70896ffeeef32b9c950ywan double speed_correction = 1.0; 1110233d2500723e5594f3e7c70896ffeeef32b9c950ywan double clip_iiratio; 1111233d2500723e5594f3e7c70896ffeeef32b9c950ywan double clip_iifactor; 1112233d2500723e5594f3e7c70896ffeeef32b9c950ywan int overhead_bits_per_mb; 1113233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1114233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (0) 1115233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1116233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *f = fopen("epmp.stt", "a"); 1117233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "%10.2f\n", err_per_mb ); 1118233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(f); 1119233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1120233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1121233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20)) 1122233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (512 * section_target_bandwitdh) / num_mbs 1123233d2500723e5594f3e7c70896ffeeef32b9c950ywan : 512 * (section_target_bandwitdh / num_mbs); 1124233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1125233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Estimate of overhead bits per mb */ 1126233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits_per_mb = overhead_bits / num_mbs; 1127233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1128233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Corrections for higher compression speed settings 1129233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (reduced compression expected) 1130233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1131233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) 1132233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1133233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.cpu_used <= 5) 1134233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04); 1135233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1136233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction = 1.25; 1137233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1138233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1139233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* II ratio correction factor for clip as a whole */ 1140233d2500723e5594f3e7c70896ffeeef32b9c950ywan clip_iiratio = cpi->twopass.total_stats.intra_error / 1141233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.coded_error); 1142233d2500723e5594f3e7c70896ffeeef32b9c950ywan clip_iifactor = 1.0 - ((clip_iiratio - 10.0) * 0.025); 1143233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (clip_iifactor < 0.80) 1144233d2500723e5594f3e7c70896ffeeef32b9c950ywan clip_iifactor = 0.80; 1145233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1146233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Try and pick a Q that can encode the content at the given rate. */ 1147233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (Q = 0; Q < MAXQ; Q++) 1148233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1149233d2500723e5594f3e7c70896ffeeef32b9c950ywan int bits_per_mb_at_this_q; 1150233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1151233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Error per MB based correction factor */ 1152233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_correction_factor = 1153233d2500723e5594f3e7c70896ffeeef32b9c950ywan calc_correction_factor(err_per_mb, 100.0, 0.40, 0.90, Q); 1154233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1155233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_mb_at_this_q = 1156233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb; 1157233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1158233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_mb_at_this_q = 1159233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)( .5 + err_correction_factor * 1160233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction * 1161233d2500723e5594f3e7c70896ffeeef32b9c950ywan clip_iifactor * 1162233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)bits_per_mb_at_this_q); 1163233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1164233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Mode and motion overhead */ 1165233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* As Q rises in real encode loop rd code will force overhead down 1166233d2500723e5594f3e7c70896ffeeef32b9c950ywan * We make a crude adjustment for this here as *.98 per Q step. 1167233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1168233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98); 1169233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1170233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) 1171233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1172233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1173233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1174233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Clip value to range "best allowed to (worst allowed - 1)" */ 1175233d2500723e5594f3e7c70896ffeeef32b9c950ywan Q = cq_level[Q]; 1176233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( Q >= cpi->worst_quality ) 1177233d2500723e5594f3e7c70896ffeeef32b9c950ywan Q = cpi->worst_quality - 1; 1178233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( Q < cpi->best_quality ) 1179233d2500723e5594f3e7c70896ffeeef32b9c950ywan Q = cpi->best_quality; 1180233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1181233d2500723e5594f3e7c70896ffeeef32b9c950ywan return Q; 1182233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1183233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1184233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int estimate_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh) 1185233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1186233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Q; 1187233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num_mbs = cpi->common.MBs; 1188233d2500723e5594f3e7c70896ffeeef32b9c950ywan int target_norm_bits_per_mb; 1189233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1190233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_per_mb = section_err / num_mbs; 1191233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_correction_factor; 1192233d2500723e5594f3e7c70896ffeeef32b9c950ywan double speed_correction = 1.0; 1193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1194233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20)) ? (512 * section_target_bandwitdh) / num_mbs : 512 * (section_target_bandwitdh / num_mbs); 1195233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1196233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Corrections for higher compression speed settings 1197233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (reduced compression expected) 1198233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1199233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) 1200233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1201233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.cpu_used <= 5) 1202233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04); 1203233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1204233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction = 1.25; 1205233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1206233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1207233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Try and pick a Q that can encode the content at the given rate. */ 1208233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (Q = 0; Q < MAXQ; Q++) 1209233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1210233d2500723e5594f3e7c70896ffeeef32b9c950ywan int bits_per_mb_at_this_q; 1211233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1212233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Error per MB based correction factor */ 1213233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_correction_factor = 1214233d2500723e5594f3e7c70896ffeeef32b9c950ywan calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q); 1215233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1216233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_mb_at_this_q = 1217233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)( .5 + ( err_correction_factor * 1218233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction * 1219233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.est_max_qcorrection_factor * 1220233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)vp8_bits_per_mb[INTER_FRAME][Q] / 1.0 ) ); 1221233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1222233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) 1223233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1224233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1225233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1226233d2500723e5594f3e7c70896ffeeef32b9c950ywan return Q; 1227233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1228233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1229233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Estimate a worst case Q for a KF group */ 1230233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int estimate_kf_group_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh, double group_iiratio) 1231233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1232233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Q; 1233233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num_mbs = cpi->common.MBs; 1234233d2500723e5594f3e7c70896ffeeef32b9c950ywan int target_norm_bits_per_mb = (512 * section_target_bandwitdh) / num_mbs; 1235233d2500723e5594f3e7c70896ffeeef32b9c950ywan int bits_per_mb_at_this_q; 1236233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1237233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_per_mb = section_err / num_mbs; 1238233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_correction_factor; 1239233d2500723e5594f3e7c70896ffeeef32b9c950ywan double speed_correction = 1.0; 1240233d2500723e5594f3e7c70896ffeeef32b9c950ywan double current_spend_ratio = 1.0; 1241233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1242233d2500723e5594f3e7c70896ffeeef32b9c950ywan double pow_highq = (POW1 < 0.6) ? POW1 + 0.3 : 0.90; 1243233d2500723e5594f3e7c70896ffeeef32b9c950ywan double pow_lowq = (POW1 < 0.7) ? POW1 + 0.1 : 0.80; 1244233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1245233d2500723e5594f3e7c70896ffeeef32b9c950ywan double iiratio_correction_factor = 1.0; 1246233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1247233d2500723e5594f3e7c70896ffeeef32b9c950ywan double combined_correction_factor; 1248233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1249233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Trap special case where the target is <= 0 */ 1250233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (target_norm_bits_per_mb <= 0) 1251233d2500723e5594f3e7c70896ffeeef32b9c950ywan return MAXQ * 2; 1252233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1253233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate a corrective factor based on a rolling ratio of bits spent 1254233d2500723e5594f3e7c70896ffeeef32b9c950ywan * vs target bits 1255233d2500723e5594f3e7c70896ffeeef32b9c950ywan * This is clamped to the range 0.1 to 10.0 1256233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1257233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->long_rolling_target_bits <= 0) 1258233d2500723e5594f3e7c70896ffeeef32b9c950ywan current_spend_ratio = 10.0; 1259233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1260233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1261233d2500723e5594f3e7c70896ffeeef32b9c950ywan current_spend_ratio = (double)cpi->long_rolling_actual_bits / (double)cpi->long_rolling_target_bits; 1262233d2500723e5594f3e7c70896ffeeef32b9c950ywan current_spend_ratio = (current_spend_ratio > 10.0) ? 10.0 : (current_spend_ratio < 0.1) ? 0.1 : current_spend_ratio; 1263233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1264233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1265233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate a correction factor based on the quality of prediction in 1266233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the sequence as indicated by intra_inter error score ratio (IIRatio) 1267233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The idea here is to favour subsampling in the hardest sections vs 1268233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the easyest. 1269233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1270233d2500723e5594f3e7c70896ffeeef32b9c950ywan iiratio_correction_factor = 1.0 - ((group_iiratio - 6.0) * 0.1); 1271233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1272233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (iiratio_correction_factor < 0.5) 1273233d2500723e5594f3e7c70896ffeeef32b9c950ywan iiratio_correction_factor = 0.5; 1274233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1275233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Corrections for higher compression speed settings 1276233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (reduced compression expected) 1277233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1278233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) 1279233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1280233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.cpu_used <= 5) 1281233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04); 1282233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1283233d2500723e5594f3e7c70896ffeeef32b9c950ywan speed_correction = 1.25; 1284233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1285233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1286233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Combine the various factors calculated above */ 1287233d2500723e5594f3e7c70896ffeeef32b9c950ywan combined_correction_factor = speed_correction * iiratio_correction_factor * current_spend_ratio; 1288233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1289233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Try and pick a Q that should be high enough to encode the content at 1290233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the given rate. 1291233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1292233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (Q = 0; Q < MAXQ; Q++) 1293233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1294233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Error per MB based correction factor */ 1295233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_correction_factor = 1296233d2500723e5594f3e7c70896ffeeef32b9c950ywan calc_correction_factor(err_per_mb, 150.0, pow_lowq, pow_highq, Q); 1297233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1298233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_mb_at_this_q = 1299233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)(.5 + ( err_correction_factor * 1300233d2500723e5594f3e7c70896ffeeef32b9c950ywan combined_correction_factor * 1301233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)vp8_bits_per_mb[INTER_FRAME][Q]) ); 1302233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1303233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) 1304233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1305233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1306233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1307233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If we could not hit the target even at Max Q then estimate what Q 1308233d2500723e5594f3e7c70896ffeeef32b9c950ywan * would have been required 1309233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1310233d2500723e5594f3e7c70896ffeeef32b9c950ywan while ((bits_per_mb_at_this_q > target_norm_bits_per_mb) && (Q < (MAXQ * 2))) 1311233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1312233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1313233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_mb_at_this_q = (int)(0.96 * bits_per_mb_at_this_q); 1314233d2500723e5594f3e7c70896ffeeef32b9c950ywan Q++; 1315233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1316233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1317233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (0) 1318233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1319233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *f = fopen("estkf_q.stt", "a"); 1320233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "%8d %8d %8d %8.2f %8.3f %8.2f %8.3f %8.3f %8.3f %8d\n", cpi->common.current_video_frame, bits_per_mb_at_this_q, 1321233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_norm_bits_per_mb, err_per_mb, err_correction_factor, 1322233d2500723e5594f3e7c70896ffeeef32b9c950ywan current_spend_ratio, group_iiratio, iiratio_correction_factor, 1323233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)cpi->buffer_level / (double)cpi->oxcf.optimal_buffer_level, Q); 1324233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(f); 1325233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1326233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1327233d2500723e5594f3e7c70896ffeeef32b9c950ywan return Q; 1328233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1329233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1330233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp8_new_framerate(VP8_COMP *cpi, double framerate); 1331233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1332233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_init_second_pass(VP8_COMP *cpi) 1333233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1334233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS this_frame; 1335233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *start_pos; 1336233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1337233d2500723e5594f3e7c70896ffeeef32b9c950ywan double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100); 1338233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1339233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(&cpi->twopass.total_stats); 1340233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(&cpi->twopass.total_left_stats); 1341233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1342233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cpi->twopass.stats_in_end) 1343233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 1344233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1345233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.total_stats = *cpi->twopass.stats_in_end; 1346233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.total_left_stats = cpi->twopass.total_stats; 1347233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1348233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* each frame can have a different duration, as the frame rate in the 1349233d2500723e5594f3e7c70896ffeeef32b9c950ywan * source isn't guaranteed to be constant. The frame rate prior to 1350233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the first frame encoded in the second pass is a guess. However the 1351233d2500723e5594f3e7c70896ffeeef32b9c950ywan * sum duration is not. Its calculated based on the actual durations of 1352233d2500723e5594f3e7c70896ffeeef32b9c950ywan * all frames from the first pass. 1353233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1354233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_new_framerate(cpi, 10000000.0 * cpi->twopass.total_stats.count / cpi->twopass.total_stats.duration); 1355233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1356233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->output_framerate = cpi->framerate; 1357233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.bits_left = (int64_t)(cpi->twopass.total_stats.duration * cpi->oxcf.target_bandwidth / 10000000.0) ; 1358233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.bits_left -= (int64_t)(cpi->twopass.total_stats.duration * two_pass_min_rate / 10000000.0); 1359233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1360233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate a minimum intra value to be used in determining the IIratio 1361233d2500723e5594f3e7c70896ffeeef32b9c950ywan * scores used in the second pass. We have this minimum to make sure 1362233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that clips that are static but "low complexity" in the intra domain 1363233d2500723e5594f3e7c70896ffeeef32b9c950ywan * are still boosted appropriately for KF/GF/ARF 1364233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1365233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; 1366233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; 1367233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1368233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Scan the first pass file and calculate an average Intra / Inter error 1369233d2500723e5594f3e7c70896ffeeef32b9c950ywan * score ratio for the sequence 1370233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1371233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1372233d2500723e5594f3e7c70896ffeeef32b9c950ywan double sum_iiratio = 0.0; 1373233d2500723e5594f3e7c70896ffeeef32b9c950ywan double IIRatio; 1374233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1375233d2500723e5594f3e7c70896ffeeef32b9c950ywan start_pos = cpi->twopass.stats_in; /* Note starting "file" position */ 1376233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1377233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (input_stats(cpi, &this_frame) != EOF) 1378233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1379233d2500723e5594f3e7c70896ffeeef32b9c950ywan IIRatio = this_frame.intra_error / DOUBLE_DIVIDE_CHECK(this_frame.coded_error); 1380233d2500723e5594f3e7c70896ffeeef32b9c950ywan IIRatio = (IIRatio < 1.0) ? 1.0 : (IIRatio > 20.0) ? 20.0 : IIRatio; 1381233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_iiratio += IIRatio; 1382233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1383233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1384233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.avg_iiratio = sum_iiratio / DOUBLE_DIVIDE_CHECK((double)cpi->twopass.total_stats.count); 1385233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1386233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset file position */ 1387233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_pos); 1388233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1389233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1390233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Scan the first pass file and calculate a modified total error based 1391233d2500723e5594f3e7c70896ffeeef32b9c950ywan * upon the bias/power function used to allocate bits 1392233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1393233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1394233d2500723e5594f3e7c70896ffeeef32b9c950ywan start_pos = cpi->twopass.stats_in; /* Note starting "file" position */ 1395233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1396233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.modified_error_total = 0.0; 1397233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.modified_error_used = 0.0; 1398233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1399233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (input_stats(cpi, &this_frame) != EOF) 1400233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1401233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.modified_error_total += calculate_modified_err(cpi, &this_frame); 1402233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1403233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.modified_error_left = cpi->twopass.modified_error_total; 1404233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1405233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_pos); /* Reset file position */ 1406233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1407233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1408233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1409233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1410233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_end_second_pass(VP8_COMP *cpi) 1411233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1412233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)cpi; 1413233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1414233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1415233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* This function gives and estimate of how badly we believe the prediction 1416233d2500723e5594f3e7c70896ffeeef32b9c950ywan * quality is decaying from frame to frame. 1417233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1418233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double get_prediction_decay_rate(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame) 1419233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1420233d2500723e5594f3e7c70896ffeeef32b9c950ywan double prediction_decay_rate; 1421233d2500723e5594f3e7c70896ffeeef32b9c950ywan double motion_decay; 1422233d2500723e5594f3e7c70896ffeeef32b9c950ywan double motion_pct = next_frame->pcnt_motion; 1423233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1424233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)cpi; 1425233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Initial basis is the % mbs inter coded */ 1426233d2500723e5594f3e7c70896ffeeef32b9c950ywan prediction_decay_rate = next_frame->pcnt_inter; 1427233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* High % motion -> somewhat higher decay rate */ 1428233d2500723e5594f3e7c70896ffeeef32b9c950ywan motion_decay = (1.0 - (motion_pct / 20.0)); 1429233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (motion_decay < prediction_decay_rate) 1430233d2500723e5594f3e7c70896ffeeef32b9c950ywan prediction_decay_rate = motion_decay; 1431233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1432233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Adjustment to decay rate based on speed of motion */ 1433233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1434233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_mv_rabs; 1435233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_mv_cabs; 1436233d2500723e5594f3e7c70896ffeeef32b9c950ywan double distance_factor; 1437233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1438233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_mv_rabs = fabs(next_frame->mvr_abs * motion_pct); 1439233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_mv_cabs = fabs(next_frame->mvc_abs * motion_pct); 1440233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1441233d2500723e5594f3e7c70896ffeeef32b9c950ywan distance_factor = sqrt((this_mv_rabs * this_mv_rabs) + 1442233d2500723e5594f3e7c70896ffeeef32b9c950ywan (this_mv_cabs * this_mv_cabs)) / 250.0; 1443233d2500723e5594f3e7c70896ffeeef32b9c950ywan distance_factor = ((distance_factor > 1.0) 1444233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? 0.0 : (1.0 - distance_factor)); 1445233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (distance_factor < prediction_decay_rate) 1446233d2500723e5594f3e7c70896ffeeef32b9c950ywan prediction_decay_rate = distance_factor; 1447233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1448233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1449233d2500723e5594f3e7c70896ffeeef32b9c950ywan return prediction_decay_rate; 1450233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1451233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1452233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Function to test for a condition where a complex transition is followed 1453233d2500723e5594f3e7c70896ffeeef32b9c950ywan * by a static section. For example in slide shows where there is a fade 1454233d2500723e5594f3e7c70896ffeeef32b9c950ywan * between slides. This is to help with more optimal kf and gf positioning. 1455233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1456233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int detect_transition_to_still( 1457233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMP *cpi, 1458233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frame_interval, 1459233d2500723e5594f3e7c70896ffeeef32b9c950ywan int still_interval, 1460233d2500723e5594f3e7c70896ffeeef32b9c950ywan double loop_decay_rate, 1461233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator ) 1462233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1463233d2500723e5594f3e7c70896ffeeef32b9c950ywan int trans_to_still = 0; 1464233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1465233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Break clause to detect very still sections after motion 1466233d2500723e5594f3e7c70896ffeeef32b9c950ywan * For example a static image after a fade or other transition 1467233d2500723e5594f3e7c70896ffeeef32b9c950ywan * instead of a clean scene cut. 1468233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1469233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( (frame_interval > MIN_GF_INTERVAL) && 1470233d2500723e5594f3e7c70896ffeeef32b9c950ywan (loop_decay_rate >= 0.999) && 1471233d2500723e5594f3e7c70896ffeeef32b9c950ywan (decay_accumulator < 0.9) ) 1472233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1473233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j; 1474233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS * position = cpi->twopass.stats_in; 1475233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS tmp_next_frame; 1476233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_rate; 1477233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1478233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Look ahead a few frames to see if static condition persists... */ 1479233d2500723e5594f3e7c70896ffeeef32b9c950ywan for ( j = 0; j < still_interval; j++ ) 1480233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1481233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(cpi, &tmp_next_frame)) 1482233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1483233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1484233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_rate = get_prediction_decay_rate(cpi, &tmp_next_frame); 1485233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( decay_rate < 0.999 ) 1486233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1487233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1488233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset file position */ 1489233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, position); 1490233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1491233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Only if it does do we signal a transition to still */ 1492233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( j == still_interval ) 1493233d2500723e5594f3e7c70896ffeeef32b9c950ywan trans_to_still = 1; 1494233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1495233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1496233d2500723e5594f3e7c70896ffeeef32b9c950ywan return trans_to_still; 1497233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1498233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1499233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* This function detects a flash through the high relative pcnt_second_ref 1500233d2500723e5594f3e7c70896ffeeef32b9c950ywan * score in the frame following a flash frame. The offset passed in should 1501233d2500723e5594f3e7c70896ffeeef32b9c950ywan * reflect this 1502233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1503233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int detect_flash( VP8_COMP *cpi, int offset ) 1504233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1505233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS next_frame; 1506233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1507233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flash_detected = 0; 1508233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1509233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Read the frame data. */ 1510233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* The return is 0 (no flash detected) if not a valid frame */ 1511233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( read_frame_stats(cpi, &next_frame, offset) != EOF ) 1512233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1513233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* What we are looking for here is a situation where there is a 1514233d2500723e5594f3e7c70896ffeeef32b9c950ywan * brief break in prediction (such as a flash) but subsequent frames 1515233d2500723e5594f3e7c70896ffeeef32b9c950ywan * are reasonably well predicted by an earlier (pre flash) frame. 1516233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The recovery after a flash is indicated by a high pcnt_second_ref 1517233d2500723e5594f3e7c70896ffeeef32b9c950ywan * comapred to pcnt_inter. 1518233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1519233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( (next_frame.pcnt_second_ref > next_frame.pcnt_inter) && 1520233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_frame.pcnt_second_ref >= 0.5 ) ) 1521233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1522233d2500723e5594f3e7c70896ffeeef32b9c950ywan flash_detected = 1; 1523233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1524233d2500723e5594f3e7c70896ffeeef32b9c950ywan /*if (1) 1525233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1526233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *f = fopen("flash.stt", "a"); 1527233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "%8.0f %6.2f %6.2f\n", 1528233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_frame.frame, 1529233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_frame.pcnt_inter, 1530233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_frame.pcnt_second_ref); 1531233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(f); 1532233d2500723e5594f3e7c70896ffeeef32b9c950ywan }*/ 1533233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1534233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1535233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1536233d2500723e5594f3e7c70896ffeeef32b9c950ywan return flash_detected; 1537233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1538233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1539233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Update the motion related elements to the GF arf boost calculation */ 1540233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void accumulate_frame_motion_stats( 1541233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMP *cpi, 1542233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS * this_frame, 1543233d2500723e5594f3e7c70896ffeeef32b9c950ywan double * this_frame_mv_in_out, 1544233d2500723e5594f3e7c70896ffeeef32b9c950ywan double * mv_in_out_accumulator, 1545233d2500723e5594f3e7c70896ffeeef32b9c950ywan double * abs_mv_in_out_accumulator, 1546233d2500723e5594f3e7c70896ffeeef32b9c950ywan double * mv_ratio_accumulator ) 1547233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1548233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_mvr_ratio; 1549233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_mvc_ratio; 1550233d2500723e5594f3e7c70896ffeeef32b9c950ywan double motion_pct; 1551233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1552233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)cpi; 1553233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Accumulate motion stats. */ 1554233d2500723e5594f3e7c70896ffeeef32b9c950ywan motion_pct = this_frame->pcnt_motion; 1555233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1556233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Accumulate Motion In/Out of frame stats */ 1557233d2500723e5594f3e7c70896ffeeef32b9c950ywan *this_frame_mv_in_out = this_frame->mv_in_out_count * motion_pct; 1558233d2500723e5594f3e7c70896ffeeef32b9c950ywan *mv_in_out_accumulator += this_frame->mv_in_out_count * motion_pct; 1559233d2500723e5594f3e7c70896ffeeef32b9c950ywan *abs_mv_in_out_accumulator += 1560233d2500723e5594f3e7c70896ffeeef32b9c950ywan fabs(this_frame->mv_in_out_count * motion_pct); 1561233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1562233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Accumulate a measure of how uniform (or conversely how random) 1563233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the motion field is. (A ratio of absmv / mv) 1564233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1565233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (motion_pct > 0.05) 1566233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1567233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_mvr_ratio = fabs(this_frame->mvr_abs) / 1568233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVr)); 1569233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1570233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_mvc_ratio = fabs(this_frame->mvc_abs) / 1571233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVc)); 1572233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1573233d2500723e5594f3e7c70896ffeeef32b9c950ywan *mv_ratio_accumulator += 1574233d2500723e5594f3e7c70896ffeeef32b9c950ywan (this_frame_mvr_ratio < this_frame->mvr_abs) 1575233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (this_frame_mvr_ratio * motion_pct) 1576233d2500723e5594f3e7c70896ffeeef32b9c950ywan : this_frame->mvr_abs * motion_pct; 1577233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1578233d2500723e5594f3e7c70896ffeeef32b9c950ywan *mv_ratio_accumulator += 1579233d2500723e5594f3e7c70896ffeeef32b9c950ywan (this_frame_mvc_ratio < this_frame->mvc_abs) 1580233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (this_frame_mvc_ratio * motion_pct) 1581233d2500723e5594f3e7c70896ffeeef32b9c950ywan : this_frame->mvc_abs * motion_pct; 1582233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1583233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1584233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1585233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1586233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Calculate a baseline boost number for the current frame. */ 1587233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double calc_frame_boost( 1588233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMP *cpi, 1589233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS * this_frame, 1590233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_mv_in_out ) 1591233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1592233d2500723e5594f3e7c70896ffeeef32b9c950ywan double frame_boost; 1593233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1594233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Underlying boost factor is based on inter intra error ratio */ 1595233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_frame->intra_error > cpi->twopass.gf_intra_err_min) 1596233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost = (IIFACTOR * this_frame->intra_error / 1597233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame->coded_error)); 1598233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1599233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost = (IIFACTOR * cpi->twopass.gf_intra_err_min / 1600233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame->coded_error)); 1601233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1602233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Increase boost for frames where new data coming into frame 1603233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (eg zoom out). Slightly reduce boost if there is a net balance 1604233d2500723e5594f3e7c70896ffeeef32b9c950ywan * of motion out of the frame (zoom in). 1605233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The range for this_frame_mv_in_out is -1.0 to +1.0 1606233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1607233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_frame_mv_in_out > 0.0) 1608233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost += frame_boost * (this_frame_mv_in_out * 2.0); 1609233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* In extreme case boost is halved */ 1610233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1611233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost += frame_boost * (this_frame_mv_in_out / 2.0); 1612233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1613233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Clip to maximum */ 1614233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame_boost > GF_RMAX) 1615233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost = GF_RMAX; 1616233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1617233d2500723e5594f3e7c70896ffeeef32b9c950ywan return frame_boost; 1618233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1619233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1620233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if NEW_BOOST 1621233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int calc_arf_boost( 1622233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMP *cpi, 1623233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset, 1624233d2500723e5594f3e7c70896ffeeef32b9c950ywan int f_frames, 1625233d2500723e5594f3e7c70896ffeeef32b9c950ywan int b_frames, 1626233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *f_boost, 1627233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *b_boost ) 1628233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1629233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS this_frame; 1630233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1631233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 1632233d2500723e5594f3e7c70896ffeeef32b9c950ywan double boost_score = 0.0; 1633233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_ratio_accumulator = 0.0; 1634233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator = 1.0; 1635233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_mv_in_out = 0.0; 1636233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_in_out_accumulator = 0.0; 1637233d2500723e5594f3e7c70896ffeeef32b9c950ywan double abs_mv_in_out_accumulator = 0.0; 1638233d2500723e5594f3e7c70896ffeeef32b9c950ywan double r; 1639233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flash_detected = 0; 1640233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1641233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Search forward from the proposed arf/next gf position */ 1642233d2500723e5594f3e7c70896ffeeef32b9c950ywan for ( i = 0; i < f_frames; i++ ) 1643233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1644233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF ) 1645233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1646233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1647233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Update the motion related elements to the boost calculation */ 1648233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_frame_motion_stats( cpi, &this_frame, 1649233d2500723e5594f3e7c70896ffeeef32b9c950ywan &this_frame_mv_in_out, &mv_in_out_accumulator, 1650233d2500723e5594f3e7c70896ffeeef32b9c950ywan &abs_mv_in_out_accumulator, &mv_ratio_accumulator ); 1651233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1652233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate the baseline boost number for this frame */ 1653233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out ); 1654233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1655233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* We want to discount the the flash frame itself and the recovery 1656233d2500723e5594f3e7c70896ffeeef32b9c950ywan * frame that follows as both will have poor scores. 1657233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1658233d2500723e5594f3e7c70896ffeeef32b9c950ywan flash_detected = detect_flash(cpi, (i+offset)) || 1659233d2500723e5594f3e7c70896ffeeef32b9c950ywan detect_flash(cpi, (i+offset+1)); 1660233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1661233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Cumulative effect of prediction quality decay */ 1662233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( !flash_detected ) 1663233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1664233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1665233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator * 1666233d2500723e5594f3e7c70896ffeeef32b9c950ywan get_prediction_decay_rate(cpi, &this_frame); 1667233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1668233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator < 0.1 ? 0.1 : decay_accumulator; 1669233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1670233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * r); 1671233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1672233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Break out conditions. */ 1673233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( (!flash_detected) && 1674233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((mv_ratio_accumulator > 100.0) || 1675233d2500723e5594f3e7c70896ffeeef32b9c950ywan (abs_mv_in_out_accumulator > 3.0) || 1676233d2500723e5594f3e7c70896ffeeef32b9c950ywan (mv_in_out_accumulator < -2.0) ) ) 1677233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1678233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1679233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1680233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1681233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1682233d2500723e5594f3e7c70896ffeeef32b9c950ywan *f_boost = (int)(boost_score * 100.0) >> 4; 1683233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1684233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset for backward looking loop */ 1685233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = 0.0; 1686233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_ratio_accumulator = 0.0; 1687233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1.0; 1688233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_mv_in_out = 0.0; 1689233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_in_out_accumulator = 0.0; 1690233d2500723e5594f3e7c70896ffeeef32b9c950ywan abs_mv_in_out_accumulator = 0.0; 1691233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1692233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Search forward from the proposed arf/next gf position */ 1693233d2500723e5594f3e7c70896ffeeef32b9c950ywan for ( i = -1; i >= -b_frames; i-- ) 1694233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1695233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF ) 1696233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1697233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1698233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Update the motion related elements to the boost calculation */ 1699233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_frame_motion_stats( cpi, &this_frame, 1700233d2500723e5594f3e7c70896ffeeef32b9c950ywan &this_frame_mv_in_out, &mv_in_out_accumulator, 1701233d2500723e5594f3e7c70896ffeeef32b9c950ywan &abs_mv_in_out_accumulator, &mv_ratio_accumulator ); 1702233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1703233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate the baseline boost number for this frame */ 1704233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out ); 1705233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1706233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* We want to discount the the flash frame itself and the recovery 1707233d2500723e5594f3e7c70896ffeeef32b9c950ywan * frame that follows as both will have poor scores. 1708233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1709233d2500723e5594f3e7c70896ffeeef32b9c950ywan flash_detected = detect_flash(cpi, (i+offset)) || 1710233d2500723e5594f3e7c70896ffeeef32b9c950ywan detect_flash(cpi, (i+offset+1)); 1711233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1712233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Cumulative effect of prediction quality decay */ 1713233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( !flash_detected ) 1714233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1715233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1716233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator * 1717233d2500723e5594f3e7c70896ffeeef32b9c950ywan get_prediction_decay_rate(cpi, &this_frame); 1718233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1719233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator < 0.1 ? 0.1 : decay_accumulator; 1720233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1721233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1722233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * r); 1723233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1724233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Break out conditions. */ 1725233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( (!flash_detected) && 1726233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((mv_ratio_accumulator > 100.0) || 1727233d2500723e5594f3e7c70896ffeeef32b9c950ywan (abs_mv_in_out_accumulator > 3.0) || 1728233d2500723e5594f3e7c70896ffeeef32b9c950ywan (mv_in_out_accumulator < -2.0) ) ) 1729233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1730233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1731233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1732233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1733233d2500723e5594f3e7c70896ffeeef32b9c950ywan *b_boost = (int)(boost_score * 100.0) >> 4; 1734233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1735233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (*f_boost + *b_boost); 1736233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1737233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1738233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1739233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Analyse and define a gf/arf group . */ 1740233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) 1741233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1742233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS next_frame; 1743233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *start_pos; 1744233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 1745233d2500723e5594f3e7c70896ffeeef32b9c950ywan double r; 1746233d2500723e5594f3e7c70896ffeeef32b9c950ywan double boost_score = 0.0; 1747233d2500723e5594f3e7c70896ffeeef32b9c950ywan double old_boost_score = 0.0; 1748233d2500723e5594f3e7c70896ffeeef32b9c950ywan double gf_group_err = 0.0; 1749233d2500723e5594f3e7c70896ffeeef32b9c950ywan double gf_first_frame_err = 0.0; 1750233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mod_frame_err = 0.0; 1751233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1752233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_ratio_accumulator = 0.0; 1753233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator = 1.0; 1754233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1755233d2500723e5594f3e7c70896ffeeef32b9c950ywan double loop_decay_rate = 1.00; /* Starting decay rate */ 1756233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1757233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_mv_in_out = 0.0; 1758233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_in_out_accumulator = 0.0; 1759233d2500723e5594f3e7c70896ffeeef32b9c950ywan double abs_mv_in_out_accumulator = 0.0; 1760233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mod_err_per_mb_accumulator = 0.0; 1761233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1762233d2500723e5594f3e7c70896ffeeef32b9c950ywan int max_bits = frame_max_bits(cpi); /* Max for a single frame */ 1763233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1764233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int allow_alt_ref = 1765233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames; 1766233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1767233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_boost = 0; 1768233d2500723e5594f3e7c70896ffeeef32b9c950ywan int f_boost = 0; 1769233d2500723e5594f3e7c70896ffeeef32b9c950ywan int b_boost = 0; 1770233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flash_detected; 1771233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1772233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = 0; 1773233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_decay_rate = 0; 1774233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1775233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 1776233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1777233d2500723e5594f3e7c70896ffeeef32b9c950ywan start_pos = cpi->twopass.stats_in; 1778233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1779233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(&next_frame, 0, sizeof(next_frame)); /* assure clean */ 1780233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1781233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Load stats for the current frame. */ 1782233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err = calculate_modified_err(cpi, this_frame); 1783233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1784233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Note the error of the frame at the start of the group (this will be 1785233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the GF frame error if we code a normal gf 1786233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1787233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_first_frame_err = mod_frame_err; 1788233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1789233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Special treatment if the current frame is a key frame (which is also 1790233d2500723e5594f3e7c70896ffeeef32b9c950ywan * a gf). If it is then its error score (and hence bit allocation) need 1791233d2500723e5594f3e7c70896ffeeef32b9c950ywan * to be subtracted out from the calculation for the GF group 1792233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1793233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type == KEY_FRAME) 1794233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_group_err -= gf_first_frame_err; 1795233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1796233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Scan forward to try and work out how many frames the next gf group 1797233d2500723e5594f3e7c70896ffeeef32b9c950ywan * should contain and what level of boost is appropriate for the GF 1798233d2500723e5594f3e7c70896ffeeef32b9c950ywan * or ARF that will be coded with the group 1799233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1800233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = 0; 1801233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1802233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (((i < cpi->twopass.static_scene_max_gf_interval) || 1803233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)) && 1804233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i < cpi->twopass.frames_to_key)) 1805233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1806233d2500723e5594f3e7c70896ffeeef32b9c950ywan i++; 1807233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1808233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Accumulate error score of frames in this gf group */ 1809233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err = calculate_modified_err(cpi, this_frame); 1810233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1811233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_group_err += mod_frame_err; 1812233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1813233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_err_per_mb_accumulator += 1814233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err / DOUBLE_DIVIDE_CHECK((double)cpi->common.MBs); 1815233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1816233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(cpi, &next_frame)) 1817233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1818233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1819233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Test for the case where there is a brief flash but the prediction 1820233d2500723e5594f3e7c70896ffeeef32b9c950ywan * quality back to an earlier frame is then restored. 1821233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1822233d2500723e5594f3e7c70896ffeeef32b9c950ywan flash_detected = detect_flash(cpi, 0); 1823233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1824233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Update the motion related elements to the boost calculation */ 1825233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_frame_motion_stats( cpi, &next_frame, 1826233d2500723e5594f3e7c70896ffeeef32b9c950ywan &this_frame_mv_in_out, &mv_in_out_accumulator, 1827233d2500723e5594f3e7c70896ffeeef32b9c950ywan &abs_mv_in_out_accumulator, &mv_ratio_accumulator ); 1828233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1829233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate a baseline boost number for this frame */ 1830233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = calc_frame_boost( cpi, &next_frame, this_frame_mv_in_out ); 1831233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1832233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Cumulative effect of prediction quality decay */ 1833233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( !flash_detected ) 1834233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1835233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); 1836233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator * loop_decay_rate; 1837233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1838233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator < 0.1 ? 0.1 : decay_accumulator; 1839233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1840233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * r); 1841233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1842233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Break clause to detect very still sections after motion 1843233d2500723e5594f3e7c70896ffeeef32b9c950ywan * For example a staic image after a fade or other transition. 1844233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1845233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( detect_transition_to_still( cpi, i, 5, 1846233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate, 1847233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator ) ) 1848233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1849233d2500723e5594f3e7c70896ffeeef32b9c950ywan allow_alt_ref = 0; 1850233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = old_boost_score; 1851233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1852233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1853233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1854233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Break out conditions. */ 1855233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( 1856233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Break at cpi->max_gf_interval unless almost totally static */ 1857233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i >= cpi->max_gf_interval && (decay_accumulator < 0.995)) || 1858233d2500723e5594f3e7c70896ffeeef32b9c950ywan ( 1859233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Dont break out with a very short interval */ 1860233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i > MIN_GF_INTERVAL) && 1861233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Dont break out very close to a key frame */ 1862233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) && 1863233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((boost_score > 20.0) || (next_frame.pcnt_inter < 0.75)) && 1864233d2500723e5594f3e7c70896ffeeef32b9c950ywan (!flash_detected) && 1865233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((mv_ratio_accumulator > 100.0) || 1866233d2500723e5594f3e7c70896ffeeef32b9c950ywan (abs_mv_in_out_accumulator > 3.0) || 1867233d2500723e5594f3e7c70896ffeeef32b9c950ywan (mv_in_out_accumulator < -2.0) || 1868233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((boost_score - old_boost_score) < 2.0)) 1869233d2500723e5594f3e7c70896ffeeef32b9c950ywan ) ) 1870233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1871233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = old_boost_score; 1872233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1873233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1874233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1875233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(this_frame, &next_frame, sizeof(*this_frame)); 1876233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1877233d2500723e5594f3e7c70896ffeeef32b9c950ywan old_boost_score = boost_score; 1878233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1879233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1880233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_decay_rate = 1881233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i > 0) ? (int)(100.0 * (1.0 - decay_accumulator)) / i : 0; 1882233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1883233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* When using CBR apply additional buffer related upper limits */ 1884233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) 1885233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1886233d2500723e5594f3e7c70896ffeeef32b9c950ywan double max_boost; 1887233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1888233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* For cbr apply buffer related limits */ 1889233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->drop_frames_allowed) 1890233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1891233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t df_buffer_level = cpi->oxcf.drop_frames_water_mark * 1892233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->oxcf.optimal_buffer_level / 100); 1893233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1894233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->buffer_level > df_buffer_level) 1895233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth); 1896233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1897233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_boost = 0.0; 1898233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1899233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (cpi->buffer_level > 0) 1900233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1901233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth); 1902233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1903233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1904233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1905233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_boost = 0.0; 1906233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1907233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1908233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (boost_score > max_boost) 1909233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = max_boost; 1910233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1911233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1912233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Dont allow conventional gf too near the next kf */ 1913233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL) 1914233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1915233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (i < cpi->twopass.frames_to_key) 1916233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1917233d2500723e5594f3e7c70896ffeeef32b9c950ywan i++; 1918233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1919233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(cpi, this_frame)) 1920233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1921233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1922233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i < cpi->twopass.frames_to_key) 1923233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1924233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err = calculate_modified_err(cpi, this_frame); 1925233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_group_err += mod_frame_err; 1926233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1927233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1928233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1929233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1930233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->gfu_boost = (int)(boost_score * 100.0) >> 4; 1931233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1932233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if NEW_BOOST 1933233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Alterrnative boost calculation for alt ref */ 1934233d2500723e5594f3e7c70896ffeeef32b9c950ywan alt_boost = calc_arf_boost( cpi, 0, (i-1), (i-1), &f_boost, &b_boost ); 1935233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1936233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1937233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Should we use the alternate refernce frame */ 1938233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (allow_alt_ref && 1939233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i >= MIN_GF_INTERVAL) && 1940233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* dont use ARF very near next kf */ 1941233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) && 1942233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if NEW_BOOST 1943233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((next_frame.pcnt_inter > 0.75) || 1944233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_frame.pcnt_second_ref > 0.5)) && 1945233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((mv_in_out_accumulator / (double)i > -0.2) || 1946233d2500723e5594f3e7c70896ffeeef32b9c950ywan (mv_in_out_accumulator > -2.0)) && 1947233d2500723e5594f3e7c70896ffeeef32b9c950ywan (b_boost > 100) && 1948233d2500723e5594f3e7c70896ffeeef32b9c950ywan (f_boost > 100) ) 1949233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 1950233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_frame.pcnt_inter > 0.75) && 1951233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((mv_in_out_accumulator / (double)i > -0.2) || 1952233d2500723e5594f3e7c70896ffeeef32b9c950ywan (mv_in_out_accumulator > -2.0)) && 1953233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->gfu_boost > 100) && 1954233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.gf_decay_rate <= 1955233d2500723e5594f3e7c70896ffeeef32b9c950ywan (ARF_DECAY_THRESH + (cpi->gfu_boost / 200))) ) 1956233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1957233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1958233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Boost; 1959233d2500723e5594f3e7c70896ffeeef32b9c950ywan int allocation_chunks; 1960233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Q = (cpi->oxcf.fixed_q < 0) 1961233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q; 1962233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_q; 1963233d2500723e5594f3e7c70896ffeeef32b9c950ywan int arf_frame_bits = 0; 1964233d2500723e5594f3e7c70896ffeeef32b9c950ywan int group_bits; 1965233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1966233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if NEW_BOOST 1967233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->gfu_boost = alt_boost; 1968233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1969233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1970233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Estimate the bits to be allocated to the group as a whole */ 1971233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->twopass.kf_group_bits > 0) && 1972233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.kf_group_error_left > 0)) 1973233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1974233d2500723e5594f3e7c70896ffeeef32b9c950ywan group_bits = (int)((double)cpi->twopass.kf_group_bits * 1975233d2500723e5594f3e7c70896ffeeef32b9c950ywan (gf_group_err / (double)cpi->twopass.kf_group_error_left)); 1976233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1977233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1978233d2500723e5594f3e7c70896ffeeef32b9c950ywan group_bits = 0; 1979233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1980233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Boost for arf frame */ 1981233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if NEW_BOOST 1982233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = (alt_boost * GFQ_ADJUSTMENT) / 100; 1983233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 1984233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100); 1985233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1986233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost += (i * 50); 1987233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1988233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set max and minimum boost and hence minimum allocation */ 1989233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Boost > ((cpi->baseline_gf_interval + 1) * 200)) 1990233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = ((cpi->baseline_gf_interval + 1) * 200); 1991233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (Boost < 125) 1992233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = 125; 1993233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1994233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = (i * 100) + Boost; 1995233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1996233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Normalize Altboost and allocations chunck down to prevent overflow */ 1997233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (Boost > 1000) 1998233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1999233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost /= 2; 2000233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks /= 2; 2001233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2002233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2003233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate the number of bits to be spent on the arf based on the 2004233d2500723e5594f3e7c70896ffeeef32b9c950ywan * boost number 2005233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2006233d2500723e5594f3e7c70896ffeeef32b9c950ywan arf_frame_bits = (int)((double)Boost * (group_bits / 2007233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)allocation_chunks)); 2008233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2009233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Estimate if there are enough bits available to make worthwhile use 2010233d2500723e5594f3e7c70896ffeeef32b9c950ywan * of an arf. 2011233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2012233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_q = estimate_q(cpi, mod_frame_err, (int)arf_frame_bits); 2013233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2014233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Only use an arf if it is likely we will be able to code 2015233d2500723e5594f3e7c70896ffeeef32b9c950ywan * it at a lower Q than the surrounding frames. 2016233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2017233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_q < cpi->worst_quality) 2018233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2019233d2500723e5594f3e7c70896ffeeef32b9c950ywan int half_gf_int; 2020233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frames_after_arf; 2021233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frames_bwd = cpi->oxcf.arnr_max_frames - 1; 2022233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frames_fwd = cpi->oxcf.arnr_max_frames - 1; 2023233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2024233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->source_alt_ref_pending = 1; 2025233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2026233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 2027233d2500723e5594f3e7c70896ffeeef32b9c950ywan * For alt ref frames the error score for the end frame of the 2028233d2500723e5594f3e7c70896ffeeef32b9c950ywan * group (the alt ref frame) should not contribute to the group 2029233d2500723e5594f3e7c70896ffeeef32b9c950ywan * total and hence the number of bit allocated to the group. 2030233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Rather it forms part of the next group (it is the GF at the 2031233d2500723e5594f3e7c70896ffeeef32b9c950ywan * start of the next group) 2032233d2500723e5594f3e7c70896ffeeef32b9c950ywan * gf_group_err -= mod_frame_err; 2033233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 2034233d2500723e5594f3e7c70896ffeeef32b9c950ywan * For alt ref frames alt ref frame is technically part of the 2035233d2500723e5594f3e7c70896ffeeef32b9c950ywan * GF frame for the next group but we always base the error 2036233d2500723e5594f3e7c70896ffeeef32b9c950ywan * calculation and bit allocation on the current group of frames. 2037233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 2038233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Set the interval till the next gf or arf. 2039233d2500723e5594f3e7c70896ffeeef32b9c950ywan * For ARFs this is the number of frames to be coded before the 2040233d2500723e5594f3e7c70896ffeeef32b9c950ywan * future frame that is coded as an ARF. 2041233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The future frame itself is part of the next group 2042233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2043233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->baseline_gf_interval = i; 2044233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2045233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 2046233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Define the arnr filter width for this group of frames: 2047233d2500723e5594f3e7c70896ffeeef32b9c950ywan * We only filter frames that lie within a distance of half 2048233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the GF interval from the ARF frame. We also have to trap 2049233d2500723e5594f3e7c70896ffeeef32b9c950ywan * cases where the filter extends beyond the end of clip. 2050233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Note: this_frame->frame has been updated in the loop 2051233d2500723e5594f3e7c70896ffeeef32b9c950ywan * so it now points at the ARF frame. 2052233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2053233d2500723e5594f3e7c70896ffeeef32b9c950ywan half_gf_int = cpi->baseline_gf_interval >> 1; 2054233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_after_arf = (int)(cpi->twopass.total_stats.count - 2055233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame->frame - 1); 2056233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2057233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (cpi->oxcf.arnr_type) 2058233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2059233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 1: /* Backward filter */ 2060233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_fwd = 0; 2061233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frames_bwd > half_gf_int) 2062233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_bwd = half_gf_int; 2063233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2064233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2065233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 2: /* Forward filter */ 2066233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frames_fwd > half_gf_int) 2067233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_fwd = half_gf_int; 2068233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frames_fwd > frames_after_arf) 2069233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_fwd = frames_after_arf; 2070233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_bwd = 0; 2071233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2072233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2073233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 3: /* Centered filter */ 2074233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 2075233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_fwd >>= 1; 2076233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frames_fwd > frames_after_arf) 2077233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_fwd = frames_after_arf; 2078233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frames_fwd > half_gf_int) 2079233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_fwd = half_gf_int; 2080233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2081233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_bwd = frames_fwd; 2082233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2083233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* For even length filter there is one more frame backward 2084233d2500723e5594f3e7c70896ffeeef32b9c950ywan * than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff. 2085233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2086233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frames_bwd < half_gf_int) 2087233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_bwd += (cpi->oxcf.arnr_max_frames+1) & 0x1; 2088233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2089233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2090233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2091233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd; 2092233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2093233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2094233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2095233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->source_alt_ref_pending = 0; 2096233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->baseline_gf_interval = i; 2097233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2098233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2099233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2100233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2101233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->source_alt_ref_pending = 0; 2102233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->baseline_gf_interval = i; 2103233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2104233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2105233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 2106233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Now decide how many bits should be allocated to the GF group as a 2107233d2500723e5594f3e7c70896ffeeef32b9c950ywan * proportion of those remaining in the kf group. 2108233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The final key frame group in the clip is treated as a special case 2109233d2500723e5594f3e7c70896ffeeef32b9c950ywan * where cpi->twopass.kf_group_bits is tied to cpi->twopass.bits_left. 2110233d2500723e5594f3e7c70896ffeeef32b9c950ywan * This is also important for short clips where there may only be one 2111233d2500723e5594f3e7c70896ffeeef32b9c950ywan * key frame. 2112233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2113233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.frames_to_key >= (int)(cpi->twopass.total_stats.count - 2114233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.current_video_frame)) 2115233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2116233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = 2117233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.bits_left > 0) ? cpi->twopass.bits_left : 0; 2118233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2119233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2120233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate the bits to be allocated to the group as a whole */ 2121233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->twopass.kf_group_bits > 0) && 2122233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.kf_group_error_left > 0)) 2123233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2124233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = 2125233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int64_t)(cpi->twopass.kf_group_bits * 2126233d2500723e5594f3e7c70896ffeeef32b9c950ywan (gf_group_err / cpi->twopass.kf_group_error_left)); 2127233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2128233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2129233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = 0; 2130233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2131233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = 2132233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.gf_group_bits < 0) 2133233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? 0 2134233d2500723e5594f3e7c70896ffeeef32b9c950ywan : (cpi->twopass.gf_group_bits > cpi->twopass.kf_group_bits) 2135233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? cpi->twopass.kf_group_bits : cpi->twopass.gf_group_bits; 2136233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2137233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Clip cpi->twopass.gf_group_bits based on user supplied data rate 2138233d2500723e5594f3e7c70896ffeeef32b9c950ywan * variability limit (cpi->oxcf.two_pass_vbrmax_section) 2139233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2140233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.gf_group_bits > 2141233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int64_t)max_bits * cpi->baseline_gf_interval) 2142233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = 2143233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int64_t)max_bits * cpi->baseline_gf_interval; 2144233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2145233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset the file position */ 2146233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_pos); 2147233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2148233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Update the record of error used so far (only done once per gf group) */ 2149233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.modified_error_used += gf_group_err; 2150233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2151233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Assign bits to the arf or gf. */ 2152233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); i++) { 2153233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Boost; 2154233d2500723e5594f3e7c70896ffeeef32b9c950ywan int allocation_chunks; 2155233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q; 2156233d2500723e5594f3e7c70896ffeeef32b9c950ywan int gf_bits; 2157233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2158233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* For ARF frames */ 2159233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->source_alt_ref_pending && i == 0) 2160233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2161233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if NEW_BOOST 2162233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = (alt_boost * GFQ_ADJUSTMENT) / 100; 2163233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 2164233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100); 2165233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 2166233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost += (cpi->baseline_gf_interval * 50); 2167233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2168233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set max and minimum boost and hence minimum allocation */ 2169233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Boost > ((cpi->baseline_gf_interval + 1) * 200)) 2170233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = ((cpi->baseline_gf_interval + 1) * 200); 2171233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (Boost < 125) 2172233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = 125; 2173233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2174233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = 2175233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->baseline_gf_interval + 1) * 100) + Boost; 2176233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2177233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Else for standard golden frames */ 2178233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2179233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2180233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* boost based on inter / intra ratio of subsequent frames */ 2181233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = (cpi->gfu_boost * GFQ_ADJUSTMENT) / 100; 2182233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2183233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set max and minimum boost and hence minimum allocation */ 2184233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Boost > (cpi->baseline_gf_interval * 150)) 2185233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = (cpi->baseline_gf_interval * 150); 2186233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (Boost < 125) 2187233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost = 125; 2188233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2189233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = 2190233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->baseline_gf_interval * 100) + (Boost - 100); 2191233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2192233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2193233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Normalize Altboost and allocations chunck down to prevent overflow */ 2194233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (Boost > 1000) 2195233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2196233d2500723e5594f3e7c70896ffeeef32b9c950ywan Boost /= 2; 2197233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks /= 2; 2198233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2199233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2200233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate the number of bits to be spent on the gf or arf based on 2201233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the boost number 2202233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2203233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits = (int)((double)Boost * 2204233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.gf_group_bits / 2205233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)allocation_chunks)); 2206233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2207233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If the frame that is to be boosted is simpler than the average for 2208233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the gf/arf group then use an alternative calculation 2209233d2500723e5594f3e7c70896ffeeef32b9c950ywan * based on the error score of the frame itself 2210233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2211233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mod_frame_err < gf_group_err / (double)cpi->baseline_gf_interval) 2212233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2213233d2500723e5594f3e7c70896ffeeef32b9c950ywan double alt_gf_grp_bits; 2214233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_gf_bits; 2215233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2216233d2500723e5594f3e7c70896ffeeef32b9c950ywan alt_gf_grp_bits = 2217233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)cpi->twopass.kf_group_bits * 2218233d2500723e5594f3e7c70896ffeeef32b9c950ywan (mod_frame_err * (double)cpi->baseline_gf_interval) / 2219233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left); 2220233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2221233d2500723e5594f3e7c70896ffeeef32b9c950ywan alt_gf_bits = (int)((double)Boost * (alt_gf_grp_bits / 2222233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)allocation_chunks)); 2223233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2224233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (gf_bits > alt_gf_bits) 2225233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2226233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits = alt_gf_bits; 2227233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2228233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2229233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Else if it is harder than other frames in the group make sure it at 2230233d2500723e5594f3e7c70896ffeeef32b9c950ywan * least receives an allocation in keeping with its relative error 2231233d2500723e5594f3e7c70896ffeeef32b9c950ywan * score, otherwise it may be worse off than an "un-boosted" frame 2232233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2233233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2234233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2235233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_gf_bits = 2236233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)((double)cpi->twopass.kf_group_bits * 2237233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err / 2238233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left)); 2239233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2240233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (alt_gf_bits > gf_bits) 2241233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2242233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits = alt_gf_bits; 2243233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2244233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2245233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2246233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Apply an additional limit for CBR */ 2247233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) 2248233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2249233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.gf_bits > (int)(cpi->buffer_level >> 1)) 2250233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_bits = (int)(cpi->buffer_level >> 1); 2251233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2252233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2253233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Dont allow a negative value for gf_bits */ 2254233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (gf_bits < 0) 2255233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits = 0; 2256233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2257233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Add in minimum for a frame */ 2258233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits += cpi->min_frame_bandwidth; 2259233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2260233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i == 0) 2261233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2262233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_bits = gf_bits; 2263233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2264233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i == 1 || (!cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME))) 2265233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2266233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Per frame bit target for this frame */ 2267233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->per_frame_bandwidth = gf_bits; 2268233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2269233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2270233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2271233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2272233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Adjust KF group bits and error remainin */ 2273233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_error_left -= (int64_t)gf_group_err; 2274233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits -= cpi->twopass.gf_group_bits; 2275233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2276233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.kf_group_bits < 0) 2277233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = 0; 2278233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2279233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Note the error score left in the remaining frames of the group. 2280233d2500723e5594f3e7c70896ffeeef32b9c950ywan * For normal GFs we want to remove the error score for the first 2281233d2500723e5594f3e7c70896ffeeef32b9c950ywan * frame of the group (except in Key frame case where this has 2282233d2500723e5594f3e7c70896ffeeef32b9c950ywan * already happened) 2283233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2284233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME) 2285233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_error_left = (int)(gf_group_err - 2286233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_first_frame_err); 2287233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2288233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_error_left = (int) gf_group_err; 2289233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2290233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits -= cpi->twopass.gf_bits - cpi->min_frame_bandwidth; 2291233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2292233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.gf_group_bits < 0) 2293233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = 0; 2294233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2295233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* This condition could fail if there are two kfs very close together 2296233d2500723e5594f3e7c70896ffeeef32b9c950ywan * despite (MIN_GF_INTERVAL) and would cause a devide by 0 in the 2297233d2500723e5594f3e7c70896ffeeef32b9c950ywan * calculation of cpi->twopass.alt_extra_bits. 2298233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2299233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( cpi->baseline_gf_interval >= 3 ) 2300233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2301233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if NEW_BOOST 2302233d2500723e5594f3e7c70896ffeeef32b9c950ywan int boost = (cpi->source_alt_ref_pending) 2303233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? b_boost : cpi->gfu_boost; 2304233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 2305233d2500723e5594f3e7c70896ffeeef32b9c950ywan int boost = cpi->gfu_boost; 2306233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 2307233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( boost >= 150 ) 2308233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2309233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pct_extra; 2310233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2311233d2500723e5594f3e7c70896ffeeef32b9c950ywan pct_extra = (boost - 100) / 50; 2312233d2500723e5594f3e7c70896ffeeef32b9c950ywan pct_extra = (pct_extra > 20) ? 20 : pct_extra; 2313233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2314233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.alt_extra_bits = 2315233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)(cpi->twopass.gf_group_bits * pct_extra) / 100; 2316233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits -= cpi->twopass.alt_extra_bits; 2317233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.alt_extra_bits /= 2318233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->baseline_gf_interval-1)>>1); 2319233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2320233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2321233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.alt_extra_bits = 0; 2322233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2323233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2324233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.alt_extra_bits = 0; 2325233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2326233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2327233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Adjustments based on a measure of complexity of the section */ 2328233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type != KEY_FRAME) 2329233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2330233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS sectionstats; 2331233d2500723e5594f3e7c70896ffeeef32b9c950ywan double Ratio; 2332233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2333233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(§ionstats); 2334233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_pos); 2335233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2336233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0 ; i < cpi->baseline_gf_interval ; i++) 2337233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2338233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_stats(cpi, &next_frame); 2339233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_stats(§ionstats, &next_frame); 2340233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2341233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2342233d2500723e5594f3e7c70896ffeeef32b9c950ywan avg_stats(§ionstats); 2343233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2344233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.section_intra_rating = (unsigned int) 2345233d2500723e5594f3e7c70896ffeeef32b9c950ywan (sectionstats.intra_error / 2346233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); 2347233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2348233d2500723e5594f3e7c70896ffeeef32b9c950ywan Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error); 2349233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025); 2350233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2351233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.section_max_qfactor < 0.80) 2352233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.section_max_qfactor = 0.80; 2353233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2354233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_pos); 2355233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2356233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 2357233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2358233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Allocate bits to a normal frame that is neither a gf an arf or a key frame. */ 2359233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void assign_std_frame_bits(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) 2360233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 2361233d2500723e5594f3e7c70896ffeeef32b9c950ywan int target_frame_size; 2362233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2363233d2500723e5594f3e7c70896ffeeef32b9c950ywan double modified_err; 2364233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_fraction; 2365233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2366233d2500723e5594f3e7c70896ffeeef32b9c950ywan int max_bits = frame_max_bits(cpi); /* Max for a single frame */ 2367233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2368233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate modified prediction error used in bit allocation */ 2369233d2500723e5594f3e7c70896ffeeef32b9c950ywan modified_err = calculate_modified_err(cpi, this_frame); 2370233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2371233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* What portion of the remaining GF group error is used by this frame */ 2372233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.gf_group_error_left > 0) 2373233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_fraction = modified_err / cpi->twopass.gf_group_error_left; 2374233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2375233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_fraction = 0.0; 2376233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2377233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* How many of those bits available for allocation should we give it? */ 2378233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_frame_size = (int)((double)cpi->twopass.gf_group_bits * err_fraction); 2379233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2380233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Clip to target size to 0 - max_bits (or cpi->twopass.gf_group_bits) 2381233d2500723e5594f3e7c70896ffeeef32b9c950ywan * at the top end. 2382233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2383233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (target_frame_size < 0) 2384233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_frame_size = 0; 2385233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2386233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2387233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (target_frame_size > max_bits) 2388233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_frame_size = max_bits; 2389233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2390233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (target_frame_size > cpi->twopass.gf_group_bits) 2391233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_frame_size = (int)cpi->twopass.gf_group_bits; 2392233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2393233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2394233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Adjust error and bits remaining */ 2395233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_error_left -= (int)modified_err; 2396233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits -= target_frame_size; 2397233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2398233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.gf_group_bits < 0) 2399233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = 0; 2400233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2401233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Add in the minimum number of bits that is set aside for every frame. */ 2402233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_frame_size += cpi->min_frame_bandwidth; 2403233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2404233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Every other frame gets a few extra bits */ 2405233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( (cpi->frames_since_golden & 0x01) && 2406233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->frames_till_gf_update_due > 0) ) 2407233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2408233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_frame_size += cpi->twopass.alt_extra_bits; 2409233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2410233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2411233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Per frame bit target for this frame */ 2412233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->per_frame_bandwidth = target_frame_size; 2413233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 2414233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2415233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_second_pass(VP8_COMP *cpi) 2416233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 2417233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_q; 2418233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frames_left = (int)(cpi->twopass.total_stats.count - cpi->common.current_video_frame); 2419233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2420233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS this_frame; 2421233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS this_frame_copy; 2422233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2423233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_intra_error; 2424233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_coded_error; 2425233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2426233d2500723e5594f3e7c70896ffeeef32b9c950ywan int overhead_bits; 2427233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2428233d2500723e5594f3e7c70896ffeeef32b9c950ywan memset(&this_frame, 0, sizeof(FIRSTPASS_STATS)); 2429233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cpi->twopass.stats_in) 2430233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2431233d2500723e5594f3e7c70896ffeeef32b9c950ywan return ; 2432233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2433233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2434233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 2435233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2436233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(cpi, &this_frame)) 2437233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 2438233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2439233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_intra_error = this_frame.intra_error; 2440233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_coded_error = this_frame.coded_error; 2441233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2442233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* keyframe and section processing ! */ 2443233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.frames_to_key == 0) 2444233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2445233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Define next KF group and assign bits to it */ 2446233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); 2447233d2500723e5594f3e7c70896ffeeef32b9c950ywan find_next_key_frame(cpi, &this_frame_copy); 2448233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2449233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Special case: Error error_resilient_mode mode does not make much 2450233d2500723e5594f3e7c70896ffeeef32b9c950ywan * sense for two pass but with its current meaning this code is 2451233d2500723e5594f3e7c70896ffeeef32b9c950ywan * designed to stop outlandish behaviour if someone does set it when 2452233d2500723e5594f3e7c70896ffeeef32b9c950ywan * using two pass. It effectively disables GF groups. This is 2453233d2500723e5594f3e7c70896ffeeef32b9c950ywan * temporary code until we decide what should really happen in this 2454233d2500723e5594f3e7c70896ffeeef32b9c950ywan * case. 2455233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2456233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.error_resilient_mode) 2457233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2458233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = cpi->twopass.kf_group_bits; 2459233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_error_left = 2460233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)cpi->twopass.kf_group_error_left; 2461233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->baseline_gf_interval = cpi->twopass.frames_to_key; 2462233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; 2463233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->source_alt_ref_pending = 0; 2464233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2465233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2466233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2467233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2468233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Is this a GF / ARF (Note that a KF is always also a GF) */ 2469233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->frames_till_gf_update_due == 0) 2470233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2471233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Define next gf group and assign bits to it */ 2472233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); 2473233d2500723e5594f3e7c70896ffeeef32b9c950ywan define_gf_group(cpi, &this_frame_copy); 2474233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2475233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If we are going to code an altref frame at the end of the group 2476233d2500723e5594f3e7c70896ffeeef32b9c950ywan * and the current frame is not a key frame.... If the previous 2477233d2500723e5594f3e7c70896ffeeef32b9c950ywan * group used an arf this frame has already benefited from that arf 2478233d2500723e5594f3e7c70896ffeeef32b9c950ywan * boost and it should not be given extra bits If the previous 2479233d2500723e5594f3e7c70896ffeeef32b9c950ywan * group was NOT coded using arf we may want to apply some boost to 2480233d2500723e5594f3e7c70896ffeeef32b9c950ywan * this GF as well 2481233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2482233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)) 2483233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2484233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Assign a standard frames worth of bits from those allocated 2485233d2500723e5594f3e7c70896ffeeef32b9c950ywan * to the GF group 2486233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2487233d2500723e5594f3e7c70896ffeeef32b9c950ywan int bak = cpi->per_frame_bandwidth; 2488233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); 2489233d2500723e5594f3e7c70896ffeeef32b9c950ywan assign_std_frame_bits(cpi, &this_frame_copy); 2490233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->per_frame_bandwidth = bak; 2491233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2492233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2493233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2494233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Otherwise this is an ordinary frame */ 2495233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2496233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2497233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Special case: Error error_resilient_mode mode does not make much 2498233d2500723e5594f3e7c70896ffeeef32b9c950ywan * sense for two pass but with its current meaning but this code is 2499233d2500723e5594f3e7c70896ffeeef32b9c950ywan * designed to stop outlandish behaviour if someone does set it 2500233d2500723e5594f3e7c70896ffeeef32b9c950ywan * when using two pass. It effectively disables GF groups. This is 2501233d2500723e5594f3e7c70896ffeeef32b9c950ywan * temporary code till we decide what should really happen in this 2502233d2500723e5594f3e7c70896ffeeef32b9c950ywan * case. 2503233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2504233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.error_resilient_mode) 2505233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2506233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->frames_till_gf_update_due = cpi->twopass.frames_to_key; 2507233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2508233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type != KEY_FRAME) 2509233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2510233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Assign bits from those allocated to the GF group */ 2511233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); 2512233d2500723e5594f3e7c70896ffeeef32b9c950ywan assign_std_frame_bits(cpi, &this_frame_copy); 2513233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2514233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2515233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2516233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2517233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Assign bits from those allocated to the GF group */ 2518233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); 2519233d2500723e5594f3e7c70896ffeeef32b9c950ywan assign_std_frame_bits(cpi, &this_frame_copy); 2520233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2521233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2522233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2523233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Keep a globally available copy of this and the next frame's iiratio. */ 2524233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.this_iiratio = (unsigned int)(this_frame_intra_error / 2525233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame_coded_error)); 2526233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2527233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS next_frame; 2528233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( lookup_next_frame_stats(cpi, &next_frame) != EOF ) 2529233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2530233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.next_iiratio = (unsigned int)(next_frame.intra_error / 2531233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); 2532233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2533233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2534233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2535233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set nominal per second bandwidth for this frame */ 2536233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->target_bandwidth = (int) 2537233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->per_frame_bandwidth * cpi->output_framerate); 2538233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->target_bandwidth < 0) 2539233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->target_bandwidth = 0; 2540233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2541233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2542233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Account for mv, mode and other overheads. */ 2543233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits = (int)estimate_modemvcost( 2544233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi, &cpi->twopass.total_left_stats ); 2545233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2546233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Special case code for first frame. */ 2547233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.current_video_frame == 0) 2548233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2549233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.est_max_qcorrection_factor = 1.0; 2550233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2551233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set a cq_level in constrained quality mode. */ 2552233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY ) 2553233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2554233d2500723e5594f3e7c70896ffeeef32b9c950ywan int est_cq; 2555233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2556233d2500723e5594f3e7c70896ffeeef32b9c950ywan est_cq = 2557233d2500723e5594f3e7c70896ffeeef32b9c950ywan estimate_cq( cpi, 2558233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->twopass.total_left_stats, 2559233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)(cpi->twopass.bits_left / frames_left), 2560233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits ); 2561233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2562233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->cq_target_quality = cpi->oxcf.cq_level; 2563233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( est_cq > cpi->cq_target_quality ) 2564233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->cq_target_quality = est_cq; 2565233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2566233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2567233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* guess at maxq needed in 2nd pass */ 2568233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.maxq_max_limit = cpi->worst_quality; 2569233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.maxq_min_limit = cpi->best_quality; 2570233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2571233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_q = estimate_max_q( 2572233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi, 2573233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->twopass.total_left_stats, 2574233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)(cpi->twopass.bits_left / frames_left), 2575233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits ); 2576233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2577233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Limit the maxq value returned subsequently. 2578233d2500723e5594f3e7c70896ffeeef32b9c950ywan * This increases the risk of overspend or underspend if the initial 2579233d2500723e5594f3e7c70896ffeeef32b9c950ywan * estimate for the clip is bad, but helps prevent excessive 2580233d2500723e5594f3e7c70896ffeeef32b9c950ywan * variation in Q, especially near the end of a clip 2581233d2500723e5594f3e7c70896ffeeef32b9c950ywan * where for example a small overspend may cause Q to crash 2582233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2583233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.maxq_max_limit = ((tmp_q + 32) < cpi->worst_quality) 2584233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (tmp_q + 32) : cpi->worst_quality; 2585233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.maxq_min_limit = ((tmp_q - 32) > cpi->best_quality) 2586233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (tmp_q - 32) : cpi->best_quality; 2587233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2588233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->active_worst_quality = tmp_q; 2589233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->ni_av_qi = tmp_q; 2590233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2591233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2592233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* The last few frames of a clip almost always have to few or too many 2593233d2500723e5594f3e7c70896ffeeef32b9c950ywan * bits and for the sake of over exact rate control we dont want to make 2594233d2500723e5594f3e7c70896ffeeef32b9c950ywan * radical adjustments to the allowed quantizer range just to use up a 2595233d2500723e5594f3e7c70896ffeeef32b9c950ywan * few surplus bits or get beneath the target rate. 2596233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2597233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if ( (cpi->common.current_video_frame < 2598233d2500723e5594f3e7c70896ffeeef32b9c950ywan (((unsigned int)cpi->twopass.total_stats.count * 255)>>8)) && 2599233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->common.current_video_frame + cpi->baseline_gf_interval) < 2600233d2500723e5594f3e7c70896ffeeef32b9c950ywan (unsigned int)cpi->twopass.total_stats.count) ) 2601233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2602233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frames_left < 1) 2603233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_left = 1; 2604233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2605233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_q = estimate_max_q( 2606233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi, 2607233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->twopass.total_left_stats, 2608233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)(cpi->twopass.bits_left / frames_left), 2609233d2500723e5594f3e7c70896ffeeef32b9c950ywan overhead_bits ); 2610233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2611233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Move active_worst_quality but in a damped way */ 2612233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_q > cpi->active_worst_quality) 2613233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->active_worst_quality ++; 2614233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (tmp_q < cpi->active_worst_quality) 2615233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->active_worst_quality --; 2616233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2617233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->active_worst_quality = 2618233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->active_worst_quality * 3) + tmp_q + 2) / 4; 2619233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2620233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2621233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.frames_to_key --; 2622233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2623233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Update the total stats remaining sturcture */ 2624233d2500723e5594f3e7c70896ffeeef32b9c950ywan subtract_stats(&cpi->twopass.total_left_stats, &this_frame ); 2625233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 2626233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2627233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2628233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int test_candidate_kf(VP8_COMP *cpi, FIRSTPASS_STATS *last_frame, FIRSTPASS_STATS *this_frame, FIRSTPASS_STATS *next_frame) 2629233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 2630233d2500723e5594f3e7c70896ffeeef32b9c950ywan int is_viable_kf = 0; 2631233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2632233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Does the frame satisfy the primary criteria of a key frame 2633233d2500723e5594f3e7c70896ffeeef32b9c950ywan * If so, then examine how well it predicts subsequent frames 2634233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2635233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((this_frame->pcnt_second_ref < 0.10) && 2636233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_frame->pcnt_second_ref < 0.10) && 2637233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((this_frame->pcnt_inter < 0.05) || 2638233d2500723e5594f3e7c70896ffeeef32b9c950ywan ( 2639233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .25) && 2640233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((this_frame->intra_error / DOUBLE_DIVIDE_CHECK(this_frame->coded_error)) < 2.5) && 2641233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((fabs(last_frame->coded_error - this_frame->coded_error) / DOUBLE_DIVIDE_CHECK(this_frame->coded_error) > .40) || 2642233d2500723e5594f3e7c70896ffeeef32b9c950ywan (fabs(last_frame->intra_error - this_frame->intra_error) / DOUBLE_DIVIDE_CHECK(this_frame->intra_error) > .40) || 2643233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((next_frame->intra_error / DOUBLE_DIVIDE_CHECK(next_frame->coded_error)) > 3.5) 2644233d2500723e5594f3e7c70896ffeeef32b9c950ywan ) 2645233d2500723e5594f3e7c70896ffeeef32b9c950ywan ) 2646233d2500723e5594f3e7c70896ffeeef32b9c950ywan ) 2647233d2500723e5594f3e7c70896ffeeef32b9c950ywan ) 2648233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2649233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 2650233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *start_pos; 2651233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2652233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS local_next_frame; 2653233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2654233d2500723e5594f3e7c70896ffeeef32b9c950ywan double boost_score = 0.0; 2655233d2500723e5594f3e7c70896ffeeef32b9c950ywan double old_boost_score = 0.0; 2656233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator = 1.0; 2657233d2500723e5594f3e7c70896ffeeef32b9c950ywan double next_iiratio; 2658233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2659233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&local_next_frame, next_frame, sizeof(*next_frame)); 2660233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2661233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Note the starting file position so we can reset to it */ 2662233d2500723e5594f3e7c70896ffeeef32b9c950ywan start_pos = cpi->twopass.stats_in; 2663233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2664233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Examine how well the key frame predicts subsequent frames */ 2665233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0 ; i < 16; i++) 2666233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2667233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_iiratio = (IIKFACTOR1 * local_next_frame.intra_error / DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error)) ; 2668233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2669233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (next_iiratio > RMAX) 2670233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_iiratio = RMAX; 2671233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2672233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Cumulative effect of decay in prediction quality */ 2673233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (local_next_frame.pcnt_inter > 0.85) 2674233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator * local_next_frame.pcnt_inter; 2675233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2676233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator * ((0.85 + local_next_frame.pcnt_inter) / 2.0); 2677233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2678233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Keep a running total */ 2679233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * next_iiratio); 2680233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2681233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Test various breakout clauses */ 2682233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((local_next_frame.pcnt_inter < 0.05) || 2683233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_iiratio < 1.5) || 2684233d2500723e5594f3e7c70896ffeeef32b9c950ywan (((local_next_frame.pcnt_inter - 2685233d2500723e5594f3e7c70896ffeeef32b9c950ywan local_next_frame.pcnt_neutral) < 0.20) && 2686233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_iiratio < 3.0)) || 2687233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((boost_score - old_boost_score) < 0.5) || 2688233d2500723e5594f3e7c70896ffeeef32b9c950ywan (local_next_frame.intra_error < 200) 2689233d2500723e5594f3e7c70896ffeeef32b9c950ywan ) 2690233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2691233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2692233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2693233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2694233d2500723e5594f3e7c70896ffeeef32b9c950ywan old_boost_score = boost_score; 2695233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2696233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Get the next frame details */ 2697233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(cpi, &local_next_frame)) 2698233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2699233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2700233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2701233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If there is tolerable prediction for at least the next 3 frames 2702233d2500723e5594f3e7c70896ffeeef32b9c950ywan * then break out else discard this pottential key frame and move on 2703233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2704233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (boost_score > 5.0 && (i > 3)) 2705233d2500723e5594f3e7c70896ffeeef32b9c950ywan is_viable_kf = 1; 2706233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2707233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2708233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset the file position */ 2709233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_pos); 2710233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2711233d2500723e5594f3e7c70896ffeeef32b9c950ywan is_viable_kf = 0; 2712233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2713233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2714233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2715233d2500723e5594f3e7c70896ffeeef32b9c950ywan return is_viable_kf; 2716233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 2717233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) 2718233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 2719233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i,j; 2720233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS last_frame; 2721233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS first_frame; 2722233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS next_frame; 2723233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *start_position; 2724233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2725233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator = 1.0; 2726233d2500723e5594f3e7c70896ffeeef32b9c950ywan double boost_score = 0; 2727233d2500723e5594f3e7c70896ffeeef32b9c950ywan double old_boost_score = 0.0; 2728233d2500723e5594f3e7c70896ffeeef32b9c950ywan double loop_decay_rate; 2729233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2730233d2500723e5594f3e7c70896ffeeef32b9c950ywan double kf_mod_err = 0.0; 2731233d2500723e5594f3e7c70896ffeeef32b9c950ywan double kf_group_err = 0.0; 2732233d2500723e5594f3e7c70896ffeeef32b9c950ywan double kf_group_intra_err = 0.0; 2733233d2500723e5594f3e7c70896ffeeef32b9c950ywan double kf_group_coded_err = 0.0; 2734233d2500723e5594f3e7c70896ffeeef32b9c950ywan double recent_loop_decay[8] = {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0}; 2735233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2736233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(&next_frame, 0, sizeof(next_frame)); 2737233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2738233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 2739233d2500723e5594f3e7c70896ffeeef32b9c950ywan start_position = cpi->twopass.stats_in; 2740233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2741233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.frame_type = KEY_FRAME; 2742233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2743233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* is this a forced key frame by interval */ 2744233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->this_key_frame_forced = cpi->next_key_frame_forced; 2745233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2746233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Clear the alt ref active flag as this can never be active on a key 2747233d2500723e5594f3e7c70896ffeeef32b9c950ywan * frame 2748233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2749233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->source_alt_ref_active = 0; 2750233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2751233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Kf is always a gf so clear frames till next gf counter */ 2752233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->frames_till_gf_update_due = 0; 2753233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2754233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.frames_to_key = 1; 2755233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2756233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Take a copy of the initial frame details */ 2757233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&first_frame, this_frame, sizeof(*this_frame)); 2758233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2759233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = 0; 2760233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_error_left = 0; 2761233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2762233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_mod_err = calculate_modified_err(cpi, this_frame); 2763233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2764233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* find the next keyframe */ 2765233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = 0; 2766233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (cpi->twopass.stats_in < cpi->twopass.stats_in_end) 2767233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2768233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Accumulate kf group error */ 2769233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_err += calculate_modified_err(cpi, this_frame); 2770233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2771233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* These figures keep intra and coded error counts for all frames 2772233d2500723e5594f3e7c70896ffeeef32b9c950ywan * including key frames in the group. The effect of the key frame 2773233d2500723e5594f3e7c70896ffeeef32b9c950ywan * itself can be subtracted out using the first_frame data 2774233d2500723e5594f3e7c70896ffeeef32b9c950ywan * collected above 2775233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2776233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_intra_err += this_frame->intra_error; 2777233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_coded_err += this_frame->coded_error; 2778233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2779233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Load the next frame's stats. */ 2780233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&last_frame, this_frame, sizeof(*this_frame)); 2781233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_stats(cpi, this_frame); 2782233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2783233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Provided that we are not at the end of the file... */ 2784233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.auto_key 2785233d2500723e5594f3e7c70896ffeeef32b9c950ywan && lookup_next_frame_stats(cpi, &next_frame) != EOF) 2786233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2787233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Normal scene cut check */ 2788233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( ( i >= MIN_GF_INTERVAL ) && 2789233d2500723e5594f3e7c70896ffeeef32b9c950ywan test_candidate_kf(cpi, &last_frame, this_frame, &next_frame) ) 2790233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2791233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2792233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2793233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2794233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* How fast is prediction quality decaying */ 2795233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); 2796233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2797233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* We want to know something about the recent past... rather than 2798233d2500723e5594f3e7c70896ffeeef32b9c950ywan * as used elsewhere where we are concened with decay in prediction 2799233d2500723e5594f3e7c70896ffeeef32b9c950ywan * quality since the last GF or KF. 2800233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2801233d2500723e5594f3e7c70896ffeeef32b9c950ywan recent_loop_decay[i%8] = loop_decay_rate; 2802233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1.0; 2803233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 8; j++) 2804233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2805233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator * recent_loop_decay[j]; 2806233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2807233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2808233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Special check for transition or high motion followed by a 2809233d2500723e5594f3e7c70896ffeeef32b9c950ywan * static scene. 2810233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2811233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( detect_transition_to_still( cpi, i, 2812233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->key_frame_frequency-i), 2813233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate, 2814233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator ) ) 2815233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2816233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2817233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2818233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2819233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2820233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Step on to the next frame */ 2821233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.frames_to_key ++; 2822233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2823233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If we don't have a real key frame within the next two 2824233d2500723e5594f3e7c70896ffeeef32b9c950ywan * forcekeyframeevery intervals then break out of the loop. 2825233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2826233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.frames_to_key >= 2 *(int)cpi->key_frame_frequency) 2827233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2828233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else 2829233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.frames_to_key ++; 2830233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2831233d2500723e5594f3e7c70896ffeeef32b9c950ywan i++; 2832233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2833233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2834233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If there is a max kf interval set by the user we must obey it. 2835233d2500723e5594f3e7c70896ffeeef32b9c950ywan * We already breakout of the loop above at 2x max. 2836233d2500723e5594f3e7c70896ffeeef32b9c950ywan * This code centers the extra kf if the actual natural 2837233d2500723e5594f3e7c70896ffeeef32b9c950ywan * interval is between 1x and 2x 2838233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2839233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.auto_key 2840233d2500723e5594f3e7c70896ffeeef32b9c950ywan && cpi->twopass.frames_to_key > (int)cpi->key_frame_frequency ) 2841233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2842233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *current_pos = cpi->twopass.stats_in; 2843233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS tmp_frame; 2844233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2845233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.frames_to_key /= 2; 2846233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2847233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Copy first frame details */ 2848233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memcpy(&tmp_frame, &first_frame, sizeof(first_frame)); 2849233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2850233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset to the start of the group */ 2851233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_position); 2852233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2853233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_err = 0; 2854233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_intra_err = 0; 2855233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_coded_err = 0; 2856233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2857233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Rescan to get the correct error data for the forced kf group */ 2858233d2500723e5594f3e7c70896ffeeef32b9c950ywan for( i = 0; i < cpi->twopass.frames_to_key; i++ ) 2859233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2860233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Accumulate kf group errors */ 2861233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_err += calculate_modified_err(cpi, &tmp_frame); 2862233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_intra_err += tmp_frame.intra_error; 2863233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_coded_err += tmp_frame.coded_error; 2864233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2865233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Load a the next frame's stats */ 2866233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_stats(cpi, &tmp_frame); 2867233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2868233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2869233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset to the start of the group */ 2870233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, current_pos); 2871233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2872233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->next_key_frame_forced = 1; 2873233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2874233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2875233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->next_key_frame_forced = 0; 2876233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2877233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Special case for the last frame of the file */ 2878233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) 2879233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2880233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Accumulate kf group error */ 2881233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_err += calculate_modified_err(cpi, this_frame); 2882233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2883233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* These figures keep intra and coded error counts for all frames 2884233d2500723e5594f3e7c70896ffeeef32b9c950ywan * including key frames in the group. The effect of the key frame 2885233d2500723e5594f3e7c70896ffeeef32b9c950ywan * itself can be subtracted out using the first_frame data 2886233d2500723e5594f3e7c70896ffeeef32b9c950ywan * collected above 2887233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2888233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_intra_err += this_frame->intra_error; 2889233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_coded_err += this_frame->coded_error; 2890233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2891233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2892233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate the number of bits that should be assigned to the kf group. */ 2893233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->twopass.bits_left > 0) && (cpi->twopass.modified_error_left > 0.0)) 2894233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2895233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Max for a single normal frame (not key frame) */ 2896233d2500723e5594f3e7c70896ffeeef32b9c950ywan int max_bits = frame_max_bits(cpi); 2897233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2898233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Maximum bits for the kf group */ 2899233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t max_grp_bits; 2900233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2901233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Default allocation based on bits left and relative 2902233d2500723e5594f3e7c70896ffeeef32b9c950ywan * complexity of the section 2903233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2904233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = (int64_t)( cpi->twopass.bits_left * 2905233d2500723e5594f3e7c70896ffeeef32b9c950ywan ( kf_group_err / 2906233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.modified_error_left )); 2907233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2908233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Clip based on maximum per frame rate defined by the user. */ 2909233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_grp_bits = (int64_t)max_bits * (int64_t)cpi->twopass.frames_to_key; 2910233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.kf_group_bits > max_grp_bits) 2911233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = max_grp_bits; 2912233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2913233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Additional special case for CBR if buffer is getting full. */ 2914233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) 2915233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2916233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t opt_buffer_lvl = cpi->oxcf.optimal_buffer_level; 2917233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t buffer_lvl = cpi->buffer_level; 2918233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2919233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If the buffer is near or above the optimal and this kf group is 2920233d2500723e5594f3e7c70896ffeeef32b9c950ywan * not being allocated much then increase the allocation a bit. 2921233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2922233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (buffer_lvl >= opt_buffer_lvl) 2923233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2924233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t high_water_mark = (opt_buffer_lvl + 2925233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->oxcf.maximum_buffer_size) >> 1; 2926233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2927233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t av_group_bits; 2928233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2929233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Av bits per frame * number of frames */ 2930233d2500723e5594f3e7c70896ffeeef32b9c950ywan av_group_bits = (int64_t)cpi->av_per_frame_bandwidth * 2931233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int64_t)cpi->twopass.frames_to_key; 2932233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2933233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* We are at or above the maximum. */ 2934233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->buffer_level >= high_water_mark) 2935233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2936233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t min_group_bits; 2937233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2938233d2500723e5594f3e7c70896ffeeef32b9c950ywan min_group_bits = av_group_bits + 2939233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int64_t)(buffer_lvl - 2940233d2500723e5594f3e7c70896ffeeef32b9c950ywan high_water_mark); 2941233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2942233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.kf_group_bits < min_group_bits) 2943233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = min_group_bits; 2944233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2945233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* We are above optimal but below the maximum */ 2946233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (cpi->twopass.kf_group_bits < av_group_bits) 2947233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2948233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t bits_below_av = av_group_bits - 2949233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits; 2950233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2951233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits += 2952233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int64_t)((double)bits_below_av * 2953233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)(buffer_lvl - opt_buffer_lvl) / 2954233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)(high_water_mark - opt_buffer_lvl)); 2955233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2956233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2957233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2958233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2959233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2960233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = 0; 2961233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2962233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset the first pass file position */ 2963233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_position); 2964233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2965233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* determine how big to make this keyframe based on how well the 2966233d2500723e5594f3e7c70896ffeeef32b9c950ywan * subsequent frames use inter blocks 2967233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 2968233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1.0; 2969233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = 0.0; 2970233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate = 1.00; /* Starting decay rate */ 2971233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2972233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0 ; i < cpi->twopass.frames_to_key ; i++) 2973233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2974233d2500723e5594f3e7c70896ffeeef32b9c950ywan double r; 2975233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2976233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(cpi, &next_frame)) 2977233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2978233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2979233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (next_frame.intra_error > cpi->twopass.kf_intra_err_min) 2980233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = (IIKFACTOR2 * next_frame.intra_error / 2981233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); 2982233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2983233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = (IIKFACTOR2 * cpi->twopass.kf_intra_err_min / 2984233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); 2985233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2986233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (r > RMAX) 2987233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = RMAX; 2988233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2989233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* How fast is prediction quality decaying */ 2990233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); 2991233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2992233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator * loop_decay_rate; 2993233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator; 2994233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2995233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * r); 2996233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2997233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((i > MIN_GF_INTERVAL) && 2998233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((boost_score - old_boost_score) < 1.0)) 2999233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3000233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 3001233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3002233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3003233d2500723e5594f3e7c70896ffeeef32b9c950ywan old_boost_score = boost_score; 3004233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3005233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3006233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (1) 3007233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3008233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS sectionstats; 3009233d2500723e5594f3e7c70896ffeeef32b9c950ywan double Ratio; 3010233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3011233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(§ionstats); 3012233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_position); 3013233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3014233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0 ; i < cpi->twopass.frames_to_key ; i++) 3015233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3016233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_stats(cpi, &next_frame); 3017233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_stats(§ionstats, &next_frame); 3018233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3019233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3020233d2500723e5594f3e7c70896ffeeef32b9c950ywan avg_stats(§ionstats); 3021233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3022233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.section_intra_rating = (unsigned int) 3023233d2500723e5594f3e7c70896ffeeef32b9c950ywan (sectionstats.intra_error 3024233d2500723e5594f3e7c70896ffeeef32b9c950ywan / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); 3025233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3026233d2500723e5594f3e7c70896ffeeef32b9c950ywan Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error); 3027233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025); 3028233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3029233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.section_max_qfactor < 0.80) 3030233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.section_max_qfactor = 0.80; 3031233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3032233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3033233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* When using CBR apply additional buffer fullness related upper limits */ 3034233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) 3035233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3036233d2500723e5594f3e7c70896ffeeef32b9c950ywan double max_boost; 3037233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3038233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->drop_frames_allowed) 3039233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3040233d2500723e5594f3e7c70896ffeeef32b9c950ywan int df_buffer_level = (int)(cpi->oxcf.drop_frames_water_mark 3041233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (cpi->oxcf.optimal_buffer_level / 100)); 3042233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3043233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->buffer_level > df_buffer_level) 3044233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth); 3045233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 3046233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_boost = 0.0; 3047233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3048233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (cpi->buffer_level > 0) 3049233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3050233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth); 3051233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3052233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 3053233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3054233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_boost = 0.0; 3055233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3056233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3057233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (boost_score > max_boost) 3058233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = max_boost; 3059233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3060233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3061233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reset the first pass file position */ 3062233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(cpi, start_position); 3063233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3064233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Work out how many bits to allocate for the key frame itself */ 3065233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (1) 3066233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3067233d2500723e5594f3e7c70896ffeeef32b9c950ywan int kf_boost = (int)boost_score; 3068233d2500723e5594f3e7c70896ffeeef32b9c950ywan int allocation_chunks; 3069233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Counter = cpi->twopass.frames_to_key; 3070233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_kf_bits; 3071233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx]; 3072233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Min boost based on kf interval */ 3073233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if 0 3074233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3075233d2500723e5594f3e7c70896ffeeef32b9c950ywan while ((kf_boost < 48) && (Counter > 0)) 3076233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3077233d2500723e5594f3e7c70896ffeeef32b9c950ywan Counter -= 2; 3078233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost ++; 3079233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3080233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3081233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 3082233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3083233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (kf_boost < 48) 3084233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3085233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost += ((Counter + 1) >> 1); 3086233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3087233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (kf_boost > 48) kf_boost = 48; 3088233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3089233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3090233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* bigger frame sizes need larger kf boosts, smaller frames smaller 3091233d2500723e5594f3e7c70896ffeeef32b9c950ywan * boosts... 3092233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3093233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((lst_yv12->y_width * lst_yv12->y_height) > (320 * 240)) 3094233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost += 2 * (lst_yv12->y_width * lst_yv12->y_height) / (320 * 240); 3095233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if ((lst_yv12->y_width * lst_yv12->y_height) < (320 * 240)) 3096233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost -= 4 * (320 * 240) / (lst_yv12->y_width * lst_yv12->y_height); 3097233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3098233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Min KF boost */ 3099233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost = (int)((double)kf_boost * 100.0) >> 4; /* Scale 16 to 100 */ 3100233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (kf_boost < 250) 3101233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost = 250; 3102233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3103233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 3104233d2500723e5594f3e7c70896ffeeef32b9c950ywan * We do three calculations for kf size. 3105233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The first is based on the error score for the whole kf group. 3106233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The second (optionaly) on the key frames own error if this is 3107233d2500723e5594f3e7c70896ffeeef32b9c950ywan * smaller than the average for the group. 3108233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The final one insures that the frame receives at least the 3109233d2500723e5594f3e7c70896ffeeef32b9c950ywan * allocation it would have received based on its own error score vs 3110233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the error score remaining 3111233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Special case if the sequence appears almost totaly static 3112233d2500723e5594f3e7c70896ffeeef32b9c950ywan * as measured by the decay accumulator. In this case we want to 3113233d2500723e5594f3e7c70896ffeeef32b9c950ywan * spend almost all of the bits on the key frame. 3114233d2500723e5594f3e7c70896ffeeef32b9c950ywan * cpi->twopass.frames_to_key-1 because key frame itself is taken 3115233d2500723e5594f3e7c70896ffeeef32b9c950ywan * care of by kf_boost. 3116233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3117233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( decay_accumulator >= 0.99 ) 3118233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3119233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = 3120233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->twopass.frames_to_key - 1) * 10) + kf_boost; 3121233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3122233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 3123233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3124233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = 3125233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cpi->twopass.frames_to_key - 1) * 100) + kf_boost; 3126233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3127233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3128233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Normalize Altboost and allocations chunck down to prevent overflow */ 3129233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (kf_boost > 1000) 3130233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3131233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost /= 2; 3132233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks /= 2; 3133233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3134233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3135233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = (cpi->twopass.kf_group_bits < 0) ? 0 : cpi->twopass.kf_group_bits; 3136233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3137233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate the number of bits to be spent on the key frame */ 3138233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_bits = (int)((double)kf_boost * ((double)cpi->twopass.kf_group_bits / (double)allocation_chunks)); 3139233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3140233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Apply an additional limit for CBR */ 3141233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) 3142233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3143233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.kf_bits > (int)((3 * cpi->buffer_level) >> 2)) 3144233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_bits = (int)((3 * cpi->buffer_level) >> 2); 3145233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3146233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3147233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If the key frame is actually easier than the average for the 3148233d2500723e5594f3e7c70896ffeeef32b9c950ywan * kf group (which does sometimes happen... eg a blank intro frame) 3149233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Then use an alternate calculation based on the kf error score 3150233d2500723e5594f3e7c70896ffeeef32b9c950ywan * which should give a smaller key frame. 3151233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3152233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (kf_mod_err < kf_group_err / cpi->twopass.frames_to_key) 3153233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3154233d2500723e5594f3e7c70896ffeeef32b9c950ywan double alt_kf_grp_bits = 3155233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((double)cpi->twopass.bits_left * 3156233d2500723e5594f3e7c70896ffeeef32b9c950ywan (kf_mod_err * (double)cpi->twopass.frames_to_key) / 3157233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left)); 3158233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3159233d2500723e5594f3e7c70896ffeeef32b9c950ywan alt_kf_bits = (int)((double)kf_boost * 3160233d2500723e5594f3e7c70896ffeeef32b9c950ywan (alt_kf_grp_bits / (double)allocation_chunks)); 3161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3162233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.kf_bits > alt_kf_bits) 3163233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3164233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_bits = alt_kf_bits; 3165233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3166233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3167233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Else if it is much harder than other frames in the group make sure 3168233d2500723e5594f3e7c70896ffeeef32b9c950ywan * it at least receives an allocation in keeping with its relative 3169233d2500723e5594f3e7c70896ffeeef32b9c950ywan * error score 3170233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3171233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 3172233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3173233d2500723e5594f3e7c70896ffeeef32b9c950ywan alt_kf_bits = 3174233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)((double)cpi->twopass.bits_left * 3175233d2500723e5594f3e7c70896ffeeef32b9c950ywan (kf_mod_err / 3176233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left))); 3177233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3178233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (alt_kf_bits > cpi->twopass.kf_bits) 3179233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3180233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_bits = alt_kf_bits; 3181233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3182233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3183233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3184233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits -= cpi->twopass.kf_bits; 3185233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Add in the minimum frame allowance */ 3186233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_bits += cpi->min_frame_bandwidth; 3187233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3188233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Peer frame bit target for this frame */ 3189233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->per_frame_bandwidth = cpi->twopass.kf_bits; 3190233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3191233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Convert to a per second bitrate */ 3192233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->target_bandwidth = (int)(cpi->twopass.kf_bits * 3193233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->output_framerate); 3194233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3195233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3196233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Note the total error score of the kf group minus the key frame itself */ 3197233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err); 3198233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3199233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Adjust the count of total modified error left. The count of bits left 3200233d2500723e5594f3e7c70896ffeeef32b9c950ywan * is adjusted elsewhere based on real coded frame sizes 3201233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3202233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.modified_error_left -= kf_group_err; 3203233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3204233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.allow_spatial_resampling) 3205233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3206233d2500723e5594f3e7c70896ffeeef32b9c950ywan int resample_trigger = 0; 3207233d2500723e5594f3e7c70896ffeeef32b9c950ywan int last_kf_resampled = 0; 3208233d2500723e5594f3e7c70896ffeeef32b9c950ywan int kf_q; 3209233d2500723e5594f3e7c70896ffeeef32b9c950ywan int scale_val = 0; 3210233d2500723e5594f3e7c70896ffeeef32b9c950ywan int hr, hs, vr, vs; 3211233d2500723e5594f3e7c70896ffeeef32b9c950ywan int new_width = cpi->oxcf.Width; 3212233d2500723e5594f3e7c70896ffeeef32b9c950ywan int new_height = cpi->oxcf.Height; 3213233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3214233d2500723e5594f3e7c70896ffeeef32b9c950ywan int projected_buffer_level = (int)cpi->buffer_level; 3215233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_q; 3216233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3217233d2500723e5594f3e7c70896ffeeef32b9c950ywan double projected_bits_perframe; 3218233d2500723e5594f3e7c70896ffeeef32b9c950ywan double group_iiratio = (kf_group_intra_err - first_frame.intra_error) / (kf_group_coded_err - first_frame.coded_error); 3219233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_per_frame = kf_group_err / cpi->twopass.frames_to_key; 3220233d2500723e5594f3e7c70896ffeeef32b9c950ywan double bits_per_frame; 3221233d2500723e5594f3e7c70896ffeeef32b9c950ywan double av_bits_per_frame; 3222233d2500723e5594f3e7c70896ffeeef32b9c950ywan double effective_size_ratio; 3223233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3224233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->common.Width != cpi->oxcf.Width) || (cpi->common.Height != cpi->oxcf.Height)) 3225233d2500723e5594f3e7c70896ffeeef32b9c950ywan last_kf_resampled = 1; 3226233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3227233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set back to unscaled by defaults */ 3228233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.horiz_scale = NORMAL; 3229233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.vert_scale = NORMAL; 3230233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3231233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Calculate Average bits per frame. */ 3232233d2500723e5594f3e7c70896ffeeef32b9c950ywan av_bits_per_frame = cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate); 3233233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3234233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* CBR... Use the clip average as the target for deciding resample */ 3235233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) 3236233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3237233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_frame = av_bits_per_frame; 3238233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3239233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3240233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* In VBR we want to avoid downsampling in easy section unless we 3241233d2500723e5594f3e7c70896ffeeef32b9c950ywan * are under extreme pressure So use the larger of target bitrate 3242233d2500723e5594f3e7c70896ffeeef32b9c950ywan * for this section or average bitrate for sequence 3243233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3244233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 3245233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3246233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* This accounts for how hard the section is... */ 3247233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_frame = (double) 3248233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key); 3249233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3250233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Dont turn to resampling in easy sections just because they 3251233d2500723e5594f3e7c70896ffeeef32b9c950ywan * have been assigned a small number of bits 3252233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3253233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bits_per_frame < av_bits_per_frame) 3254233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_frame = av_bits_per_frame; 3255233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3256233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3257233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* bits_per_frame should comply with our minimum */ 3258233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bits_per_frame < (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100)) 3259233d2500723e5594f3e7c70896ffeeef32b9c950ywan bits_per_frame = (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100); 3260233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3261233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Work out if spatial resampling is necessary */ 3262233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_q = estimate_kf_group_q(cpi, err_per_frame, 3263233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)bits_per_frame, group_iiratio); 3264233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3265233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If we project a required Q higher than the maximum allowed Q then 3266233d2500723e5594f3e7c70896ffeeef32b9c950ywan * make a guess at the actual size of frames in this section 3267233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3268233d2500723e5594f3e7c70896ffeeef32b9c950ywan projected_bits_perframe = bits_per_frame; 3269233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_q = kf_q; 3270233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3271233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (tmp_q > cpi->worst_quality) 3272233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3273233d2500723e5594f3e7c70896ffeeef32b9c950ywan projected_bits_perframe *= 1.04; 3274233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_q--; 3275233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3276233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3277233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Guess at buffer level at the end of the section */ 3278233d2500723e5594f3e7c70896ffeeef32b9c950ywan projected_buffer_level = (int) 3279233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->buffer_level - (int) 3280233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((projected_bits_perframe - av_bits_per_frame) * 3281233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.frames_to_key)); 3282233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3283233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (0) 3284233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3285233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *f = fopen("Subsamle.stt", "a"); 3286233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, " %8d %8d %8d %8d %12.0f %8d %8d %8d\n", cpi->common.current_video_frame, kf_q, cpi->common.horiz_scale, cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key, (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key), new_height, new_width); 3287233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(f); 3288233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3289233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3290233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* The trigger for spatial resampling depends on the various 3291233d2500723e5594f3e7c70896ffeeef32b9c950ywan * parameters such as whether we are streaming (CBR) or VBR. 3292233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3293233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) 3294233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3295233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Trigger resample if we are projected to fall below down 3296233d2500723e5594f3e7c70896ffeeef32b9c950ywan * sample level or resampled last time and are projected to 3297233d2500723e5594f3e7c70896ffeeef32b9c950ywan * remain below the up sample level 3298233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3299233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((projected_buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100)) || 3300233d2500723e5594f3e7c70896ffeeef32b9c950ywan (last_kf_resampled && (projected_buffer_level < (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100)))) 3301233d2500723e5594f3e7c70896ffeeef32b9c950ywan resample_trigger = 1; 3302233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 3303233d2500723e5594f3e7c70896ffeeef32b9c950ywan resample_trigger = 0; 3304233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3305233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 3306233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3307233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t clip_bits = (int64_t)(cpi->twopass.total_stats.count * cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate)); 3308233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t over_spend = cpi->oxcf.starting_buffer_level - cpi->buffer_level; 3309233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3310233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If triggered last time the threshold for triggering again is 3311233d2500723e5594f3e7c70896ffeeef32b9c950ywan * reduced: 3312233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 3313233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Projected Q higher than allowed and Overspend > 5% of total 3314233d2500723e5594f3e7c70896ffeeef32b9c950ywan * bits 3315233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3316233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((last_kf_resampled && (kf_q > cpi->worst_quality)) || 3317233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((kf_q > cpi->worst_quality) && 3318233d2500723e5594f3e7c70896ffeeef32b9c950ywan (over_spend > clip_bits / 20))) 3319233d2500723e5594f3e7c70896ffeeef32b9c950ywan resample_trigger = 1; 3320233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 3321233d2500723e5594f3e7c70896ffeeef32b9c950ywan resample_trigger = 0; 3322233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3323233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3324233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3325233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (resample_trigger) 3326233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3327233d2500723e5594f3e7c70896ffeeef32b9c950ywan while ((kf_q >= cpi->worst_quality) && (scale_val < 6)) 3328233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3329233d2500723e5594f3e7c70896ffeeef32b9c950ywan scale_val ++; 3330233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3331233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.vert_scale = vscale_lookup[scale_val]; 3332233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.horiz_scale = hscale_lookup[scale_val]; 3333233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3334233d2500723e5594f3e7c70896ffeeef32b9c950ywan Scale2Ratio(cpi->common.horiz_scale, &hr, &hs); 3335233d2500723e5594f3e7c70896ffeeef32b9c950ywan Scale2Ratio(cpi->common.vert_scale, &vr, &vs); 3336233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3337233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs; 3338233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs; 3339233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3340233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Reducing the area to 1/4 does not reduce the complexity 3341233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (err_per_frame) to 1/4... effective_sizeratio attempts 3342233d2500723e5594f3e7c70896ffeeef32b9c950ywan * to provide a crude correction for this 3343233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3344233d2500723e5594f3e7c70896ffeeef32b9c950ywan effective_size_ratio = (double)(new_width * new_height) / (double)(cpi->oxcf.Width * cpi->oxcf.Height); 3345233d2500723e5594f3e7c70896ffeeef32b9c950ywan effective_size_ratio = (1.0 + (3.0 * effective_size_ratio)) / 4.0; 3346233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3347233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Now try again and see what Q we get with the smaller 3348233d2500723e5594f3e7c70896ffeeef32b9c950ywan * image size 3349233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 3350233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_q = estimate_kf_group_q(cpi, 3351233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_per_frame * effective_size_ratio, 3352233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)bits_per_frame, group_iiratio); 3353233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3354233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (0) 3355233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3356233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *f = fopen("Subsamle.stt", "a"); 3357233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(f, "******** %8d %8d %8d %12.0f %8d %8d %8d\n", kf_q, cpi->common.horiz_scale, cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key, (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key), new_height, new_width); 3358233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(f); 3359233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3360233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3361233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3362233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3363233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cpi->common.Width != new_width) || (cpi->common.Height != new_height)) 3364233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 3365233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.Width = new_width; 3366233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.Height = new_height; 3367233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_alloc_compressor_data(cpi); 3368233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3369233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 3370233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 3371