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(&sectionstats);
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(&sectionstats, &next_frame);
1778233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
1779233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1780233d2500723e5594f3e7c70896ffeeef32b9c950ywan    avg_stats(&sectionstats);
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(&sectionstats);
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(&sectionstats, &next_frame);
2090233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
2091233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2092233d2500723e5594f3e7c70896ffeeef32b9c950ywan    avg_stats(&sectionstats);
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