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 <limits.h> 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h> 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h> 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vpx_scale_rtcd.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_scale/vpx_scale.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_scale/yv12config.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropymv.h" 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_quant_common.h" 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_reconinter.h" // vp9_setup_dst_planes() 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_systemdependent.h" 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_aq_variance.h" 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_block.h" 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_encodeframe.h" 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_encodemb.h" 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_encodemv.h" 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_extend.h" 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_firstpass.h" 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_mcomp.h" 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_onyx_int.h" 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_quantize.h" 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_ratectrl.h" 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_rdopt.h" 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_variance.h" 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define OUTPUT_FPF 0 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define IIFACTOR 12.5 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define IIKFACTOR1 12.5 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define IIKFACTOR2 15.0 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RMAX 512.0 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GF_RMAX 96.0 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ERR_DIVISOR 150.0 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MIN_DECAY_FACTOR 0.1 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define KF_MB_INTRA_MIN 150 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GF_MB_INTRA_MIN 100 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001) 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MIN_KF_BOOST 300 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Set MIN_GF_INTERVAL to 1 for the full decomposition. 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MIN_GF_INTERVAL 2 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MIN_GF_INTERVAL 4 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG temp = *a; 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan *a = *b; 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan *b = temp; 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan 70233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int gfboost_qadjust(int qindex) { 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double q = vp9_convert_qindex_to_q(qindex); 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (int)((0.00000828 * q * q * q) + 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan (-0.0055 * q * q) + 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan (1.32 * q) + 79.3); 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Resets the first pass file to the given position using a relative seek from 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the current position. 79233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void reset_fpf_position(struct twopass_rc *p, 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *position) { 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan p->stats_in = position; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 84233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int lookup_next_frame_stats(const struct twopass_rc *p, 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *next_frame) { 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (p->stats_in >= p->stats_in_end) 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan return EOF; 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan *next_frame = *p->stats_in; 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 1; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Read frame stats at an offset from the current position. 95233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int read_frame_stats(const struct twopass_rc *p, 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *frame_stats, int offset) { 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *fps_ptr = p->stats_in; 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Check legality of offset. 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (offset >= 0) { 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (&fps_ptr[offset] >= p->stats_in_end) 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan return EOF; 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (offset < 0) { 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (&fps_ptr[offset] < p->stats_in_start) 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan return EOF; 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan *frame_stats = fps_ptr[offset]; 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 1; 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan 112233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int input_stats(struct twopass_rc *p, FIRSTPASS_STATS *fps) { 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (p->stats_in >= p->stats_in_end) 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan return EOF; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan *fps = *p->stats_in; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++p->stats_in; 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 1; 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan 121233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void output_stats(FIRSTPASS_STATS *stats, 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_codec_pkt_list *pktlist) { 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_codec_cx_pkt pkt; 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.kind = VPX_CODEC_STATS_PKT; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.twopass_stats.buf = stats; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS); 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pkt_list_add(pktlist, &pkt); 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEMP debug code 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if OUTPUT_FPF 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *fpfile; 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan fpfile = fopen("firstpass.stt", "a"); 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan fprintf(fpfile, "%12.0f %12.0f %12.0f %12.0f %12.0f %12.4f %12.4f" 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan "%12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f" 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan "%12.0f %12.0f %12.4f %12.0f %12.0f %12.4f\n", 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->frame, 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->intra_error, 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->coded_error, 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->sr_coded_error, 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->ssim_weighted_pred_err, 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->pcnt_inter, 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->pcnt_motion, 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->pcnt_second_ref, 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->pcnt_neutral, 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->MVr, 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->mvr_abs, 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->MVc, 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->mvc_abs, 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->MVrv, 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->MVcv, 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->mv_in_out_count, 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->new_mv_count, 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->count, 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats->duration); 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(fpfile); 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 162233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void zero_stats(FIRSTPASS_STATS *section) { 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->frame = 0.0; 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->intra_error = 0.0; 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->coded_error = 0.0; 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->sr_coded_error = 0.0; 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->ssim_weighted_pred_err = 0.0; 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_inter = 0.0; 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_motion = 0.0; 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_second_ref = 0.0; 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_neutral = 0.0; 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVr = 0.0; 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvr_abs = 0.0; 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVc = 0.0; 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvc_abs = 0.0; 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVrv = 0.0; 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVcv = 0.0; 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mv_in_out_count = 0.0; 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->new_mv_count = 0.0; 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->count = 0.0; 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->duration = 1.0; 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->spatial_layer_id = 0; 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan 185233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void accumulate_stats(FIRSTPASS_STATS *section, 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *frame) { 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->frame += frame->frame; 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->spatial_layer_id = frame->spatial_layer_id; 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->intra_error += frame->intra_error; 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->coded_error += frame->coded_error; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->sr_coded_error += frame->sr_coded_error; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err; 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_inter += frame->pcnt_inter; 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_motion += frame->pcnt_motion; 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_second_ref += frame->pcnt_second_ref; 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_neutral += frame->pcnt_neutral; 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVr += frame->MVr; 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvr_abs += frame->mvr_abs; 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVc += frame->MVc; 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvc_abs += frame->mvc_abs; 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVrv += frame->MVrv; 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVcv += frame->MVcv; 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mv_in_out_count += frame->mv_in_out_count; 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->new_mv_count += frame->new_mv_count; 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->count += frame->count; 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->duration += frame->duration; 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan 209233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void subtract_stats(FIRSTPASS_STATS *section, 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *frame) { 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->frame -= frame->frame; 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->intra_error -= frame->intra_error; 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->coded_error -= frame->coded_error; 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->sr_coded_error -= frame->sr_coded_error; 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err; 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_inter -= frame->pcnt_inter; 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_motion -= frame->pcnt_motion; 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_second_ref -= frame->pcnt_second_ref; 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_neutral -= frame->pcnt_neutral; 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVr -= frame->MVr; 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvr_abs -= frame->mvr_abs; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVc -= frame->MVc; 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvc_abs -= frame->mvc_abs; 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVrv -= frame->MVrv; 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVcv -= frame->MVcv; 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mv_in_out_count -= frame->mv_in_out_count; 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->new_mv_count -= frame->new_mv_count; 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->count -= frame->count; 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->duration -= frame->duration; 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan 232233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void avg_stats(FIRSTPASS_STATS *section) { 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (section->count < 1.0) 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->intra_error /= section->count; 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->coded_error /= section->count; 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->sr_coded_error /= section->count; 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->ssim_weighted_pred_err /= section->count; 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_inter /= section->count; 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_second_ref /= section->count; 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_neutral /= section->count; 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->pcnt_motion /= section->count; 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVr /= section->count; 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvr_abs /= section->count; 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVc /= section->count; 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mvc_abs /= section->count; 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVrv /= section->count; 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->MVcv /= section->count; 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->mv_in_out_count /= section->count; 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan section->duration /= section->count; 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Calculate a modified Error used in distributing bits between easier and 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan// harder frames. 256233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double calculate_modified_err(const VP9_COMP *cpi, 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *this_frame) { 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan const struct twopass_rc *twopass = &cpi->twopass; 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *stats; 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan double av_err; 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan double modified_error; 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->svc.number_spatial_layers > 1 && 264233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->svc.number_temporal_layers == 1) { 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass; 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan 268233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats = &twopass->total_stats; 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan av_err = stats->ssim_weighted_pred_err / stats->count; 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan modified_error = av_err * pow(this_frame->ssim_weighted_pred_err / 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(av_err), 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->oxcf.two_pass_vbrbias / 100.0); 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan return fclamp(modified_error, 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->modified_error_min, twopass->modified_error_max); 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan 278233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const double weight_table[256] = { 279233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.031250, 0.062500, 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.093750, 0.125000, 0.156250, 0.187500, 0.218750, 0.250000, 0.281250, 285233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750, 0.500000, 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750, 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.750000, 0.781250, 0.812500, 0.843750, 0.875000, 0.906250, 0.937500, 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0.968750, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 313233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 314233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 315233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1.000000, 1.000000, 1.000000, 1.000000 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan 318233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double simple_weight(const YV12_BUFFER_CONFIG *buf) { 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan double sum = 0.0; 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int w = buf->y_crop_width; 322233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int h = buf->y_crop_height; 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint8_t *row = buf->y_buffer; 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < h; ++i) { 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint8_t *pixel = row; 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < w; ++j) 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum += weight_table[*pixel++]; 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan row += buf->y_stride; 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan return MAX(0.1, sum / (w * h)); 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This function returns the maximum target rate per frame. 336233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int frame_max_bits(const VP9_COMP *cpi) { 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t max_bits = 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((int64_t)cpi->rc.av_per_frame_bandwidth * 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int64_t)cpi->oxcf.two_pass_vbrmax_section) / 100; 340233d2500723e5594f3e7c70896ffeeef32b9c950ywan 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (max_bits < 0) 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_bits = 0; 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (max_bits > cpi->rc.max_frame_bandwidth) 344233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_bits = cpi->rc.max_frame_bandwidth; 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (int)max_bits; 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan 349233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_init_first_pass(VP9_COMP *cpi) { 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(&cpi->twopass.total_stats); 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan 353233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_end_first_pass(VP9_COMP *cpi) { 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->svc.number_spatial_layers; ++i) { 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan output_stats(&cpi->svc.layer_context[i].twopass.total_stats, 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->output_pkt_list); 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan output_stats(&cpi->twopass.total_stats, cpi->output_pkt_list); 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 363233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan 365233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vp9_variance_fn_t get_block_variance_fn(BLOCK_SIZE bsize) { 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (bsize) { 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_8X8: 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan return vp9_mse8x8; 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_16X8: 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan return vp9_mse16x8; 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_8X16: 372233d2500723e5594f3e7c70896ffeeef32b9c950ywan return vp9_mse8x16; 373233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 374233d2500723e5594f3e7c70896ffeeef32b9c950ywan return vp9_mse16x16; 375233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 376233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 377233d2500723e5594f3e7c70896ffeeef32b9c950ywan 378233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned int zz_motion_search(const MACROBLOCK *x) { 379233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MACROBLOCKD *const xd = &x->e_mbd; 380233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint8_t *const src = x->plane[0].src.buf; 381233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int src_stride = x->plane[0].src.stride; 382233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint8_t *const ref = xd->plane[0].pre[0].buf; 383233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int ref_stride = xd->plane[0].pre[0].stride; 384233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int sse; 385233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_variance_fn_t fn = get_block_variance_fn(xd->mi[0]->mbmi.sb_type); 386233d2500723e5594f3e7c70896ffeeef32b9c950ywan fn(src, src_stride, ref, ref_stride, &sse); 387233d2500723e5594f3e7c70896ffeeef32b9c950ywan return sse; 388233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 389233d2500723e5594f3e7c70896ffeeef32b9c950ywan 390233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void first_pass_motion_search(VP9_COMP *cpi, MACROBLOCK *x, 391233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MV *ref_mv, MV *best_mv, 392233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *best_motion_err) { 393233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *const xd = &x->e_mbd; 394233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV tmp_mv = {0, 0}; 395233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV ref_mv_full = {ref_mv->row >> 3, ref_mv->col >> 3}; 396233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num00, tmp_err, n, sr = 0; 397233d2500723e5594f3e7c70896ffeeef32b9c950ywan int step_param = 3; 398233d2500723e5594f3e7c70896ffeeef32b9c950ywan int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; 399233d2500723e5594f3e7c70896ffeeef32b9c950ywan const BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type; 400233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[bsize]; 401233d2500723e5594f3e7c70896ffeeef32b9c950ywan int new_mv_mode_penalty = 256; 402233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int quart_frm = MIN(cpi->common.width, cpi->common.height); 403233d2500723e5594f3e7c70896ffeeef32b9c950ywan 404233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Refine the motion search range according to the frame dimension 405233d2500723e5594f3e7c70896ffeeef32b9c950ywan // for first pass test. 406233d2500723e5594f3e7c70896ffeeef32b9c950ywan while ((quart_frm << sr) < MAX_FULL_PEL_VAL) 407233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++sr; 408233d2500723e5594f3e7c70896ffeeef32b9c950ywan 409233d2500723e5594f3e7c70896ffeeef32b9c950ywan step_param += sr; 410233d2500723e5594f3e7c70896ffeeef32b9c950ywan further_steps -= sr; 411233d2500723e5594f3e7c70896ffeeef32b9c950ywan 412233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Override the default variance function to use MSE. 413233d2500723e5594f3e7c70896ffeeef32b9c950ywan v_fn_ptr.vf = get_block_variance_fn(bsize); 414233d2500723e5594f3e7c70896ffeeef32b9c950ywan 415233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Center the initial step/diamond search on best mv. 416233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = cpi->diamond_search_sad(x, &ref_mv_full, &tmp_mv, 417233d2500723e5594f3e7c70896ffeeef32b9c950ywan step_param, 418233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->sadperbit16, &num00, &v_fn_ptr, 419233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->nmvjointcost, 420233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mvcost, ref_mv); 421233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < INT_MAX) 422233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = vp9_get_mvpred_var(x, &tmp_mv, ref_mv, &v_fn_ptr, 1); 423233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < INT_MAX - new_mv_mode_penalty) 424233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err += new_mv_mode_penalty; 425233d2500723e5594f3e7c70896ffeeef32b9c950ywan 426233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < *best_motion_err) { 427233d2500723e5594f3e7c70896ffeeef32b9c950ywan *best_motion_err = tmp_err; 428233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->row = tmp_mv.row; 429233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->col = tmp_mv.col; 430233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 431233d2500723e5594f3e7c70896ffeeef32b9c950ywan 432233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Carry out further step/diamond searches as necessary. 433233d2500723e5594f3e7c70896ffeeef32b9c950ywan n = num00; 434233d2500723e5594f3e7c70896ffeeef32b9c950ywan num00 = 0; 435233d2500723e5594f3e7c70896ffeeef32b9c950ywan 436233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (n < further_steps) { 437233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++n; 438233d2500723e5594f3e7c70896ffeeef32b9c950ywan 439233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (num00) { 440233d2500723e5594f3e7c70896ffeeef32b9c950ywan --num00; 441233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 442233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = cpi->diamond_search_sad(x, &ref_mv_full, &tmp_mv, 443233d2500723e5594f3e7c70896ffeeef32b9c950ywan step_param + n, x->sadperbit16, 444233d2500723e5594f3e7c70896ffeeef32b9c950ywan &num00, &v_fn_ptr, 445233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->nmvjointcost, 446233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mvcost, ref_mv); 447233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < INT_MAX) 448233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = vp9_get_mvpred_var(x, &tmp_mv, ref_mv, &v_fn_ptr, 1); 449233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < INT_MAX - new_mv_mode_penalty) 450233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err += new_mv_mode_penalty; 451233d2500723e5594f3e7c70896ffeeef32b9c950ywan 452233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < *best_motion_err) { 453233d2500723e5594f3e7c70896ffeeef32b9c950ywan *best_motion_err = tmp_err; 454233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->row = tmp_mv.row; 455233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->col = tmp_mv.col; 456233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 457233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 458233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 459233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 460233d2500723e5594f3e7c70896ffeeef32b9c950ywan 461233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic BLOCK_SIZE get_bsize(const VP9_COMMON *cm, int mb_row, int mb_col) { 462233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (2 * mb_col + 1 < cm->mi_cols) { 463233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 2 * mb_row + 1 < cm->mi_rows ? BLOCK_16X16 464233d2500723e5594f3e7c70896ffeeef32b9c950ywan : BLOCK_16X8; 465233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 466233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 2 * mb_row + 1 < cm->mi_rows ? BLOCK_8X16 467233d2500723e5594f3e7c70896ffeeef32b9c950ywan : BLOCK_8X8; 468233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 469233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 470233d2500723e5594f3e7c70896ffeeef32b9c950ywan 471233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_first_pass(VP9_COMP *cpi) { 472233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_row, mb_col; 473233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCK *const x = &cpi->mb; 474233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_COMMON *const cm = &cpi->common; 475233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *const xd = &x->e_mbd; 476233d2500723e5594f3e7c70896ffeeef32b9c950ywan TileInfo tile; 477233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct macroblock_plane *const p = x->plane; 478233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct macroblockd_plane *const pd = xd->plane; 479233d2500723e5594f3e7c70896ffeeef32b9c950ywan const PICK_MODE_CONTEXT *ctx = &x->sb64_context; 480233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 481233d2500723e5594f3e7c70896ffeeef32b9c950ywan 482233d2500723e5594f3e7c70896ffeeef32b9c950ywan int recon_yoffset, recon_uvoffset; 483233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *const lst_yv12 = get_ref_frame_buffer(cpi, LAST_FRAME); 484233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *gld_yv12 = get_ref_frame_buffer(cpi, GOLDEN_FRAME); 485233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *const new_yv12 = get_frame_new_buffer(cm); 486233d2500723e5594f3e7c70896ffeeef32b9c950ywan int recon_y_stride = lst_yv12->y_stride; 487233d2500723e5594f3e7c70896ffeeef32b9c950ywan int recon_uv_stride = lst_yv12->uv_stride; 488233d2500723e5594f3e7c70896ffeeef32b9c950ywan int uv_mb_height = 16 >> (lst_yv12->y_height > lst_yv12->uv_height); 489233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t intra_error = 0; 490233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t coded_error = 0; 491233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t sr_coded_error = 0; 492233d2500723e5594f3e7c70896ffeeef32b9c950ywan 493233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum_mvr = 0, sum_mvc = 0; 494233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum_mvr_abs = 0, sum_mvc_abs = 0; 495233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t sum_mvrs = 0, sum_mvcs = 0; 496233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mvcount = 0; 497233d2500723e5594f3e7c70896ffeeef32b9c950ywan int intercount = 0; 498233d2500723e5594f3e7c70896ffeeef32b9c950ywan int second_ref_count = 0; 499233d2500723e5594f3e7c70896ffeeef32b9c950ywan int intrapenalty = 256; 500233d2500723e5594f3e7c70896ffeeef32b9c950ywan int neutral_count = 0; 501233d2500723e5594f3e7c70896ffeeef32b9c950ywan int new_mv_count = 0; 502233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum_in_vectors = 0; 503233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint32_t lastmv_as_int = 0; 504233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct twopass_rc *twopass = &cpi->twopass; 505233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MV zero_mv = {0, 0}; 506233d2500723e5594f3e7c70896ffeeef32b9c950ywan const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; 507233d2500723e5594f3e7c70896ffeeef32b9c950ywan 508233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 509233d2500723e5594f3e7c70896ffeeef32b9c950ywan 510233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 511233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV_REFERENCE_FRAME ref_frame = LAST_FRAME; 512233d2500723e5594f3e7c70896ffeeef32b9c950ywan const YV12_BUFFER_CONFIG *scaled_ref_buf = NULL; 513233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass; 514233d2500723e5594f3e7c70896ffeeef32b9c950ywan 515233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_scale_references(cpi); 516233d2500723e5594f3e7c70896ffeeef32b9c950ywan 517233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Use either last frame or alt frame for motion search. 518233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->ref_frame_flags & VP9_LAST_FLAG) { 519233d2500723e5594f3e7c70896ffeeef32b9c950ywan scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, LAST_FRAME); 520233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_frame = LAST_FRAME; 521233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cpi->ref_frame_flags & VP9_ALT_FLAG) { 522233d2500723e5594f3e7c70896ffeeef32b9c950ywan scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, ALTREF_FRAME); 523233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_frame = ALTREF_FRAME; 524233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 525233d2500723e5594f3e7c70896ffeeef32b9c950ywan 526233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (scaled_ref_buf != NULL) { 527233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Update the stride since we are using scaled reference buffer 528233d2500723e5594f3e7c70896ffeeef32b9c950ywan first_ref_buf = scaled_ref_buf; 529233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_y_stride = first_ref_buf->y_stride; 530233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_uv_stride = first_ref_buf->uv_stride; 531233d2500723e5594f3e7c70896ffeeef32b9c950ywan uv_mb_height = 16 >> (first_ref_buf->y_height > first_ref_buf->uv_height); 532233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 533233d2500723e5594f3e7c70896ffeeef32b9c950ywan 534233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Disable golden frame for svc first pass for now. 535233d2500723e5594f3e7c70896ffeeef32b9c950ywan gld_yv12 = NULL; 536233d2500723e5594f3e7c70896ffeeef32b9c950ywan set_ref_ptrs(cm, xd, ref_frame, NONE); 537233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 538233d2500723e5594f3e7c70896ffeeef32b9c950ywan 539233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_setup_src_planes(x, cpi->Source, 0, 0); 540233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_setup_pre_planes(xd, 0, first_ref_buf, 0, 0, NULL); 541233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_setup_dst_planes(xd, new_yv12, 0, 0); 542233d2500723e5594f3e7c70896ffeeef32b9c950ywan 543233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi = cm->mi_grid_visible; 544233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0] = cm->mi; 545233d2500723e5594f3e7c70896ffeeef32b9c950ywan 546233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_setup_block_planes(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); 547233d2500723e5594f3e7c70896ffeeef32b9c950ywan 548233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_frame_init_quantizer(cpi); 549233d2500723e5594f3e7c70896ffeeef32b9c950ywan 550233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MAX_MB_PLANE; ++i) { 551233d2500723e5594f3e7c70896ffeeef32b9c950ywan p[i].coeff = ctx->coeff_pbuf[i][1]; 552233d2500723e5594f3e7c70896ffeeef32b9c950ywan p[i].qcoeff = ctx->qcoeff_pbuf[i][1]; 553233d2500723e5594f3e7c70896ffeeef32b9c950ywan pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1]; 554233d2500723e5594f3e7c70896ffeeef32b9c950ywan p[i].eobs = ctx->eobs_pbuf[i][1]; 555233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 556233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->skip_recode = 0; 557233d2500723e5594f3e7c70896ffeeef32b9c950ywan 558233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_init_mv_probs(cm); 559233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_initialize_rd_consts(cpi); 560233d2500723e5594f3e7c70896ffeeef32b9c950ywan 561233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Tiling is ignored in the first pass. 562233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_tile_init(&tile, cm, 0, 0); 563233d2500723e5594f3e7c70896ffeeef32b9c950ywan 564233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) { 565233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv best_ref_mv; 566233d2500723e5594f3e7c70896ffeeef32b9c950ywan 567233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_ref_mv.as_int = 0; 568233d2500723e5594f3e7c70896ffeeef32b9c950ywan 569233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Reset above block coeffs. 570233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->up_available = (mb_row != 0); 571233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_yoffset = (mb_row * recon_y_stride * 16); 572233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_uvoffset = (mb_row * recon_uv_stride * uv_mb_height); 573233d2500723e5594f3e7c70896ffeeef32b9c950ywan 574233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Set up limit values for motion vectors to prevent them extending 575233d2500723e5594f3e7c70896ffeeef32b9c950ywan // outside the UMV borders. 576233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_row_min = -((mb_row * 16) + BORDER_MV_PIXELS_B16); 577233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) 578233d2500723e5594f3e7c70896ffeeef32b9c950ywan + BORDER_MV_PIXELS_B16; 579233d2500723e5594f3e7c70896ffeeef32b9c950ywan 580233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) { 581233d2500723e5594f3e7c70896ffeeef32b9c950ywan int this_error; 582233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); 583233d2500723e5594f3e7c70896ffeeef32b9c950ywan double error_weight = 1.0; 584233d2500723e5594f3e7c70896ffeeef32b9c950ywan const BLOCK_SIZE bsize = get_bsize(cm, mb_row, mb_col); 585233d2500723e5594f3e7c70896ffeeef32b9c950ywan 586233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 587233d2500723e5594f3e7c70896ffeeef32b9c950ywan 588233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset; 589233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset; 590233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset; 591233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->left_available = (mb_col != 0); 592233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0]->mbmi.sb_type = bsize; 593233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0]->mbmi.ref_frame[0] = INTRA_FRAME; 594233d2500723e5594f3e7c70896ffeeef32b9c950ywan set_mi_row_col(xd, &tile, 595233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_row << 1, num_8x8_blocks_high_lookup[bsize], 596233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_col << 1, num_8x8_blocks_wide_lookup[bsize], 597233d2500723e5594f3e7c70896ffeeef32b9c950ywan cm->mi_rows, cm->mi_cols); 598233d2500723e5594f3e7c70896ffeeef32b9c950ywan 599233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 600233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int energy = vp9_block_energy(cpi, x, bsize); 601233d2500723e5594f3e7c70896ffeeef32b9c950ywan error_weight = vp9_vaq_inv_q_ratio(energy); 602233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 603233d2500723e5594f3e7c70896ffeeef32b9c950ywan 604233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Do intra 16x16 prediction. 605233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_error = vp9_encode_intra(x, use_dc_pred); 606233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 607233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 608233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_error = (int)(this_error * error_weight); 609233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 610233d2500723e5594f3e7c70896ffeeef32b9c950ywan 611233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Intrapenalty below deals with situations where the intra and inter 612233d2500723e5594f3e7c70896ffeeef32b9c950ywan // error scores are very low (e.g. a plain black frame). 613233d2500723e5594f3e7c70896ffeeef32b9c950ywan // We do not have special cases in first pass for 0,0 and nearest etc so 614233d2500723e5594f3e7c70896ffeeef32b9c950ywan // all inter modes carry an overhead cost estimate for the mv. 615233d2500723e5594f3e7c70896ffeeef32b9c950ywan // When the error score is very low this causes us to pick all or lots of 616233d2500723e5594f3e7c70896ffeeef32b9c950ywan // INTRA modes and throw lots of key frames. 617233d2500723e5594f3e7c70896ffeeef32b9c950ywan // This penalty adds a cost matching that of a 0,0 mv to the intra case. 618233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_error += intrapenalty; 619233d2500723e5594f3e7c70896ffeeef32b9c950ywan 620233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate the intra error. 621233d2500723e5594f3e7c70896ffeeef32b9c950ywan intra_error += (int64_t)this_error; 622233d2500723e5594f3e7c70896ffeeef32b9c950ywan 623233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Set up limit values for motion vectors to prevent them extending 624233d2500723e5594f3e7c70896ffeeef32b9c950ywan // outside the UMV borders. 625233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_col_min = -((mb_col * 16) + BORDER_MV_PIXELS_B16); 626233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + BORDER_MV_PIXELS_B16; 627233d2500723e5594f3e7c70896ffeeef32b9c950ywan 628233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Other than for the first frame do a motion search. 629233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cm->current_video_frame > 0) { 630233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_err, motion_error; 631233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv mv, tmp_mv; 632233d2500723e5594f3e7c70896ffeeef32b9c950ywan 633233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[0].pre[0].buf = first_ref_buf->y_buffer + recon_yoffset; 634233d2500723e5594f3e7c70896ffeeef32b9c950ywan motion_error = zz_motion_search(x); 635233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Assume 0,0 motion with no mv overhead. 636233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv.as_int = tmp_mv.as_int = 0; 637233d2500723e5594f3e7c70896ffeeef32b9c950ywan 638233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Test last reference frame using the previous best mv as the 639233d2500723e5594f3e7c70896ffeeef32b9c950ywan // starting point (best reference) for the search. 640233d2500723e5594f3e7c70896ffeeef32b9c950ywan first_pass_motion_search(cpi, x, &best_ref_mv.as_mv, &mv.as_mv, 641233d2500723e5594f3e7c70896ffeeef32b9c950ywan &motion_error); 642233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 643233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 644233d2500723e5594f3e7c70896ffeeef32b9c950ywan motion_error = (int)(motion_error * error_weight); 645233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 646233d2500723e5594f3e7c70896ffeeef32b9c950ywan 647233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If the current best reference mv is not centered on 0,0 then do a 0,0 648233d2500723e5594f3e7c70896ffeeef32b9c950ywan // based search as well. 649233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (best_ref_mv.as_int) { 650233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = INT_MAX; 651233d2500723e5594f3e7c70896ffeeef32b9c950ywan first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv.as_mv, 652233d2500723e5594f3e7c70896ffeeef32b9c950ywan &tmp_err); 653233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 654233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 655233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_err = (int)(tmp_err * error_weight); 656233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 657233d2500723e5594f3e7c70896ffeeef32b9c950ywan 658233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_err < motion_error) { 659233d2500723e5594f3e7c70896ffeeef32b9c950ywan motion_error = tmp_err; 660233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv.as_int = tmp_mv.as_int; 661233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 662233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 663233d2500723e5594f3e7c70896ffeeef32b9c950ywan 664233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Search in an older reference frame. 665233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cm->current_video_frame > 1 && gld_yv12 != NULL) { 666233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Assume 0,0 motion with no mv overhead. 667233d2500723e5594f3e7c70896ffeeef32b9c950ywan int gf_motion_error; 668233d2500723e5594f3e7c70896ffeeef32b9c950ywan 669233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[0].pre[0].buf = gld_yv12->y_buffer + recon_yoffset; 670233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_motion_error = zz_motion_search(x); 671233d2500723e5594f3e7c70896ffeeef32b9c950ywan 672233d2500723e5594f3e7c70896ffeeef32b9c950ywan first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv.as_mv, 673233d2500723e5594f3e7c70896ffeeef32b9c950ywan &gf_motion_error); 674233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 675233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 676233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_motion_error = (int)(gf_motion_error * error_weight); 677233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 678233d2500723e5594f3e7c70896ffeeef32b9c950ywan 679233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (gf_motion_error < motion_error && gf_motion_error < this_error) 680233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++second_ref_count; 681233d2500723e5594f3e7c70896ffeeef32b9c950ywan 682233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Reset to last frame as reference buffer. 683233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[0].pre[0].buf = first_ref_buf->y_buffer + recon_yoffset; 684233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[1].pre[0].buf = first_ref_buf->u_buffer + recon_uvoffset; 685233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[2].pre[0].buf = first_ref_buf->v_buffer + recon_uvoffset; 686233d2500723e5594f3e7c70896ffeeef32b9c950ywan 687233d2500723e5594f3e7c70896ffeeef32b9c950ywan // In accumulating a score for the older reference frame take the 688233d2500723e5594f3e7c70896ffeeef32b9c950ywan // best of the motion predicted score and the intra coded error 689233d2500723e5594f3e7c70896ffeeef32b9c950ywan // (just as will be done for) accumulation of "coded_error" for 690233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the last frame. 691233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (gf_motion_error < this_error) 692233d2500723e5594f3e7c70896ffeeef32b9c950ywan sr_coded_error += gf_motion_error; 693233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 694233d2500723e5594f3e7c70896ffeeef32b9c950ywan sr_coded_error += this_error; 695233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 696233d2500723e5594f3e7c70896ffeeef32b9c950ywan sr_coded_error += motion_error; 697233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 698233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Start by assuming that intra mode is best. 699233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_ref_mv.as_int = 0; 700233d2500723e5594f3e7c70896ffeeef32b9c950ywan 701233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (motion_error <= this_error) { 702233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Keep a count of cases where the inter and intra were very close 703233d2500723e5594f3e7c70896ffeeef32b9c950ywan // and very low. This helps with scene cut detection for example in 704233d2500723e5594f3e7c70896ffeeef32b9c950ywan // cropped clips with black bars at the sides or top and bottom. 705233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (((this_error - intrapenalty) * 9 <= motion_error * 10) && 706233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_error < 2 * intrapenalty) 707233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++neutral_count; 708233d2500723e5594f3e7c70896ffeeef32b9c950ywan 709233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv.as_mv.row *= 8; 710233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv.as_mv.col *= 8; 711233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_error = motion_error; 712233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0]->mbmi.mode = NEWMV; 713233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0]->mbmi.mv[0] = mv; 714233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0]->mbmi.tx_size = TX_4X4; 715233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0]->mbmi.ref_frame[0] = LAST_FRAME; 716233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0]->mbmi.ref_frame[1] = NONE; 717233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_build_inter_predictors_sby(xd, mb_row << 1, mb_col << 1, bsize); 718233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_encode_sby_pass1(x, bsize); 719233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvr += mv.as_mv.row; 720233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvr_abs += abs(mv.as_mv.row); 721233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvc += mv.as_mv.col; 722233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvc_abs += abs(mv.as_mv.col); 723233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvrs += mv.as_mv.row * mv.as_mv.row; 724233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_mvcs += mv.as_mv.col * mv.as_mv.col; 725233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++intercount; 726233d2500723e5594f3e7c70896ffeeef32b9c950ywan 727233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_ref_mv.as_int = mv.as_int; 728233d2500723e5594f3e7c70896ffeeef32b9c950ywan 729233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv.as_int) { 730233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++mvcount; 731233d2500723e5594f3e7c70896ffeeef32b9c950ywan 732233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Non-zero vector, was it different from the last non zero vector? 733233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv.as_int != lastmv_as_int) 734233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++new_mv_count; 735233d2500723e5594f3e7c70896ffeeef32b9c950ywan lastmv_as_int = mv.as_int; 736233d2500723e5594f3e7c70896ffeeef32b9c950ywan 737233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Does the row vector point inwards or outwards? 738233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mb_row < cm->mb_rows / 2) { 739233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv.as_mv.row > 0) 740233d2500723e5594f3e7c70896ffeeef32b9c950ywan --sum_in_vectors; 741233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mv.as_mv.row < 0) 742233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++sum_in_vectors; 743233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (mb_row > cm->mb_rows / 2) { 744233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv.as_mv.row > 0) 745233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++sum_in_vectors; 746233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mv.as_mv.row < 0) 747233d2500723e5594f3e7c70896ffeeef32b9c950ywan --sum_in_vectors; 748233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 749233d2500723e5594f3e7c70896ffeeef32b9c950ywan 750233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Does the col vector point inwards or outwards? 751233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mb_col < cm->mb_cols / 2) { 752233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv.as_mv.col > 0) 753233d2500723e5594f3e7c70896ffeeef32b9c950ywan --sum_in_vectors; 754233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mv.as_mv.col < 0) 755233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++sum_in_vectors; 756233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (mb_col > cm->mb_cols / 2) { 757233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv.as_mv.col > 0) 758233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++sum_in_vectors; 759233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mv.as_mv.col < 0) 760233d2500723e5594f3e7c70896ffeeef32b9c950ywan --sum_in_vectors; 761233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 762233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 763233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 764233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 765233d2500723e5594f3e7c70896ffeeef32b9c950ywan sr_coded_error += (int64_t)this_error; 766233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 767233d2500723e5594f3e7c70896ffeeef32b9c950ywan coded_error += (int64_t)this_error; 768233d2500723e5594f3e7c70896ffeeef32b9c950ywan 769233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Adjust to the next column of MBs. 770233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->plane[0].src.buf += 16; 771233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->plane[1].src.buf += uv_mb_height; 772233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->plane[2].src.buf += uv_mb_height; 773233d2500723e5594f3e7c70896ffeeef32b9c950ywan 774233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_yoffset += 16; 775233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_uvoffset += uv_mb_height; 776233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 777233d2500723e5594f3e7c70896ffeeef32b9c950ywan 778233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Adjust to the next row of MBs. 779233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->plane[0].src.buf += 16 * x->plane[0].src.stride - 16 * cm->mb_cols; 780233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->plane[1].src.buf += uv_mb_height * x->plane[1].src.stride - 781233d2500723e5594f3e7c70896ffeeef32b9c950ywan uv_mb_height * cm->mb_cols; 782233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->plane[2].src.buf += uv_mb_height * x->plane[1].src.stride - 783233d2500723e5594f3e7c70896ffeeef32b9c950ywan uv_mb_height * cm->mb_cols; 784233d2500723e5594f3e7c70896ffeeef32b9c950ywan 785233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 786233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 787233d2500723e5594f3e7c70896ffeeef32b9c950ywan 788233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 789233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 790233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS fps; 791233d2500723e5594f3e7c70896ffeeef32b9c950ywan 792233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.frame = cm->current_video_frame; 793233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.spatial_layer_id = cpi->svc.spatial_layer_id; 794233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.intra_error = (double)(intra_error >> 8); 795233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.coded_error = (double)(coded_error >> 8); 796233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.sr_coded_error = (double)(sr_coded_error >> 8); 797233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.ssim_weighted_pred_err = fps.coded_error * simple_weight(cpi->Source); 798233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.count = 1.0; 799233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_inter = (double)intercount / cm->MBs; 800233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_second_ref = (double)second_ref_count / cm->MBs; 801233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_neutral = (double)neutral_count / cm->MBs; 802233d2500723e5594f3e7c70896ffeeef32b9c950ywan 803233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mvcount > 0) { 804233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVr = (double)sum_mvr / mvcount; 805233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mvr_abs = (double)sum_mvr_abs / mvcount; 806233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVc = (double)sum_mvc / mvcount; 807233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mvc_abs = (double)sum_mvc_abs / mvcount; 808233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / mvcount)) / mvcount; 809233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / mvcount)) / mvcount; 810233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.mv_in_out_count = (double)sum_in_vectors / (mvcount * 2); 811233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.new_mv_count = new_mv_count; 812233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.pcnt_motion = (double)mvcount / cm->MBs; 813233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 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.pcnt_motion = 0.0; 823233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 824233d2500723e5594f3e7c70896ffeeef32b9c950ywan 825233d2500723e5594f3e7c70896ffeeef32b9c950ywan // TODO(paulwilkins): Handle the case when duration is set to 0, or 826233d2500723e5594f3e7c70896ffeeef32b9c950ywan // something less than the full time between subsequent values of 827233d2500723e5594f3e7c70896ffeeef32b9c950ywan // cpi->source_time_stamp. 828233d2500723e5594f3e7c70896ffeeef32b9c950ywan fps.duration = (double)(cpi->source->ts_end - cpi->source->ts_start); 829233d2500723e5594f3e7c70896ffeeef32b9c950ywan 830233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Don't want to do output stats with a stack variable! 831233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->this_frame_stats = fps; 832233d2500723e5594f3e7c70896ffeeef32b9c950ywan output_stats(&twopass->this_frame_stats, cpi->output_pkt_list); 833233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_stats(&twopass->total_stats, &fps); 834233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 835233d2500723e5594f3e7c70896ffeeef32b9c950ywan 836233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Copy the previous Last Frame back into gf and and arf buffers if 837233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the prediction is good enough... but also don't allow it to lag too far. 838233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((twopass->sr_update_lag > 3) || 839233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((cm->current_video_frame > 0) && 840233d2500723e5594f3e7c70896ffeeef32b9c950ywan (twopass->this_frame_stats.pcnt_inter > 0.20) && 841233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((twopass->this_frame_stats.intra_error / 842233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(twopass->this_frame_stats.coded_error)) > 2.0))) { 843233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (gld_yv12 != NULL) { 844233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_yv12_copy_frame(lst_yv12, gld_yv12); 845233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 846233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->sr_update_lag = 1; 847233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 848233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++twopass->sr_update_lag; 849233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 850233d2500723e5594f3e7c70896ffeeef32b9c950ywan 851233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 852233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_update_reference_frames(cpi); 853233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 854233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Swap frame pointers so last frame refers to the frame we just compressed. 855233d2500723e5594f3e7c70896ffeeef32b9c950ywan swap_yv12(lst_yv12, new_yv12); 856233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 857233d2500723e5594f3e7c70896ffeeef32b9c950ywan 858233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_extend_frame_borders(lst_yv12); 859233d2500723e5594f3e7c70896ffeeef32b9c950ywan 860233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Special case for the first frame. Copy into the GF buffer as a second 861233d2500723e5594f3e7c70896ffeeef32b9c950ywan // reference. 862233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cm->current_video_frame == 0 && gld_yv12 != NULL) { 863233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_yv12_copy_frame(lst_yv12, gld_yv12); 864233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 865233d2500723e5594f3e7c70896ffeeef32b9c950ywan 866233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Use this to see what the first pass reconstruction looks like. 867233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (0) { 868233d2500723e5594f3e7c70896ffeeef32b9c950ywan char filename[512]; 869233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *recon_file; 870233d2500723e5594f3e7c70896ffeeef32b9c950ywan snprintf(filename, sizeof(filename), "enc%04d.yuv", 871233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int)cm->current_video_frame); 872233d2500723e5594f3e7c70896ffeeef32b9c950ywan 873233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cm->current_video_frame == 0) 874233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_file = fopen(filename, "wb"); 875233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 876233d2500723e5594f3e7c70896ffeeef32b9c950ywan recon_file = fopen(filename, "ab"); 877233d2500723e5594f3e7c70896ffeeef32b9c950ywan 878233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, recon_file); 879233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(recon_file); 880233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 881233d2500723e5594f3e7c70896ffeeef32b9c950ywan 882233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++cm->current_video_frame; 883233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 884233d2500723e5594f3e7c70896ffeeef32b9c950ywan 885233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double calc_correction_factor(double err_per_mb, 886233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_divisor, 887233d2500723e5594f3e7c70896ffeeef32b9c950ywan double pt_low, 888233d2500723e5594f3e7c70896ffeeef32b9c950ywan double pt_high, 889233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q) { 890233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double error_term = err_per_mb / err_divisor; 891233d2500723e5594f3e7c70896ffeeef32b9c950ywan 892233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Adjustment based on actual quantizer to power term. 893233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double power_term = MIN(vp9_convert_qindex_to_q(q) * 0.0125 + pt_low, 894233d2500723e5594f3e7c70896ffeeef32b9c950ywan pt_high); 895233d2500723e5594f3e7c70896ffeeef32b9c950ywan 896233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate correction factor. 897233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (power_term < 1.0) 898233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(error_term >= 0.0); 899233d2500723e5594f3e7c70896ffeeef32b9c950ywan 900233d2500723e5594f3e7c70896ffeeef32b9c950ywan return fclamp(pow(error_term, power_term), 0.05, 5.0); 901233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 902233d2500723e5594f3e7c70896ffeeef32b9c950ywan 903233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_twopass_worst_quality(VP9_COMP *cpi, FIRSTPASS_STATS *fpstats, 904233d2500723e5594f3e7c70896ffeeef32b9c950ywan int section_target_bandwitdh) { 905233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q; 906233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int num_mbs = cpi->common.MBs; 907233d2500723e5594f3e7c70896ffeeef32b9c950ywan int target_norm_bits_per_mb; 908233d2500723e5594f3e7c70896ffeeef32b9c950ywan const RATE_CONTROL *const rc = &cpi->rc; 909233d2500723e5594f3e7c70896ffeeef32b9c950ywan 910233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double section_err = fpstats->coded_error / fpstats->count; 911233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double err_per_mb = section_err / num_mbs; 912233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double speed_term = 1.0 + ((double)cpi->speed * 0.04); 913233d2500723e5594f3e7c70896ffeeef32b9c950ywan 914233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (section_target_bandwitdh <= 0) 915233d2500723e5594f3e7c70896ffeeef32b9c950ywan return rc->worst_quality; // Highest value allowed 916233d2500723e5594f3e7c70896ffeeef32b9c950ywan 917233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_norm_bits_per_mb = section_target_bandwitdh < (1 << 20) 918233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (512 * section_target_bandwitdh) / num_mbs 919233d2500723e5594f3e7c70896ffeeef32b9c950ywan : 512 * (section_target_bandwitdh / num_mbs); 920233d2500723e5594f3e7c70896ffeeef32b9c950ywan 921233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Try and pick a max Q that will be high enough to encode the 922233d2500723e5594f3e7c70896ffeeef32b9c950ywan // content at the given rate. 923233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (q = rc->best_quality; q < rc->worst_quality; ++q) { 924233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double err_correction_factor = calc_correction_factor(err_per_mb, 925233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERR_DIVISOR, 0.5, 0.90, q); 926233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int bits_per_mb_at_this_q = 927233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_rc_bits_per_mb(INTER_FRAME, q, (err_correction_factor * speed_term)); 928233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) 929233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 930233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 931233d2500723e5594f3e7c70896ffeeef32b9c950ywan 932233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Restriction on active max q for constrained quality mode. 933233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) 934233d2500723e5594f3e7c70896ffeeef32b9c950ywan q = MAX(q, cpi->cq_target_quality); 935233d2500723e5594f3e7c70896ffeeef32b9c950ywan 936233d2500723e5594f3e7c70896ffeeef32b9c950ywan return q; 937233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 938233d2500723e5594f3e7c70896ffeeef32b9c950ywan 939233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp9_new_framerate(VP9_COMP *cpi, double framerate); 940233d2500723e5594f3e7c70896ffeeef32b9c950ywan 941233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_init_second_pass(VP9_COMP *cpi) { 942233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS this_frame; 943233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *start_pos; 944233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct twopass_rc *twopass = &cpi->twopass; 945233d2500723e5594f3e7c70896ffeeef32b9c950ywan const VP9_CONFIG *const oxcf = &cpi->oxcf; 946233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int is_spatial_svc = (cpi->svc.number_spatial_layers > 1) && 947233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cpi->svc.number_temporal_layers == 1); 948233d2500723e5594f3e7c70896ffeeef32b9c950ywan double frame_rate; 949233d2500723e5594f3e7c70896ffeeef32b9c950ywan 950233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (is_spatial_svc) { 951233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass; 952233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 953233d2500723e5594f3e7c70896ffeeef32b9c950ywan 954233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(&twopass->total_stats); 955233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(&twopass->total_left_stats); 956233d2500723e5594f3e7c70896ffeeef32b9c950ywan 957233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!twopass->stats_in_end) 958233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 959233d2500723e5594f3e7c70896ffeeef32b9c950ywan 960233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->total_stats = *twopass->stats_in_end; 961233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->total_left_stats = twopass->total_stats; 962233d2500723e5594f3e7c70896ffeeef32b9c950ywan 963233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_rate = 10000000.0 * twopass->total_stats.count / 964233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->total_stats.duration; 965233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Each frame can have a different duration, as the frame rate in the source 966233d2500723e5594f3e7c70896ffeeef32b9c950ywan // isn't guaranteed to be constant. The frame rate prior to the first frame 967233d2500723e5594f3e7c70896ffeeef32b9c950ywan // encoded in the second pass is a guess. However, the sum duration is not. 968233d2500723e5594f3e7c70896ffeeef32b9c950ywan // It is calculated based on the actual durations of all frames from the 969233d2500723e5594f3e7c70896ffeeef32b9c950ywan // first pass. 970233d2500723e5594f3e7c70896ffeeef32b9c950ywan 971233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (is_spatial_svc) { 972233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_update_spatial_layer_framerate(cpi, frame_rate); 973233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->bits_left = 974233d2500723e5594f3e7c70896ffeeef32b9c950ywan (int64_t)(twopass->total_stats.duration * 975233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->svc.layer_context[cpi->svc.spatial_layer_id].target_bandwidth / 976233d2500723e5594f3e7c70896ffeeef32b9c950ywan 10000000.0); 977233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 978233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_new_framerate(cpi, frame_rate); 979233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->bits_left = (int64_t)(twopass->total_stats.duration * 980233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->target_bandwidth / 10000000.0); 981233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 982233d2500723e5594f3e7c70896ffeeef32b9c950ywan 983233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->output_framerate = oxcf->framerate; 984233d2500723e5594f3e7c70896ffeeef32b9c950ywan 985233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate a minimum intra value to be used in determining the IIratio 986233d2500723e5594f3e7c70896ffeeef32b9c950ywan // scores used in the second pass. We have this minimum to make sure 987233d2500723e5594f3e7c70896ffeeef32b9c950ywan // that clips that are static but "low complexity" in the intra domain 988233d2500723e5594f3e7c70896ffeeef32b9c950ywan // are still boosted appropriately for KF/GF/ARF. 989233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!is_spatial_svc) { 990233d2500723e5594f3e7c70896ffeeef32b9c950ywan // We don't know the number of MBs for each layer at this point. 991233d2500723e5594f3e7c70896ffeeef32b9c950ywan // So we will do it later. 992233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; 993233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; 994233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 995233d2500723e5594f3e7c70896ffeeef32b9c950ywan 996233d2500723e5594f3e7c70896ffeeef32b9c950ywan // This variable monitors how far behind the second ref update is lagging. 997233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->sr_update_lag = 1; 998233d2500723e5594f3e7c70896ffeeef32b9c950ywan 999233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Scan the first pass file and calculate an average Intra / Inter error 1000233d2500723e5594f3e7c70896ffeeef32b9c950ywan // score ratio for the sequence. 1001233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1002233d2500723e5594f3e7c70896ffeeef32b9c950ywan double sum_iiratio = 0.0; 1003233d2500723e5594f3e7c70896ffeeef32b9c950ywan start_pos = twopass->stats_in; 1004233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1005233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (input_stats(twopass, &this_frame) != EOF) { 1006233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double iiratio = this_frame.intra_error / 1007233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame.coded_error); 1008233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum_iiratio += fclamp(iiratio, 1.0, 20.0); 1009233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1010233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1011233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->avg_iiratio = sum_iiratio / 1012233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK((double)twopass->total_stats.count); 1013233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1014233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_pos); 1015233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1016233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1017233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Scan the first pass file and calculate a modified total error based upon 1018233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the bias/power function used to allocate bits. 1019233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1020233d2500723e5594f3e7c70896ffeeef32b9c950ywan double av_error = twopass->total_stats.ssim_weighted_pred_err / 1021233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(twopass->total_stats.count); 1022233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1023233d2500723e5594f3e7c70896ffeeef32b9c950ywan start_pos = twopass->stats_in; 1024233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1025233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->modified_error_total = 0.0; 1026233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->modified_error_min = 1027233d2500723e5594f3e7c70896ffeeef32b9c950ywan (av_error * oxcf->two_pass_vbrmin_section) / 100; 1028233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->modified_error_max = 1029233d2500723e5594f3e7c70896ffeeef32b9c950ywan (av_error * oxcf->two_pass_vbrmax_section) / 100; 1030233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1031233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (input_stats(twopass, &this_frame) != EOF) { 1032233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->modified_error_total += 1033233d2500723e5594f3e7c70896ffeeef32b9c950ywan calculate_modified_err(cpi, &this_frame); 1034233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1035233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->modified_error_left = twopass->modified_error_total; 1036233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1037233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_pos); 1038233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1039233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1040233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1041233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This function gives an estimate of how badly we believe the prediction 1042233d2500723e5594f3e7c70896ffeeef32b9c950ywan// quality is decaying from frame to frame. 1043233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double get_prediction_decay_rate(const VP9_COMMON *cm, 1044233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *next_frame) { 1045233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Look at the observed drop in prediction quality between the last frame 1046233d2500723e5594f3e7c70896ffeeef32b9c950ywan // and the GF buffer (which contains an older frame). 1047233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double mb_sr_err_diff = (next_frame->sr_coded_error - 1048233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_frame->coded_error) / cm->MBs; 1049233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double second_ref_decay = mb_sr_err_diff <= 512.0 1050233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? fclamp(pow(1.0 - (mb_sr_err_diff / 512.0), 0.5), 0.85, 1.0) 1051233d2500723e5594f3e7c70896ffeeef32b9c950ywan : 0.85; 1052233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1053233d2500723e5594f3e7c70896ffeeef32b9c950ywan return MIN(second_ref_decay, next_frame->pcnt_inter); 1054233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1055233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1056233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Function to test for a condition where a complex transition is followed 1057233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by a static section. For example in slide shows where there is a fade 1058233d2500723e5594f3e7c70896ffeeef32b9c950ywan// between slides. This is to help with more optimal kf and gf positioning. 1059233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int detect_transition_to_still(VP9_COMP *cpi, int frame_interval, 1060233d2500723e5594f3e7c70896ffeeef32b9c950ywan int still_interval, 1061233d2500723e5594f3e7c70896ffeeef32b9c950ywan double loop_decay_rate, 1062233d2500723e5594f3e7c70896ffeeef32b9c950ywan double last_decay_rate) { 1063233d2500723e5594f3e7c70896ffeeef32b9c950ywan int trans_to_still = 0; 1064233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1065233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Break clause to detect very still sections after motion 1066233d2500723e5594f3e7c70896ffeeef32b9c950ywan // For example a static image after a fade or other transition 1067233d2500723e5594f3e7c70896ffeeef32b9c950ywan // instead of a clean scene cut. 1068233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame_interval > MIN_GF_INTERVAL && 1069233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate >= 0.999 && 1070233d2500723e5594f3e7c70896ffeeef32b9c950ywan last_decay_rate < 0.9) { 1071233d2500723e5594f3e7c70896ffeeef32b9c950ywan int j; 1072233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *position = cpi->twopass.stats_in; 1073233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS tmp_next_frame; 1074233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1075233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Look ahead a few frames to see if static condition persists... 1076233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < still_interval; ++j) { 1077233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(&cpi->twopass, &tmp_next_frame)) 1078233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1079233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1080233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (tmp_next_frame.pcnt_inter - tmp_next_frame.pcnt_motion < 0.999) 1081233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1082233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1083233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1084233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(&cpi->twopass, position); 1085233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1086233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Only if it does do we signal a transition to still. 1087233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (j == still_interval) 1088233d2500723e5594f3e7c70896ffeeef32b9c950ywan trans_to_still = 1; 1089233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1090233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1091233d2500723e5594f3e7c70896ffeeef32b9c950ywan return trans_to_still; 1092233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1093233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1094233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This function detects a flash through the high relative pcnt_second_ref 1095233d2500723e5594f3e7c70896ffeeef32b9c950ywan// score in the frame following a flash frame. The offset passed in should 1096233d2500723e5594f3e7c70896ffeeef32b9c950ywan// reflect this. 1097233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int detect_flash(const struct twopass_rc *twopass, int offset) { 1098233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS next_frame; 1099233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1100233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flash_detected = 0; 1101233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1102233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Read the frame data. 1103233d2500723e5594f3e7c70896ffeeef32b9c950ywan // The return is FALSE (no flash detected) if not a valid frame 1104233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (read_frame_stats(twopass, &next_frame, offset) != EOF) { 1105233d2500723e5594f3e7c70896ffeeef32b9c950ywan // What we are looking for here is a situation where there is a 1106233d2500723e5594f3e7c70896ffeeef32b9c950ywan // brief break in prediction (such as a flash) but subsequent frames 1107233d2500723e5594f3e7c70896ffeeef32b9c950ywan // are reasonably well predicted by an earlier (pre flash) frame. 1108233d2500723e5594f3e7c70896ffeeef32b9c950ywan // The recovery after a flash is indicated by a high pcnt_second_ref 1109233d2500723e5594f3e7c70896ffeeef32b9c950ywan // compared to pcnt_inter. 1110233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (next_frame.pcnt_second_ref > next_frame.pcnt_inter && 1111233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_frame.pcnt_second_ref >= 0.5) 1112233d2500723e5594f3e7c70896ffeeef32b9c950ywan flash_detected = 1; 1113233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1114233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1115233d2500723e5594f3e7c70896ffeeef32b9c950ywan return flash_detected; 1116233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1117233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1118233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Update the motion related elements to the GF arf boost calculation. 1119233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void accumulate_frame_motion_stats( 1120233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *this_frame, 1121233d2500723e5594f3e7c70896ffeeef32b9c950ywan double *this_frame_mv_in_out, 1122233d2500723e5594f3e7c70896ffeeef32b9c950ywan double *mv_in_out_accumulator, 1123233d2500723e5594f3e7c70896ffeeef32b9c950ywan double *abs_mv_in_out_accumulator, 1124233d2500723e5594f3e7c70896ffeeef32b9c950ywan double *mv_ratio_accumulator) { 1125233d2500723e5594f3e7c70896ffeeef32b9c950ywan double motion_pct; 1126233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1127233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate motion stats. 1128233d2500723e5594f3e7c70896ffeeef32b9c950ywan motion_pct = this_frame->pcnt_motion; 1129233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1130233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate Motion In/Out of frame stats. 1131233d2500723e5594f3e7c70896ffeeef32b9c950ywan *this_frame_mv_in_out = this_frame->mv_in_out_count * motion_pct; 1132233d2500723e5594f3e7c70896ffeeef32b9c950ywan *mv_in_out_accumulator += this_frame->mv_in_out_count * motion_pct; 1133233d2500723e5594f3e7c70896ffeeef32b9c950ywan *abs_mv_in_out_accumulator += fabs(this_frame->mv_in_out_count * motion_pct); 1134233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1135233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate a measure of how uniform (or conversely how random) 1136233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the motion field is (a ratio of absmv / mv). 1137233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (motion_pct > 0.05) { 1138233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double this_frame_mvr_ratio = fabs(this_frame->mvr_abs) / 1139233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVr)); 1140233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1141233d2500723e5594f3e7c70896ffeeef32b9c950ywan const double this_frame_mvc_ratio = fabs(this_frame->mvc_abs) / 1142233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVc)); 1143233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1144233d2500723e5594f3e7c70896ffeeef32b9c950ywan *mv_ratio_accumulator += (this_frame_mvr_ratio < this_frame->mvr_abs) 1145233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (this_frame_mvr_ratio * motion_pct) 1146233d2500723e5594f3e7c70896ffeeef32b9c950ywan : this_frame->mvr_abs * motion_pct; 1147233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1148233d2500723e5594f3e7c70896ffeeef32b9c950ywan *mv_ratio_accumulator += (this_frame_mvc_ratio < this_frame->mvc_abs) 1149233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? (this_frame_mvc_ratio * motion_pct) 1150233d2500723e5594f3e7c70896ffeeef32b9c950ywan : this_frame->mvc_abs * motion_pct; 1151233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1152233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1153233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1154233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Calculate a baseline boost number for the current frame. 1155233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double calc_frame_boost(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame, 1156233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_mv_in_out) { 1157233d2500723e5594f3e7c70896ffeeef32b9c950ywan double frame_boost; 1158233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1159233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Underlying boost factor is based on inter intra error ratio. 1160233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_frame->intra_error > cpi->twopass.gf_intra_err_min) 1161233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost = (IIFACTOR * this_frame->intra_error / 1162233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame->coded_error)); 1163233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1164233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost = (IIFACTOR * cpi->twopass.gf_intra_err_min / 1165233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame->coded_error)); 1166233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1167233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Increase boost for frames where new data coming into frame (e.g. zoom out). 1168233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Slightly reduce boost if there is a net balance of motion out of the frame 1169233d2500723e5594f3e7c70896ffeeef32b9c950ywan // (zoom in). The range for this_frame_mv_in_out is -1.0 to +1.0. 1170233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_frame_mv_in_out > 0.0) 1171233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost += frame_boost * (this_frame_mv_in_out * 2.0); 1172233d2500723e5594f3e7c70896ffeeef32b9c950ywan // In the extreme case the boost is halved. 1173233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1174233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_boost += frame_boost * (this_frame_mv_in_out / 2.0); 1175233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1176233d2500723e5594f3e7c70896ffeeef32b9c950ywan return MIN(frame_boost, GF_RMAX); 1177233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1178233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1179233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int calc_arf_boost(VP9_COMP *cpi, int offset, 1180233d2500723e5594f3e7c70896ffeeef32b9c950ywan int f_frames, int b_frames, 1181233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *f_boost, int *b_boost) { 1182233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS this_frame; 1183233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct twopass_rc *const twopass = &cpi->twopass; 1184233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 1185233d2500723e5594f3e7c70896ffeeef32b9c950ywan double boost_score = 0.0; 1186233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_ratio_accumulator = 0.0; 1187233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator = 1.0; 1188233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_mv_in_out = 0.0; 1189233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_in_out_accumulator = 0.0; 1190233d2500723e5594f3e7c70896ffeeef32b9c950ywan double abs_mv_in_out_accumulator = 0.0; 1191233d2500723e5594f3e7c70896ffeeef32b9c950ywan int arf_boost; 1192233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flash_detected = 0; 1193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1194233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Search forward from the proposed arf/next gf position. 1195233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < f_frames; ++i) { 1196233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (read_frame_stats(twopass, &this_frame, (i + offset)) == EOF) 1197233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1198233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1199233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Update the motion related elements to the boost calculation. 1200233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_frame_motion_stats(&this_frame, 1201233d2500723e5594f3e7c70896ffeeef32b9c950ywan &this_frame_mv_in_out, &mv_in_out_accumulator, 1202233d2500723e5594f3e7c70896ffeeef32b9c950ywan &abs_mv_in_out_accumulator, 1203233d2500723e5594f3e7c70896ffeeef32b9c950ywan &mv_ratio_accumulator); 1204233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1205233d2500723e5594f3e7c70896ffeeef32b9c950ywan // We want to discount the flash frame itself and the recovery 1206233d2500723e5594f3e7c70896ffeeef32b9c950ywan // frame that follows as both will have poor scores. 1207233d2500723e5594f3e7c70896ffeeef32b9c950ywan flash_detected = detect_flash(twopass, i + offset) || 1208233d2500723e5594f3e7c70896ffeeef32b9c950ywan detect_flash(twopass, i + offset + 1); 1209233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1210233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate the effect of prediction quality decay. 1211233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!flash_detected) { 1212233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator *= get_prediction_decay_rate(&cpi->common, &this_frame); 1213233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR 1214233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? MIN_DECAY_FACTOR : decay_accumulator; 1215233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1216233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1217233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * 1218233d2500723e5594f3e7c70896ffeeef32b9c950ywan calc_frame_boost(cpi, &this_frame, this_frame_mv_in_out)); 1219233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1220233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1221233d2500723e5594f3e7c70896ffeeef32b9c950ywan *f_boost = (int)boost_score; 1222233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1223233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Reset for backward looking loop. 1224233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = 0.0; 1225233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_ratio_accumulator = 0.0; 1226233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1.0; 1227233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_mv_in_out = 0.0; 1228233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_in_out_accumulator = 0.0; 1229233d2500723e5594f3e7c70896ffeeef32b9c950ywan abs_mv_in_out_accumulator = 0.0; 1230233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1231233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Search backward towards last gf position. 1232233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = -1; i >= -b_frames; --i) { 1233233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (read_frame_stats(twopass, &this_frame, (i + offset)) == EOF) 1234233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1235233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1236233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Update the motion related elements to the boost calculation. 1237233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_frame_motion_stats(&this_frame, 1238233d2500723e5594f3e7c70896ffeeef32b9c950ywan &this_frame_mv_in_out, &mv_in_out_accumulator, 1239233d2500723e5594f3e7c70896ffeeef32b9c950ywan &abs_mv_in_out_accumulator, 1240233d2500723e5594f3e7c70896ffeeef32b9c950ywan &mv_ratio_accumulator); 1241233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1242233d2500723e5594f3e7c70896ffeeef32b9c950ywan // We want to discount the the flash frame itself and the recovery 1243233d2500723e5594f3e7c70896ffeeef32b9c950ywan // frame that follows as both will have poor scores. 1244233d2500723e5594f3e7c70896ffeeef32b9c950ywan flash_detected = detect_flash(twopass, i + offset) || 1245233d2500723e5594f3e7c70896ffeeef32b9c950ywan detect_flash(twopass, i + offset + 1); 1246233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1247233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Cumulative effect of prediction quality decay. 1248233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!flash_detected) { 1249233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator *= get_prediction_decay_rate(&cpi->common, &this_frame); 1250233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR 1251233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? MIN_DECAY_FACTOR : decay_accumulator; 1252233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1253233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1254233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * 1255233d2500723e5594f3e7c70896ffeeef32b9c950ywan calc_frame_boost(cpi, &this_frame, this_frame_mv_in_out)); 1256233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1257233d2500723e5594f3e7c70896ffeeef32b9c950ywan *b_boost = (int)boost_score; 1258233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1259233d2500723e5594f3e7c70896ffeeef32b9c950ywan arf_boost = (*f_boost + *b_boost); 1260233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (arf_boost < ((b_frames + f_frames) * 20)) 1261233d2500723e5594f3e7c70896ffeeef32b9c950ywan arf_boost = ((b_frames + f_frames) * 20); 1262233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1263233d2500723e5594f3e7c70896ffeeef32b9c950ywan return arf_boost; 1264233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1265233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1266233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 1267233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Work out the frame coding order for a GF or an ARF group. 1268233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The current implementation codes frames in their natural order for a 1269233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GF group, and inserts additional ARFs into an ARF group using a 1270233d2500723e5594f3e7c70896ffeeef32b9c950ywan// binary split approach. 1271233d2500723e5594f3e7c70896ffeeef32b9c950ywan// NOTE: this function is currently implemented recursively. 1272233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void schedule_frames(VP9_COMP *cpi, const int start, const int end, 1273233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int arf_idx, const int gf_or_arf_group, 1274233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int level) { 1275233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, abs_end, half_range; 1276233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *cfo = cpi->frame_coding_order; 1277233d2500723e5594f3e7c70896ffeeef32b9c950ywan int idx = cpi->new_frame_coding_order_period; 1278233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1279233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If (end < 0) an ARF should be coded at position (-end). 1280233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(start >= 0); 1281233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1282233d2500723e5594f3e7c70896ffeeef32b9c950ywan // printf("start:%d end:%d\n", start, end); 1283233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1284233d2500723e5594f3e7c70896ffeeef32b9c950ywan // GF Group: code frames in logical order. 1285233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (gf_or_arf_group == 0) { 1286233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(end >= start); 1287233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = start; i <= end; ++i) { 1288233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfo[idx] = i; 1289233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_buffer_idx[idx] = arf_idx; 1290233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_weight[idx] = -1; 1291233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++idx; 1292233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1293233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->new_frame_coding_order_period = idx; 1294233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 1295233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1296233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1297233d2500723e5594f3e7c70896ffeeef32b9c950ywan // ARF Group: Work out the ARF schedule and mark ARF frames as negative. 1298233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (end < 0) { 1299233d2500723e5594f3e7c70896ffeeef32b9c950ywan // printf("start:%d end:%d\n", -end, -end); 1300233d2500723e5594f3e7c70896ffeeef32b9c950ywan // ARF frame is at the end of the range. 1301233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfo[idx] = end; 1302233d2500723e5594f3e7c70896ffeeef32b9c950ywan // What ARF buffer does this ARF use as predictor. 1303233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_buffer_idx[idx] = (arf_idx > 2) ? (arf_idx - 1) : 2; 1304233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_weight[idx] = level; 1305233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++idx; 1306233d2500723e5594f3e7c70896ffeeef32b9c950ywan abs_end = -end; 1307233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1308233d2500723e5594f3e7c70896ffeeef32b9c950ywan abs_end = end; 1309233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1310233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1311233d2500723e5594f3e7c70896ffeeef32b9c950ywan half_range = (abs_end - start) >> 1; 1312233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1313233d2500723e5594f3e7c70896ffeeef32b9c950ywan // ARFs may not be adjacent, they must be separated by at least 1314233d2500723e5594f3e7c70896ffeeef32b9c950ywan // MIN_GF_INTERVAL non-ARF frames. 1315233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((start + MIN_GF_INTERVAL) >= (abs_end - MIN_GF_INTERVAL)) { 1316233d2500723e5594f3e7c70896ffeeef32b9c950ywan // printf("start:%d end:%d\n", start, abs_end); 1317233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Update the coding order and active ARF. 1318233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = start; i <= abs_end; ++i) { 1319233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfo[idx] = i; 1320233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_buffer_idx[idx] = arf_idx; 1321233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_weight[idx] = -1; 1322233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++idx; 1323233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1324233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->new_frame_coding_order_period = idx; 1325233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1326233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Place a new ARF at the mid-point of the range. 1327233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->new_frame_coding_order_period = idx; 1328233d2500723e5594f3e7c70896ffeeef32b9c950ywan schedule_frames(cpi, start, -(start + half_range), arf_idx + 1, 1329233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_or_arf_group, level + 1); 1330233d2500723e5594f3e7c70896ffeeef32b9c950ywan schedule_frames(cpi, start + half_range + 1, abs_end, arf_idx, 1331233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_or_arf_group, level + 1); 1332233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1333233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1334233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1335233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define FIXED_ARF_GROUP_SIZE 16 1336233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1337233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid define_fixed_arf_period(VP9_COMP *cpi) { 1338233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 1339233d2500723e5594f3e7c70896ffeeef32b9c950ywan int max_level = INT_MIN; 1340233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1341233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(cpi->multi_arf_enabled); 1342233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(cpi->oxcf.lag_in_frames >= FIXED_ARF_GROUP_SIZE); 1343233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1344233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Save the weight of the last frame in the sequence before next 1345233d2500723e5594f3e7c70896ffeeef32b9c950ywan // sequence pattern overwrites it. 1346233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->this_frame_weight = cpi->arf_weight[cpi->sequence_number]; 1347233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(cpi->this_frame_weight >= 0); 1348233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1349233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_zeromotion_pct = 0; 1350233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1351233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Initialize frame coding order variables. 1352233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->new_frame_coding_order_period = 0; 1353233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->next_frame_in_order = 0; 1354233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_buffered = 0; 1355233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_zero(cpi->frame_coding_order); 1356233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_zero(cpi->arf_buffer_idx); 1357233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(cpi->arf_weight, -1, sizeof(cpi->arf_weight)); 1358233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1359233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->rc.frames_to_key <= (FIXED_ARF_GROUP_SIZE + 8)) { 1360233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Setup a GF group close to the keyframe. 1361233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->rc.source_alt_ref_pending = 0; 1362233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->rc.baseline_gf_interval = cpi->rc.frames_to_key; 1363233d2500723e5594f3e7c70896ffeeef32b9c950ywan schedule_frames(cpi, 0, (cpi->rc.baseline_gf_interval - 1), 2, 0, 0); 1364233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1365233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Setup a fixed period ARF group. 1366233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->rc.source_alt_ref_pending = 1; 1367233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->rc.baseline_gf_interval = FIXED_ARF_GROUP_SIZE; 1368233d2500723e5594f3e7c70896ffeeef32b9c950ywan schedule_frames(cpi, 0, -(cpi->rc.baseline_gf_interval - 1), 2, 1, 0); 1369233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1370233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1371233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Replace level indicator of -1 with correct level. 1372233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1373233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->arf_weight[i] > max_level) { 1374233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_level = cpi->arf_weight[i]; 1375233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1376233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1377233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++max_level; 1378233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1379233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->arf_weight[i] == -1) { 1380233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_weight[i] = max_level; 1381233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1382233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1383233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->max_arf_level = max_level; 1384233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if 0 1385233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("\nSchedule: "); 1386233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1387233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("%4d ", cpi->frame_coding_order[i]); 1388233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1389233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("\n"); 1390233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("ARFref: "); 1391233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1392233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("%4d ", cpi->arf_buffer_idx[i]); 1393233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1394233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("\n"); 1395233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("Weight: "); 1396233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1397233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("%4d ", cpi->arf_weight[i]); 1398233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1399233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("\n"); 1400233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1401233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1402233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1403233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1404233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Analyse and define a gf/arf group. 1405233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { 1406233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS next_frame = { 0 }; 1407233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *start_pos; 1408233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct twopass_rc *const twopass = &cpi->twopass; 1409233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 1410233d2500723e5594f3e7c70896ffeeef32b9c950ywan double boost_score = 0.0; 1411233d2500723e5594f3e7c70896ffeeef32b9c950ywan double old_boost_score = 0.0; 1412233d2500723e5594f3e7c70896ffeeef32b9c950ywan double gf_group_err = 0.0; 1413233d2500723e5594f3e7c70896ffeeef32b9c950ywan double gf_first_frame_err = 0.0; 1414233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mod_frame_err = 0.0; 1415233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1416233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_ratio_accumulator = 0.0; 1417233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator = 1.0; 1418233d2500723e5594f3e7c70896ffeeef32b9c950ywan double zero_motion_accumulator = 1.0; 1419233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1420233d2500723e5594f3e7c70896ffeeef32b9c950ywan double loop_decay_rate = 1.00; 1421233d2500723e5594f3e7c70896ffeeef32b9c950ywan double last_loop_decay_rate = 1.00; 1422233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1423233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_mv_in_out = 0.0; 1424233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_in_out_accumulator = 0.0; 1425233d2500723e5594f3e7c70896ffeeef32b9c950ywan double abs_mv_in_out_accumulator = 0.0; 1426233d2500723e5594f3e7c70896ffeeef32b9c950ywan double mv_ratio_accumulator_thresh; 1427233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int max_bits = frame_max_bits(cpi); // Max bits for a single frame. 1428233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1429233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int allow_alt_ref = cpi->oxcf.play_alternate && 1430233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->oxcf.lag_in_frames; 1431233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1432233d2500723e5594f3e7c70896ffeeef32b9c950ywan int f_boost = 0; 1433233d2500723e5594f3e7c70896ffeeef32b9c950ywan int b_boost = 0; 1434233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flash_detected; 1435233d2500723e5594f3e7c70896ffeeef32b9c950ywan int active_max_gf_interval; 1436233d2500723e5594f3e7c70896ffeeef32b9c950ywan RATE_CONTROL *const rc = &cpi->rc; 1437233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1438233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_bits = 0; 1439233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1440233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 1441233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1442233d2500723e5594f3e7c70896ffeeef32b9c950ywan start_pos = twopass->stats_in; 1443233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1444233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Load stats for the current frame. 1445233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err = calculate_modified_err(cpi, this_frame); 1446233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1447233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Note the error of the frame at the start of the group. This will be 1448233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the GF frame error if we code a normal gf. 1449233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_first_frame_err = mod_frame_err; 1450233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1451233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If this is a key frame or the overlay from a previous arf then 1452233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the error score / cost of this frame has already been accounted for. 1453233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) 1454233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_group_err -= gf_first_frame_err; 1455233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1456233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Motion breakout threshold for loop below depends on image size. 1457233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_ratio_accumulator_thresh = (cpi->common.width + cpi->common.height) / 10.0; 1458233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1459233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Work out a maximum interval for the GF. 1460233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If the image appears completely static we can extend beyond this. 1461233d2500723e5594f3e7c70896ffeeef32b9c950ywan // The value chosen depends on the active Q range. At low Q we have 1462233d2500723e5594f3e7c70896ffeeef32b9c950ywan // bits to spare and are better with a smaller interval and smaller boost. 1463233d2500723e5594f3e7c70896ffeeef32b9c950ywan // At high Q when there are few bits to spare we are better with a longer 1464233d2500723e5594f3e7c70896ffeeef32b9c950ywan // interval to spread the cost of the GF. 1465233d2500723e5594f3e7c70896ffeeef32b9c950ywan // 1466233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_max_gf_interval = 1467233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12 + ((int)vp9_convert_qindex_to_q(rc->last_q[INTER_FRAME]) >> 5); 1468233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1469233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (active_max_gf_interval > rc->max_gf_interval) 1470233d2500723e5594f3e7c70896ffeeef32b9c950ywan active_max_gf_interval = rc->max_gf_interval; 1471233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1472233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = 0; 1473233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (i < rc->static_scene_max_gf_interval && i < rc->frames_to_key) { 1474233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++i; 1475233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1476233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate error score of frames in this gf group. 1477233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err = calculate_modified_err(cpi, this_frame); 1478233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_group_err += mod_frame_err; 1479233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1480233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(twopass, &next_frame)) 1481233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1482233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1483233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Test for the case where there is a brief flash but the prediction 1484233d2500723e5594f3e7c70896ffeeef32b9c950ywan // quality back to an earlier frame is then restored. 1485233d2500723e5594f3e7c70896ffeeef32b9c950ywan flash_detected = detect_flash(twopass, 0); 1486233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1487233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Update the motion related elements to the boost calculation. 1488233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_frame_motion_stats(&next_frame, 1489233d2500723e5594f3e7c70896ffeeef32b9c950ywan &this_frame_mv_in_out, &mv_in_out_accumulator, 1490233d2500723e5594f3e7c70896ffeeef32b9c950ywan &abs_mv_in_out_accumulator, 1491233d2500723e5594f3e7c70896ffeeef32b9c950ywan &mv_ratio_accumulator); 1492233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1493233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate the effect of prediction quality decay. 1494233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!flash_detected) { 1495233d2500723e5594f3e7c70896ffeeef32b9c950ywan last_loop_decay_rate = loop_decay_rate; 1496233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate = get_prediction_decay_rate(&cpi->common, &next_frame); 1497233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator * loop_decay_rate; 1498233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1499233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Monitor for static sections. 1500233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((next_frame.pcnt_inter - next_frame.pcnt_motion) < 1501233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_motion_accumulator) { 1502233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_motion_accumulator = next_frame.pcnt_inter - 1503233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_frame.pcnt_motion; 1504233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1505233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1506233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Break clause to detect very still sections after motion. For example, 1507233d2500723e5594f3e7c70896ffeeef32b9c950ywan // a static image after a fade or other transition. 1508233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (detect_transition_to_still(cpi, i, 5, loop_decay_rate, 1509233d2500723e5594f3e7c70896ffeeef32b9c950ywan last_loop_decay_rate)) { 1510233d2500723e5594f3e7c70896ffeeef32b9c950ywan allow_alt_ref = 0; 1511233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1512233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1513233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1514233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1515233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate a boost number for this frame. 1516233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * 1517233d2500723e5594f3e7c70896ffeeef32b9c950ywan calc_frame_boost(cpi, &next_frame, this_frame_mv_in_out)); 1518233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1519233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Break out conditions. 1520233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( 1521233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Break at cpi->max_gf_interval unless almost totally static. 1522233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i >= active_max_gf_interval && (zero_motion_accumulator < 0.995)) || 1523233d2500723e5594f3e7c70896ffeeef32b9c950ywan ( 1524233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Don't break out with a very short interval. 1525233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i > MIN_GF_INTERVAL) && 1526233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((boost_score > 125.0) || (next_frame.pcnt_inter < 0.75)) && 1527233d2500723e5594f3e7c70896ffeeef32b9c950ywan (!flash_detected) && 1528233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((mv_ratio_accumulator > mv_ratio_accumulator_thresh) || 1529233d2500723e5594f3e7c70896ffeeef32b9c950ywan (abs_mv_in_out_accumulator > 3.0) || 1530233d2500723e5594f3e7c70896ffeeef32b9c950ywan (mv_in_out_accumulator < -2.0) || 1531233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((boost_score - old_boost_score) < IIFACTOR)))) { 1532233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = old_boost_score; 1533233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1534233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1535233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1536233d2500723e5594f3e7c70896ffeeef32b9c950ywan *this_frame = next_frame; 1537233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1538233d2500723e5594f3e7c70896ffeeef32b9c950ywan old_boost_score = boost_score; 1539233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1540233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1541233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_zeromotion_pct = (int)(zero_motion_accumulator * 1000.0); 1542233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1543233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Don't allow a gf too near the next kf. 1544233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((rc->frames_to_key - i) < MIN_GF_INTERVAL) { 1545233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (i < (rc->frames_to_key + !rc->next_key_frame_forced)) { 1546233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++i; 1547233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1548233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(twopass, this_frame)) 1549233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1550233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1551233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i < rc->frames_to_key) { 1552233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err = calculate_modified_err(cpi, this_frame); 1553233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_group_err += mod_frame_err; 1554233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1555233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1556233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1557233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1558233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 1559233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->multi_arf_enabled) { 1560233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Initialize frame coding order variables. 1561233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->new_frame_coding_order_period = 0; 1562233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->next_frame_in_order = 0; 1563233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_buffered = 0; 1564233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_zero(cpi->frame_coding_order); 1565233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_zero(cpi->arf_buffer_idx); 1566233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(cpi->arf_weight, -1, sizeof(cpi->arf_weight)); 1567233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1568233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1569233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1570233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Set the interval until the next gf. 1571233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) 1572233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->baseline_gf_interval = i - 1; 1573233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1574233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->baseline_gf_interval = i; 1575233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1576233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Should we use the alternate reference frame. 1577233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (allow_alt_ref && 1578233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i < cpi->oxcf.lag_in_frames) && 1579233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i >= MIN_GF_INTERVAL) && 1580233d2500723e5594f3e7c70896ffeeef32b9c950ywan // For real scene cuts (not forced kfs) don't allow arf very near kf. 1581233d2500723e5594f3e7c70896ffeeef32b9c950ywan (rc->next_key_frame_forced || 1582233d2500723e5594f3e7c70896ffeeef32b9c950ywan (i <= (rc->frames_to_key - MIN_GF_INTERVAL)))) { 1583233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate the boost for alt ref. 1584233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost, 1585233d2500723e5594f3e7c70896ffeeef32b9c950ywan &b_boost); 1586233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->source_alt_ref_pending = 1; 1587233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1588233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 1589233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Set the ARF schedule. 1590233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->multi_arf_enabled) { 1591233d2500723e5594f3e7c70896ffeeef32b9c950ywan schedule_frames(cpi, 0, -(rc->baseline_gf_interval - 1), 2, 1, 0); 1592233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1593233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1594233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1595233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->gfu_boost = (int)boost_score; 1596233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->source_alt_ref_pending = 0; 1597233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 1598233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Set the GF schedule. 1599233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->multi_arf_enabled) { 1600233d2500723e5594f3e7c70896ffeeef32b9c950ywan schedule_frames(cpi, 0, rc->baseline_gf_interval - 1, 2, 0, 0); 1601233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(cpi->new_frame_coding_order_period == 1602233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->baseline_gf_interval); 1603233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1604233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1605233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1606233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1607233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 1608233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->multi_arf_enabled && (cpi->common.frame_type != KEY_FRAME)) { 1609233d2500723e5594f3e7c70896ffeeef32b9c950ywan int max_level = INT_MIN; 1610233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Replace level indicator of -1 with correct level. 1611233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->frame_coding_order_period; ++i) { 1612233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->arf_weight[i] > max_level) { 1613233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_level = cpi->arf_weight[i]; 1614233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1615233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1616233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++max_level; 1617233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->frame_coding_order_period; ++i) { 1618233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->arf_weight[i] == -1) { 1619233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->arf_weight[i] = max_level; 1620233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1621233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1622233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->max_arf_level = max_level; 1623233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1624233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if 0 1625233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->multi_arf_enabled) { 1626233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("\nSchedule: "); 1627233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1628233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("%4d ", cpi->frame_coding_order[i]); 1629233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1630233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("\n"); 1631233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("ARFref: "); 1632233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1633233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("%4d ", cpi->arf_buffer_idx[i]); 1634233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1635233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("\n"); 1636233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("Weight: "); 1637233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1638233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("%4d ", cpi->arf_weight[i]); 1639233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1640233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("\n"); 1641233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1642233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1643233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1644233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1645233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate the bits to be allocated to the group as a whole. 1646233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (twopass->kf_group_bits > 0 && twopass->kf_group_error_left > 0) { 1647233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_bits = (int64_t)(twopass->kf_group_bits * 1648233d2500723e5594f3e7c70896ffeeef32b9c950ywan (gf_group_err / twopass->kf_group_error_left)); 1649233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1650233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_bits = 0; 1651233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1652233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_bits = (twopass->gf_group_bits < 0) ? 1653233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0 : (twopass->gf_group_bits > twopass->kf_group_bits) ? 1654233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_bits : twopass->gf_group_bits; 1655233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1656233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Clip cpi->twopass.gf_group_bits based on user supplied data rate 1657233d2500723e5594f3e7c70896ffeeef32b9c950ywan // variability limit, cpi->oxcf.two_pass_vbrmax_section. 1658233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (twopass->gf_group_bits > (int64_t)max_bits * rc->baseline_gf_interval) 1659233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_bits = (int64_t)max_bits * rc->baseline_gf_interval; 1660233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1661233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Reset the file position. 1662233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_pos); 1663233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1664233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Assign bits to the arf or gf. 1665233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i <= (rc->source_alt_ref_pending && 1666233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.frame_type != KEY_FRAME); ++i) { 1667233d2500723e5594f3e7c70896ffeeef32b9c950ywan int allocation_chunks; 1668233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q = rc->last_q[INTER_FRAME]; 1669233d2500723e5594f3e7c70896ffeeef32b9c950ywan int gf_bits; 1670233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1671233d2500723e5594f3e7c70896ffeeef32b9c950ywan int boost = (rc->gfu_boost * gfboost_qadjust(q)) / 100; 1672233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1673233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Set max and minimum boost and hence minimum allocation. 1674233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost = clamp(boost, 125, (rc->baseline_gf_interval + 1) * 200); 1675233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1676233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rc->source_alt_ref_pending && i == 0) 1677233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = ((rc->baseline_gf_interval + 1) * 100) + boost; 1678233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1679233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = (rc->baseline_gf_interval * 100) + (boost - 100); 1680233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1681233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Prevent overflow. 1682233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (boost > 1023) { 1683233d2500723e5594f3e7c70896ffeeef32b9c950ywan int divisor = boost >> 10; 1684233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost /= divisor; 1685233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks /= divisor; 1686233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1687233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1688233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate the number of bits to be spent on the gf or arf based on 1689233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the boost number. 1690233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits = (int)((double)boost * (twopass->gf_group_bits / 1691233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)allocation_chunks)); 1692233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1693233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If the frame that is to be boosted is simpler than the average for 1694233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the gf/arf group then use an alternative calculation 1695233d2500723e5594f3e7c70896ffeeef32b9c950ywan // based on the error score of the frame itself. 1696233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rc->baseline_gf_interval < 1 || 1697233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err < gf_group_err / (double)rc->baseline_gf_interval) { 1698233d2500723e5594f3e7c70896ffeeef32b9c950ywan double alt_gf_grp_bits = (double)twopass->kf_group_bits * 1699233d2500723e5594f3e7c70896ffeeef32b9c950ywan (mod_frame_err * (double)rc->baseline_gf_interval) / 1700233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(twopass->kf_group_error_left); 1701233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1702233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_gf_bits = (int)((double)boost * (alt_gf_grp_bits / 1703233d2500723e5594f3e7c70896ffeeef32b9c950ywan (double)allocation_chunks)); 1704233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1705233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (gf_bits > alt_gf_bits) 1706233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits = alt_gf_bits; 1707233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1708233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If it is harder than other frames in the group make sure it at 1709233d2500723e5594f3e7c70896ffeeef32b9c950ywan // least receives an allocation in keeping with its relative error 1710233d2500723e5594f3e7c70896ffeeef32b9c950ywan // score, otherwise it may be worse off than an "un-boosted" frame. 1711233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_gf_bits = (int)((double)twopass->kf_group_bits * 1712233d2500723e5594f3e7c70896ffeeef32b9c950ywan mod_frame_err / 1713233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(twopass->kf_group_error_left)); 1714233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1715233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (alt_gf_bits > gf_bits) 1716233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits = alt_gf_bits; 1717233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1718233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1719233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Don't allow a negative value for gf_bits. 1720233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (gf_bits < 0) 1721233d2500723e5594f3e7c70896ffeeef32b9c950ywan gf_bits = 0; 1722233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1723233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i == 0) { 1724233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_bits = gf_bits; 1725233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1726233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i == 1 || 1727233d2500723e5594f3e7c70896ffeeef32b9c950ywan (!rc->source_alt_ref_pending && 1728233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.frame_type != KEY_FRAME)) { 1729233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate the per frame bit target for this frame. 1730233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_rc_set_frame_target(cpi, gf_bits); 1731233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1732233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1733233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1734233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1735233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Adjust KF group bits and error remaining. 1736233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_error_left -= (int64_t)gf_group_err; 1737233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1738233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If this is an arf update we want to remove the score for the overlay 1739233d2500723e5594f3e7c70896ffeeef32b9c950ywan // frame at the end which will usually be very cheap to code. 1740233d2500723e5594f3e7c70896ffeeef32b9c950ywan // The overlay frame has already, in effect, been coded so we want to spread 1741233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the remaining bits among the other frames. 1742233d2500723e5594f3e7c70896ffeeef32b9c950ywan // For normal GFs remove the score for the GF itself unless this is 1743233d2500723e5594f3e7c70896ffeeef32b9c950ywan // also a key frame in which case it has already been accounted for. 1744233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rc->source_alt_ref_pending) { 1745233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_error_left = (int64_t)(gf_group_err - mod_frame_err); 1746233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cpi->common.frame_type != KEY_FRAME) { 1747233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_error_left = (int64_t)(gf_group_err 1748233d2500723e5594f3e7c70896ffeeef32b9c950ywan - gf_first_frame_err); 1749233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1750233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_error_left = (int64_t)gf_group_err; 1751233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1752233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1753233d2500723e5594f3e7c70896ffeeef32b9c950ywan // This condition could fail if there are two kfs very close together 1754233d2500723e5594f3e7c70896ffeeef32b9c950ywan // despite MIN_GF_INTERVAL and would cause a divide by 0 in the 1755233d2500723e5594f3e7c70896ffeeef32b9c950ywan // calculation of alt_extra_bits. 1756233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rc->baseline_gf_interval >= 3) { 1757233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int boost = rc->source_alt_ref_pending ? b_boost : rc->gfu_boost; 1758233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1759233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (boost >= 150) { 1760233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int pct_extra = MIN(20, (boost - 100) / 50); 1761233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int alt_extra_bits = (int)(( 1762233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAX(twopass->gf_group_bits - twopass->gf_bits, 0) * 1763233d2500723e5594f3e7c70896ffeeef32b9c950ywan pct_extra) / 100); 1764233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_group_bits -= alt_extra_bits; 1765233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1766233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1767233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1768233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1769233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type != KEY_FRAME) { 1770233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS sectionstats; 1771233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1772233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(§ionstats); 1773233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_pos); 1774233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1775233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < rc->baseline_gf_interval; ++i) { 1776233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_stats(twopass, &next_frame); 1777233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_stats(§ionstats, &next_frame); 1778233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1779233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1780233d2500723e5594f3e7c70896ffeeef32b9c950ywan avg_stats(§ionstats); 1781233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1782233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->section_intra_rating = (int) 1783233d2500723e5594f3e7c70896ffeeef32b9c950ywan (sectionstats.intra_error / 1784233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); 1785233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1786233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_pos); 1787233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1788233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1789233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1790233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Allocate bits to a normal frame that is neither a gf an arf or a key frame. 1791233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void assign_std_frame_bits(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { 1792233d2500723e5594f3e7c70896ffeeef32b9c950ywan int target_frame_size; 1793233d2500723e5594f3e7c70896ffeeef32b9c950ywan double modified_err; 1794233d2500723e5594f3e7c70896ffeeef32b9c950ywan double err_fraction; 1795233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int max_bits = frame_max_bits(cpi); // Max for a single frame. 1796233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1797233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate modified prediction error used in bit allocation. 1798233d2500723e5594f3e7c70896ffeeef32b9c950ywan modified_err = calculate_modified_err(cpi, this_frame); 1799233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1800233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->twopass.gf_group_error_left > 0) 1801233d2500723e5594f3e7c70896ffeeef32b9c950ywan // What portion of the remaining GF group error is used by this frame. 1802233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_fraction = modified_err / cpi->twopass.gf_group_error_left; 1803233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1804233d2500723e5594f3e7c70896ffeeef32b9c950ywan err_fraction = 0.0; 1805233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1806233d2500723e5594f3e7c70896ffeeef32b9c950ywan // How many of those bits available for allocation should we give it? 1807233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_frame_size = (int)((double)cpi->twopass.gf_group_bits * err_fraction); 1808233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1809233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Clip target size to 0 - max_bits (or cpi->twopass.gf_group_bits) at 1810233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the top end. 1811233d2500723e5594f3e7c70896ffeeef32b9c950ywan target_frame_size = clamp(target_frame_size, 0, 1812233d2500723e5594f3e7c70896ffeeef32b9c950ywan MIN(max_bits, (int)cpi->twopass.gf_group_bits)); 1813233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1814233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Adjust error and bits remaining. 1815233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_error_left -= (int64_t)modified_err; 1816233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1817233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Per frame bit target for this frame. 1818233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_rc_set_frame_target(cpi, target_frame_size); 1819233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1820233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1821233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int test_candidate_kf(VP9_COMP *cpi, 1822233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *last_frame, 1823233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *this_frame, 1824233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *next_frame) { 1825233d2500723e5594f3e7c70896ffeeef32b9c950ywan int is_viable_kf = 0; 1826233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1827233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Does the frame satisfy the primary criteria of a key frame? 1828233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If so, then examine how well it predicts subsequent frames. 1829233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((this_frame->pcnt_second_ref < 0.10) && 1830233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_frame->pcnt_second_ref < 0.10) && 1831233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((this_frame->pcnt_inter < 0.05) || 1832233d2500723e5594f3e7c70896ffeeef32b9c950ywan (((this_frame->pcnt_inter - this_frame->pcnt_neutral) < 0.35) && 1833233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((this_frame->intra_error / 1834233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame->coded_error)) < 2.5) && 1835233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((fabs(last_frame->coded_error - this_frame->coded_error) / 1836233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame->coded_error) > 0.40) || 1837233d2500723e5594f3e7c70896ffeeef32b9c950ywan (fabs(last_frame->intra_error - this_frame->intra_error) / 1838233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame->intra_error) > 0.40) || 1839233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((next_frame->intra_error / 1840233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(next_frame->coded_error)) > 3.5))))) { 1841233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 1842233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *start_pos = cpi->twopass.stats_in; 1843233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS local_next_frame = *next_frame; 1844233d2500723e5594f3e7c70896ffeeef32b9c950ywan double boost_score = 0.0; 1845233d2500723e5594f3e7c70896ffeeef32b9c950ywan double old_boost_score = 0.0; 1846233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator = 1.0; 1847233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1848233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Examine how well the key frame predicts subsequent frames. 1849233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 16; ++i) { 1850233d2500723e5594f3e7c70896ffeeef32b9c950ywan double next_iiratio = (IIKFACTOR1 * local_next_frame.intra_error / 1851233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error)); 1852233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1853233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (next_iiratio > RMAX) 1854233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_iiratio = RMAX; 1855233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1856233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Cumulative effect of decay in prediction quality. 1857233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (local_next_frame.pcnt_inter > 0.85) 1858233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator *= local_next_frame.pcnt_inter; 1859233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1860233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator *= (0.85 + local_next_frame.pcnt_inter) / 2.0; 1861233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1862233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Keep a running total. 1863233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * next_iiratio); 1864233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1865233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Test various breakout clauses. 1866233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((local_next_frame.pcnt_inter < 0.05) || 1867233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_iiratio < 1.5) || 1868233d2500723e5594f3e7c70896ffeeef32b9c950ywan (((local_next_frame.pcnt_inter - 1869233d2500723e5594f3e7c70896ffeeef32b9c950ywan local_next_frame.pcnt_neutral) < 0.20) && 1870233d2500723e5594f3e7c70896ffeeef32b9c950ywan (next_iiratio < 3.0)) || 1871233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((boost_score - old_boost_score) < 3.0) || 1872233d2500723e5594f3e7c70896ffeeef32b9c950ywan (local_next_frame.intra_error < 200)) { 1873233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1874233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1875233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1876233d2500723e5594f3e7c70896ffeeef32b9c950ywan old_boost_score = boost_score; 1877233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1878233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Get the next frame details 1879233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(&cpi->twopass, &local_next_frame)) 1880233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1881233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1882233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1883233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If there is tolerable prediction for at least the next 3 frames then 1884233d2500723e5594f3e7c70896ffeeef32b9c950ywan // break out else discard this potential key frame and move on 1885233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (boost_score > 30.0 && (i > 3)) { 1886233d2500723e5594f3e7c70896ffeeef32b9c950ywan is_viable_kf = 1; 1887233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1888233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Reset the file position 1889233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(&cpi->twopass, start_pos); 1890233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1891233d2500723e5594f3e7c70896ffeeef32b9c950ywan is_viable_kf = 0; 1892233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1893233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1894233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1895233d2500723e5594f3e7c70896ffeeef32b9c950ywan return is_viable_kf; 1896233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1897233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1898233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { 1899233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 1900233d2500723e5594f3e7c70896ffeeef32b9c950ywan RATE_CONTROL *const rc = &cpi->rc; 1901233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct twopass_rc *const twopass = &cpi->twopass; 1902233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS last_frame; 1903233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS first_frame = *this_frame; 1904233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS next_frame; 1905233d2500723e5594f3e7c70896ffeeef32b9c950ywan const FIRSTPASS_STATS *start_position = twopass->stats_in; 1906233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1907233d2500723e5594f3e7c70896ffeeef32b9c950ywan double decay_accumulator = 1.0; 1908233d2500723e5594f3e7c70896ffeeef32b9c950ywan double zero_motion_accumulator = 1.0; 1909233d2500723e5594f3e7c70896ffeeef32b9c950ywan double boost_score = 0; 1910233d2500723e5594f3e7c70896ffeeef32b9c950ywan double loop_decay_rate; 1911233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1912233d2500723e5594f3e7c70896ffeeef32b9c950ywan double kf_mod_err = 0.0; 1913233d2500723e5594f3e7c70896ffeeef32b9c950ywan double kf_group_err = 0.0; 1914233d2500723e5594f3e7c70896ffeeef32b9c950ywan double recent_loop_decay[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; 1915233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1916233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_zero(next_frame); 1917233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1918233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.frame_type = KEY_FRAME; 1919233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1920233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Is this a forced key frame by interval. 1921233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->this_key_frame_forced = rc->next_key_frame_forced; 1922233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1923233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Clear the alt ref active flag as this can never be active on a key frame. 1924233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->source_alt_ref_active = 0; 1925233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1926233d2500723e5594f3e7c70896ffeeef32b9c950ywan // KF is always a GF so clear frames till next gf counter. 1927233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->frames_till_gf_update_due = 0; 1928233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1929233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->frames_to_key = 1; 1930233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1931233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_bits = 0; // Total bits available to kf group 1932233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_error_left = 0; // Group modified error score. 1933233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1934233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_mod_err = calculate_modified_err(cpi, this_frame); 1935233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1936233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Find the next keyframe. 1937233d2500723e5594f3e7c70896ffeeef32b9c950ywan i = 0; 1938233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (twopass->stats_in < twopass->stats_in_end) { 1939233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate kf group error. 1940233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_err += calculate_modified_err(cpi, this_frame); 1941233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1942233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Load the next frame's stats. 1943233d2500723e5594f3e7c70896ffeeef32b9c950ywan last_frame = *this_frame; 1944233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_stats(twopass, this_frame); 1945233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1946233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Provided that we are not at the end of the file... 1947233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.auto_key && 1948233d2500723e5594f3e7c70896ffeeef32b9c950ywan lookup_next_frame_stats(twopass, &next_frame) != EOF) { 1949233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Check for a scene cut. 1950233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (test_candidate_kf(cpi, &last_frame, this_frame, &next_frame)) 1951233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1952233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1953233d2500723e5594f3e7c70896ffeeef32b9c950ywan // How fast is the prediction quality decaying? 1954233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate = get_prediction_decay_rate(&cpi->common, &next_frame); 1955233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1956233d2500723e5594f3e7c70896ffeeef32b9c950ywan // We want to know something about the recent past... rather than 1957233d2500723e5594f3e7c70896ffeeef32b9c950ywan // as used elsewhere where we are concerned with decay in prediction 1958233d2500723e5594f3e7c70896ffeeef32b9c950ywan // quality since the last GF or KF. 1959233d2500723e5594f3e7c70896ffeeef32b9c950ywan recent_loop_decay[i % 8] = loop_decay_rate; 1960233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1.0; 1961233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 8; ++j) 1962233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator *= recent_loop_decay[j]; 1963233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1964233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Special check for transition or high motion followed by a 1965233d2500723e5594f3e7c70896ffeeef32b9c950ywan // static scene. 1966233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (detect_transition_to_still(cpi, i, cpi->key_frame_frequency - i, 1967233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate, decay_accumulator)) 1968233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1969233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1970233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Step on to the next frame. 1971233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++rc->frames_to_key; 1972233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1973233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If we don't have a real key frame within the next two 1974233d2500723e5594f3e7c70896ffeeef32b9c950ywan // key_frame_frequency intervals then break out of the loop. 1975233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rc->frames_to_key >= 2 * (int)cpi->key_frame_frequency) 1976233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1977233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 1978233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++rc->frames_to_key; 1979233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1980233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++i; 1981233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1982233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1983233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If there is a max kf interval set by the user we must obey it. 1984233d2500723e5594f3e7c70896ffeeef32b9c950ywan // We already breakout of the loop above at 2x max. 1985233d2500723e5594f3e7c70896ffeeef32b9c950ywan // This code centers the extra kf if the actual natural interval 1986233d2500723e5594f3e7c70896ffeeef32b9c950ywan // is between 1x and 2x. 1987233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.auto_key && 1988233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->frames_to_key > (int)cpi->key_frame_frequency) { 1989233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS tmp_frame = first_frame; 1990233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1991233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->frames_to_key /= 2; 1992233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1993233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Reset to the start of the group. 1994233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_position); 1995233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1996233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_err = 0; 1997233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1998233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Rescan to get the correct error data for the forced kf group. 1999233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < rc->frames_to_key; ++i) { 2000233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_err += calculate_modified_err(cpi, &tmp_frame); 2001233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_stats(twopass, &tmp_frame); 2002233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2003233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->next_key_frame_forced = 1; 2004233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (twopass->stats_in == twopass->stats_in_end) { 2005233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->next_key_frame_forced = 1; 2006233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2007233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->next_key_frame_forced = 0; 2008233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2009233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2010233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Special case for the last key frame of the file. 2011233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (twopass->stats_in >= twopass->stats_in_end) { 2012233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Accumulate kf group error. 2013233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_group_err += calculate_modified_err(cpi, this_frame); 2014233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2015233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2016233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate the number of bits that should be assigned to the kf group. 2017233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (twopass->bits_left > 0 && twopass->modified_error_left > 0.0) { 2018233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Maximum number of bits for a single normal frame (not key frame). 2019233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int max_bits = frame_max_bits(cpi); 2020233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2021233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Maximum number of bits allocated to the key frame group. 2022233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t max_grp_bits; 2023233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2024233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Default allocation based on bits left and relative 2025233d2500723e5594f3e7c70896ffeeef32b9c950ywan // complexity of the section. 2026233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_bits = (int64_t)(twopass->bits_left * 2027233d2500723e5594f3e7c70896ffeeef32b9c950ywan (kf_group_err / twopass->modified_error_left)); 2028233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2029233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Clip based on maximum per frame rate defined by the user. 2030233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_grp_bits = (int64_t)max_bits * (int64_t)rc->frames_to_key; 2031233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (twopass->kf_group_bits > max_grp_bits) 2032233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_bits = max_grp_bits; 2033233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2034233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_bits = 0; 2035233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2036233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Reset the first pass file position. 2037233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_position); 2038233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2039233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Determine how big to make this keyframe based on how well the subsequent 2040233d2500723e5594f3e7c70896ffeeef32b9c950ywan // frames use inter blocks. 2041233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = 1.0; 2042233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score = 0.0; 2043233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2044233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Scan through the kf group collating various stats. 2045233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < rc->frames_to_key; ++i) { 2046233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(twopass, &next_frame)) 2047233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 2048233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2049233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Monitor for static sections. 2050233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((next_frame.pcnt_inter - next_frame.pcnt_motion) < 2051233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_motion_accumulator) { 2052233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_motion_accumulator = (next_frame.pcnt_inter - 2053233d2500723e5594f3e7c70896ffeeef32b9c950ywan next_frame.pcnt_motion); 2054233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2055233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2056233d2500723e5594f3e7c70896ffeeef32b9c950ywan // For the first few frames collect data to decide kf boost. 2057233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i <= (rc->max_gf_interval * 2)) { 2058233d2500723e5594f3e7c70896ffeeef32b9c950ywan double r; 2059233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (next_frame.intra_error > twopass->kf_intra_err_min) 2060233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = (IIKFACTOR2 * next_frame.intra_error / 2061233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); 2062233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2063233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = (IIKFACTOR2 * twopass->kf_intra_err_min / 2064233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); 2065233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2066233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (r > RMAX) 2067233d2500723e5594f3e7c70896ffeeef32b9c950ywan r = RMAX; 2068233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2069233d2500723e5594f3e7c70896ffeeef32b9c950ywan // How fast is prediction quality decaying. 2070233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!detect_flash(twopass, 0)) { 2071233d2500723e5594f3e7c70896ffeeef32b9c950ywan loop_decay_rate = get_prediction_decay_rate(&cpi->common, &next_frame); 2072233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator *= loop_decay_rate; 2073233d2500723e5594f3e7c70896ffeeef32b9c950ywan decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR 2074233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? MIN_DECAY_FACTOR : decay_accumulator; 2075233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2076233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2077233d2500723e5594f3e7c70896ffeeef32b9c950ywan boost_score += (decay_accumulator * r); 2078233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2079233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2080233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2081233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2082233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS sectionstats; 2083233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2084233d2500723e5594f3e7c70896ffeeef32b9c950ywan zero_stats(§ionstats); 2085233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_position); 2086233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2087233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < rc->frames_to_key; ++i) { 2088233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_stats(twopass, &next_frame); 2089233d2500723e5594f3e7c70896ffeeef32b9c950ywan accumulate_stats(§ionstats, &next_frame); 2090233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2091233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2092233d2500723e5594f3e7c70896ffeeef32b9c950ywan avg_stats(§ionstats); 2093233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2094233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->section_intra_rating = (int) (sectionstats.intra_error / 2095233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); 2096233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2097233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2098233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Reset the first pass file position. 2099233d2500723e5594f3e7c70896ffeeef32b9c950ywan reset_fpf_position(twopass, start_position); 2100233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2101233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Work out how many bits to allocate for the key frame itself. 2102233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (1) { 2103233d2500723e5594f3e7c70896ffeeef32b9c950ywan int kf_boost = (int)boost_score; 2104233d2500723e5594f3e7c70896ffeeef32b9c950ywan int allocation_chunks; 2105233d2500723e5594f3e7c70896ffeeef32b9c950ywan int alt_kf_bits; 2106233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2107233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (kf_boost < (rc->frames_to_key * 3)) 2108233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost = (rc->frames_to_key * 3); 2109233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2110233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (kf_boost < MIN_KF_BOOST) 2111233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost = MIN_KF_BOOST; 2112233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2113233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Make a note of baseline boost and the zero motion 2114233d2500723e5594f3e7c70896ffeeef32b9c950ywan // accumulator value for use elsewhere. 2115233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->kf_boost = kf_boost; 2116233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_zeromotion_pct = (int)(zero_motion_accumulator * 100.0); 2117233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2118233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Key frame size depends on: 2119233d2500723e5594f3e7c70896ffeeef32b9c950ywan // (1) the error score for the whole key frame group, 2120233d2500723e5594f3e7c70896ffeeef32b9c950ywan // (2) the key frames' own error if this is smaller than the 2121233d2500723e5594f3e7c70896ffeeef32b9c950ywan // average for the group (optional), 2122233d2500723e5594f3e7c70896ffeeef32b9c950ywan // (3) insuring that the frame receives at least the allocation it would 2123233d2500723e5594f3e7c70896ffeeef32b9c950ywan // have received based on its own error score vs the error score 2124233d2500723e5594f3e7c70896ffeeef32b9c950ywan // remaining. 2125233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Special case: 2126233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If the sequence appears almost totally static we want to spend almost 2127233d2500723e5594f3e7c70896ffeeef32b9c950ywan // all of the bits on the key frame. 2128233d2500723e5594f3e7c70896ffeeef32b9c950ywan // 2129233d2500723e5594f3e7c70896ffeeef32b9c950ywan // We use (cpi->rc.frames_to_key - 1) below because the key frame itself is 2130233d2500723e5594f3e7c70896ffeeef32b9c950ywan // taken care of by kf_boost. 2131233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (zero_motion_accumulator >= 0.99) { 2132233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = ((rc->frames_to_key - 1) * 10) + kf_boost; 2133233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2134233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks = ((rc->frames_to_key - 1) * 100) + kf_boost; 2135233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2136233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2137233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Prevent overflow. 2138233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (kf_boost > 1028) { 2139233d2500723e5594f3e7c70896ffeeef32b9c950ywan int divisor = kf_boost >> 10; 2140233d2500723e5594f3e7c70896ffeeef32b9c950ywan kf_boost /= divisor; 2141233d2500723e5594f3e7c70896ffeeef32b9c950ywan allocation_chunks /= divisor; 2142233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2143233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2144233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_bits = (twopass->kf_group_bits < 0) ? 0 2145233d2500723e5594f3e7c70896ffeeef32b9c950ywan : twopass->kf_group_bits; 2146233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2147233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Calculate the number of bits to be spent on the key frame. 2148233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_bits = (int)((double)kf_boost * 2149233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((double)twopass->kf_group_bits / allocation_chunks)); 2150233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2151233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If the key frame is actually easier than the average for the 2152233d2500723e5594f3e7c70896ffeeef32b9c950ywan // kf group (which does sometimes happen, e.g. a blank intro frame) 2153233d2500723e5594f3e7c70896ffeeef32b9c950ywan // then use an alternate calculation based on the kf error score 2154233d2500723e5594f3e7c70896ffeeef32b9c950ywan // which should give a smaller key frame. 2155233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (kf_mod_err < kf_group_err / rc->frames_to_key) { 2156233d2500723e5594f3e7c70896ffeeef32b9c950ywan double alt_kf_grp_bits = ((double)twopass->bits_left * 2157233d2500723e5594f3e7c70896ffeeef32b9c950ywan (kf_mod_err * (double)rc->frames_to_key) / 2158233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(twopass->modified_error_left)); 2159233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2160233d2500723e5594f3e7c70896ffeeef32b9c950ywan alt_kf_bits = (int)((double)kf_boost * 2161233d2500723e5594f3e7c70896ffeeef32b9c950ywan (alt_kf_grp_bits / (double)allocation_chunks)); 2162233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2163233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (twopass->kf_bits > alt_kf_bits) 2164233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_bits = alt_kf_bits; 2165233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2166233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Else if it is much harder than other frames in the group make sure 2167233d2500723e5594f3e7c70896ffeeef32b9c950ywan // it at least receives an allocation in keeping with its relative 2168233d2500723e5594f3e7c70896ffeeef32b9c950ywan // error score. 2169233d2500723e5594f3e7c70896ffeeef32b9c950ywan alt_kf_bits = (int)((double)twopass->bits_left * (kf_mod_err / 2170233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(twopass->modified_error_left))); 2171233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2172233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (alt_kf_bits > twopass->kf_bits) { 2173233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_bits = alt_kf_bits; 2174233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2175233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2176233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_bits -= twopass->kf_bits; 2177233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Per frame bit target for this frame. 2178233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_rc_set_frame_target(cpi, twopass->kf_bits); 2179233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2180233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2181233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Note the total error score of the kf group minus the key frame itself. 2182233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_group_error_left = (int)(kf_group_err - kf_mod_err); 2183233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2184233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Adjust the count of total modified error left. 2185233d2500723e5594f3e7c70896ffeeef32b9c950ywan // The count of bits left is adjusted elsewhere based on real coded frame 2186233d2500723e5594f3e7c70896ffeeef32b9c950ywan // sizes. 2187233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->modified_error_left -= kf_group_err; 2188233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 2189233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2190233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_get_first_pass_params(VP9_COMP *cpi) { 2191233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_COMMON *const cm = &cpi->common; 2192233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cpi->refresh_alt_ref_frame && 2193233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cm->current_video_frame == 0 || 2194233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cm->frame_flags & FRAMEFLAGS_KEY))) { 2195233d2500723e5594f3e7c70896ffeeef32b9c950ywan cm->frame_type = KEY_FRAME; 2196233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2197233d2500723e5594f3e7c70896ffeeef32b9c950ywan cm->frame_type = INTER_FRAME; 2198233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2199233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Do not use periodic key frames. 2200233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->rc.frames_to_key = INT_MAX; 2201233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 2202233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2203233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_get_second_pass_params(VP9_COMP *cpi) { 2204233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_COMMON *const cm = &cpi->common; 2205233d2500723e5594f3e7c70896ffeeef32b9c950ywan RATE_CONTROL *const rc = &cpi->rc; 2206233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct twopass_rc *const twopass = &cpi->twopass; 2207233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frames_left; 2208233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS this_frame; 2209233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS this_frame_copy; 2210233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2211233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_intra_error; 2212233d2500723e5594f3e7c70896ffeeef32b9c950ywan double this_frame_coded_error; 2213233d2500723e5594f3e7c70896ffeeef32b9c950ywan int target; 2214233d2500723e5594f3e7c70896ffeeef32b9c950ywan LAYER_CONTEXT *lc = NULL; 2215233d2500723e5594f3e7c70896ffeeef32b9c950ywan int is_spatial_svc = (cpi->use_svc && cpi->svc.number_temporal_layers == 1); 2216233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2217233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (is_spatial_svc) { 2218233d2500723e5594f3e7c70896ffeeef32b9c950ywan lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; 2219233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_left = (int)(twopass->total_stats.count - 2220233d2500723e5594f3e7c70896ffeeef32b9c950ywan lc->current_video_frame_in_layer); 2221233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2222233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_left = (int)(twopass->total_stats.count - 2223233d2500723e5594f3e7c70896ffeeef32b9c950ywan cm->current_video_frame); 2224233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2225233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2226233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!twopass->stats_in) 2227233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 2228233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2229233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->refresh_alt_ref_frame) { 2230233d2500723e5594f3e7c70896ffeeef32b9c950ywan cm->frame_type = INTER_FRAME; 2231233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_rc_set_frame_target(cpi, twopass->gf_bits); 2232233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 2233233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2234233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2235233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_clear_system_state(); 2236233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2237233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (is_spatial_svc && twopass->kf_intra_err_min == 0) { 2238233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; 2239233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; 2240233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2241233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2242233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) { 2243233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->active_worst_quality = cpi->oxcf.cq_level; 2244233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cm->current_video_frame == 0 || 2245233d2500723e5594f3e7c70896ffeeef32b9c950ywan (is_spatial_svc && lc->current_video_frame_in_layer == 0)) { 2246233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Special case code for first frame. 2247233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int section_target_bandwidth = (int)(twopass->bits_left / 2248233d2500723e5594f3e7c70896ffeeef32b9c950ywan frames_left); 2249233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int tmp_q = vp9_twopass_worst_quality(cpi, &twopass->total_left_stats, 2250233d2500723e5594f3e7c70896ffeeef32b9c950ywan section_target_bandwidth); 2251233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->active_worst_quality = tmp_q; 2252233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->ni_av_qi = tmp_q; 2253233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->avg_q = vp9_convert_qindex_to_q(tmp_q); 2254233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2255233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_zero(this_frame); 2256233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (EOF == input_stats(twopass, &this_frame)) 2257233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 2258233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2259233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_intra_error = this_frame.intra_error; 2260233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_coded_error = this_frame.coded_error; 2261233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2262233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Keyframe and section processing. 2263233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rc->frames_to_key == 0 || 2264233d2500723e5594f3e7c70896ffeeef32b9c950ywan (cm->frame_flags & FRAMEFLAGS_KEY)) { 2265233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Define next KF group and assign bits to it. 2266233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_copy = this_frame; 2267233d2500723e5594f3e7c70896ffeeef32b9c950ywan find_next_key_frame(cpi, &this_frame_copy); 2268233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Don't place key frame in any enhancement layers in spatial svc 2269233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->use_svc && cpi->svc.number_temporal_layers == 1 && 2270233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->svc.spatial_layer_id > 0) { 2271233d2500723e5594f3e7c70896ffeeef32b9c950ywan cm->frame_type = INTER_FRAME; 2272233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2273233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2274233d2500723e5594f3e7c70896ffeeef32b9c950ywan cm->frame_type = INTER_FRAME; 2275233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2276233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2277233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Is this frame a GF / ARF? (Note: a key frame is always also a GF). 2278233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (rc->frames_till_gf_update_due == 0) { 2279233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Define next gf group and assign bits to it. 2280233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_copy = this_frame; 2281233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2282233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 2283233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->multi_arf_enabled) { 2284233d2500723e5594f3e7c70896ffeeef32b9c950ywan define_fixed_arf_period(cpi); 2285233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2286233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 2287233d2500723e5594f3e7c70896ffeeef32b9c950ywan define_gf_group(cpi, &this_frame_copy); 2288233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF 2289233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2290233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 2291233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2292233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (twopass->gf_zeromotion_pct > 995) { 2293233d2500723e5594f3e7c70896ffeeef32b9c950ywan // As long as max_thresh for encode breakout is small enough, it is ok 2294233d2500723e5594f3e7c70896ffeeef32b9c950ywan // to enable it for show frame, i.e. set allow_encode_breakout to 2295233d2500723e5594f3e7c70896ffeeef32b9c950ywan // ENCODE_BREAKOUT_LIMITED. 2296233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cm->show_frame) 2297233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->allow_encode_breakout = ENCODE_BREAKOUT_DISABLED; 2298233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2299233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->allow_encode_breakout = ENCODE_BREAKOUT_LIMITED; 2300233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2301233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2302233d2500723e5594f3e7c70896ffeeef32b9c950ywan rc->frames_till_gf_update_due = rc->baseline_gf_interval; 2303233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->refresh_golden_frame = 1; 2304233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2305233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Otherwise this is an ordinary frame. 2306233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Assign bits from those allocated to the GF group. 2307233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_frame_copy = this_frame; 2308233d2500723e5594f3e7c70896ffeeef32b9c950ywan assign_std_frame_bits(cpi, &this_frame_copy); 2309233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2310233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2311233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Keep a globally available copy of this and the next frame's iiratio. 2312233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->this_iiratio = (int)(this_frame_intra_error / 2313233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(this_frame_coded_error)); 2314233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 2315233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS next_frame; 2316233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (lookup_next_frame_stats(twopass, &next_frame) != EOF) { 2317233d2500723e5594f3e7c70896ffeeef32b9c950ywan twopass->next_iiratio = (int)(next_frame.intra_error / 2318233d2500723e5594f3e7c70896ffeeef32b9c950ywan DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); 2319233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2320233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2321233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2322233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type == KEY_FRAME) 2323233d2500723e5594f3e7c70896ffeeef32b9c950ywan target = vp9_rc_clamp_iframe_target_size(cpi, rc->this_frame_target); 2324233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 2325233d2500723e5594f3e7c70896ffeeef32b9c950ywan target = vp9_rc_clamp_pframe_target_size(cpi, rc->this_frame_target); 2326233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_rc_set_frame_target(cpi, target); 2327233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2328233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Update the total stats remaining structure. 2329233d2500723e5594f3e7c70896ffeeef32b9c950ywan subtract_stats(&twopass->total_left_stats, &this_frame); 2330233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 2331233d2500723e5594f3e7c70896ffeeef32b9c950ywan 2332233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_twopass_postencode_update(VP9_COMP *cpi) { 2333233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint64_t bits_used = cpi->rc.projected_frame_size; 2334233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.bits_left -= bits_used; 2335233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.bits_left = MAX(cpi->twopass.bits_left, 0); 2336233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Update bits left to the kf and gf groups to account for overshoot or 2337233d2500723e5594f3e7c70896ffeeef32b9c950ywan // undershoot on these frames. 2338233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->common.frame_type == KEY_FRAME) { 2339233d2500723e5594f3e7c70896ffeeef32b9c950ywan // For key frames kf_group_bits already had the target bits subtracted out. 2340233d2500723e5594f3e7c70896ffeeef32b9c950ywan // So now update to the correct value based on the actual bits used. 2341233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits += cpi->rc.this_frame_target - bits_used; 2342233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 2343233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits -= bits_used; 2344233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits -= bits_used; 2345233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.gf_group_bits = MAX(cpi->twopass.gf_group_bits, 0); 2346233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 2347233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->twopass.kf_group_bits = MAX(cpi->twopass.kf_group_bits, 0); 2348233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 2349