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