1/*
2 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11
12#include "vpx_config.h"
13#include "./vpx_scale_rtcd.h"
14#include "vp8/common/onyxc_int.h"
15#include "vp8/common/blockd.h"
16#include "onyx_int.h"
17#include "vp8/common/systemdependent.h"
18#include "quantize.h"
19#include "vp8/common/alloccommon.h"
20#include "mcomp.h"
21#include "firstpass.h"
22#include "vpx/internal/vpx_psnr.h"
23#include "vpx_scale/vpx_scale.h"
24#include "vp8/common/extend.h"
25#include "ratectrl.h"
26#include "vp8/common/quant_common.h"
27#include "segmentation.h"
28#if CONFIG_POSTPROC
29#include "vp8/common/postproc.h"
30#endif
31#include "vpx_mem/vpx_mem.h"
32#include "vp8/common/swapyv12buffer.h"
33#include "vp8/common/threading.h"
34#include "vpx_ports/vpx_timer.h"
35#if ARCH_ARM
36#include "vpx_ports/arm.h"
37#endif
38#if CONFIG_MULTI_RES_ENCODING
39#include "mr_dissim.h"
40#endif
41#include "encodeframe.h"
42
43#include <math.h>
44#include <stdio.h>
45#include <limits.h>
46
47#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
48extern int vp8_update_coef_context(VP8_COMP *cpi);
49extern void vp8_update_coef_probs(VP8_COMP *cpi);
50#endif
51
52extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
53extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
54extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
55
56extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
57extern void print_parms(VP8_CONFIG *ocf, char *filenam);
58extern unsigned int vp8_get_processor_freq();
59extern void print_tree_update_probs();
60extern int vp8cx_create_encoder_threads(VP8_COMP *cpi);
61extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
62
63int vp8_estimate_entropy_savings(VP8_COMP *cpi);
64
65int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
66
67extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
68
69static void set_default_lf_deltas(VP8_COMP *cpi);
70
71extern const int vp8_gf_interval_table[101];
72
73#if CONFIG_INTERNAL_STATS
74#include "math.h"
75
76extern double vp8_calc_ssim
77(
78    YV12_BUFFER_CONFIG *source,
79    YV12_BUFFER_CONFIG *dest,
80    int lumamask,
81    double *weight
82);
83
84
85extern double vp8_calc_ssimg
86(
87    YV12_BUFFER_CONFIG *source,
88    YV12_BUFFER_CONFIG *dest,
89    double *ssim_y,
90    double *ssim_u,
91    double *ssim_v
92);
93
94
95#endif
96
97
98#ifdef OUTPUT_YUV_SRC
99FILE *yuv_file;
100#endif
101
102#if 0
103FILE *framepsnr;
104FILE *kf_list;
105FILE *keyfile;
106#endif
107
108#if 0
109extern int skip_true_count;
110extern int skip_false_count;
111#endif
112
113
114#ifdef VP8_ENTROPY_STATS
115extern int intra_mode_stats[10][10][10];
116#endif
117
118#ifdef SPEEDSTATS
119unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
120unsigned int tot_pm = 0;
121unsigned int cnt_pm = 0;
122unsigned int tot_ef = 0;
123unsigned int cnt_ef = 0;
124#endif
125
126#ifdef MODE_STATS
127extern unsigned __int64 Sectionbits[50];
128extern int y_modes[5]  ;
129extern int uv_modes[4] ;
130extern int b_modes[10]  ;
131
132extern int inter_y_modes[10] ;
133extern int inter_uv_modes[4] ;
134extern unsigned int inter_b_modes[15];
135#endif
136
137extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
138
139extern const int qrounding_factors[129];
140extern const int qzbin_factors[129];
141extern void vp8cx_init_quantizer(VP8_COMP *cpi);
142extern const int vp8cx_base_skip_false_prob[128];
143
144/* Tables relating active max Q to active min Q */
145static const unsigned char kf_low_motion_minq[QINDEX_RANGE] =
146{
147    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
148    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
149    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
150    0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
151    3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,
152    6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
153    11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
154    16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23
155};
156static const unsigned char kf_high_motion_minq[QINDEX_RANGE] =
157{
158    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
159    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160    1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,
161    3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6,
162    6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
163    11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
164    16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21,
165    21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30
166};
167static const unsigned char gf_low_motion_minq[QINDEX_RANGE] =
168{
169    0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
170    3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,
171    7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,
172    11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,
173    19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,
174    27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,
175    35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,
176    43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
177};
178static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] =
179{
180    0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4,
181    4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
182    9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,
183    14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,
184    22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,
185    30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,
186    38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48,
187    49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
188};
189static const unsigned char gf_high_motion_minq[QINDEX_RANGE] =
190{
191    0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4,
192    4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
193    9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
194    17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,
195    25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,
196    33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,
197    41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54,
198    55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
199};
200static const unsigned char inter_minq[QINDEX_RANGE] =
201{
202    0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
203    9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
204    20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
205    32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
206    44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
207    57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
208    71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
209    86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
210};
211
212#ifdef PACKET_TESTING
213extern FILE *vpxlogc;
214#endif
215
216static void save_layer_context(VP8_COMP *cpi)
217{
218    LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
219
220    /* Save layer dependent coding state */
221    lc->target_bandwidth                 = cpi->target_bandwidth;
222    lc->starting_buffer_level            = cpi->oxcf.starting_buffer_level;
223    lc->optimal_buffer_level             = cpi->oxcf.optimal_buffer_level;
224    lc->maximum_buffer_size              = cpi->oxcf.maximum_buffer_size;
225    lc->starting_buffer_level_in_ms      = cpi->oxcf.starting_buffer_level_in_ms;
226    lc->optimal_buffer_level_in_ms       = cpi->oxcf.optimal_buffer_level_in_ms;
227    lc->maximum_buffer_size_in_ms        = cpi->oxcf.maximum_buffer_size_in_ms;
228    lc->buffer_level                     = cpi->buffer_level;
229    lc->bits_off_target                  = cpi->bits_off_target;
230    lc->total_actual_bits                = cpi->total_actual_bits;
231    lc->worst_quality                    = cpi->worst_quality;
232    lc->active_worst_quality             = cpi->active_worst_quality;
233    lc->best_quality                     = cpi->best_quality;
234    lc->active_best_quality              = cpi->active_best_quality;
235    lc->ni_av_qi                         = cpi->ni_av_qi;
236    lc->ni_tot_qi                        = cpi->ni_tot_qi;
237    lc->ni_frames                        = cpi->ni_frames;
238    lc->avg_frame_qindex                 = cpi->avg_frame_qindex;
239    lc->rate_correction_factor           = cpi->rate_correction_factor;
240    lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
241    lc->gf_rate_correction_factor        = cpi->gf_rate_correction_factor;
242    lc->zbin_over_quant                  = cpi->mb.zbin_over_quant;
243    lc->inter_frame_target               = cpi->inter_frame_target;
244    lc->total_byte_count                 = cpi->total_byte_count;
245    lc->filter_level                     = cpi->common.filter_level;
246
247    lc->last_frame_percent_intra         = cpi->last_frame_percent_intra;
248
249    memcpy (lc->count_mb_ref_frame_usage,
250            cpi->mb.count_mb_ref_frame_usage,
251            sizeof(cpi->mb.count_mb_ref_frame_usage));
252}
253
254static void restore_layer_context(VP8_COMP *cpi, const int layer)
255{
256    LAYER_CONTEXT *lc = &cpi->layer_context[layer];
257
258    /* Restore layer dependent coding state */
259    cpi->current_layer                    = layer;
260    cpi->target_bandwidth                 = lc->target_bandwidth;
261    cpi->oxcf.target_bandwidth            = lc->target_bandwidth;
262    cpi->oxcf.starting_buffer_level       = lc->starting_buffer_level;
263    cpi->oxcf.optimal_buffer_level        = lc->optimal_buffer_level;
264    cpi->oxcf.maximum_buffer_size         = lc->maximum_buffer_size;
265    cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
266    cpi->oxcf.optimal_buffer_level_in_ms  = lc->optimal_buffer_level_in_ms;
267    cpi->oxcf.maximum_buffer_size_in_ms   = lc->maximum_buffer_size_in_ms;
268    cpi->buffer_level                     = lc->buffer_level;
269    cpi->bits_off_target                  = lc->bits_off_target;
270    cpi->total_actual_bits                = lc->total_actual_bits;
271    cpi->active_worst_quality             = lc->active_worst_quality;
272    cpi->active_best_quality              = lc->active_best_quality;
273    cpi->ni_av_qi                         = lc->ni_av_qi;
274    cpi->ni_tot_qi                        = lc->ni_tot_qi;
275    cpi->ni_frames                        = lc->ni_frames;
276    cpi->avg_frame_qindex                 = lc->avg_frame_qindex;
277    cpi->rate_correction_factor           = lc->rate_correction_factor;
278    cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
279    cpi->gf_rate_correction_factor        = lc->gf_rate_correction_factor;
280    cpi->mb.zbin_over_quant                  = lc->zbin_over_quant;
281    cpi->inter_frame_target               = lc->inter_frame_target;
282    cpi->total_byte_count                 = lc->total_byte_count;
283    cpi->common.filter_level              = lc->filter_level;
284
285    cpi->last_frame_percent_intra         = lc->last_frame_percent_intra;
286
287    memcpy (cpi->mb.count_mb_ref_frame_usage,
288            lc->count_mb_ref_frame_usage,
289            sizeof(cpi->mb.count_mb_ref_frame_usage));
290}
291
292static int rescale(int val, int num, int denom)
293{
294    int64_t llnum = num;
295    int64_t llden = denom;
296    int64_t llval = val;
297
298    return (int)(llval * llnum / llden);
299}
300
301static void init_temporal_layer_context(VP8_COMP *cpi,
302                                        VP8_CONFIG *oxcf,
303                                        const int layer,
304                                        double prev_layer_framerate)
305{
306    LAYER_CONTEXT *lc = &cpi->layer_context[layer];
307
308    lc->framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[layer];
309    lc->target_bandwidth = cpi->oxcf.target_bitrate[layer] * 1000;
310
311    lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
312    lc->optimal_buffer_level_in_ms  = oxcf->optimal_buffer_level;
313    lc->maximum_buffer_size_in_ms   = oxcf->maximum_buffer_size;
314
315    lc->starting_buffer_level =
316        rescale((int)(oxcf->starting_buffer_level),
317                lc->target_bandwidth, 1000);
318
319    if (oxcf->optimal_buffer_level == 0)
320      lc->optimal_buffer_level = lc->target_bandwidth / 8;
321    else
322      lc->optimal_buffer_level =
323          rescale((int)(oxcf->optimal_buffer_level),
324                  lc->target_bandwidth, 1000);
325
326    if (oxcf->maximum_buffer_size == 0)
327      lc->maximum_buffer_size = lc->target_bandwidth / 8;
328    else
329      lc->maximum_buffer_size =
330          rescale((int)(oxcf->maximum_buffer_size),
331                  lc->target_bandwidth, 1000);
332
333    /* Work out the average size of a frame within this layer */
334    if (layer > 0)
335      lc->avg_frame_size_for_layer =
336          (int)((cpi->oxcf.target_bitrate[layer] -
337                cpi->oxcf.target_bitrate[layer-1]) * 1000 /
338                (lc->framerate - prev_layer_framerate));
339
340     lc->active_worst_quality         = cpi->oxcf.worst_allowed_q;
341     lc->active_best_quality          = cpi->oxcf.best_allowed_q;
342     lc->avg_frame_qindex             = cpi->oxcf.worst_allowed_q;
343
344     lc->buffer_level                 = lc->starting_buffer_level;
345     lc->bits_off_target              = lc->starting_buffer_level;
346
347     lc->total_actual_bits                 = 0;
348     lc->ni_av_qi                          = 0;
349     lc->ni_tot_qi                         = 0;
350     lc->ni_frames                         = 0;
351     lc->rate_correction_factor            = 1.0;
352     lc->key_frame_rate_correction_factor  = 1.0;
353     lc->gf_rate_correction_factor         = 1.0;
354     lc->inter_frame_target                = 0;
355}
356
357// Upon a run-time change in temporal layers, reset the layer context parameters
358// for any "new" layers. For "existing" layers, let them inherit the parameters
359// from the previous layer state (at the same layer #). In future we may want
360// to better map the previous layer state(s) to the "new" ones.
361static void reset_temporal_layer_change(VP8_COMP *cpi,
362                                        VP8_CONFIG *oxcf,
363                                        const int prev_num_layers)
364{
365    int i;
366    double prev_layer_framerate = 0;
367    const int curr_num_layers = cpi->oxcf.number_of_layers;
368    // If the previous state was 1 layer, get current layer context from cpi.
369    // We need this to set the layer context for the new layers below.
370    if (prev_num_layers == 1)
371    {
372        cpi->current_layer = 0;
373        save_layer_context(cpi);
374    }
375    for (i = 0; i < curr_num_layers; i++)
376    {
377        LAYER_CONTEXT *lc = &cpi->layer_context[i];
378        if (i >= prev_num_layers)
379        {
380           init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
381        }
382        // The initial buffer levels are set based on their starting levels.
383        // We could set the buffer levels based on the previous state (normalized
384        // properly by the layer bandwidths) but we would need to keep track of
385        // the previous set of layer bandwidths (i.e., target_bitrate[i])
386        // before the layer change. For now, reset to the starting levels.
387        lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
388                           cpi->oxcf.target_bitrate[i];
389        lc->bits_off_target = lc->buffer_level;
390        // TDOD(marpan): Should we set the rate_correction_factor and
391        // active_worst/best_quality to values derived from the previous layer
392        // state (to smooth-out quality dips/rate fluctuation at transition)?
393
394        // We need to treat the 1 layer case separately: oxcf.target_bitrate[i]
395        // is not set for 1 layer, and the restore_layer_context/save_context()
396        // are not called in the encoding loop, so we need to call it here to
397        // pass the layer context state to |cpi|.
398        if (curr_num_layers == 1)
399        {
400            lc->target_bandwidth = cpi->oxcf.target_bandwidth;
401            lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
402                               lc->target_bandwidth  / 1000;
403            lc->bits_off_target = lc->buffer_level;
404            restore_layer_context(cpi, 0);
405        }
406        prev_layer_framerate = cpi->output_framerate /
407                               cpi->oxcf.rate_decimator[i];
408    }
409}
410
411static void setup_features(VP8_COMP *cpi)
412{
413    // If segmentation enabled set the update flags
414    if ( cpi->mb.e_mbd.segmentation_enabled )
415    {
416        cpi->mb.e_mbd.update_mb_segmentation_map = 1;
417        cpi->mb.e_mbd.update_mb_segmentation_data = 1;
418    }
419    else
420    {
421        cpi->mb.e_mbd.update_mb_segmentation_map = 0;
422        cpi->mb.e_mbd.update_mb_segmentation_data = 0;
423    }
424
425    cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
426    cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
427    vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
428    vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
429    vpx_memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
430    vpx_memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
431
432    set_default_lf_deltas(cpi);
433
434}
435
436
437static void dealloc_raw_frame_buffers(VP8_COMP *cpi);
438
439
440static void dealloc_compressor_data(VP8_COMP *cpi)
441{
442    vpx_free(cpi->tplist);
443    cpi->tplist = NULL;
444
445    /* Delete last frame MV storage buffers */
446    vpx_free(cpi->lfmv);
447    cpi->lfmv = 0;
448
449    vpx_free(cpi->lf_ref_frame_sign_bias);
450    cpi->lf_ref_frame_sign_bias = 0;
451
452    vpx_free(cpi->lf_ref_frame);
453    cpi->lf_ref_frame = 0;
454
455    /* Delete sementation map */
456    vpx_free(cpi->segmentation_map);
457    cpi->segmentation_map = 0;
458
459    vpx_free(cpi->active_map);
460    cpi->active_map = 0;
461
462    vp8_de_alloc_frame_buffers(&cpi->common);
463
464    vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
465    vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
466    dealloc_raw_frame_buffers(cpi);
467
468    vpx_free(cpi->tok);
469    cpi->tok = 0;
470
471    /* Structure used to monitor GF usage */
472    vpx_free(cpi->gf_active_flags);
473    cpi->gf_active_flags = 0;
474
475    /* Activity mask based per mb zbin adjustments */
476    vpx_free(cpi->mb_activity_map);
477    cpi->mb_activity_map = 0;
478
479    vpx_free(cpi->mb.pip);
480    cpi->mb.pip = 0;
481
482#if CONFIG_MULTITHREAD
483    vpx_free(cpi->mt_current_mb_col);
484    cpi->mt_current_mb_col = NULL;
485#endif
486}
487
488static void enable_segmentation(VP8_COMP *cpi)
489{
490    /* Set the appropriate feature bit */
491    cpi->mb.e_mbd.segmentation_enabled = 1;
492    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
493    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
494}
495static void disable_segmentation(VP8_COMP *cpi)
496{
497    /* Clear the appropriate feature bit */
498    cpi->mb.e_mbd.segmentation_enabled = 0;
499}
500
501/* Valid values for a segment are 0 to 3
502 * Segmentation map is arrange as [Rows][Columns]
503 */
504static void set_segmentation_map(VP8_COMP *cpi, unsigned char *segmentation_map)
505{
506    /* Copy in the new segmentation map */
507    vpx_memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));
508
509    /* Signal that the map should be updated. */
510    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
511    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
512}
513
514/* The values given for each segment can be either deltas (from the default
515 * value chosen for the frame) or absolute values.
516 *
517 * Valid range for abs values is:
518 *    (0-127 for MB_LVL_ALT_Q), (0-63 for SEGMENT_ALT_LF)
519 * Valid range for delta values are:
520 *    (+/-127 for MB_LVL_ALT_Q), (+/-63 for SEGMENT_ALT_LF)
521 *
522 * abs_delta = SEGMENT_DELTADATA (deltas)
523 * abs_delta = SEGMENT_ABSDATA (use the absolute values given).
524 *
525 */
526static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned char abs_delta)
527{
528    cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
529    vpx_memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
530}
531
532
533static void segmentation_test_function(VP8_COMP *cpi)
534{
535    unsigned char *seg_map;
536    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
537
538    // Create a temporary map for segmentation data.
539    CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
540
541    // Set the segmentation Map
542    set_segmentation_map(cpi, seg_map);
543
544    // Activate segmentation.
545    enable_segmentation(cpi);
546
547    // Set up the quant segment data
548    feature_data[MB_LVL_ALT_Q][0] = 0;
549    feature_data[MB_LVL_ALT_Q][1] = 4;
550    feature_data[MB_LVL_ALT_Q][2] = 0;
551    feature_data[MB_LVL_ALT_Q][3] = 0;
552    // Set up the loop segment data
553    feature_data[MB_LVL_ALT_LF][0] = 0;
554    feature_data[MB_LVL_ALT_LF][1] = 0;
555    feature_data[MB_LVL_ALT_LF][2] = 0;
556    feature_data[MB_LVL_ALT_LF][3] = 0;
557
558    // Initialise the feature data structure
559    // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1
560    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
561
562    // Delete sementation map
563    vpx_free(seg_map);
564
565    seg_map = 0;
566}
567
568/* A simple function to cyclically refresh the background at a lower Q */
569static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
570{
571    unsigned char *seg_map = cpi->segmentation_map;
572    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
573    int i;
574    int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
575    int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
576
577    cpi->cyclic_refresh_q = Q / 2;
578
579    // Set every macroblock to be eligible for update.
580    // For key frame this will reset seg map to 0.
581    vpx_memset(cpi->segmentation_map, 0, mbs_in_frame);
582
583    if (cpi->common.frame_type != KEY_FRAME)
584    {
585        /* Cycle through the macro_block rows */
586        /* MB loop to set local segmentation map */
587        i = cpi->cyclic_refresh_mode_index;
588        assert(i < mbs_in_frame);
589        do
590        {
591          /* If the MB is as a candidate for clean up then mark it for
592           * possible boost/refresh (segment 1) The segment id may get
593           * reset to 0 later if the MB gets coded anything other than
594           * last frame 0,0 as only (last frame 0,0) MBs are eligable for
595           * refresh : that is to say Mbs likely to be background blocks.
596           */
597          if (cpi->cyclic_refresh_map[i] == 0)
598          {
599              seg_map[i] = 1;
600              block_count --;
601          }
602          else if (cpi->cyclic_refresh_map[i] < 0)
603              cpi->cyclic_refresh_map[i]++;
604
605          i++;
606          if (i == mbs_in_frame)
607              i = 0;
608
609        }
610        while(block_count && i != cpi->cyclic_refresh_mode_index);
611
612        cpi->cyclic_refresh_mode_index = i;
613    }
614
615    /* Activate segmentation. */
616    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
617    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
618    enable_segmentation(cpi);
619
620    /* Set up the quant segment data */
621    feature_data[MB_LVL_ALT_Q][0] = 0;
622    feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
623    feature_data[MB_LVL_ALT_Q][2] = 0;
624    feature_data[MB_LVL_ALT_Q][3] = 0;
625
626    /* Set up the loop segment data */
627    feature_data[MB_LVL_ALT_LF][0] = 0;
628    feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
629    feature_data[MB_LVL_ALT_LF][2] = 0;
630    feature_data[MB_LVL_ALT_LF][3] = 0;
631
632    /* Initialise the feature data structure */
633    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
634
635}
636
637static void set_default_lf_deltas(VP8_COMP *cpi)
638{
639    cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
640    cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
641
642    vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
643    vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
644
645    /* Test of ref frame deltas */
646    cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
647    cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
648    cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
649    cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
650
651    cpi->mb.e_mbd.mode_lf_deltas[0] = 4;               /* BPRED */
652
653    if(cpi->oxcf.Mode == MODE_REALTIME)
654      cpi->mb.e_mbd.mode_lf_deltas[1] = -12;              /* Zero */
655    else
656      cpi->mb.e_mbd.mode_lf_deltas[1] = -2;              /* Zero */
657
658    cpi->mb.e_mbd.mode_lf_deltas[2] = 2;               /* New mv */
659    cpi->mb.e_mbd.mode_lf_deltas[3] = 4;               /* Split mv */
660}
661
662/* Convenience macros for mapping speed and mode into a continuous
663 * range
664 */
665#define GOOD(x) (x+1)
666#define RT(x) (x+7)
667
668static int speed_map(int speed, const int *map)
669{
670    int res;
671
672    do
673    {
674        res = *map++;
675    } while(speed >= *map++);
676    return res;
677}
678
679static const int thresh_mult_map_znn[] = {
680    /* map common to zero, nearest, and near */
681    0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
682};
683
684static const int thresh_mult_map_vhpred[] = {
685    1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(1), 2000,
686    RT(7), INT_MAX, INT_MAX
687};
688
689static const int thresh_mult_map_bpred[] = {
690    2000, GOOD(0), 2500, GOOD(2), 5000, GOOD(3), 7500, RT(0), 2500, RT(1), 5000,
691    RT(6), INT_MAX, INT_MAX
692};
693
694static const int thresh_mult_map_tm[] = {
695    1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 0, RT(1), 1000, RT(2), 2000,
696    RT(7), INT_MAX, INT_MAX
697};
698
699static const int thresh_mult_map_new1[] = {
700    1000, GOOD(2), 2000, RT(0), 2000, INT_MAX
701};
702
703static const int thresh_mult_map_new2[] = {
704    1000, GOOD(2), 2000, GOOD(3), 2500, GOOD(5), 4000, RT(0), 2000, RT(2), 2500,
705    RT(5), 4000, INT_MAX
706};
707
708static const int thresh_mult_map_split1[] = {
709    2500, GOOD(0), 1700, GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
710    RT(0), 5000, RT(1), 10000, RT(2), 25000, RT(3), INT_MAX, INT_MAX
711};
712
713static const int thresh_mult_map_split2[] = {
714    5000, GOOD(0), 4500, GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
715    RT(0), 10000, RT(1), 20000, RT(2), 50000, RT(3), INT_MAX, INT_MAX
716};
717
718static const int mode_check_freq_map_zn2[] = {
719    /* {zero,nearest}{2,3} */
720    0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
721};
722
723static const int mode_check_freq_map_vhbpred[] = {
724    0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(5), 4, INT_MAX
725};
726
727static const int mode_check_freq_map_near2[] = {
728    0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(10), 1<<2, RT(11), 1<<3, RT(12), 1<<4,
729    INT_MAX
730};
731
732static const int mode_check_freq_map_new1[] = {
733    0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
734};
735
736static const int mode_check_freq_map_new2[] = {
737    0, GOOD(5), 4, RT(0), 0, RT(3), 4, RT(10), 1<<3, RT(11), 1<<4, RT(12), 1<<5,
738    INT_MAX
739};
740
741static const int mode_check_freq_map_split1[] = {
742    0, GOOD(2), 2, GOOD(3), 7, RT(1), 2, RT(2), 7, INT_MAX
743};
744
745static const int mode_check_freq_map_split2[] = {
746    0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
747};
748
749void vp8_set_speed_features(VP8_COMP *cpi)
750{
751    SPEED_FEATURES *sf = &cpi->sf;
752    int Mode = cpi->compressor_speed;
753    int Speed = cpi->Speed;
754    int i;
755    VP8_COMMON *cm = &cpi->common;
756    int last_improved_quant = sf->improved_quant;
757    int ref_frames;
758
759    /* Initialise default mode frequency sampling variables */
760    for (i = 0; i < MAX_MODES; i ++)
761    {
762        cpi->mode_check_freq[i] = 0;
763    }
764
765    cpi->mb.mbs_tested_so_far = 0;
766
767    /* best quality defaults */
768    sf->RD = 1;
769    sf->search_method = NSTEP;
770    sf->improved_quant = 1;
771    sf->improved_dct = 1;
772    sf->auto_filter = 1;
773    sf->recode_loop = 1;
774    sf->quarter_pixel_search = 1;
775    sf->half_pixel_search = 1;
776    sf->iterative_sub_pixel = 1;
777    sf->optimize_coefficients = 1;
778    sf->use_fastquant_for_pick = 0;
779    sf->no_skip_block4x4_search = 1;
780
781    sf->first_step = 0;
782    sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
783    sf->improved_mv_pred = 1;
784
785    /* default thresholds to 0 */
786    for (i = 0; i < MAX_MODES; i++)
787        sf->thresh_mult[i] = 0;
788
789    /* Count enabled references */
790    ref_frames = 1;
791    if (cpi->ref_frame_flags & VP8_LAST_FRAME)
792        ref_frames++;
793    if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
794        ref_frames++;
795    if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
796        ref_frames++;
797
798    /* Convert speed to continuous range, with clamping */
799    if (Mode == 0)
800        Speed = 0;
801    else if (Mode == 2)
802        Speed = RT(Speed);
803    else
804    {
805        if (Speed > 5)
806            Speed = 5;
807        Speed = GOOD(Speed);
808    }
809
810    sf->thresh_mult[THR_ZERO1] =
811    sf->thresh_mult[THR_NEAREST1] =
812    sf->thresh_mult[THR_NEAR1] =
813    sf->thresh_mult[THR_DC] = 0; /* always */
814
815    sf->thresh_mult[THR_ZERO2] =
816    sf->thresh_mult[THR_ZERO3] =
817    sf->thresh_mult[THR_NEAREST2] =
818    sf->thresh_mult[THR_NEAREST3] =
819    sf->thresh_mult[THR_NEAR2]  =
820    sf->thresh_mult[THR_NEAR3]  = speed_map(Speed, thresh_mult_map_znn);
821
822    sf->thresh_mult[THR_V_PRED] =
823    sf->thresh_mult[THR_H_PRED] = speed_map(Speed, thresh_mult_map_vhpred);
824    sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
825    sf->thresh_mult[THR_TM]     = speed_map(Speed, thresh_mult_map_tm);
826    sf->thresh_mult[THR_NEW1]   = speed_map(Speed, thresh_mult_map_new1);
827    sf->thresh_mult[THR_NEW2]   =
828    sf->thresh_mult[THR_NEW3]   = speed_map(Speed, thresh_mult_map_new2);
829    sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
830    sf->thresh_mult[THR_SPLIT2] =
831    sf->thresh_mult[THR_SPLIT3] = speed_map(Speed, thresh_mult_map_split2);
832
833    cpi->mode_check_freq[THR_ZERO1] =
834    cpi->mode_check_freq[THR_NEAREST1] =
835    cpi->mode_check_freq[THR_NEAR1] =
836    cpi->mode_check_freq[THR_TM]     =
837    cpi->mode_check_freq[THR_DC] = 0; /* always */
838
839    cpi->mode_check_freq[THR_ZERO2] =
840    cpi->mode_check_freq[THR_ZERO3] =
841    cpi->mode_check_freq[THR_NEAREST2] =
842    cpi->mode_check_freq[THR_NEAREST3] = speed_map(Speed,
843                                                   mode_check_freq_map_zn2);
844
845    cpi->mode_check_freq[THR_NEAR2]  =
846    cpi->mode_check_freq[THR_NEAR3]  = speed_map(Speed,
847                                                 mode_check_freq_map_near2);
848
849    cpi->mode_check_freq[THR_V_PRED] =
850    cpi->mode_check_freq[THR_H_PRED] =
851    cpi->mode_check_freq[THR_B_PRED] = speed_map(Speed,
852                                                 mode_check_freq_map_vhbpred);
853    cpi->mode_check_freq[THR_NEW1]   = speed_map(Speed,
854                                                 mode_check_freq_map_new1);
855    cpi->mode_check_freq[THR_NEW2]   =
856    cpi->mode_check_freq[THR_NEW3]   = speed_map(Speed,
857                                                 mode_check_freq_map_new2);
858    cpi->mode_check_freq[THR_SPLIT1] = speed_map(Speed,
859                                                 mode_check_freq_map_split1);
860    cpi->mode_check_freq[THR_SPLIT2] =
861    cpi->mode_check_freq[THR_SPLIT3] = speed_map(Speed,
862                                                 mode_check_freq_map_split2);
863    Speed = cpi->Speed;
864    switch (Mode)
865    {
866#if !(CONFIG_REALTIME_ONLY)
867    case 0: /* best quality mode */
868        sf->first_step = 0;
869        sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
870        break;
871    case 1:
872    case 3:
873        if (Speed > 0)
874        {
875            /* Disable coefficient optimization above speed 0 */
876            sf->optimize_coefficients = 0;
877            sf->use_fastquant_for_pick = 1;
878            sf->no_skip_block4x4_search = 0;
879
880            sf->first_step = 1;
881        }
882
883        if (Speed > 2)
884        {
885            sf->improved_quant = 0;
886            sf->improved_dct = 0;
887
888            /* Only do recode loop on key frames, golden frames and
889             * alt ref frames
890             */
891            sf->recode_loop = 2;
892
893        }
894
895        if (Speed > 3)
896        {
897            sf->auto_filter = 1;
898            sf->recode_loop = 0; /* recode loop off */
899            sf->RD = 0;         /* Turn rd off */
900
901        }
902
903        if (Speed > 4)
904        {
905            sf->auto_filter = 0;  /* Faster selection of loop filter */
906        }
907
908        break;
909#endif
910    case 2:
911        sf->optimize_coefficients = 0;
912        sf->recode_loop = 0;
913        sf->auto_filter = 1;
914        sf->iterative_sub_pixel = 1;
915        sf->search_method = NSTEP;
916
917        if (Speed > 0)
918        {
919            sf->improved_quant = 0;
920            sf->improved_dct = 0;
921
922            sf->use_fastquant_for_pick = 1;
923            sf->no_skip_block4x4_search = 0;
924            sf->first_step = 1;
925        }
926
927        if (Speed > 2)
928            sf->auto_filter = 0;  /* Faster selection of loop filter */
929
930        if (Speed > 3)
931        {
932            sf->RD = 0;
933            sf->auto_filter = 1;
934        }
935
936        if (Speed > 4)
937        {
938            sf->auto_filter = 0;  /* Faster selection of loop filter */
939            sf->search_method = HEX;
940            sf->iterative_sub_pixel = 0;
941        }
942
943        if (Speed > 6)
944        {
945            unsigned int sum = 0;
946            unsigned int total_mbs = cm->MBs;
947            int thresh;
948            unsigned int total_skip;
949
950            int min = 2000;
951
952            if (cpi->oxcf.encode_breakout > 2000)
953                min = cpi->oxcf.encode_breakout;
954
955            min >>= 7;
956
957            for (i = 0; i < min; i++)
958            {
959                sum += cpi->mb.error_bins[i];
960            }
961
962            total_skip = sum;
963            sum = 0;
964
965            /* i starts from 2 to make sure thresh started from 2048 */
966            for (; i < 1024; i++)
967            {
968                sum += cpi->mb.error_bins[i];
969
970                if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
971                    break;
972            }
973
974            i--;
975            thresh = (i << 7);
976
977            if (thresh < 2000)
978                thresh = 2000;
979
980            if (ref_frames > 1)
981            {
982                sf->thresh_mult[THR_NEW1 ] = thresh;
983                sf->thresh_mult[THR_NEAREST1  ] = thresh >> 1;
984                sf->thresh_mult[THR_NEAR1     ] = thresh >> 1;
985            }
986
987            if (ref_frames > 2)
988            {
989                sf->thresh_mult[THR_NEW2] = thresh << 1;
990                sf->thresh_mult[THR_NEAREST2 ] = thresh;
991                sf->thresh_mult[THR_NEAR2    ] = thresh;
992            }
993
994            if (ref_frames > 3)
995            {
996                sf->thresh_mult[THR_NEW3] = thresh << 1;
997                sf->thresh_mult[THR_NEAREST3 ] = thresh;
998                sf->thresh_mult[THR_NEAR3    ] = thresh;
999            }
1000
1001            sf->improved_mv_pred = 0;
1002        }
1003
1004        if (Speed > 8)
1005            sf->quarter_pixel_search = 0;
1006
1007        if(cm->version == 0)
1008        {
1009            cm->filter_type = NORMAL_LOOPFILTER;
1010
1011            if (Speed >= 14)
1012                cm->filter_type = SIMPLE_LOOPFILTER;
1013        }
1014        else
1015        {
1016            cm->filter_type = SIMPLE_LOOPFILTER;
1017        }
1018
1019        /* This has a big hit on quality. Last resort */
1020        if (Speed >= 15)
1021            sf->half_pixel_search = 0;
1022
1023        vpx_memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
1024
1025    }; /* switch */
1026
1027    /* Slow quant, dct and trellis not worthwhile for first pass
1028     * so make sure they are always turned off.
1029     */
1030    if ( cpi->pass == 1 )
1031    {
1032        sf->improved_quant = 0;
1033        sf->optimize_coefficients = 0;
1034        sf->improved_dct = 0;
1035    }
1036
1037    if (cpi->sf.search_method == NSTEP)
1038    {
1039        vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1040    }
1041    else if (cpi->sf.search_method == DIAMOND)
1042    {
1043        vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1044    }
1045
1046    if (cpi->sf.improved_dct)
1047    {
1048        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
1049        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
1050    }
1051    else
1052    {
1053        /* No fast FDCT defined for any platform at this time. */
1054        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
1055        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
1056    }
1057
1058    cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
1059
1060    if (cpi->sf.improved_quant)
1061    {
1062        cpi->mb.quantize_b      = vp8_regular_quantize_b;
1063        cpi->mb.quantize_b_pair = vp8_regular_quantize_b_pair;
1064    }
1065    else
1066    {
1067        cpi->mb.quantize_b      = vp8_fast_quantize_b;
1068        cpi->mb.quantize_b_pair = vp8_fast_quantize_b_pair;
1069    }
1070    if (cpi->sf.improved_quant != last_improved_quant)
1071        vp8cx_init_quantizer(cpi);
1072
1073    if (cpi->sf.iterative_sub_pixel == 1)
1074    {
1075        cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
1076    }
1077    else if (cpi->sf.quarter_pixel_search)
1078    {
1079        cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
1080    }
1081    else if (cpi->sf.half_pixel_search)
1082    {
1083        cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1084    }
1085    else
1086    {
1087        cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1088    }
1089
1090    if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
1091        cpi->mb.optimize = 1;
1092    else
1093        cpi->mb.optimize = 0;
1094
1095    if (cpi->common.full_pixel)
1096        cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1097
1098#ifdef SPEEDSTATS
1099    frames_at_speed[cpi->Speed]++;
1100#endif
1101}
1102#undef GOOD
1103#undef RT
1104
1105static void alloc_raw_frame_buffers(VP8_COMP *cpi)
1106{
1107#if VP8_TEMPORAL_ALT_REF
1108    int width = (cpi->oxcf.Width + 15) & ~15;
1109    int height = (cpi->oxcf.Height + 15) & ~15;
1110#endif
1111
1112    cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
1113                                        cpi->oxcf.lag_in_frames);
1114    if(!cpi->lookahead)
1115        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1116                           "Failed to allocate lag buffers");
1117
1118#if VP8_TEMPORAL_ALT_REF
1119
1120    if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
1121                                    width, height, VP8BORDERINPIXELS))
1122        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1123                           "Failed to allocate altref buffer");
1124
1125#endif
1126}
1127
1128
1129static void dealloc_raw_frame_buffers(VP8_COMP *cpi)
1130{
1131#if VP8_TEMPORAL_ALT_REF
1132    vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
1133#endif
1134    vp8_lookahead_destroy(cpi->lookahead);
1135}
1136
1137
1138static int vp8_alloc_partition_data(VP8_COMP *cpi)
1139{
1140        vpx_free(cpi->mb.pip);
1141
1142    cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
1143                                (cpi->common.mb_rows + 1),
1144                                sizeof(PARTITION_INFO));
1145    if(!cpi->mb.pip)
1146        return 1;
1147
1148    cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1149
1150    return 0;
1151}
1152
1153void vp8_alloc_compressor_data(VP8_COMP *cpi)
1154{
1155    VP8_COMMON *cm = & cpi->common;
1156
1157    int width = cm->Width;
1158    int height = cm->Height;
1159
1160    if (vp8_alloc_frame_buffers(cm, width, height))
1161        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1162                           "Failed to allocate frame buffers");
1163
1164    if (vp8_alloc_partition_data(cpi))
1165        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1166                           "Failed to allocate partition data");
1167
1168
1169    if ((width & 0xf) != 0)
1170        width += 16 - (width & 0xf);
1171
1172    if ((height & 0xf) != 0)
1173        height += 16 - (height & 0xf);
1174
1175
1176    if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame,
1177                                    width, height, VP8BORDERINPIXELS))
1178        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1179                           "Failed to allocate last frame buffer");
1180
1181    if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
1182                                    width, height, VP8BORDERINPIXELS))
1183        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1184                           "Failed to allocate scaled source buffer");
1185
1186    vpx_free(cpi->tok);
1187
1188    {
1189#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
1190        unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
1191#else
1192        unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1193#endif
1194        CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1195    }
1196
1197    /* Data used for real time vc mode to see if gf needs refreshing */
1198    cpi->zeromv_count = 0;
1199
1200
1201    /* Structures used to monitor GF usage */
1202    vpx_free(cpi->gf_active_flags);
1203    CHECK_MEM_ERROR(cpi->gf_active_flags,
1204                    vpx_calloc(sizeof(*cpi->gf_active_flags),
1205                    cm->mb_rows * cm->mb_cols));
1206    cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1207
1208    vpx_free(cpi->mb_activity_map);
1209    CHECK_MEM_ERROR(cpi->mb_activity_map,
1210                    vpx_calloc(sizeof(*cpi->mb_activity_map),
1211                    cm->mb_rows * cm->mb_cols));
1212
1213    /* allocate memory for storing last frame's MVs for MV prediction. */
1214    vpx_free(cpi->lfmv);
1215    CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1216                    sizeof(*cpi->lfmv)));
1217    vpx_free(cpi->lf_ref_frame_sign_bias);
1218    CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
1219                    vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1220                    sizeof(*cpi->lf_ref_frame_sign_bias)));
1221    vpx_free(cpi->lf_ref_frame);
1222    CHECK_MEM_ERROR(cpi->lf_ref_frame,
1223                    vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1224                    sizeof(*cpi->lf_ref_frame)));
1225
1226    /* Create the encoder segmentation map and set all entries to 0 */
1227    vpx_free(cpi->segmentation_map);
1228    CHECK_MEM_ERROR(cpi->segmentation_map,
1229                    vpx_calloc(cm->mb_rows * cm->mb_cols,
1230                    sizeof(*cpi->segmentation_map)));
1231    cpi->cyclic_refresh_mode_index = 0;
1232    vpx_free(cpi->active_map);
1233    CHECK_MEM_ERROR(cpi->active_map,
1234                    vpx_calloc(cm->mb_rows * cm->mb_cols,
1235                    sizeof(*cpi->active_map)));
1236    vpx_memset(cpi->active_map , 1, (cm->mb_rows * cm->mb_cols));
1237
1238#if CONFIG_MULTITHREAD
1239    if (width < 640)
1240        cpi->mt_sync_range = 1;
1241    else if (width <= 1280)
1242        cpi->mt_sync_range = 4;
1243    else if (width <= 2560)
1244        cpi->mt_sync_range = 8;
1245    else
1246        cpi->mt_sync_range = 16;
1247
1248    if (cpi->oxcf.multi_threaded > 1)
1249    {
1250        vpx_free(cpi->mt_current_mb_col);
1251        CHECK_MEM_ERROR(cpi->mt_current_mb_col,
1252                    vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
1253    }
1254
1255#endif
1256
1257    vpx_free(cpi->tplist);
1258    CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
1259}
1260
1261
1262/* Quant MOD */
1263static const int q_trans[] =
1264{
1265    0,   1,  2,  3,  4,  5,  7,  8,
1266    9,  10, 12, 13, 15, 17, 18, 19,
1267    20,  21, 23, 24, 25, 26, 27, 28,
1268    29,  30, 31, 33, 35, 37, 39, 41,
1269    43,  45, 47, 49, 51, 53, 55, 57,
1270    59,  61, 64, 67, 70, 73, 76, 79,
1271    82,  85, 88, 91, 94, 97, 100, 103,
1272    106, 109, 112, 115, 118, 121, 124, 127,
1273};
1274
1275int vp8_reverse_trans(int x)
1276{
1277    int i;
1278
1279    for (i = 0; i < 64; i++)
1280        if (q_trans[i] >= x)
1281            return i;
1282
1283    return 63;
1284}
1285void vp8_new_framerate(VP8_COMP *cpi, double framerate)
1286{
1287    if(framerate < .1)
1288        framerate = 30;
1289
1290    cpi->framerate              = framerate;
1291    cpi->output_framerate       = framerate;
1292    cpi->per_frame_bandwidth    = (int)(cpi->oxcf.target_bandwidth /
1293                                  cpi->output_framerate);
1294    cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
1295    cpi->min_frame_bandwidth    = (int)(cpi->av_per_frame_bandwidth *
1296                                  cpi->oxcf.two_pass_vbrmin_section / 100);
1297
1298    /* Set Maximum gf/arf interval */
1299    cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);
1300
1301    if(cpi->max_gf_interval < 12)
1302        cpi->max_gf_interval = 12;
1303
1304    /* Extended interval for genuinely static scenes */
1305    cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1306
1307     /* Special conditions when altr ref frame enabled in lagged compress mode */
1308    if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
1309    {
1310        if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1311            cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1312
1313        if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1314            cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1315    }
1316
1317    if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
1318        cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1319}
1320
1321
1322static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
1323{
1324    VP8_COMMON *cm = &cpi->common;
1325
1326    cpi->oxcf = *oxcf;
1327
1328    cpi->auto_gold = 1;
1329    cpi->auto_adjust_gold_quantizer = 1;
1330
1331    cm->version = oxcf->Version;
1332    vp8_setup_version(cm);
1333
1334    /* frame rate is not available on the first frame, as it's derived from
1335     * the observed timestamps. The actual value used here doesn't matter
1336     * too much, as it will adapt quickly. If the reciprocal of the timebase
1337     * seems like a reasonable framerate, then use that as a guess, otherwise
1338     * use 30.
1339     */
1340    cpi->framerate = (double)(oxcf->timebase.den) /
1341                     (double)(oxcf->timebase.num);
1342
1343    if (cpi->framerate > 180)
1344        cpi->framerate = 30;
1345
1346    cpi->ref_framerate = cpi->framerate;
1347
1348    /* change includes all joint functionality */
1349    vp8_change_config(cpi, oxcf);
1350
1351    /* Initialize active best and worst q and average q values. */
1352    cpi->active_worst_quality         = cpi->oxcf.worst_allowed_q;
1353    cpi->active_best_quality          = cpi->oxcf.best_allowed_q;
1354    cpi->avg_frame_qindex             = cpi->oxcf.worst_allowed_q;
1355
1356    /* Initialise the starting buffer levels */
1357    cpi->buffer_level                 = cpi->oxcf.starting_buffer_level;
1358    cpi->bits_off_target              = cpi->oxcf.starting_buffer_level;
1359
1360    cpi->rolling_target_bits          = cpi->av_per_frame_bandwidth;
1361    cpi->rolling_actual_bits          = cpi->av_per_frame_bandwidth;
1362    cpi->long_rolling_target_bits     = cpi->av_per_frame_bandwidth;
1363    cpi->long_rolling_actual_bits     = cpi->av_per_frame_bandwidth;
1364
1365    cpi->total_actual_bits            = 0;
1366    cpi->total_target_vs_actual       = 0;
1367
1368    /* Temporal scalabilty */
1369    if (cpi->oxcf.number_of_layers > 1)
1370    {
1371        unsigned int i;
1372        double prev_layer_framerate=0;
1373
1374        for (i=0; i<cpi->oxcf.number_of_layers; i++)
1375        {
1376            init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
1377            prev_layer_framerate = cpi->output_framerate /
1378                                   cpi->oxcf.rate_decimator[i];
1379        }
1380    }
1381
1382#if VP8_TEMPORAL_ALT_REF
1383    {
1384        int i;
1385
1386        cpi->fixed_divide[0] = 0;
1387
1388        for (i = 1; i < 512; i++)
1389            cpi->fixed_divide[i] = 0x80000 / i;
1390    }
1391#endif
1392}
1393
1394static void update_layer_contexts (VP8_COMP *cpi)
1395{
1396    VP8_CONFIG *oxcf = &cpi->oxcf;
1397
1398    /* Update snapshots of the layer contexts to reflect new parameters */
1399    if (oxcf->number_of_layers > 1)
1400    {
1401        unsigned int i;
1402        double prev_layer_framerate=0;
1403
1404        assert(oxcf->number_of_layers <= VPX_TS_MAX_LAYERS);
1405        for (i=0; i<oxcf->number_of_layers; i++)
1406        {
1407            LAYER_CONTEXT *lc = &cpi->layer_context[i];
1408
1409            lc->framerate =
1410                cpi->ref_framerate / oxcf->rate_decimator[i];
1411            lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
1412
1413            lc->starting_buffer_level = rescale(
1414                          (int)oxcf->starting_buffer_level_in_ms,
1415                          lc->target_bandwidth, 1000);
1416
1417            if (oxcf->optimal_buffer_level == 0)
1418                lc->optimal_buffer_level = lc->target_bandwidth / 8;
1419            else
1420                lc->optimal_buffer_level = rescale(
1421                          (int)oxcf->optimal_buffer_level_in_ms,
1422                          lc->target_bandwidth, 1000);
1423
1424            if (oxcf->maximum_buffer_size == 0)
1425                lc->maximum_buffer_size = lc->target_bandwidth / 8;
1426            else
1427                lc->maximum_buffer_size = rescale(
1428                          (int)oxcf->maximum_buffer_size_in_ms,
1429                          lc->target_bandwidth, 1000);
1430
1431            /* Work out the average size of a frame within this layer */
1432            if (i > 0)
1433                lc->avg_frame_size_for_layer =
1434                   (int)((oxcf->target_bitrate[i] -
1435                          oxcf->target_bitrate[i-1]) * 1000 /
1436                          (lc->framerate - prev_layer_framerate));
1437
1438            prev_layer_framerate = lc->framerate;
1439        }
1440    }
1441}
1442
1443void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
1444{
1445    VP8_COMMON *cm = &cpi->common;
1446    int last_w, last_h;
1447    uint32_t prev_number_of_layers;
1448
1449    if (!cpi)
1450        return;
1451
1452    if (!oxcf)
1453        return;
1454
1455#if CONFIG_MULTITHREAD
1456    /*  wait for the last picture loopfilter thread done */
1457    if (cpi->b_lpf_running)
1458    {
1459        sem_wait(&cpi->h_event_end_lpf);
1460        cpi->b_lpf_running = 0;
1461    }
1462#endif
1463
1464    if (cm->version != oxcf->Version)
1465    {
1466        cm->version = oxcf->Version;
1467        vp8_setup_version(cm);
1468    }
1469
1470    last_w = cpi->oxcf.Width;
1471    last_h = cpi->oxcf.Height;
1472    prev_number_of_layers = cpi->oxcf.number_of_layers;
1473
1474    cpi->oxcf = *oxcf;
1475
1476    switch (cpi->oxcf.Mode)
1477    {
1478
1479    case MODE_REALTIME:
1480        cpi->pass = 0;
1481        cpi->compressor_speed = 2;
1482
1483        if (cpi->oxcf.cpu_used < -16)
1484        {
1485            cpi->oxcf.cpu_used = -16;
1486        }
1487
1488        if (cpi->oxcf.cpu_used > 16)
1489            cpi->oxcf.cpu_used = 16;
1490
1491        break;
1492
1493    case MODE_GOODQUALITY:
1494        cpi->pass = 0;
1495        cpi->compressor_speed = 1;
1496
1497        if (cpi->oxcf.cpu_used < -5)
1498        {
1499            cpi->oxcf.cpu_used = -5;
1500        }
1501
1502        if (cpi->oxcf.cpu_used > 5)
1503            cpi->oxcf.cpu_used = 5;
1504
1505        break;
1506
1507    case MODE_BESTQUALITY:
1508        cpi->pass = 0;
1509        cpi->compressor_speed = 0;
1510        break;
1511
1512    case MODE_FIRSTPASS:
1513        cpi->pass = 1;
1514        cpi->compressor_speed = 1;
1515        break;
1516    case MODE_SECONDPASS:
1517        cpi->pass = 2;
1518        cpi->compressor_speed = 1;
1519
1520        if (cpi->oxcf.cpu_used < -5)
1521        {
1522            cpi->oxcf.cpu_used = -5;
1523        }
1524
1525        if (cpi->oxcf.cpu_used > 5)
1526            cpi->oxcf.cpu_used = 5;
1527
1528        break;
1529    case MODE_SECONDPASS_BEST:
1530        cpi->pass = 2;
1531        cpi->compressor_speed = 0;
1532        break;
1533    }
1534
1535    if (cpi->pass == 0)
1536        cpi->auto_worst_q = 1;
1537
1538    cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1539    cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1540    cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1541
1542    if (oxcf->fixed_q >= 0)
1543    {
1544        if (oxcf->worst_allowed_q < 0)
1545            cpi->oxcf.fixed_q = q_trans[0];
1546        else
1547            cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1548
1549        if (oxcf->alt_q < 0)
1550            cpi->oxcf.alt_q = q_trans[0];
1551        else
1552            cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1553
1554        if (oxcf->key_q < 0)
1555            cpi->oxcf.key_q = q_trans[0];
1556        else
1557            cpi->oxcf.key_q = q_trans[oxcf->key_q];
1558
1559        if (oxcf->gold_q < 0)
1560            cpi->oxcf.gold_q = q_trans[0];
1561        else
1562            cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1563
1564    }
1565
1566    cpi->baseline_gf_interval =
1567        cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1568
1569    cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
1570
1571    cm->refresh_golden_frame = 0;
1572    cm->refresh_last_frame = 1;
1573    cm->refresh_entropy_probs = 1;
1574
1575#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
1576    cpi->oxcf.token_partitions = 3;
1577#endif
1578
1579    if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
1580        cm->multi_token_partition =
1581            (TOKEN_PARTITION) cpi->oxcf.token_partitions;
1582
1583    setup_features(cpi);
1584
1585    {
1586        int i;
1587
1588        for (i = 0; i < MAX_MB_SEGMENTS; i++)
1589            cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1590    }
1591
1592    /* At the moment the first order values may not be > MAXQ */
1593    if (cpi->oxcf.fixed_q > MAXQ)
1594        cpi->oxcf.fixed_q = MAXQ;
1595
1596    /* local file playback mode == really big buffer */
1597    if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
1598    {
1599        cpi->oxcf.starting_buffer_level       = 60000;
1600        cpi->oxcf.optimal_buffer_level        = 60000;
1601        cpi->oxcf.maximum_buffer_size         = 240000;
1602        cpi->oxcf.starting_buffer_level_in_ms = 60000;
1603        cpi->oxcf.optimal_buffer_level_in_ms  = 60000;
1604        cpi->oxcf.maximum_buffer_size_in_ms   = 240000;
1605    }
1606
1607    /* Convert target bandwidth from Kbit/s to Bit/s */
1608    cpi->oxcf.target_bandwidth       *= 1000;
1609
1610    cpi->oxcf.starting_buffer_level =
1611        rescale((int)cpi->oxcf.starting_buffer_level,
1612                cpi->oxcf.target_bandwidth, 1000);
1613
1614    /* Set or reset optimal and maximum buffer levels. */
1615    if (cpi->oxcf.optimal_buffer_level == 0)
1616        cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1617    else
1618        cpi->oxcf.optimal_buffer_level =
1619            rescale((int)cpi->oxcf.optimal_buffer_level,
1620                    cpi->oxcf.target_bandwidth, 1000);
1621
1622    if (cpi->oxcf.maximum_buffer_size == 0)
1623        cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1624    else
1625        cpi->oxcf.maximum_buffer_size =
1626            rescale((int)cpi->oxcf.maximum_buffer_size,
1627                    cpi->oxcf.target_bandwidth, 1000);
1628    // Under a configuration change, where maximum_buffer_size may change,
1629    // keep buffer level clipped to the maximum allowed buffer size.
1630    if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
1631      cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
1632      cpi->buffer_level = cpi->bits_off_target;
1633    }
1634
1635    /* Set up frame rate and related parameters rate control values. */
1636    vp8_new_framerate(cpi, cpi->framerate);
1637
1638    /* Set absolute upper and lower quality limits */
1639    cpi->worst_quality               = cpi->oxcf.worst_allowed_q;
1640    cpi->best_quality                = cpi->oxcf.best_allowed_q;
1641
1642    /* active values should only be modified if out of new range */
1643    if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
1644    {
1645      cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1646    }
1647    /* less likely */
1648    else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
1649    {
1650      cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1651    }
1652    if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
1653    {
1654      cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1655    }
1656    /* less likely */
1657    else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
1658    {
1659      cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1660    }
1661
1662    cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
1663
1664    cpi->cq_target_quality = cpi->oxcf.cq_level;
1665
1666    /* Only allow dropped frames in buffered mode */
1667    cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1668
1669    cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1670
1671    // Check if the number of temporal layers has changed, and if so reset the
1672    // pattern counter and set/initialize the temporal layer context for the
1673    // new layer configuration.
1674    if (cpi->oxcf.number_of_layers != prev_number_of_layers)
1675    {
1676        // If the number of temporal layers are changed we must start at the
1677        // base of the pattern cycle, so reset temporal_pattern_counter.
1678        cpi->temporal_pattern_counter = 0;
1679        reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
1680    }
1681
1682    cm->Width       = cpi->oxcf.Width;
1683    cm->Height      = cpi->oxcf.Height;
1684
1685    /* TODO(jkoleszar): if an internal spatial resampling is active,
1686     * and we downsize the input image, maybe we should clear the
1687     * internal scale immediately rather than waiting for it to
1688     * correct.
1689     */
1690
1691    /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
1692    if (cpi->oxcf.Sharpness > 7)
1693        cpi->oxcf.Sharpness = 7;
1694
1695    cm->sharpness_level = cpi->oxcf.Sharpness;
1696
1697    if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
1698    {
1699        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
1700        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
1701
1702        Scale2Ratio(cm->horiz_scale, &hr, &hs);
1703        Scale2Ratio(cm->vert_scale, &vr, &vs);
1704
1705        /* always go to the next whole number */
1706        cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1707        cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1708    }
1709
1710    if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height)
1711        cpi->force_next_frame_intra = 1;
1712
1713    if (((cm->Width + 15) & 0xfffffff0) !=
1714          (uint32_t)(cm->yv12_fb[cm->lst_fb_idx].y_width) ||
1715        ((cm->Height + 15) & 0xfffffff0) !=
1716          (uint32_t)(cm->yv12_fb[cm->lst_fb_idx].y_height) ||
1717        cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
1718    {
1719        dealloc_raw_frame_buffers(cpi);
1720        alloc_raw_frame_buffers(cpi);
1721        vp8_alloc_compressor_data(cpi);
1722    }
1723
1724    if (cpi->oxcf.fixed_q >= 0)
1725    {
1726        cpi->last_q[0] = cpi->oxcf.fixed_q;
1727        cpi->last_q[1] = cpi->oxcf.fixed_q;
1728    }
1729
1730    cpi->Speed = cpi->oxcf.cpu_used;
1731
1732    /* force to allowlag to 0 if lag_in_frames is 0; */
1733    if (cpi->oxcf.lag_in_frames == 0)
1734    {
1735        cpi->oxcf.allow_lag = 0;
1736    }
1737    /* Limit on lag buffers as these are not currently dynamically allocated */
1738    else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
1739        cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1740
1741    /* YX Temp */
1742    cpi->alt_ref_source = NULL;
1743    cpi->is_src_frame_alt_ref = 0;
1744
1745#if CONFIG_TEMPORAL_DENOISING
1746    if (cpi->oxcf.noise_sensitivity)
1747    {
1748      if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc)
1749      {
1750        int width = (cpi->oxcf.Width + 15) & ~15;
1751        int height = (cpi->oxcf.Height + 15) & ~15;
1752        vp8_denoiser_allocate(&cpi->denoiser, width, height);
1753      }
1754    }
1755#endif
1756
1757#if 0
1758    /* Experimental RD Code */
1759    cpi->frame_distortion = 0;
1760    cpi->last_frame_distortion = 0;
1761#endif
1762
1763}
1764
1765#define M_LOG2_E 0.693147180559945309417
1766#define log2f(x) (log (x) / (float) M_LOG2_E)
1767static void cal_mvsadcosts(int *mvsadcost[2])
1768{
1769    int i = 1;
1770
1771    mvsadcost [0] [0] = 300;
1772    mvsadcost [1] [0] = 300;
1773
1774    do
1775    {
1776        double z = 256 * (2 * (log2f(8 * i) + .6));
1777        mvsadcost [0][i] = (int) z;
1778        mvsadcost [1][i] = (int) z;
1779        mvsadcost [0][-i] = (int) z;
1780        mvsadcost [1][-i] = (int) z;
1781    }
1782    while (++i <= mvfp_max);
1783}
1784
1785struct VP8_COMP* vp8_create_compressor(VP8_CONFIG *oxcf)
1786{
1787    int i;
1788
1789    VP8_COMP *cpi;
1790    VP8_COMMON *cm;
1791
1792    cpi = vpx_memalign(32, sizeof(VP8_COMP));
1793    /* Check that the CPI instance is valid */
1794    if (!cpi)
1795        return 0;
1796
1797    cm = &cpi->common;
1798
1799    vpx_memset(cpi, 0, sizeof(VP8_COMP));
1800
1801    if (setjmp(cm->error.jmp))
1802    {
1803        cpi->common.error.setjmp = 0;
1804        vp8_remove_compressor(&cpi);
1805        return 0;
1806    }
1807
1808    cpi->common.error.setjmp = 1;
1809
1810    CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));
1811
1812    vp8_create_common(&cpi->common);
1813
1814    init_config(cpi, oxcf);
1815
1816    memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
1817    cpi->common.current_video_frame   = 0;
1818    cpi->temporal_pattern_counter     = 0;
1819    cpi->kf_overspend_bits            = 0;
1820    cpi->kf_bitrate_adjustment        = 0;
1821    cpi->frames_till_gf_update_due      = 0;
1822    cpi->gf_overspend_bits            = 0;
1823    cpi->non_gf_bitrate_adjustment     = 0;
1824    cpi->prob_last_coded              = 128;
1825    cpi->prob_gf_coded                = 128;
1826    cpi->prob_intra_coded             = 63;
1827
1828    /* Prime the recent reference frame usage counters.
1829     * Hereafter they will be maintained as a sort of moving average
1830     */
1831    cpi->recent_ref_frame_usage[INTRA_FRAME]  = 1;
1832    cpi->recent_ref_frame_usage[LAST_FRAME]   = 1;
1833    cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1834    cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1835
1836    /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
1837    cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1838
1839    cpi->twopass.gf_decay_rate = 0;
1840    cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1841
1842    cpi->gold_is_last = 0 ;
1843    cpi->alt_is_last  = 0 ;
1844    cpi->gold_is_alt  = 0 ;
1845
1846    cpi->active_map_enabled = 0;
1847
1848#if 0
1849    /* Experimental code for lagged and one pass */
1850    /* Initialise one_pass GF frames stats */
1851    /* Update stats used for GF selection */
1852    if (cpi->pass == 0)
1853    {
1854        cpi->one_pass_frame_index = 0;
1855
1856        for (i = 0; i < MAX_LAG_BUFFERS; i++)
1857        {
1858            cpi->one_pass_frame_stats[i].frames_so_far = 0;
1859            cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1860            cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1861            cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1862            cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1863            cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1864            cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1865            cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1866            cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1867        }
1868    }
1869#endif
1870
1871    /* Should we use the cyclic refresh method.
1872     * Currently this is tied to error resilliant mode
1873     */
1874    cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
1875    cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 5;
1876    cpi->cyclic_refresh_mode_index = 0;
1877    cpi->cyclic_refresh_q = 32;
1878
1879    if (cpi->cyclic_refresh_mode_enabled)
1880    {
1881        CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1882    }
1883    else
1884        cpi->cyclic_refresh_map = (signed char *) NULL;
1885
1886#ifdef VP8_ENTROPY_STATS
1887    init_context_counters();
1888#endif
1889
1890    /*Initialize the feed-forward activity masking.*/
1891    cpi->activity_avg = 90<<12;
1892
1893    /* Give a sensible default for the first frame. */
1894    cpi->frames_since_key = 8;
1895    cpi->key_frame_frequency = cpi->oxcf.key_freq;
1896    cpi->this_key_frame_forced = 0;
1897    cpi->next_key_frame_forced = 0;
1898
1899    cpi->source_alt_ref_pending = 0;
1900    cpi->source_alt_ref_active = 0;
1901    cpi->common.refresh_alt_ref_frame = 0;
1902
1903    cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1904#if CONFIG_INTERNAL_STATS
1905    cpi->b_calculate_ssimg = 0;
1906
1907    cpi->count = 0;
1908    cpi->bytes = 0;
1909
1910    if (cpi->b_calculate_psnr)
1911    {
1912        cpi->total_sq_error = 0.0;
1913        cpi->total_sq_error2 = 0.0;
1914        cpi->total_y = 0.0;
1915        cpi->total_u = 0.0;
1916        cpi->total_v = 0.0;
1917        cpi->total = 0.0;
1918        cpi->totalp_y = 0.0;
1919        cpi->totalp_u = 0.0;
1920        cpi->totalp_v = 0.0;
1921        cpi->totalp = 0.0;
1922        cpi->tot_recode_hits = 0;
1923        cpi->summed_quality = 0;
1924        cpi->summed_weights = 0;
1925    }
1926
1927    if (cpi->b_calculate_ssimg)
1928    {
1929        cpi->total_ssimg_y = 0;
1930        cpi->total_ssimg_u = 0;
1931        cpi->total_ssimg_v = 0;
1932        cpi->total_ssimg_all = 0;
1933    }
1934
1935#endif
1936
1937    cpi->first_time_stamp_ever = 0x7FFFFFFF;
1938
1939    cpi->frames_till_gf_update_due      = 0;
1940    cpi->key_frame_count              = 1;
1941
1942    cpi->ni_av_qi                     = cpi->oxcf.worst_allowed_q;
1943    cpi->ni_tot_qi                    = 0;
1944    cpi->ni_frames                   = 0;
1945    cpi->total_byte_count             = 0;
1946
1947    cpi->drop_frame                  = 0;
1948
1949    cpi->rate_correction_factor         = 1.0;
1950    cpi->key_frame_rate_correction_factor = 1.0;
1951    cpi->gf_rate_correction_factor  = 1.0;
1952    cpi->twopass.est_max_qcorrection_factor  = 1.0;
1953
1954    for (i = 0; i < KEY_FRAME_CONTEXT; i++)
1955    {
1956        cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
1957    }
1958
1959#ifdef OUTPUT_YUV_SRC
1960    yuv_file = fopen("bd.yuv", "ab");
1961#endif
1962
1963#if 0
1964    framepsnr = fopen("framepsnr.stt", "a");
1965    kf_list = fopen("kf_list.stt", "w");
1966#endif
1967
1968    cpi->output_pkt_list = oxcf->output_pkt_list;
1969
1970#if !(CONFIG_REALTIME_ONLY)
1971
1972    if (cpi->pass == 1)
1973    {
1974        vp8_init_first_pass(cpi);
1975    }
1976    else if (cpi->pass == 2)
1977    {
1978        size_t packet_sz = sizeof(FIRSTPASS_STATS);
1979        int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
1980
1981        cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1982        cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1983        cpi->twopass.stats_in_end = (void*)((char *)cpi->twopass.stats_in
1984                            + (packets - 1) * packet_sz);
1985        vp8_init_second_pass(cpi);
1986    }
1987
1988#endif
1989
1990    if (cpi->compressor_speed == 2)
1991    {
1992        cpi->avg_encode_time      = 0;
1993        cpi->avg_pick_mode_time    = 0;
1994    }
1995
1996    vp8_set_speed_features(cpi);
1997
1998    /* Set starting values of RD threshold multipliers (128 = *1) */
1999    for (i = 0; i < MAX_MODES; i++)
2000    {
2001        cpi->mb.rd_thresh_mult[i] = 128;
2002    }
2003
2004#ifdef VP8_ENTROPY_STATS
2005    init_mv_ref_counts();
2006#endif
2007
2008#if CONFIG_MULTITHREAD
2009    if(vp8cx_create_encoder_threads(cpi))
2010    {
2011        vp8_remove_compressor(&cpi);
2012        return 0;
2013    }
2014#endif
2015
2016    cpi->fn_ptr[BLOCK_16X16].sdf            = vp8_sad16x16;
2017    cpi->fn_ptr[BLOCK_16X16].vf             = vp8_variance16x16;
2018    cpi->fn_ptr[BLOCK_16X16].svf            = vp8_sub_pixel_variance16x16;
2019    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h  = vp8_variance_halfpixvar16x16_h;
2020    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v  = vp8_variance_halfpixvar16x16_v;
2021    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = vp8_variance_halfpixvar16x16_hv;
2022    cpi->fn_ptr[BLOCK_16X16].sdx3f          = vp8_sad16x16x3;
2023    cpi->fn_ptr[BLOCK_16X16].sdx8f          = vp8_sad16x16x8;
2024    cpi->fn_ptr[BLOCK_16X16].sdx4df         = vp8_sad16x16x4d;
2025
2026    cpi->fn_ptr[BLOCK_16X8].sdf            = vp8_sad16x8;
2027    cpi->fn_ptr[BLOCK_16X8].vf             = vp8_variance16x8;
2028    cpi->fn_ptr[BLOCK_16X8].svf            = vp8_sub_pixel_variance16x8;
2029    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h  = NULL;
2030    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v  = NULL;
2031    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
2032    cpi->fn_ptr[BLOCK_16X8].sdx3f          = vp8_sad16x8x3;
2033    cpi->fn_ptr[BLOCK_16X8].sdx8f          = vp8_sad16x8x8;
2034    cpi->fn_ptr[BLOCK_16X8].sdx4df         = vp8_sad16x8x4d;
2035
2036    cpi->fn_ptr[BLOCK_8X16].sdf            = vp8_sad8x16;
2037    cpi->fn_ptr[BLOCK_8X16].vf             = vp8_variance8x16;
2038    cpi->fn_ptr[BLOCK_8X16].svf            = vp8_sub_pixel_variance8x16;
2039    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h  = NULL;
2040    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v  = NULL;
2041    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
2042    cpi->fn_ptr[BLOCK_8X16].sdx3f          = vp8_sad8x16x3;
2043    cpi->fn_ptr[BLOCK_8X16].sdx8f          = vp8_sad8x16x8;
2044    cpi->fn_ptr[BLOCK_8X16].sdx4df         = vp8_sad8x16x4d;
2045
2046    cpi->fn_ptr[BLOCK_8X8].sdf            = vp8_sad8x8;
2047    cpi->fn_ptr[BLOCK_8X8].vf             = vp8_variance8x8;
2048    cpi->fn_ptr[BLOCK_8X8].svf            = vp8_sub_pixel_variance8x8;
2049    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h  = NULL;
2050    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v  = NULL;
2051    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
2052    cpi->fn_ptr[BLOCK_8X8].sdx3f          = vp8_sad8x8x3;
2053    cpi->fn_ptr[BLOCK_8X8].sdx8f          = vp8_sad8x8x8;
2054    cpi->fn_ptr[BLOCK_8X8].sdx4df         = vp8_sad8x8x4d;
2055
2056    cpi->fn_ptr[BLOCK_4X4].sdf            = vp8_sad4x4;
2057    cpi->fn_ptr[BLOCK_4X4].vf             = vp8_variance4x4;
2058    cpi->fn_ptr[BLOCK_4X4].svf            = vp8_sub_pixel_variance4x4;
2059    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h  = NULL;
2060    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v  = NULL;
2061    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
2062    cpi->fn_ptr[BLOCK_4X4].sdx3f          = vp8_sad4x4x3;
2063    cpi->fn_ptr[BLOCK_4X4].sdx8f          = vp8_sad4x4x8;
2064    cpi->fn_ptr[BLOCK_4X4].sdx4df         = vp8_sad4x4x4d;
2065
2066#if ARCH_X86_32 || ARCH_X86_64
2067    cpi->fn_ptr[BLOCK_16X16].copymem      = vp8_copy32xn;
2068    cpi->fn_ptr[BLOCK_16X8].copymem       = vp8_copy32xn;
2069    cpi->fn_ptr[BLOCK_8X16].copymem       = vp8_copy32xn;
2070    cpi->fn_ptr[BLOCK_8X8].copymem        = vp8_copy32xn;
2071    cpi->fn_ptr[BLOCK_4X4].copymem        = vp8_copy32xn;
2072#endif
2073
2074    cpi->full_search_sad = vp8_full_search_sad;
2075    cpi->diamond_search_sad = vp8_diamond_search_sad;
2076    cpi->refining_search_sad = vp8_refining_search_sad;
2077
2078    /* make sure frame 1 is okay */
2079    cpi->mb.error_bins[0] = cpi->common.MBs;
2080
2081    /* vp8cx_init_quantizer() is first called here. Add check in
2082     * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
2083     * called later when needed. This will avoid unnecessary calls of
2084     * vp8cx_init_quantizer() for every frame.
2085     */
2086    vp8cx_init_quantizer(cpi);
2087
2088    vp8_loop_filter_init(cm);
2089
2090    cpi->common.error.setjmp = 0;
2091
2092#if CONFIG_MULTI_RES_ENCODING
2093
2094    /* Calculate # of MBs in a row in lower-resolution level image. */
2095    if (cpi->oxcf.mr_encoder_id > 0)
2096        vp8_cal_low_res_mb_cols(cpi);
2097
2098#endif
2099
2100    /* setup RD costs to MACROBLOCK struct */
2101
2102    cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max+1];
2103    cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max+1];
2104    cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max+1];
2105    cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max+1];
2106
2107    cal_mvsadcosts(cpi->mb.mvsadcost);
2108
2109    cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
2110    cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
2111    cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
2112    cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
2113    cpi->mb.token_costs = cpi->rd_costs.token_costs;
2114
2115    /* setup block ptrs & offsets */
2116    vp8_setup_block_ptrs(&cpi->mb);
2117    vp8_setup_block_dptrs(&cpi->mb.e_mbd);
2118
2119    return  cpi;
2120}
2121
2122
2123void vp8_remove_compressor(VP8_COMP **ptr)
2124{
2125    VP8_COMP *cpi = *ptr;
2126
2127    if (!cpi)
2128        return;
2129
2130    if (cpi && (cpi->common.current_video_frame > 0))
2131    {
2132#if !(CONFIG_REALTIME_ONLY)
2133
2134        if (cpi->pass == 2)
2135        {
2136            vp8_end_second_pass(cpi);
2137        }
2138
2139#endif
2140
2141#ifdef VP8_ENTROPY_STATS
2142        print_context_counters();
2143        print_tree_update_probs();
2144        print_mode_context();
2145#endif
2146
2147#if CONFIG_INTERNAL_STATS
2148
2149        if (cpi->pass != 1)
2150        {
2151            FILE *f = fopen("opsnr.stt", "a");
2152            double time_encoded = (cpi->last_end_time_stamp_seen
2153                                   - cpi->first_time_stamp_ever) / 10000000.000;
2154            double total_encode_time = (cpi->time_receive_data +
2155                                            cpi->time_compress_data) / 1000.000;
2156            double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
2157
2158            if (cpi->b_calculate_psnr)
2159            {
2160                YV12_BUFFER_CONFIG *lst_yv12 =
2161                              &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
2162
2163                if (cpi->oxcf.number_of_layers > 1)
2164                {
2165                    int i;
2166
2167                    fprintf(f, "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2168                               "GLPsnrP\tVPXSSIM\t\n");
2169                    for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
2170                    {
2171                        double dr = (double)cpi->bytes_in_layer[i] *
2172                                              8.0 / 1000.0  / time_encoded;
2173                        double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
2174                                         lst_yv12->y_width * lst_yv12->y_height;
2175                        double total_psnr =
2176                            vpx_sse_to_psnr(samples, 255.0,
2177                                            cpi->total_error2[i]);
2178                        double total_psnr2 =
2179                            vpx_sse_to_psnr(samples, 255.0,
2180                                            cpi->total_error2_p[i]);
2181                        double total_ssim = 100 * pow(cpi->sum_ssim[i] /
2182                                                      cpi->sum_weights[i], 8.0);
2183
2184                        fprintf(f, "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2185                                   "%7.3f\t%7.3f\n",
2186                                   i, dr,
2187                                   cpi->sum_psnr[i] / cpi->frames_in_layer[i],
2188                                   total_psnr,
2189                                   cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
2190                                   total_psnr2, total_ssim);
2191                    }
2192                }
2193                else
2194                {
2195                    double samples = 3.0 / 2 * cpi->count *
2196                                        lst_yv12->y_width * lst_yv12->y_height;
2197                    double total_psnr = vpx_sse_to_psnr(samples, 255.0,
2198                                                        cpi->total_sq_error);
2199                    double total_psnr2 = vpx_sse_to_psnr(samples, 255.0,
2200                                                         cpi->total_sq_error2);
2201                    double total_ssim = 100 * pow(cpi->summed_quality /
2202                                                      cpi->summed_weights, 8.0);
2203
2204                    fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2205                               "GLPsnrP\tVPXSSIM\t  Time(us)\n");
2206                    fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2207                               "%7.3f\t%8.0f\n",
2208                               dr, cpi->total / cpi->count, total_psnr,
2209                               cpi->totalp / cpi->count, total_psnr2,
2210                               total_ssim, total_encode_time);
2211                }
2212            }
2213
2214            if (cpi->b_calculate_ssimg)
2215            {
2216                if (cpi->oxcf.number_of_layers > 1)
2217                {
2218                    int i;
2219
2220                    fprintf(f, "Layer\tBitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
2221                               "Time(us)\n");
2222                    for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
2223                    {
2224                        double dr = (double)cpi->bytes_in_layer[i] *
2225                                    8.0 / 1000.0  / time_encoded;
2226                        fprintf(f, "%5d\t%7.3f\t%6.4f\t"
2227                                "%6.4f\t%6.4f\t%6.4f\t%8.0f\n",
2228                                i, dr,
2229                                cpi->total_ssimg_y_in_layer[i] /
2230                                     cpi->frames_in_layer[i],
2231                                cpi->total_ssimg_u_in_layer[i] /
2232                                     cpi->frames_in_layer[i],
2233                                cpi->total_ssimg_v_in_layer[i] /
2234                                     cpi->frames_in_layer[i],
2235                                cpi->total_ssimg_all_in_layer[i] /
2236                                     cpi->frames_in_layer[i],
2237                                total_encode_time);
2238                    }
2239                }
2240                else
2241                {
2242                    fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
2243                               "Time(us)\n");
2244                    fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
2245                            cpi->total_ssimg_y / cpi->count,
2246                            cpi->total_ssimg_u / cpi->count,
2247                            cpi->total_ssimg_v / cpi->count,
2248                            cpi->total_ssimg_all / cpi->count, total_encode_time);
2249                }
2250            }
2251
2252            fclose(f);
2253#if 0
2254            f = fopen("qskip.stt", "a");
2255            fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2256            fclose(f);
2257#endif
2258
2259        }
2260
2261#endif
2262
2263
2264#ifdef SPEEDSTATS
2265
2266        if (cpi->compressor_speed == 2)
2267        {
2268            int i;
2269            FILE *f = fopen("cxspeed.stt", "a");
2270            cnt_pm /= cpi->common.MBs;
2271
2272            for (i = 0; i < 16; i++)
2273                fprintf(f, "%5d", frames_at_speed[i]);
2274
2275            fprintf(f, "\n");
2276            fclose(f);
2277        }
2278
2279#endif
2280
2281
2282#ifdef MODE_STATS
2283        {
2284            extern int count_mb_seg[4];
2285            FILE *f = fopen("modes.stt", "a");
2286            double dr = (double)cpi->framerate * (double)bytes * (double)8 / (double)count / (double)1000 ;
2287            fprintf(f, "intra_mode in Intra Frames:\n");
2288            fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
2289            fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
2290            fprintf(f, "B: ");
2291            {
2292                int i;
2293
2294                for (i = 0; i < 10; i++)
2295                    fprintf(f, "%8d, ", b_modes[i]);
2296
2297                fprintf(f, "\n");
2298
2299            }
2300
2301            fprintf(f, "Modes in Inter Frames:\n");
2302            fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2303                    inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
2304                    inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
2305            fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2306            fprintf(f, "B: ");
2307            {
2308                int i;
2309
2310                for (i = 0; i < 15; i++)
2311                    fprintf(f, "%8d, ", inter_b_modes[i]);
2312
2313                fprintf(f, "\n");
2314
2315            }
2316            fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
2317            fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);
2318
2319
2320
2321            fclose(f);
2322        }
2323#endif
2324
2325#ifdef VP8_ENTROPY_STATS
2326        {
2327            int i, j, k;
2328            FILE *fmode = fopen("modecontext.c", "w");
2329
2330            fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
2331            fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
2332            fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
2333
2334            for (i = 0; i < 10; i++)
2335            {
2336
2337                fprintf(fmode, "    { /* Above Mode :  %d */\n", i);
2338
2339                for (j = 0; j < 10; j++)
2340                {
2341
2342                    fprintf(fmode, "        {");
2343
2344                    for (k = 0; k < 10; k++)
2345                    {
2346                        if (!intra_mode_stats[i][j][k])
2347                            fprintf(fmode, " %5d, ", 1);
2348                        else
2349                            fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2350                    }
2351
2352                    fprintf(fmode, "}, /* left_mode %d */\n", j);
2353
2354                }
2355
2356                fprintf(fmode, "    },\n");
2357
2358            }
2359
2360            fprintf(fmode, "};\n");
2361            fclose(fmode);
2362        }
2363#endif
2364
2365
2366#if defined(SECTIONBITS_OUTPUT)
2367
2368        if (0)
2369        {
2370            int i;
2371            FILE *f = fopen("tokenbits.stt", "a");
2372
2373            for (i = 0; i < 28; i++)
2374                fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2375
2376            fprintf(f, "\n");
2377            fclose(f);
2378        }
2379
2380#endif
2381
2382#if 0
2383        {
2384            printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2385            printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
2386            printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame, cpi->time_receive_data / 1000, cpi->time_encode_mb_row / 1000, cpi->time_compress_data / 1000, (cpi->time_receive_data + cpi->time_compress_data) / 1000);
2387        }
2388#endif
2389
2390    }
2391
2392#if CONFIG_MULTITHREAD
2393    vp8cx_remove_encoder_threads(cpi);
2394#endif
2395
2396#if CONFIG_TEMPORAL_DENOISING
2397    vp8_denoiser_free(&cpi->denoiser);
2398#endif
2399    dealloc_compressor_data(cpi);
2400    vpx_free(cpi->mb.ss);
2401    vpx_free(cpi->tok);
2402    vpx_free(cpi->cyclic_refresh_map);
2403
2404    vp8_remove_common(&cpi->common);
2405    vpx_free(cpi);
2406    *ptr = 0;
2407
2408#ifdef OUTPUT_YUV_SRC
2409    fclose(yuv_file);
2410#endif
2411
2412#if 0
2413
2414    if (keyfile)
2415        fclose(keyfile);
2416
2417    if (framepsnr)
2418        fclose(framepsnr);
2419
2420    if (kf_list)
2421        fclose(kf_list);
2422
2423#endif
2424
2425}
2426
2427
2428static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2429                                 unsigned char *recon, int recon_stride,
2430                                 unsigned int cols, unsigned int rows)
2431{
2432    unsigned int row, col;
2433    uint64_t total_sse = 0;
2434    int diff;
2435
2436    for (row = 0; row + 16 <= rows; row += 16)
2437    {
2438        for (col = 0; col + 16 <= cols; col += 16)
2439        {
2440            unsigned int sse;
2441
2442            vp8_mse16x16(orig + col, orig_stride,
2443                                            recon + col, recon_stride,
2444                                            &sse);
2445            total_sse += sse;
2446        }
2447
2448        /* Handle odd-sized width */
2449        if (col < cols)
2450        {
2451            unsigned int   border_row, border_col;
2452            unsigned char *border_orig = orig;
2453            unsigned char *border_recon = recon;
2454
2455            for (border_row = 0; border_row < 16; border_row++)
2456            {
2457                for (border_col = col; border_col < cols; border_col++)
2458                {
2459                    diff = border_orig[border_col] - border_recon[border_col];
2460                    total_sse += diff * diff;
2461                }
2462
2463                border_orig += orig_stride;
2464                border_recon += recon_stride;
2465            }
2466        }
2467
2468        orig += orig_stride * 16;
2469        recon += recon_stride * 16;
2470    }
2471
2472    /* Handle odd-sized height */
2473    for (; row < rows; row++)
2474    {
2475        for (col = 0; col < cols; col++)
2476        {
2477            diff = orig[col] - recon[col];
2478            total_sse += diff * diff;
2479        }
2480
2481        orig += orig_stride;
2482        recon += recon_stride;
2483    }
2484
2485    vp8_clear_system_state();
2486    return total_sse;
2487}
2488
2489
2490static void generate_psnr_packet(VP8_COMP *cpi)
2491{
2492    YV12_BUFFER_CONFIG      *orig = cpi->Source;
2493    YV12_BUFFER_CONFIG      *recon = cpi->common.frame_to_show;
2494    struct vpx_codec_cx_pkt  pkt;
2495    uint64_t                 sse;
2496    int                      i;
2497    unsigned int             width = cpi->common.Width;
2498    unsigned int             height = cpi->common.Height;
2499
2500    pkt.kind = VPX_CODEC_PSNR_PKT;
2501    sse = calc_plane_error(orig->y_buffer, orig->y_stride,
2502                           recon->y_buffer, recon->y_stride,
2503                           width, height);
2504    pkt.data.psnr.sse[0] = sse;
2505    pkt.data.psnr.sse[1] = sse;
2506    pkt.data.psnr.samples[0] = width * height;
2507    pkt.data.psnr.samples[1] = width * height;
2508
2509    width = (width + 1) / 2;
2510    height = (height + 1) / 2;
2511
2512    sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
2513                           recon->u_buffer, recon->uv_stride,
2514                           width, height);
2515    pkt.data.psnr.sse[0] += sse;
2516    pkt.data.psnr.sse[2] = sse;
2517    pkt.data.psnr.samples[0] += width * height;
2518    pkt.data.psnr.samples[2] = width * height;
2519
2520    sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
2521                           recon->v_buffer, recon->uv_stride,
2522                           width, height);
2523    pkt.data.psnr.sse[0] += sse;
2524    pkt.data.psnr.sse[3] = sse;
2525    pkt.data.psnr.samples[0] += width * height;
2526    pkt.data.psnr.samples[3] = width * height;
2527
2528    for (i = 0; i < 4; i++)
2529        pkt.data.psnr.psnr[i] = vpx_sse_to_psnr(pkt.data.psnr.samples[i], 255.0,
2530                                                (double)(pkt.data.psnr.sse[i]));
2531
2532    vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2533}
2534
2535
2536int vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags)
2537{
2538    if (ref_frame_flags > 7)
2539        return -1 ;
2540
2541    cpi->ref_frame_flags = ref_frame_flags;
2542    return 0;
2543}
2544int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags)
2545{
2546    if (ref_frame_flags > 7)
2547        return -1 ;
2548
2549    cpi->common.refresh_golden_frame = 0;
2550    cpi->common.refresh_alt_ref_frame = 0;
2551    cpi->common.refresh_last_frame   = 0;
2552
2553    if (ref_frame_flags & VP8_LAST_FRAME)
2554        cpi->common.refresh_last_frame = 1;
2555
2556    if (ref_frame_flags & VP8_GOLD_FRAME)
2557        cpi->common.refresh_golden_frame = 1;
2558
2559    if (ref_frame_flags & VP8_ALTR_FRAME)
2560        cpi->common.refresh_alt_ref_frame = 1;
2561
2562    return 0;
2563}
2564
2565int vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2566{
2567    VP8_COMMON *cm = &cpi->common;
2568    int ref_fb_idx;
2569
2570    if (ref_frame_flag == VP8_LAST_FRAME)
2571        ref_fb_idx = cm->lst_fb_idx;
2572    else if (ref_frame_flag == VP8_GOLD_FRAME)
2573        ref_fb_idx = cm->gld_fb_idx;
2574    else if (ref_frame_flag == VP8_ALTR_FRAME)
2575        ref_fb_idx = cm->alt_fb_idx;
2576    else
2577        return -1;
2578
2579    vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
2580
2581    return 0;
2582}
2583int vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2584{
2585    VP8_COMMON *cm = &cpi->common;
2586
2587    int ref_fb_idx;
2588
2589    if (ref_frame_flag == VP8_LAST_FRAME)
2590        ref_fb_idx = cm->lst_fb_idx;
2591    else if (ref_frame_flag == VP8_GOLD_FRAME)
2592        ref_fb_idx = cm->gld_fb_idx;
2593    else if (ref_frame_flag == VP8_ALTR_FRAME)
2594        ref_fb_idx = cm->alt_fb_idx;
2595    else
2596        return -1;
2597
2598    vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
2599
2600    return 0;
2601}
2602int vp8_update_entropy(VP8_COMP *cpi, int update)
2603{
2604    VP8_COMMON *cm = &cpi->common;
2605    cm->refresh_entropy_probs = update;
2606
2607    return 0;
2608}
2609
2610
2611#if OUTPUT_YUV_SRC
2612void vp8_write_yuv_frame(const char *name, YV12_BUFFER_CONFIG *s)
2613{
2614    FILE *yuv_file = fopen(name, "ab");
2615    unsigned char *src = s->y_buffer;
2616    int h = s->y_height;
2617
2618    do
2619    {
2620        fwrite(src, s->y_width, 1,  yuv_file);
2621        src += s->y_stride;
2622    }
2623    while (--h);
2624
2625    src = s->u_buffer;
2626    h = s->uv_height;
2627
2628    do
2629    {
2630        fwrite(src, s->uv_width, 1,  yuv_file);
2631        src += s->uv_stride;
2632    }
2633    while (--h);
2634
2635    src = s->v_buffer;
2636    h = s->uv_height;
2637
2638    do
2639    {
2640        fwrite(src, s->uv_width, 1, yuv_file);
2641        src += s->uv_stride;
2642    }
2643    while (--h);
2644
2645    fclose(yuv_file);
2646}
2647#endif
2648
2649
2650static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
2651{
2652    VP8_COMMON *cm = &cpi->common;
2653
2654    /* are we resizing the image */
2655    if (cm->horiz_scale != 0 || cm->vert_scale != 0)
2656    {
2657#if CONFIG_SPATIAL_RESAMPLING
2658        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2659        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2660        int tmp_height;
2661
2662        if (cm->vert_scale == 3)
2663            tmp_height = 9;
2664        else
2665            tmp_height = 11;
2666
2667        Scale2Ratio(cm->horiz_scale, &hr, &hs);
2668        Scale2Ratio(cm->vert_scale, &vr, &vs);
2669
2670        vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2671                        tmp_height, hs, hr, vs, vr, 0);
2672
2673        vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2674        cpi->Source = &cpi->scaled_source;
2675#endif
2676    }
2677    else
2678        cpi->Source = sd;
2679}
2680
2681
2682static int resize_key_frame(VP8_COMP *cpi)
2683{
2684#if CONFIG_SPATIAL_RESAMPLING
2685    VP8_COMMON *cm = &cpi->common;
2686
2687    /* Do we need to apply resampling for one pass cbr.
2688     * In one pass this is more limited than in two pass cbr.
2689     * The test and any change is only made once per key frame sequence.
2690     */
2691    if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
2692    {
2693        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2694        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2695        int new_width, new_height;
2696
2697        /* If we are below the resample DOWN watermark then scale down a
2698         * notch.
2699         */
2700        if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2701        {
2702            cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2703            cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2704        }
2705        /* Should we now start scaling back up */
2706        else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2707        {
2708            cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2709            cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2710        }
2711
2712        /* Get the new height and width */
2713        Scale2Ratio(cm->horiz_scale, &hr, &hs);
2714        Scale2Ratio(cm->vert_scale, &vr, &vs);
2715        new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2716        new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2717
2718        /* If the image size has changed we need to reallocate the buffers
2719         * and resample the source image
2720         */
2721        if ((cm->Width != new_width) || (cm->Height != new_height))
2722        {
2723            cm->Width = new_width;
2724            cm->Height = new_height;
2725            vp8_alloc_compressor_data(cpi);
2726            scale_and_extend_source(cpi->un_scaled_source, cpi);
2727            return 1;
2728        }
2729    }
2730
2731#endif
2732    return 0;
2733}
2734
2735
2736static void update_alt_ref_frame_stats(VP8_COMP *cpi)
2737{
2738    VP8_COMMON *cm = &cpi->common;
2739
2740    /* Select an interval before next GF or altref */
2741    if (!cpi->auto_gold)
2742        cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2743
2744    if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
2745    {
2746        cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2747
2748        /* Set the bits per frame that we should try and recover in
2749         * subsequent inter frames to account for the extra GF spend...
2750         * note that his does not apply for GF updates that occur
2751         * coincident with a key frame as the extra cost of key frames is
2752         * dealt with elsewhere.
2753         */
2754        cpi->gf_overspend_bits += cpi->projected_frame_size;
2755        cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2756    }
2757
2758    /* Update data structure that monitors level of reference to last GF */
2759    vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2760    cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2761
2762    /* this frame refreshes means next frames don't unless specified by user */
2763    cpi->frames_since_golden = 0;
2764
2765    /* Clear the alternate reference update pending flag. */
2766    cpi->source_alt_ref_pending = 0;
2767
2768    /* Set the alternate reference frame active flag */
2769    cpi->source_alt_ref_active = 1;
2770
2771
2772}
2773static void update_golden_frame_stats(VP8_COMP *cpi)
2774{
2775    VP8_COMMON *cm = &cpi->common;
2776
2777    /* Update the Golden frame usage counts. */
2778    if (cm->refresh_golden_frame)
2779    {
2780        /* Select an interval before next GF */
2781        if (!cpi->auto_gold)
2782            cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2783
2784        if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
2785        {
2786            cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2787
2788            /* Set the bits per frame that we should try and recover in
2789             * subsequent inter frames to account for the extra GF spend...
2790             * note that his does not apply for GF updates that occur
2791             * coincident with a key frame as the extra cost of key frames
2792             * is dealt with elsewhere.
2793             */
2794            if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
2795            {
2796                /* Calcluate GF bits to be recovered
2797                 * Projected size - av frame bits available for inter
2798                 * frames for clip as a whole
2799                 */
2800                cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
2801            }
2802
2803            cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2804
2805        }
2806
2807        /* Update data structure that monitors level of reference to last GF */
2808        vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2809        cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2810
2811        /* this frame refreshes means next frames don't unless specified by
2812         * user
2813         */
2814        cm->refresh_golden_frame = 0;
2815        cpi->frames_since_golden = 0;
2816
2817        cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2818        cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2819        cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2820        cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2821
2822        /* ******** Fixed Q test code only ************ */
2823        /* If we are going to use the ALT reference for the next group of
2824         * frames set a flag to say so.
2825         */
2826        if (cpi->oxcf.fixed_q >= 0 &&
2827            cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
2828        {
2829            cpi->source_alt_ref_pending = 1;
2830            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2831        }
2832
2833        if (!cpi->source_alt_ref_pending)
2834            cpi->source_alt_ref_active = 0;
2835
2836        /* Decrement count down till next gf */
2837        if (cpi->frames_till_gf_update_due > 0)
2838            cpi->frames_till_gf_update_due--;
2839
2840    }
2841    else if (!cpi->common.refresh_alt_ref_frame)
2842    {
2843        /* Decrement count down till next gf */
2844        if (cpi->frames_till_gf_update_due > 0)
2845            cpi->frames_till_gf_update_due--;
2846
2847        if (cpi->frames_till_alt_ref_frame)
2848            cpi->frames_till_alt_ref_frame --;
2849
2850        cpi->frames_since_golden ++;
2851
2852        if (cpi->frames_since_golden > 1)
2853        {
2854            cpi->recent_ref_frame_usage[INTRA_FRAME] +=
2855                cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
2856            cpi->recent_ref_frame_usage[LAST_FRAME] +=
2857                cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
2858            cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
2859                cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
2860            cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
2861                cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
2862        }
2863    }
2864}
2865
2866/* This function updates the reference frame probability estimates that
2867 * will be used during mode selection
2868 */
2869static void update_rd_ref_frame_probs(VP8_COMP *cpi)
2870{
2871    VP8_COMMON *cm = &cpi->common;
2872
2873    const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
2874    const int rf_intra = rfct[INTRA_FRAME];
2875    const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2876
2877    if (cm->frame_type == KEY_FRAME)
2878    {
2879        cpi->prob_intra_coded = 255;
2880        cpi->prob_last_coded  = 128;
2881        cpi->prob_gf_coded  = 128;
2882    }
2883    else if (!(rf_intra + rf_inter))
2884    {
2885        cpi->prob_intra_coded = 63;
2886        cpi->prob_last_coded  = 128;
2887        cpi->prob_gf_coded    = 128;
2888    }
2889
2890    /* update reference frame costs since we can do better than what we got
2891     * last frame.
2892     */
2893    if (cpi->oxcf.number_of_layers == 1)
2894    {
2895        if (cpi->common.refresh_alt_ref_frame)
2896        {
2897            cpi->prob_intra_coded += 40;
2898            if (cpi->prob_intra_coded > 255)
2899                cpi->prob_intra_coded = 255;
2900            cpi->prob_last_coded = 200;
2901            cpi->prob_gf_coded = 1;
2902        }
2903        else if (cpi->frames_since_golden == 0)
2904        {
2905            cpi->prob_last_coded = 214;
2906        }
2907        else if (cpi->frames_since_golden == 1)
2908        {
2909            cpi->prob_last_coded = 192;
2910            cpi->prob_gf_coded = 220;
2911        }
2912        else if (cpi->source_alt_ref_active)
2913        {
2914            cpi->prob_gf_coded -= 20;
2915
2916            if (cpi->prob_gf_coded < 10)
2917                cpi->prob_gf_coded = 10;
2918        }
2919        if (!cpi->source_alt_ref_active)
2920            cpi->prob_gf_coded = 255;
2921    }
2922}
2923
2924
2925/* 1 = key, 0 = inter */
2926static int decide_key_frame(VP8_COMP *cpi)
2927{
2928    VP8_COMMON *cm = &cpi->common;
2929
2930    int code_key_frame = 0;
2931
2932    cpi->kf_boost = 0;
2933
2934    if (cpi->Speed > 11)
2935        return 0;
2936
2937    /* Clear down mmx registers */
2938    vp8_clear_system_state();
2939
2940    if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
2941    {
2942        double change = 1.0 * abs((int)(cpi->mb.intra_error -
2943            cpi->last_intra_error)) / (1 + cpi->last_intra_error);
2944        double change2 = 1.0 * abs((int)(cpi->mb.prediction_error -
2945            cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
2946        double minerror = cm->MBs * 256;
2947
2948        cpi->last_intra_error = cpi->mb.intra_error;
2949        cpi->last_prediction_error = cpi->mb.prediction_error;
2950
2951        if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15
2952            && cpi->mb.prediction_error > minerror
2953            && (change > .25 || change2 > .25))
2954        {
2955            /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
2956            return 1;
2957        }
2958
2959        return 0;
2960
2961    }
2962
2963    /* If the following are true we might as well code a key frame */
2964    if (((cpi->this_frame_percent_intra == 100) &&
2965         (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
2966        ((cpi->this_frame_percent_intra > 95) &&
2967         (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
2968    {
2969        code_key_frame = 1;
2970    }
2971    /* in addition if the following are true and this is not a golden frame
2972     * then code a key frame Note that on golden frames there often seems
2973     * to be a pop in intra useage anyway hence this restriction is
2974     * designed to prevent spurious key frames. The Intra pop needs to be
2975     * investigated.
2976     */
2977    else if (((cpi->this_frame_percent_intra > 60) &&
2978              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
2979             ((cpi->this_frame_percent_intra > 75) &&
2980              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
2981             ((cpi->this_frame_percent_intra > 90) &&
2982              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
2983    {
2984        if (!cm->refresh_golden_frame)
2985            code_key_frame = 1;
2986    }
2987
2988    return code_key_frame;
2989
2990}
2991
2992#if !(CONFIG_REALTIME_ONLY)
2993static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
2994{
2995    (void) size;
2996    (void) dest;
2997    (void) frame_flags;
2998    vp8_set_quantizer(cpi, 26);
2999
3000    vp8_first_pass(cpi);
3001}
3002#endif
3003
3004#if 0
3005void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
3006{
3007
3008    /* write the frame */
3009    FILE *yframe;
3010    int i;
3011    char filename[255];
3012
3013    sprintf(filename, "cx\\y%04d.raw", this_frame);
3014    yframe = fopen(filename, "wb");
3015
3016    for (i = 0; i < frame->y_height; i++)
3017        fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
3018
3019    fclose(yframe);
3020    sprintf(filename, "cx\\u%04d.raw", this_frame);
3021    yframe = fopen(filename, "wb");
3022
3023    for (i = 0; i < frame->uv_height; i++)
3024        fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3025
3026    fclose(yframe);
3027    sprintf(filename, "cx\\v%04d.raw", this_frame);
3028    yframe = fopen(filename, "wb");
3029
3030    for (i = 0; i < frame->uv_height; i++)
3031        fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3032
3033    fclose(yframe);
3034}
3035#endif
3036/* return of 0 means drop frame */
3037
3038/* Function to test for conditions that indeicate we should loop
3039 * back and recode a frame.
3040 */
3041static int recode_loop_test( VP8_COMP *cpi,
3042                              int high_limit, int low_limit,
3043                              int q, int maxq, int minq )
3044{
3045    int force_recode = 0;
3046    VP8_COMMON *cm = &cpi->common;
3047
3048    /* Is frame recode allowed at all
3049     * Yes if either recode mode 1 is selected or mode two is selcted
3050     * and the frame is a key frame. golden frame or alt_ref_frame
3051     */
3052    if ( (cpi->sf.recode_loop == 1) ||
3053         ( (cpi->sf.recode_loop == 2) &&
3054           ( (cm->frame_type == KEY_FRAME) ||
3055             cm->refresh_golden_frame ||
3056             cm->refresh_alt_ref_frame ) ) )
3057    {
3058        /* General over and under shoot tests */
3059        if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
3060             ((cpi->projected_frame_size < low_limit) && (q > minq)) )
3061        {
3062            force_recode = 1;
3063        }
3064        /* Special Constrained quality tests */
3065        else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3066        {
3067            /* Undershoot and below auto cq level */
3068            if ( (q > cpi->cq_target_quality) &&
3069                 (cpi->projected_frame_size <
3070                     ((cpi->this_frame_target * 7) >> 3)))
3071            {
3072                force_recode = 1;
3073            }
3074            /* Severe undershoot and between auto and user cq level */
3075            else if ( (q > cpi->oxcf.cq_level) &&
3076                      (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
3077                      (cpi->active_best_quality > cpi->oxcf.cq_level))
3078            {
3079                force_recode = 1;
3080                cpi->active_best_quality = cpi->oxcf.cq_level;
3081            }
3082        }
3083    }
3084
3085    return force_recode;
3086}
3087
3088static void update_reference_frames(VP8_COMP *cpi)
3089{
3090    VP8_COMMON *cm = &cpi->common;
3091    YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
3092
3093    /* At this point the new frame has been encoded.
3094     * If any buffer copy / swapping is signaled it should be done here.
3095     */
3096
3097    if (cm->frame_type == KEY_FRAME)
3098    {
3099        yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME ;
3100
3101        yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3102        yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3103
3104        cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
3105
3106#if CONFIG_MULTI_RES_ENCODING
3107        cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
3108        cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
3109#endif
3110    }
3111    else    /* For non key frames */
3112    {
3113        if (cm->refresh_alt_ref_frame)
3114        {
3115            assert(!cm->copy_buffer_to_arf);
3116
3117            cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
3118            cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3119            cm->alt_fb_idx = cm->new_fb_idx;
3120
3121#if CONFIG_MULTI_RES_ENCODING
3122            cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
3123#endif
3124        }
3125        else if (cm->copy_buffer_to_arf)
3126        {
3127            assert(!(cm->copy_buffer_to_arf & ~0x3));
3128
3129            if (cm->copy_buffer_to_arf == 1)
3130            {
3131                if(cm->alt_fb_idx != cm->lst_fb_idx)
3132                {
3133                    yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
3134                    yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3135                    cm->alt_fb_idx = cm->lst_fb_idx;
3136
3137#if CONFIG_MULTI_RES_ENCODING
3138                    cpi->current_ref_frames[ALTREF_FRAME] =
3139                        cpi->current_ref_frames[LAST_FRAME];
3140#endif
3141                }
3142            }
3143            else /* if (cm->copy_buffer_to_arf == 2) */
3144            {
3145                if(cm->alt_fb_idx != cm->gld_fb_idx)
3146                {
3147                    yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
3148                    yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3149                    cm->alt_fb_idx = cm->gld_fb_idx;
3150
3151#if CONFIG_MULTI_RES_ENCODING
3152                    cpi->current_ref_frames[ALTREF_FRAME] =
3153                        cpi->current_ref_frames[GOLDEN_FRAME];
3154#endif
3155                }
3156            }
3157        }
3158
3159        if (cm->refresh_golden_frame)
3160        {
3161            assert(!cm->copy_buffer_to_gf);
3162
3163            cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
3164            cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3165            cm->gld_fb_idx = cm->new_fb_idx;
3166
3167#if CONFIG_MULTI_RES_ENCODING
3168            cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
3169#endif
3170        }
3171        else if (cm->copy_buffer_to_gf)
3172        {
3173            assert(!(cm->copy_buffer_to_arf & ~0x3));
3174
3175            if (cm->copy_buffer_to_gf == 1)
3176            {
3177                if(cm->gld_fb_idx != cm->lst_fb_idx)
3178                {
3179                    yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
3180                    yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3181                    cm->gld_fb_idx = cm->lst_fb_idx;
3182
3183#if CONFIG_MULTI_RES_ENCODING
3184                    cpi->current_ref_frames[GOLDEN_FRAME] =
3185                        cpi->current_ref_frames[LAST_FRAME];
3186#endif
3187                }
3188            }
3189            else /* if (cm->copy_buffer_to_gf == 2) */
3190            {
3191                if(cm->alt_fb_idx != cm->gld_fb_idx)
3192                {
3193                    yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
3194                    yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3195                    cm->gld_fb_idx = cm->alt_fb_idx;
3196
3197#if CONFIG_MULTI_RES_ENCODING
3198                    cpi->current_ref_frames[GOLDEN_FRAME] =
3199                        cpi->current_ref_frames[ALTREF_FRAME];
3200#endif
3201                }
3202            }
3203        }
3204    }
3205
3206    if (cm->refresh_last_frame)
3207    {
3208        cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
3209        cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
3210        cm->lst_fb_idx = cm->new_fb_idx;
3211
3212#if CONFIG_MULTI_RES_ENCODING
3213        cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
3214#endif
3215    }
3216
3217#if CONFIG_TEMPORAL_DENOISING
3218    if (cpi->oxcf.noise_sensitivity)
3219    {
3220        /* we shouldn't have to keep multiple copies as we know in advance which
3221         * buffer we should start - for now to get something up and running
3222         * I've chosen to copy the buffers
3223         */
3224        if (cm->frame_type == KEY_FRAME)
3225        {
3226            int i;
3227            vp8_yv12_copy_frame(
3228                    cpi->Source,
3229                    &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3230
3231            vp8_yv12_extend_frame_borders(
3232                    &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3233
3234            for (i = 2; i < MAX_REF_FRAMES - 1; i++)
3235                vp8_yv12_copy_frame(
3236                        &cpi->denoiser.yv12_running_avg[LAST_FRAME],
3237                        &cpi->denoiser.yv12_running_avg[i]);
3238        }
3239        else /* For non key frames */
3240        {
3241            vp8_yv12_extend_frame_borders(
3242                    &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
3243
3244            if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf)
3245            {
3246                vp8_yv12_copy_frame(
3247                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3248                        &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
3249            }
3250            if (cm->refresh_golden_frame || cm->copy_buffer_to_gf)
3251            {
3252                vp8_yv12_copy_frame(
3253                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3254                        &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
3255            }
3256            if(cm->refresh_last_frame)
3257            {
3258                vp8_yv12_copy_frame(
3259                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3260                        &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3261            }
3262        }
3263
3264    }
3265#endif
3266
3267}
3268
3269void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
3270{
3271    const FRAME_TYPE frame_type = cm->frame_type;
3272
3273    if (cm->no_lpf)
3274    {
3275        cm->filter_level = 0;
3276    }
3277    else
3278    {
3279        struct vpx_usec_timer timer;
3280
3281        vp8_clear_system_state();
3282
3283        vpx_usec_timer_start(&timer);
3284        if (cpi->sf.auto_filter == 0)
3285            vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3286
3287        else
3288            vp8cx_pick_filter_level(cpi->Source, cpi);
3289
3290        if (cm->filter_level > 0)
3291        {
3292            vp8cx_set_alt_lf_level(cpi, cm->filter_level);
3293        }
3294
3295        vpx_usec_timer_mark(&timer);
3296        cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3297    }
3298
3299#if CONFIG_MULTITHREAD
3300    if (cpi->b_multi_threaded)
3301        sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3302#endif
3303
3304    if (cm->filter_level > 0)
3305    {
3306        vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
3307    }
3308
3309    vp8_yv12_extend_frame_borders(cm->frame_to_show);
3310
3311}
3312
3313static void encode_frame_to_data_rate
3314(
3315    VP8_COMP *cpi,
3316    unsigned long *size,
3317    unsigned char *dest,
3318    unsigned char* dest_end,
3319    unsigned int *frame_flags
3320)
3321{
3322    int Q;
3323    int frame_over_shoot_limit;
3324    int frame_under_shoot_limit;
3325
3326    int Loop = 0;
3327    int loop_count;
3328
3329    VP8_COMMON *cm = &cpi->common;
3330    int active_worst_qchanged = 0;
3331
3332#if !(CONFIG_REALTIME_ONLY)
3333    int q_low;
3334    int q_high;
3335    int zbin_oq_high;
3336    int zbin_oq_low = 0;
3337    int top_index;
3338    int bottom_index;
3339    int overshoot_seen = 0;
3340    int undershoot_seen = 0;
3341#endif
3342
3343    int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
3344                          cpi->oxcf.optimal_buffer_level / 100);
3345    int drop_mark75 = drop_mark * 2 / 3;
3346    int drop_mark50 = drop_mark / 4;
3347    int drop_mark25 = drop_mark / 8;
3348
3349
3350    /* Clear down mmx registers to allow floating point in what follows */
3351    vp8_clear_system_state();
3352
3353#if CONFIG_MULTITHREAD
3354    /*  wait for the last picture loopfilter thread done */
3355    if (cpi->b_lpf_running)
3356    {
3357        sem_wait(&cpi->h_event_end_lpf);
3358        cpi->b_lpf_running = 0;
3359    }
3360#endif
3361
3362    if(cpi->force_next_frame_intra)
3363    {
3364        cm->frame_type = KEY_FRAME;  /* delayed intra frame */
3365        cpi->force_next_frame_intra = 0;
3366    }
3367
3368    /* For an alt ref frame in 2 pass we skip the call to the second pass
3369     * function that sets the target bandwidth
3370     */
3371#if !(CONFIG_REALTIME_ONLY)
3372
3373    if (cpi->pass == 2)
3374    {
3375        if (cpi->common.refresh_alt_ref_frame)
3376        {
3377            /* Per frame bit target for the alt ref frame */
3378            cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
3379            /* per second target bitrate */
3380            cpi->target_bandwidth = (int)(cpi->twopass.gf_bits *
3381                                          cpi->output_framerate);
3382        }
3383    }
3384    else
3385#endif
3386        cpi->per_frame_bandwidth  = (int)(cpi->target_bandwidth / cpi->output_framerate);
3387
3388    /* Default turn off buffer to buffer copying */
3389    cm->copy_buffer_to_gf = 0;
3390    cm->copy_buffer_to_arf = 0;
3391
3392    /* Clear zbin over-quant value and mode boost values. */
3393    cpi->mb.zbin_over_quant = 0;
3394    cpi->mb.zbin_mode_boost = 0;
3395
3396    /* Enable or disable mode based tweaking of the zbin
3397     * For 2 Pass Only used where GF/ARF prediction quality
3398     * is above a threshold
3399     */
3400    cpi->mb.zbin_mode_boost_enabled = 1;
3401    if (cpi->pass == 2)
3402    {
3403        if ( cpi->gfu_boost <= 400 )
3404        {
3405            cpi->mb.zbin_mode_boost_enabled = 0;
3406        }
3407    }
3408
3409    /* Current default encoder behaviour for the altref sign bias */
3410    if (cpi->source_alt_ref_active)
3411        cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3412    else
3413        cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3414
3415    /* Check to see if a key frame is signaled
3416     * For two pass with auto key frame enabled cm->frame_type may already
3417     * be set, but not for one pass.
3418     */
3419    if ((cm->current_video_frame == 0) ||
3420        (cm->frame_flags & FRAMEFLAGS_KEY) ||
3421        (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
3422    {
3423        /* Key frame from VFW/auto-keyframe/first frame */
3424        cm->frame_type = KEY_FRAME;
3425    }
3426
3427#if CONFIG_MULTI_RES_ENCODING
3428    /* In multi-resolution encoding, frame_type is decided by lowest-resolution
3429     * encoder. Same frame_type is adopted while encoding at other resolution.
3430     */
3431    if (cpi->oxcf.mr_encoder_id)
3432    {
3433        LOWER_RES_FRAME_INFO* low_res_frame_info
3434                        = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info;
3435
3436        cm->frame_type = low_res_frame_info->frame_type;
3437
3438        if(cm->frame_type != KEY_FRAME)
3439        {
3440            cpi->mr_low_res_mv_avail = 1;
3441            cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);
3442
3443            if (cpi->ref_frame_flags & VP8_LAST_FRAME)
3444                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[LAST_FRAME]
3445                         == low_res_frame_info->low_res_ref_frames[LAST_FRAME]);
3446
3447            if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
3448                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[GOLDEN_FRAME]
3449                         == low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);
3450
3451            if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
3452                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
3453                         == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
3454        }
3455    }
3456#endif
3457
3458    /* Set various flags etc to special state if it is a key frame */
3459    if (cm->frame_type == KEY_FRAME)
3460    {
3461        int i;
3462
3463        // Set the loop filter deltas and segmentation map update
3464        setup_features(cpi);
3465
3466        /* The alternate reference frame cannot be active for a key frame */
3467        cpi->source_alt_ref_active = 0;
3468
3469        /* Reset the RD threshold multipliers to default of * 1 (128) */
3470        for (i = 0; i < MAX_MODES; i++)
3471        {
3472            cpi->mb.rd_thresh_mult[i] = 128;
3473        }
3474    }
3475
3476#if 0
3477    /* Experimental code for lagged compress and one pass
3478     * Initialise one_pass GF frames stats
3479     * Update stats used for GF selection
3480     */
3481    {
3482        cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3483
3484        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3485        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3486        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3487        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3488        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3489        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3490        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3491        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3492        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3493    }
3494#endif
3495
3496    update_rd_ref_frame_probs(cpi);
3497
3498    if (cpi->drop_frames_allowed)
3499    {
3500        /* The reset to decimation 0 is only done here for one pass.
3501         * Once it is set two pass leaves decimation on till the next kf.
3502         */
3503        if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
3504            cpi->decimation_factor --;
3505
3506        if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
3507            cpi->decimation_factor = 1;
3508
3509        else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
3510        {
3511            cpi->decimation_factor = 3;
3512        }
3513        else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
3514        {
3515            cpi->decimation_factor = 2;
3516        }
3517        else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
3518        {
3519            cpi->decimation_factor = 1;
3520        }
3521    }
3522
3523    /* The following decimates the frame rate according to a regular
3524     * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
3525     * prevent buffer under-run in CBR mode. Alternatively it might be
3526     * desirable in some situations to drop frame rate but throw more bits
3527     * at each frame.
3528     *
3529     * Note that dropping a key frame can be problematic if spatial
3530     * resampling is also active
3531     */
3532    if (cpi->decimation_factor > 0)
3533    {
3534        switch (cpi->decimation_factor)
3535        {
3536        case 1:
3537            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 3 / 2;
3538            break;
3539        case 2:
3540            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 5 / 4;
3541            break;
3542        case 3:
3543            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 5 / 4;
3544            break;
3545        }
3546
3547        /* Note that we should not throw out a key frame (especially when
3548         * spatial resampling is enabled).
3549         */
3550        if (cm->frame_type == KEY_FRAME)
3551        {
3552            cpi->decimation_count = cpi->decimation_factor;
3553        }
3554        else if (cpi->decimation_count > 0)
3555        {
3556            cpi->decimation_count --;
3557
3558            cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3559            if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
3560                cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
3561
3562#if CONFIG_MULTI_RES_ENCODING
3563            vp8_store_drop_frame_info(cpi);
3564#endif
3565
3566            cm->current_video_frame++;
3567            cpi->frames_since_key++;
3568            // We advance the temporal pattern for dropped frames.
3569            cpi->temporal_pattern_counter++;
3570
3571#if CONFIG_INTERNAL_STATS
3572            cpi->count ++;
3573#endif
3574
3575            cpi->buffer_level = cpi->bits_off_target;
3576
3577            if (cpi->oxcf.number_of_layers > 1)
3578            {
3579                unsigned int i;
3580
3581                /* Propagate bits saved by dropping the frame to higher
3582                 * layers
3583                 */
3584                for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
3585                {
3586                    LAYER_CONTEXT *lc = &cpi->layer_context[i];
3587                    lc->bits_off_target += (int)(lc->target_bandwidth /
3588                                                 lc->framerate);
3589                    if (lc->bits_off_target > lc->maximum_buffer_size)
3590                        lc->bits_off_target = lc->maximum_buffer_size;
3591                    lc->buffer_level = lc->bits_off_target;
3592                }
3593            }
3594
3595            return;
3596        }
3597        else
3598            cpi->decimation_count = cpi->decimation_factor;
3599    }
3600    else
3601        cpi->decimation_count = 0;
3602
3603    /* Decide how big to make the frame */
3604    if (!vp8_pick_frame_size(cpi))
3605    {
3606        /*TODO: 2 drop_frame and return code could be put together. */
3607#if CONFIG_MULTI_RES_ENCODING
3608        vp8_store_drop_frame_info(cpi);
3609#endif
3610        cm->current_video_frame++;
3611        cpi->frames_since_key++;
3612        // We advance the temporal pattern for dropped frames.
3613        cpi->temporal_pattern_counter++;
3614        return;
3615    }
3616
3617    /* Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
3618     * This has a knock on effect on active best quality as well.
3619     * For CBR if the buffer reaches its maximum level then we can no longer
3620     * save up bits for later frames so we might as well use them up
3621     * on the current frame.
3622     */
3623    if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
3624        (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
3625    {
3626        /* Max adjustment is 1/4 */
3627        int Adjustment = cpi->active_worst_quality / 4;
3628
3629        if (Adjustment)
3630        {
3631            int buff_lvl_step;
3632
3633            if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
3634            {
3635                buff_lvl_step = (int)
3636                                ((cpi->oxcf.maximum_buffer_size -
3637                                  cpi->oxcf.optimal_buffer_level) /
3638                                  Adjustment);
3639
3640                if (buff_lvl_step)
3641                    Adjustment = (int)
3642                                 ((cpi->buffer_level -
3643                                 cpi->oxcf.optimal_buffer_level) /
3644                                 buff_lvl_step);
3645                else
3646                    Adjustment = 0;
3647            }
3648
3649            cpi->active_worst_quality -= Adjustment;
3650
3651            if(cpi->active_worst_quality < cpi->active_best_quality)
3652                cpi->active_worst_quality = cpi->active_best_quality;
3653        }
3654    }
3655
3656    /* Set an active best quality and if necessary active worst quality
3657     * There is some odd behavior for one pass here that needs attention.
3658     */
3659    if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
3660    {
3661        vp8_clear_system_state();
3662
3663        Q = cpi->active_worst_quality;
3664
3665        if ( cm->frame_type == KEY_FRAME )
3666        {
3667            if ( cpi->pass == 2 )
3668            {
3669                if (cpi->gfu_boost > 600)
3670                   cpi->active_best_quality = kf_low_motion_minq[Q];
3671                else
3672                   cpi->active_best_quality = kf_high_motion_minq[Q];
3673
3674                /* Special case for key frames forced because we have reached
3675                 * the maximum key frame interval. Here force the Q to a range
3676                 * based on the ambient Q to reduce the risk of popping
3677                 */
3678                if ( cpi->this_key_frame_forced )
3679                {
3680                    if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
3681                        cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
3682                    else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
3683                        cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3684                }
3685            }
3686            /* One pass more conservative */
3687            else
3688               cpi->active_best_quality = kf_high_motion_minq[Q];
3689        }
3690
3691        else if (cpi->oxcf.number_of_layers==1 &&
3692                (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame))
3693        {
3694            /* Use the lower of cpi->active_worst_quality and recent
3695             * average Q as basis for GF/ARF Q limit unless last frame was
3696             * a key frame.
3697             */
3698            if ( (cpi->frames_since_key > 1) &&
3699               (cpi->avg_frame_qindex < cpi->active_worst_quality) )
3700            {
3701                Q = cpi->avg_frame_qindex;
3702            }
3703
3704            /* For constrained quality dont allow Q less than the cq level */
3705            if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3706                 (Q < cpi->cq_target_quality) )
3707            {
3708                Q = cpi->cq_target_quality;
3709            }
3710
3711            if ( cpi->pass == 2 )
3712            {
3713                if ( cpi->gfu_boost > 1000 )
3714                    cpi->active_best_quality = gf_low_motion_minq[Q];
3715                else if ( cpi->gfu_boost < 400 )
3716                    cpi->active_best_quality = gf_high_motion_minq[Q];
3717                else
3718                    cpi->active_best_quality = gf_mid_motion_minq[Q];
3719
3720                /* Constrained quality use slightly lower active best. */
3721                if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
3722                {
3723                    cpi->active_best_quality =
3724                        cpi->active_best_quality * 15/16;
3725                }
3726            }
3727            /* One pass more conservative */
3728            else
3729                cpi->active_best_quality = gf_high_motion_minq[Q];
3730        }
3731        else
3732        {
3733            cpi->active_best_quality = inter_minq[Q];
3734
3735            /* For the constant/constrained quality mode we dont want
3736             * q to fall below the cq level.
3737             */
3738            if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3739                (cpi->active_best_quality < cpi->cq_target_quality) )
3740            {
3741                /* If we are strongly undershooting the target rate in the last
3742                 * frames then use the user passed in cq value not the auto
3743                 * cq value.
3744                 */
3745                if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
3746                    cpi->active_best_quality = cpi->oxcf.cq_level;
3747                else
3748                    cpi->active_best_quality = cpi->cq_target_quality;
3749            }
3750        }
3751
3752        /* If CBR and the buffer is as full then it is reasonable to allow
3753         * higher quality on the frames to prevent bits just going to waste.
3754         */
3755        if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3756        {
3757            /* Note that the use of >= here elliminates the risk of a devide
3758             * by 0 error in the else if clause
3759             */
3760            if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
3761                cpi->active_best_quality = cpi->best_quality;
3762
3763            else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
3764            {
3765                int Fraction = (int)
3766                  (((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128)
3767                  / (cpi->oxcf.maximum_buffer_size -
3768                  cpi->oxcf.optimal_buffer_level));
3769                int min_qadjustment = ((cpi->active_best_quality -
3770                                        cpi->best_quality) * Fraction) / 128;
3771
3772                cpi->active_best_quality -= min_qadjustment;
3773            }
3774        }
3775    }
3776    /* Make sure constrained quality mode limits are adhered to for the first
3777     * few frames of one pass encodes
3778     */
3779    else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3780    {
3781        if ( (cm->frame_type == KEY_FRAME) ||
3782             cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
3783        {
3784             cpi->active_best_quality = cpi->best_quality;
3785        }
3786        else if (cpi->active_best_quality < cpi->cq_target_quality)
3787        {
3788            cpi->active_best_quality = cpi->cq_target_quality;
3789        }
3790    }
3791
3792    /* Clip the active best and worst quality values to limits */
3793    if (cpi->active_worst_quality > cpi->worst_quality)
3794        cpi->active_worst_quality = cpi->worst_quality;
3795
3796    if (cpi->active_best_quality < cpi->best_quality)
3797        cpi->active_best_quality = cpi->best_quality;
3798
3799    if ( cpi->active_worst_quality < cpi->active_best_quality )
3800        cpi->active_worst_quality = cpi->active_best_quality;
3801
3802    /* Determine initial Q to try */
3803    Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3804
3805#if !(CONFIG_REALTIME_ONLY)
3806
3807    /* Set highest allowed value for Zbin over quant */
3808    if (cm->frame_type == KEY_FRAME)
3809        zbin_oq_high = 0;
3810    else if ((cpi->oxcf.number_of_layers == 1) && ((cm->refresh_alt_ref_frame ||
3811              (cm->refresh_golden_frame && !cpi->source_alt_ref_active))))
3812    {
3813          zbin_oq_high = 16;
3814    }
3815    else
3816        zbin_oq_high = ZBIN_OQ_MAX;
3817#endif
3818
3819    /* Setup background Q adjustment for error resilient mode.
3820     * For multi-layer encodes only enable this for the base layer.
3821    */
3822    if (cpi->cyclic_refresh_mode_enabled)
3823    {
3824      if (cpi->current_layer==0)
3825        cyclic_background_refresh(cpi, Q, 0);
3826      else
3827        disable_segmentation(cpi);
3828    }
3829
3830    vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3831
3832#if !(CONFIG_REALTIME_ONLY)
3833    /* Limit Q range for the adaptive loop. */
3834    bottom_index = cpi->active_best_quality;
3835    top_index    = cpi->active_worst_quality;
3836    q_low  = cpi->active_best_quality;
3837    q_high = cpi->active_worst_quality;
3838#endif
3839
3840    vp8_save_coding_context(cpi);
3841
3842    loop_count = 0;
3843
3844    scale_and_extend_source(cpi->un_scaled_source, cpi);
3845
3846#if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
3847
3848    if (cpi->oxcf.noise_sensitivity > 0)
3849    {
3850        unsigned char *src;
3851        int l = 0;
3852
3853        switch (cpi->oxcf.noise_sensitivity)
3854        {
3855        case 1:
3856            l = 20;
3857            break;
3858        case 2:
3859            l = 40;
3860            break;
3861        case 3:
3862            l = 60;
3863            break;
3864        case 4:
3865            l = 80;
3866            break;
3867        case 5:
3868            l = 100;
3869            break;
3870        case 6:
3871            l = 150;
3872            break;
3873        }
3874
3875
3876        if (cm->frame_type == KEY_FRAME)
3877        {
3878            vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1,  0);
3879        }
3880        else
3881        {
3882            vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1,  0);
3883
3884            src = cpi->Source->y_buffer;
3885
3886            if (cpi->Source->y_stride < 0)
3887            {
3888                src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
3889            }
3890        }
3891    }
3892
3893#endif
3894
3895#ifdef OUTPUT_YUV_SRC
3896    vp8_write_yuv_frame(cpi->Source);
3897#endif
3898
3899    do
3900    {
3901        vp8_clear_system_state();
3902
3903        vp8_set_quantizer(cpi, Q);
3904
3905        /* setup skip prob for costing in mode/mv decision */
3906        if (cpi->common.mb_no_coeff_skip)
3907        {
3908            cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
3909
3910            if (cm->frame_type != KEY_FRAME)
3911            {
3912                if (cpi->common.refresh_alt_ref_frame)
3913                {
3914                    if (cpi->last_skip_false_probs[2] != 0)
3915                        cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3916
3917                    /*
3918                                        if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
3919                       cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3920                                        else if (cpi->last_skip_false_probs[2]!=0)
3921                       cpi->prob_skip_false = (cpi->last_skip_false_probs[2]  + cpi->prob_skip_false ) / 2;
3922                       */
3923                }
3924                else if (cpi->common.refresh_golden_frame)
3925                {
3926                    if (cpi->last_skip_false_probs[1] != 0)
3927                        cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3928
3929                    /*
3930                                        if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
3931                       cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3932                                        else if (cpi->last_skip_false_probs[1]!=0)
3933                       cpi->prob_skip_false = (cpi->last_skip_false_probs[1]  + cpi->prob_skip_false ) / 2;
3934                       */
3935                }
3936                else
3937                {
3938                    if (cpi->last_skip_false_probs[0] != 0)
3939                        cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3940
3941                    /*
3942                    if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
3943                        cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3944                    else if(cpi->last_skip_false_probs[0]!=0)
3945                        cpi->prob_skip_false = (cpi->last_skip_false_probs[0]  + cpi->prob_skip_false ) / 2;
3946                        */
3947                }
3948
3949                /* as this is for cost estimate, let's make sure it does not
3950                 * go extreme eitehr way
3951                 */
3952                if (cpi->prob_skip_false < 5)
3953                    cpi->prob_skip_false = 5;
3954
3955                if (cpi->prob_skip_false > 250)
3956                    cpi->prob_skip_false = 250;
3957
3958                if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref)
3959                    cpi->prob_skip_false = 1;
3960            }
3961
3962#if 0
3963
3964            if (cpi->pass != 1)
3965            {
3966                FILE *f = fopen("skip.stt", "a");
3967                fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
3968                fclose(f);
3969            }
3970
3971#endif
3972
3973        }
3974
3975        if (cm->frame_type == KEY_FRAME)
3976        {
3977            if(resize_key_frame(cpi))
3978            {
3979              /* If the frame size has changed, need to reset Q, quantizer,
3980               * and background refresh.
3981               */
3982              Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3983              if (cpi->cyclic_refresh_mode_enabled)
3984              {
3985                if (cpi->current_layer==0)
3986                  cyclic_background_refresh(cpi, Q, 0);
3987                else
3988                  disable_segmentation(cpi);
3989              }
3990              vp8_set_quantizer(cpi, Q);
3991            }
3992
3993            vp8_setup_key_frame(cpi);
3994        }
3995
3996
3997
3998#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
3999        {
4000            if(cpi->oxcf.error_resilient_mode)
4001                cm->refresh_entropy_probs = 0;
4002
4003            if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
4004            {
4005                if (cm->frame_type == KEY_FRAME)
4006                    cm->refresh_entropy_probs = 1;
4007            }
4008
4009            if (cm->refresh_entropy_probs == 0)
4010            {
4011                /* save a copy for later refresh */
4012                vpx_memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
4013            }
4014
4015            vp8_update_coef_context(cpi);
4016
4017            vp8_update_coef_probs(cpi);
4018
4019            /* transform / motion compensation build reconstruction frame
4020             * +pack coef partitions
4021             */
4022            vp8_encode_frame(cpi);
4023
4024            /* cpi->projected_frame_size is not needed for RT mode */
4025        }
4026#else
4027        /* transform / motion compensation build reconstruction frame */
4028        vp8_encode_frame(cpi);
4029
4030        cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
4031        cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
4032#endif
4033        vp8_clear_system_state();
4034
4035        /* Test to see if the stats generated for this frame indicate that
4036         * we should have coded a key frame (assuming that we didn't)!
4037         */
4038
4039        if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME
4040            && cpi->compressor_speed != 2)
4041        {
4042#if !(CONFIG_REALTIME_ONLY)
4043            if (decide_key_frame(cpi))
4044            {
4045                /* Reset all our sizing numbers and recode */
4046                cm->frame_type = KEY_FRAME;
4047
4048                vp8_pick_frame_size(cpi);
4049
4050                /* Clear the Alt reference frame active flag when we have
4051                 * a key frame
4052                 */
4053                cpi->source_alt_ref_active = 0;
4054
4055                // Set the loop filter deltas and segmentation map update
4056                setup_features(cpi);
4057
4058                vp8_restore_coding_context(cpi);
4059
4060                Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4061
4062                vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
4063
4064                /* Limit Q range for the adaptive loop. */
4065                bottom_index = cpi->active_best_quality;
4066                top_index    = cpi->active_worst_quality;
4067                q_low  = cpi->active_best_quality;
4068                q_high = cpi->active_worst_quality;
4069
4070                loop_count++;
4071                Loop = 1;
4072
4073                continue;
4074            }
4075#endif
4076        }
4077
4078        vp8_clear_system_state();
4079
4080        if (frame_over_shoot_limit == 0)
4081            frame_over_shoot_limit = 1;
4082
4083        /* Are we are overshooting and up against the limit of active max Q. */
4084        if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
4085            (Q == cpi->active_worst_quality)                     &&
4086            (cpi->active_worst_quality < cpi->worst_quality)      &&
4087            (cpi->projected_frame_size > frame_over_shoot_limit))
4088        {
4089            int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;
4090
4091            /* If so is there any scope for relaxing it */
4092            while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
4093            {
4094                cpi->active_worst_quality++;
4095                /* Assume 1 qstep = about 4% on frame size. */
4096                over_size_percent = (int)(over_size_percent * 0.96);
4097            }
4098#if !(CONFIG_REALTIME_ONLY)
4099            top_index = cpi->active_worst_quality;
4100#endif
4101            /* If we have updated the active max Q do not call
4102             * vp8_update_rate_correction_factors() this loop.
4103             */
4104            active_worst_qchanged = 1;
4105        }
4106        else
4107            active_worst_qchanged = 0;
4108
4109#if !(CONFIG_REALTIME_ONLY)
4110        /* Special case handling for forced key frames */
4111        if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
4112        {
4113            int last_q = Q;
4114            int kf_err = vp8_calc_ss_err(cpi->Source,
4115                                         &cm->yv12_fb[cm->new_fb_idx]);
4116
4117            /* The key frame is not good enough */
4118            if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
4119            {
4120                /* Lower q_high */
4121                q_high = (Q > q_low) ? (Q - 1) : q_low;
4122
4123                /* Adjust Q */
4124                Q = (q_high + q_low) >> 1;
4125            }
4126            /* The key frame is much better than the previous frame */
4127            else if ( kf_err < (cpi->ambient_err >> 1) )
4128            {
4129                /* Raise q_low */
4130                q_low = (Q < q_high) ? (Q + 1) : q_high;
4131
4132                /* Adjust Q */
4133                Q = (q_high + q_low + 1) >> 1;
4134            }
4135
4136            /* Clamp Q to upper and lower limits: */
4137            if (Q > q_high)
4138                Q = q_high;
4139            else if (Q < q_low)
4140                Q = q_low;
4141
4142            Loop = Q != last_q;
4143        }
4144
4145        /* Is the projected frame size out of range and are we allowed
4146         * to attempt to recode.
4147         */
4148        else if ( recode_loop_test( cpi,
4149                               frame_over_shoot_limit, frame_under_shoot_limit,
4150                               Q, top_index, bottom_index ) )
4151        {
4152            int last_q = Q;
4153            int Retries = 0;
4154
4155            /* Frame size out of permitted range. Update correction factor
4156             * & compute new Q to try...
4157             */
4158
4159            /* Frame is too large */
4160            if (cpi->projected_frame_size > cpi->this_frame_target)
4161            {
4162                /* Raise Qlow as to at least the current value */
4163                q_low = (Q < q_high) ? (Q + 1) : q_high;
4164
4165                /* If we are using over quant do the same for zbin_oq_low */
4166                if (cpi->mb.zbin_over_quant > 0)
4167                    zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
4168                        (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
4169
4170                if (undershoot_seen)
4171                {
4172                    /* Update rate_correction_factor unless
4173                     * cpi->active_worst_quality has changed.
4174                     */
4175                    if (!active_worst_qchanged)
4176                        vp8_update_rate_correction_factors(cpi, 1);
4177
4178                    Q = (q_high + q_low + 1) / 2;
4179
4180                    /* Adjust cpi->zbin_over_quant (only allowed when Q
4181                     * is max)
4182                     */
4183                    if (Q < MAXQ)
4184                        cpi->mb.zbin_over_quant = 0;
4185                    else
4186                    {
4187                        zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
4188                            (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
4189                        cpi->mb.zbin_over_quant =
4190                            (zbin_oq_high + zbin_oq_low) / 2;
4191                    }
4192                }
4193                else
4194                {
4195                    /* Update rate_correction_factor unless
4196                     * cpi->active_worst_quality has changed.
4197                     */
4198                    if (!active_worst_qchanged)
4199                        vp8_update_rate_correction_factors(cpi, 0);
4200
4201                    Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4202
4203                    while (((Q < q_low) ||
4204                        (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
4205                        (Retries < 10))
4206                    {
4207                        vp8_update_rate_correction_factors(cpi, 0);
4208                        Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4209                        Retries ++;
4210                    }
4211                }
4212
4213                overshoot_seen = 1;
4214            }
4215            /* Frame is too small */
4216            else
4217            {
4218                if (cpi->mb.zbin_over_quant == 0)
4219                    /* Lower q_high if not using over quant */
4220                    q_high = (Q > q_low) ? (Q - 1) : q_low;
4221                else
4222                    /* else lower zbin_oq_high */
4223                    zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low) ?
4224                        (cpi->mb.zbin_over_quant - 1) : zbin_oq_low;
4225
4226                if (overshoot_seen)
4227                {
4228                    /* Update rate_correction_factor unless
4229                     * cpi->active_worst_quality has changed.
4230                     */
4231                    if (!active_worst_qchanged)
4232                        vp8_update_rate_correction_factors(cpi, 1);
4233
4234                    Q = (q_high + q_low) / 2;
4235
4236                    /* Adjust cpi->zbin_over_quant (only allowed when Q
4237                     * is max)
4238                     */
4239                    if (Q < MAXQ)
4240                        cpi->mb.zbin_over_quant = 0;
4241                    else
4242                        cpi->mb.zbin_over_quant =
4243                            (zbin_oq_high + zbin_oq_low) / 2;
4244                }
4245                else
4246                {
4247                    /* Update rate_correction_factor unless
4248                     * cpi->active_worst_quality has changed.
4249                     */
4250                    if (!active_worst_qchanged)
4251                        vp8_update_rate_correction_factors(cpi, 0);
4252
4253                    Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4254
4255                    /* Special case reset for qlow for constrained quality.
4256                     * This should only trigger where there is very substantial
4257                     * undershoot on a frame and the auto cq level is above
4258                     * the user passsed in value.
4259                     */
4260                    if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4261                         (Q < q_low) )
4262                    {
4263                        q_low = Q;
4264                    }
4265
4266                    while (((Q > q_high) ||
4267                        (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
4268                        (Retries < 10))
4269                    {
4270                        vp8_update_rate_correction_factors(cpi, 0);
4271                        Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4272                        Retries ++;
4273                    }
4274                }
4275
4276                undershoot_seen = 1;
4277            }
4278
4279            /* Clamp Q to upper and lower limits: */
4280            if (Q > q_high)
4281                Q = q_high;
4282            else if (Q < q_low)
4283                Q = q_low;
4284
4285            /* Clamp cpi->zbin_over_quant */
4286            cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low) ?
4287                zbin_oq_low : (cpi->mb.zbin_over_quant > zbin_oq_high) ?
4288                    zbin_oq_high : cpi->mb.zbin_over_quant;
4289
4290            Loop = Q != last_q;
4291        }
4292        else
4293#endif
4294            Loop = 0;
4295
4296        if (cpi->is_src_frame_alt_ref)
4297            Loop = 0;
4298
4299        if (Loop == 1)
4300        {
4301            vp8_restore_coding_context(cpi);
4302            loop_count++;
4303#if CONFIG_INTERNAL_STATS
4304            cpi->tot_recode_hits++;
4305#endif
4306        }
4307    }
4308    while (Loop == 1);
4309
4310#if 0
4311    /* Experimental code for lagged and one pass
4312     * Update stats used for one pass GF selection
4313     */
4314    {
4315        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4316        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4317        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4318    }
4319#endif
4320
4321    /* Special case code to reduce pulsing when key frames are forced at a
4322     * fixed interval. Note the reconstruction error if it is the frame before
4323     * the force key frame
4324     */
4325    if ( cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0) )
4326    {
4327        cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
4328                                           &cm->yv12_fb[cm->new_fb_idx]);
4329    }
4330
4331    /* This frame's MVs are saved and will be used in next frame's MV predictor.
4332     * Last frame has one more line(add to bottom) and one more column(add to
4333     * right) than cm->mip. The edge elements are initialized to 0.
4334     */
4335#if CONFIG_MULTI_RES_ENCODING
4336    if(!cpi->oxcf.mr_encoder_id && cm->show_frame)
4337#else
4338    if(cm->show_frame)   /* do not save for altref frame */
4339#endif
4340    {
4341        int mb_row;
4342        int mb_col;
4343        /* Point to beginning of allocated MODE_INFO arrays. */
4344        MODE_INFO *tmp = cm->mip;
4345
4346        if(cm->frame_type != KEY_FRAME)
4347        {
4348            for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
4349            {
4350                for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
4351                {
4352                    if(tmp->mbmi.ref_frame != INTRA_FRAME)
4353                        cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;
4354
4355                    cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4356                    cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
4357                    tmp++;
4358                }
4359            }
4360        }
4361    }
4362
4363    /* Count last ref frame 0,0 usage on current encoded frame. */
4364    {
4365        int mb_row;
4366        int mb_col;
4367        /* Point to beginning of MODE_INFO arrays. */
4368        MODE_INFO *tmp = cm->mi;
4369
4370        cpi->zeromv_count = 0;
4371
4372        if(cm->frame_type != KEY_FRAME)
4373        {
4374            for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
4375            {
4376                for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++)
4377                {
4378                    if(tmp->mbmi.mode == ZEROMV)
4379                        cpi->zeromv_count++;
4380                    tmp++;
4381                }
4382                tmp++;
4383            }
4384        }
4385    }
4386
4387#if CONFIG_MULTI_RES_ENCODING
4388    vp8_cal_dissimilarity(cpi);
4389#endif
4390
4391    /* Update the GF useage maps.
4392     * This is done after completing the compression of a frame when all
4393     * modes etc. are finalized but before loop filter
4394     */
4395    if (cpi->oxcf.number_of_layers == 1)
4396        vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4397
4398    if (cm->frame_type == KEY_FRAME)
4399        cm->refresh_last_frame = 1;
4400
4401#if 0
4402    {
4403        FILE *f = fopen("gfactive.stt", "a");
4404        fprintf(f, "%8d %8d %8d %8d %8d\n", cm->current_video_frame, (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols), cpi->this_iiratio, cpi->next_iiratio, cm->refresh_golden_frame);
4405        fclose(f);
4406    }
4407#endif
4408
4409    /* For inter frames the current default behavior is that when
4410     * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4411     * This is purely an encoder decision at present.
4412     */
4413    if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
4414        cm->copy_buffer_to_arf  = 2;
4415    else
4416        cm->copy_buffer_to_arf  = 0;
4417
4418    cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4419
4420#if CONFIG_MULTITHREAD
4421    if (cpi->b_multi_threaded)
4422    {
4423        /* start loopfilter in separate thread */
4424        sem_post(&cpi->h_event_start_lpf);
4425        cpi->b_lpf_running = 1;
4426    }
4427    else
4428#endif
4429    {
4430        vp8_loopfilter_frame(cpi, cm);
4431    }
4432
4433    update_reference_frames(cpi);
4434
4435#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
4436    if (cpi->oxcf.error_resilient_mode)
4437    {
4438        cm->refresh_entropy_probs = 0;
4439    }
4440#endif
4441
4442#if CONFIG_MULTITHREAD
4443    /* wait that filter_level is picked so that we can continue with stream packing */
4444    if (cpi->b_multi_threaded)
4445        sem_wait(&cpi->h_event_end_lpf);
4446#endif
4447
4448    /* build the bitstream */
4449    vp8_pack_bitstream(cpi, dest, dest_end, size);
4450
4451#if CONFIG_MULTITHREAD
4452    /* if PSNR packets are generated we have to wait for the lpf */
4453    if (cpi->b_lpf_running && cpi->b_calculate_psnr)
4454    {
4455        sem_wait(&cpi->h_event_end_lpf);
4456        cpi->b_lpf_running = 0;
4457    }
4458#endif
4459
4460    /* Move storing frame_type out of the above loop since it is also
4461     * needed in motion search besides loopfilter */
4462    cm->last_frame_type = cm->frame_type;
4463
4464    /* Update rate control heuristics */
4465    cpi->total_byte_count += (*size);
4466    cpi->projected_frame_size = (*size) << 3;
4467
4468    if (cpi->oxcf.number_of_layers > 1)
4469    {
4470        unsigned int i;
4471        for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
4472          cpi->layer_context[i].total_byte_count += (*size);
4473    }
4474
4475    if (!active_worst_qchanged)
4476        vp8_update_rate_correction_factors(cpi, 2);
4477
4478    cpi->last_q[cm->frame_type] = cm->base_qindex;
4479
4480    if (cm->frame_type == KEY_FRAME)
4481    {
4482        vp8_adjust_key_frame_context(cpi);
4483    }
4484
4485    /* Keep a record of ambient average Q. */
4486    if (cm->frame_type != KEY_FRAME)
4487        cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4488
4489    /* Keep a record from which we can calculate the average Q excluding
4490     * GF updates and key frames
4491     */
4492    if ((cm->frame_type != KEY_FRAME) && ((cpi->oxcf.number_of_layers > 1) ||
4493        (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)))
4494    {
4495        cpi->ni_frames++;
4496
4497        /* Calculate the average Q for normal inter frames (not key or GFU
4498         * frames).
4499         */
4500        if ( cpi->pass == 2 )
4501        {
4502            cpi->ni_tot_qi += Q;
4503            cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4504        }
4505        else
4506        {
4507            /* Damp value for first few frames */
4508            if (cpi->ni_frames > 150 )
4509            {
4510                cpi->ni_tot_qi += Q;
4511                cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4512            }
4513            /* For one pass, early in the clip ... average the current frame Q
4514             * value with the worstq entered by the user as a dampening measure
4515             */
4516            else
4517            {
4518                cpi->ni_tot_qi += Q;
4519                cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4520            }
4521
4522            /* If the average Q is higher than what was used in the last
4523             * frame (after going through the recode loop to keep the frame
4524             * size within range) then use the last frame value - 1. The -1
4525             * is designed to stop Q and hence the data rate, from
4526             * progressively falling away during difficult sections, but at
4527             * the same time reduce the number of itterations around the
4528             * recode loop.
4529             */
4530            if (Q > cpi->ni_av_qi)
4531                cpi->ni_av_qi = Q - 1;
4532        }
4533    }
4534
4535    /* Update the buffer level variable. */
4536    /* Non-viewable frames are a special case and are treated as pure overhead. */
4537    if ( !cm->show_frame )
4538        cpi->bits_off_target -= cpi->projected_frame_size;
4539    else
4540        cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4541
4542    /* Clip the buffer level to the maximum specified buffer size */
4543    if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
4544        cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
4545
4546    /* Rolling monitors of whether we are over or underspending used to
4547     * help regulate min and Max Q in two pass.
4548     */
4549    cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
4550    cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
4551    cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
4552    cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;
4553
4554    /* Actual bits spent */
4555    cpi->total_actual_bits += cpi->projected_frame_size;
4556
4557    /* Debug stats */
4558    cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);
4559
4560    cpi->buffer_level = cpi->bits_off_target;
4561
4562    /* Propagate values to higher temporal layers */
4563    if (cpi->oxcf.number_of_layers > 1)
4564    {
4565        unsigned int i;
4566
4567        for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
4568        {
4569            LAYER_CONTEXT *lc = &cpi->layer_context[i];
4570            int bits_off_for_this_layer =
4571               (int)(lc->target_bandwidth / lc->framerate -
4572                     cpi->projected_frame_size);
4573
4574            lc->bits_off_target += bits_off_for_this_layer;
4575
4576            /* Clip buffer level to maximum buffer size for the layer */
4577            if (lc->bits_off_target > lc->maximum_buffer_size)
4578                lc->bits_off_target = lc->maximum_buffer_size;
4579
4580            lc->total_actual_bits += cpi->projected_frame_size;
4581            lc->total_target_vs_actual += bits_off_for_this_layer;
4582            lc->buffer_level = lc->bits_off_target;
4583        }
4584    }
4585
4586    /* Update bits left to the kf and gf groups to account for overshoot
4587     * or undershoot on these frames
4588     */
4589    if (cm->frame_type == KEY_FRAME)
4590    {
4591        cpi->twopass.kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4592
4593        if (cpi->twopass.kf_group_bits < 0)
4594            cpi->twopass.kf_group_bits = 0 ;
4595    }
4596    else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4597    {
4598        cpi->twopass.gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4599
4600        if (cpi->twopass.gf_group_bits < 0)
4601            cpi->twopass.gf_group_bits = 0 ;
4602    }
4603
4604    if (cm->frame_type != KEY_FRAME)
4605    {
4606        if (cpi->common.refresh_alt_ref_frame)
4607        {
4608            cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4609            cpi->last_skip_probs_q[2] = cm->base_qindex;
4610        }
4611        else if (cpi->common.refresh_golden_frame)
4612        {
4613            cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4614            cpi->last_skip_probs_q[1] = cm->base_qindex;
4615        }
4616        else
4617        {
4618            cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4619            cpi->last_skip_probs_q[0] = cm->base_qindex;
4620
4621            /* update the baseline */
4622            cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4623
4624        }
4625    }
4626
4627#if 0 && CONFIG_INTERNAL_STATS
4628    {
4629        FILE *f = fopen("tmp.stt", "a");
4630
4631        vp8_clear_system_state();
4632
4633        if (cpi->twopass.total_left_stats.coded_error != 0.0)
4634            fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
4635                       "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
4636                       "%8.2lf %"PRId64" %10.3lf %10"PRId64" %8d\n",
4637                       cpi->common.current_video_frame, cpi->this_frame_target,
4638                       cpi->projected_frame_size,
4639                       (cpi->projected_frame_size - cpi->this_frame_target),
4640                       cpi->total_target_vs_actual,
4641                       cpi->buffer_level,
4642                       (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4643                       cpi->total_actual_bits, cm->base_qindex,
4644                       cpi->active_best_quality, cpi->active_worst_quality,
4645                       cpi->ni_av_qi, cpi->cq_target_quality,
4646                       cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4647                       cm->frame_type, cpi->gfu_boost,
4648                       cpi->twopass.est_max_qcorrection_factor,
4649                       cpi->twopass.bits_left,
4650                       cpi->twopass.total_left_stats.coded_error,
4651                       (double)cpi->twopass.bits_left /
4652                           cpi->twopass.total_left_stats.coded_error,
4653                       cpi->tot_recode_hits);
4654        else
4655            fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
4656                       "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
4657                       "%8.2lf %"PRId64" %10.3lf %8d\n",
4658                       cpi->common.current_video_frame, cpi->this_frame_target,
4659                       cpi->projected_frame_size,
4660                       (cpi->projected_frame_size - cpi->this_frame_target),
4661                       cpi->total_target_vs_actual,
4662                       cpi->buffer_level,
4663                       (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4664                       cpi->total_actual_bits, cm->base_qindex,
4665                       cpi->active_best_quality, cpi->active_worst_quality,
4666                       cpi->ni_av_qi, cpi->cq_target_quality,
4667                       cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4668                       cm->frame_type, cpi->gfu_boost,
4669                       cpi->twopass.est_max_qcorrection_factor,
4670                       cpi->twopass.bits_left,
4671                       cpi->twopass.total_left_stats.coded_error,
4672                       cpi->tot_recode_hits);
4673
4674        fclose(f);
4675
4676        {
4677            FILE *fmodes = fopen("Modes.stt", "a");
4678
4679            fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4680                        cpi->common.current_video_frame,
4681                        cm->frame_type, cm->refresh_golden_frame,
4682                        cm->refresh_alt_ref_frame);
4683
4684            fprintf(fmodes, "\n");
4685
4686            fclose(fmodes);
4687        }
4688    }
4689
4690#endif
4691
4692    if (cm->refresh_golden_frame == 1)
4693        cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4694    else
4695        cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
4696
4697    if (cm->refresh_alt_ref_frame == 1)
4698        cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4699    else
4700        cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
4701
4702
4703    if (cm->refresh_last_frame & cm->refresh_golden_frame)
4704        /* both refreshed */
4705        cpi->gold_is_last = 1;
4706    else if (cm->refresh_last_frame ^ cm->refresh_golden_frame)
4707        /* 1 refreshed but not the other */
4708        cpi->gold_is_last = 0;
4709
4710    if (cm->refresh_last_frame & cm->refresh_alt_ref_frame)
4711        /* both refreshed */
4712        cpi->alt_is_last = 1;
4713    else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame)
4714        /* 1 refreshed but not the other */
4715        cpi->alt_is_last = 0;
4716
4717    if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame)
4718        /* both refreshed */
4719        cpi->gold_is_alt = 1;
4720    else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame)
4721        /* 1 refreshed but not the other */
4722        cpi->gold_is_alt = 0;
4723
4724    cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
4725
4726    if (cpi->gold_is_last)
4727        cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;
4728
4729    if (cpi->alt_is_last)
4730        cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4731
4732    if (cpi->gold_is_alt)
4733        cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4734
4735
4736    if (!cpi->oxcf.error_resilient_mode)
4737    {
4738        if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
4739            /* Update the alternate reference frame stats as appropriate. */
4740            update_alt_ref_frame_stats(cpi);
4741        else
4742            /* Update the Golden frame stats as appropriate. */
4743            update_golden_frame_stats(cpi);
4744    }
4745
4746    if (cm->frame_type == KEY_FRAME)
4747    {
4748        /* Tell the caller that the frame was coded as a key frame */
4749        *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4750
4751        /* As this frame is a key frame  the next defaults to an inter frame. */
4752        cm->frame_type = INTER_FRAME;
4753
4754        cpi->last_frame_percent_intra = 100;
4755    }
4756    else
4757    {
4758        *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
4759
4760        cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4761    }
4762
4763    /* Clear the one shot update flags for segmentation map and mode/ref
4764     * loop filter deltas.
4765     */
4766    cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4767    cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4768    cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4769
4770
4771    /* Dont increment frame counters if this was an altref buffer update
4772     * not a real frame
4773     */
4774    if (cm->show_frame)
4775    {
4776        cm->current_video_frame++;
4777        cpi->frames_since_key++;
4778        cpi->temporal_pattern_counter++;
4779    }
4780
4781    /* reset to normal state now that we are done. */
4782
4783
4784
4785#if 0
4786    {
4787        char filename[512];
4788        FILE *recon_file;
4789        sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
4790        recon_file = fopen(filename, "wb");
4791        fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4792               cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4793        fclose(recon_file);
4794    }
4795#endif
4796
4797    /* DEBUG */
4798    /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
4799
4800
4801}
4802#if !(CONFIG_REALTIME_ONLY)
4803static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned char * dest_end, unsigned int *frame_flags)
4804{
4805
4806    if (!cpi->common.refresh_alt_ref_frame)
4807        vp8_second_pass(cpi);
4808
4809    encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
4810    cpi->twopass.bits_left -= 8 * *size;
4811
4812    if (!cpi->common.refresh_alt_ref_frame)
4813    {
4814        double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
4815            *cpi->oxcf.two_pass_vbrmin_section / 100);
4816        cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
4817    }
4818}
4819#endif
4820
4821/* For ARM NEON, d8-d15 are callee-saved registers, and need to be saved. */
4822#if HAVE_NEON
4823extern void vp8_push_neon(int64_t *store);
4824extern void vp8_pop_neon(int64_t *store);
4825#endif
4826
4827
4828int vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time)
4829{
4830#if HAVE_NEON
4831    int64_t store_reg[8];
4832#if CONFIG_RUNTIME_CPU_DETECT
4833    VP8_COMMON            *cm = &cpi->common;
4834#endif
4835#endif
4836    struct vpx_usec_timer  timer;
4837    int                    res = 0;
4838
4839#if HAVE_NEON
4840#if CONFIG_RUNTIME_CPU_DETECT
4841    if (cm->cpu_caps & HAS_NEON)
4842#endif
4843    {
4844        vp8_push_neon(store_reg);
4845    }
4846#endif
4847
4848    vpx_usec_timer_start(&timer);
4849
4850    /* Reinit the lookahead buffer if the frame size changes */
4851    if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height)
4852    {
4853        assert(cpi->oxcf.lag_in_frames < 2);
4854        dealloc_raw_frame_buffers(cpi);
4855        alloc_raw_frame_buffers(cpi);
4856    }
4857
4858    if(vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
4859                          frame_flags, cpi->active_map_enabled ? cpi->active_map : NULL))
4860        res = -1;
4861    vpx_usec_timer_mark(&timer);
4862    cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
4863
4864#if HAVE_NEON
4865#if CONFIG_RUNTIME_CPU_DETECT
4866    if (cm->cpu_caps & HAS_NEON)
4867#endif
4868    {
4869        vp8_pop_neon(store_reg);
4870    }
4871#endif
4872
4873    return res;
4874}
4875
4876
4877static int frame_is_reference(const VP8_COMP *cpi)
4878{
4879    const VP8_COMMON *cm = &cpi->common;
4880    const MACROBLOCKD *xd = &cpi->mb.e_mbd;
4881
4882    return cm->frame_type == KEY_FRAME || cm->refresh_last_frame
4883           || cm->refresh_golden_frame || cm->refresh_alt_ref_frame
4884           || cm->copy_buffer_to_gf || cm->copy_buffer_to_arf
4885           || cm->refresh_entropy_probs
4886           || xd->mode_ref_lf_delta_update
4887           || xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
4888}
4889
4890
4891int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, unsigned char *dest_end, int64_t *time_stamp, int64_t *time_end, int flush)
4892{
4893#if HAVE_NEON
4894    int64_t store_reg[8];
4895#endif
4896    VP8_COMMON *cm;
4897    struct vpx_usec_timer  tsctimer;
4898    struct vpx_usec_timer  ticktimer;
4899    struct vpx_usec_timer  cmptimer;
4900    YV12_BUFFER_CONFIG    *force_src_buffer;
4901
4902    if (!cpi)
4903        return -1;
4904
4905    cm = &cpi->common;
4906
4907    if (setjmp(cpi->common.error.jmp))
4908    {
4909        cpi->common.error.setjmp = 0;
4910        return VPX_CODEC_CORRUPT_FRAME;
4911    }
4912
4913    force_src_buffer = NULL;
4914    cpi->common.error.setjmp = 1;
4915
4916#if HAVE_NEON
4917#if CONFIG_RUNTIME_CPU_DETECT
4918    if (cm->cpu_caps & HAS_NEON)
4919#endif
4920    {
4921        vp8_push_neon(store_reg);
4922    }
4923#endif
4924
4925    vpx_usec_timer_start(&cmptimer);
4926
4927    cpi->source = NULL;
4928
4929#if !(CONFIG_REALTIME_ONLY)
4930    /* Should we code an alternate reference frame */
4931    if (cpi->oxcf.error_resilient_mode == 0 &&
4932        cpi->oxcf.play_alternate &&
4933        cpi->source_alt_ref_pending)
4934    {
4935        if ((cpi->source = vp8_lookahead_peek(cpi->lookahead,
4936                                              cpi->frames_till_gf_update_due,
4937                                              PEEK_FORWARD)))
4938        {
4939            cpi->alt_ref_source = cpi->source;
4940            if (cpi->oxcf.arnr_max_frames > 0)
4941            {
4942                vp8_temporal_filter_prepare_c(cpi,
4943                                              cpi->frames_till_gf_update_due);
4944                force_src_buffer = &cpi->alt_ref_buffer;
4945            }
4946            cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
4947            cm->refresh_alt_ref_frame = 1;
4948            cm->refresh_golden_frame = 0;
4949            cm->refresh_last_frame = 0;
4950            cm->show_frame = 0;
4951            /* Clear Pending alt Ref flag. */
4952            cpi->source_alt_ref_pending = 0;
4953            cpi->is_src_frame_alt_ref = 0;
4954        }
4955    }
4956#endif
4957
4958    if (!cpi->source)
4959    {
4960        /* Read last frame source if we are encoding first pass. */
4961        if (cpi->pass == 1 && cm->current_video_frame > 0)
4962        {
4963            if((cpi->last_source = vp8_lookahead_peek(cpi->lookahead, 1,
4964                                                      PEEK_BACKWARD)) == NULL)
4965              return -1;
4966        }
4967
4968
4969        if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush)))
4970        {
4971            cm->show_frame = 1;
4972
4973            cpi->is_src_frame_alt_ref = cpi->alt_ref_source
4974                                        && (cpi->source == cpi->alt_ref_source);
4975
4976            if(cpi->is_src_frame_alt_ref)
4977                cpi->alt_ref_source = NULL;
4978        }
4979    }
4980
4981    if (cpi->source)
4982    {
4983        cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
4984        cpi->un_scaled_source = cpi->Source;
4985        *time_stamp = cpi->source->ts_start;
4986        *time_end = cpi->source->ts_end;
4987        *frame_flags = cpi->source->flags;
4988
4989        if (cpi->pass == 1 && cm->current_video_frame > 0)
4990        {
4991            cpi->last_frame_unscaled_source = &cpi->last_source->img;
4992        }
4993    }
4994    else
4995    {
4996        *size = 0;
4997#if !(CONFIG_REALTIME_ONLY)
4998
4999        if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done)
5000        {
5001            vp8_end_first_pass(cpi);    /* get last stats packet */
5002            cpi->twopass.first_pass_done = 1;
5003        }
5004
5005#endif
5006
5007#if HAVE_NEON
5008#if CONFIG_RUNTIME_CPU_DETECT
5009        if (cm->cpu_caps & HAS_NEON)
5010#endif
5011        {
5012            vp8_pop_neon(store_reg);
5013        }
5014#endif
5015        return -1;
5016    }
5017
5018    if (cpi->source->ts_start < cpi->first_time_stamp_ever)
5019    {
5020        cpi->first_time_stamp_ever = cpi->source->ts_start;
5021        cpi->last_end_time_stamp_seen = cpi->source->ts_start;
5022    }
5023
5024    /* adjust frame rates based on timestamps given */
5025    if (cm->show_frame)
5026    {
5027        int64_t this_duration;
5028        int step = 0;
5029
5030        if (cpi->source->ts_start == cpi->first_time_stamp_ever)
5031        {
5032            this_duration = cpi->source->ts_end - cpi->source->ts_start;
5033            step = 1;
5034        }
5035        else
5036        {
5037            int64_t last_duration;
5038
5039            this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
5040            last_duration = cpi->last_end_time_stamp_seen
5041                            - cpi->last_time_stamp_seen;
5042            /* do a step update if the duration changes by 10% */
5043            if (last_duration)
5044                step = (int)(((this_duration - last_duration) *
5045                            10 / last_duration));
5046        }
5047
5048        if (this_duration)
5049        {
5050            if (step)
5051                cpi->ref_framerate = 10000000.0 / this_duration;
5052            else
5053            {
5054                double avg_duration, interval;
5055
5056                /* Average this frame's rate into the last second's average
5057                 * frame rate. If we haven't seen 1 second yet, then average
5058                 * over the whole interval seen.
5059                 */
5060                interval = (double)(cpi->source->ts_end -
5061                                    cpi->first_time_stamp_ever);
5062                if(interval > 10000000.0)
5063                    interval = 10000000;
5064
5065                avg_duration = 10000000.0 / cpi->ref_framerate;
5066                avg_duration *= (interval - avg_duration + this_duration);
5067                avg_duration /= interval;
5068
5069                cpi->ref_framerate = 10000000.0 / avg_duration;
5070            }
5071
5072            if (cpi->oxcf.number_of_layers > 1)
5073            {
5074                unsigned int i;
5075
5076                /* Update frame rates for each layer */
5077                assert(cpi->oxcf.number_of_layers <= VPX_TS_MAX_LAYERS);
5078                for (i=0; i<cpi->oxcf.number_of_layers; i++)
5079                {
5080                    LAYER_CONTEXT *lc = &cpi->layer_context[i];
5081                    lc->framerate = cpi->ref_framerate /
5082                                    cpi->oxcf.rate_decimator[i];
5083                }
5084            }
5085            else
5086                vp8_new_framerate(cpi, cpi->ref_framerate);
5087        }
5088
5089        cpi->last_time_stamp_seen = cpi->source->ts_start;
5090        cpi->last_end_time_stamp_seen = cpi->source->ts_end;
5091    }
5092
5093    if (cpi->oxcf.number_of_layers > 1)
5094    {
5095        int layer;
5096
5097        update_layer_contexts (cpi);
5098
5099        /* Restore layer specific context & set frame rate */
5100        layer = cpi->oxcf.layer_id[
5101                cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
5102        restore_layer_context (cpi, layer);
5103        vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
5104    }
5105
5106    if (cpi->compressor_speed == 2)
5107    {
5108        vpx_usec_timer_start(&tsctimer);
5109        vpx_usec_timer_start(&ticktimer);
5110    }
5111
5112    cpi->lf_zeromv_pct = (cpi->zeromv_count * 100)/cm->MBs;
5113
5114#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
5115    {
5116        int i;
5117        const int num_part = (1 << cm->multi_token_partition);
5118        /* the available bytes in dest */
5119        const unsigned long dest_size = dest_end - dest;
5120        const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
5121
5122        unsigned char *dp = dest;
5123
5124        cpi->partition_d[0] = dp;
5125        dp += dest_size/10;         /* reserve 1/10 for control partition */
5126        cpi->partition_d_end[0] = dp;
5127
5128        for(i = 0; i < num_part; i++)
5129        {
5130            cpi->partition_d[i + 1] = dp;
5131            dp += tok_part_buff_size;
5132            cpi->partition_d_end[i + 1] = dp;
5133        }
5134    }
5135#endif
5136
5137    /* start with a 0 size frame */
5138    *size = 0;
5139
5140    /* Clear down mmx registers */
5141    vp8_clear_system_state();
5142
5143    cm->frame_type = INTER_FRAME;
5144    cm->frame_flags = *frame_flags;
5145
5146#if 0
5147
5148    if (cm->refresh_alt_ref_frame)
5149    {
5150        cm->refresh_golden_frame = 0;
5151        cm->refresh_last_frame = 0;
5152    }
5153    else
5154    {
5155        cm->refresh_golden_frame = 0;
5156        cm->refresh_last_frame = 1;
5157    }
5158
5159#endif
5160    /* find a free buffer for the new frame */
5161    {
5162        int i = 0;
5163        for(; i < NUM_YV12_BUFFERS; i++)
5164        {
5165            if(!cm->yv12_fb[i].flags)
5166            {
5167                cm->new_fb_idx = i;
5168                break;
5169            }
5170        }
5171
5172        assert(i < NUM_YV12_BUFFERS );
5173    }
5174#if !(CONFIG_REALTIME_ONLY)
5175
5176    if (cpi->pass == 1)
5177    {
5178        Pass1Encode(cpi, size, dest, frame_flags);
5179    }
5180    else if (cpi->pass == 2)
5181    {
5182        Pass2Encode(cpi, size, dest, dest_end, frame_flags);
5183    }
5184    else
5185#endif
5186        encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
5187
5188    if (cpi->compressor_speed == 2)
5189    {
5190        unsigned int duration, duration2;
5191        vpx_usec_timer_mark(&tsctimer);
5192        vpx_usec_timer_mark(&ticktimer);
5193
5194        duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
5195        duration2 = (unsigned int)((double)duration / 2);
5196
5197        if (cm->frame_type != KEY_FRAME)
5198        {
5199            if (cpi->avg_encode_time == 0)
5200                cpi->avg_encode_time = duration;
5201            else
5202                cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
5203        }
5204
5205        if (duration2)
5206        {
5207            {
5208
5209                if (cpi->avg_pick_mode_time == 0)
5210                    cpi->avg_pick_mode_time = duration2;
5211                else
5212                    cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
5213            }
5214        }
5215
5216    }
5217
5218    if (cm->refresh_entropy_probs == 0)
5219    {
5220        vpx_memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
5221    }
5222
5223    /* Save the contexts separately for alt ref, gold and last. */
5224    /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
5225    if(cm->refresh_alt_ref_frame)
5226        vpx_memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
5227
5228    if(cm->refresh_golden_frame)
5229        vpx_memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
5230
5231    if(cm->refresh_last_frame)
5232        vpx_memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
5233
5234    /* if its a dropped frame honor the requests on subsequent frames */
5235    if (*size > 0)
5236    {
5237        cpi->droppable = !frame_is_reference(cpi);
5238
5239        /* return to normal state */
5240        cm->refresh_entropy_probs = 1;
5241        cm->refresh_alt_ref_frame = 0;
5242        cm->refresh_golden_frame = 0;
5243        cm->refresh_last_frame = 1;
5244        cm->frame_type = INTER_FRAME;
5245
5246    }
5247
5248    /* Save layer specific state */
5249    if (cpi->oxcf.number_of_layers > 1)
5250        save_layer_context (cpi);
5251
5252    vpx_usec_timer_mark(&cmptimer);
5253    cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
5254
5255    if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
5256    {
5257        generate_psnr_packet(cpi);
5258    }
5259
5260#if CONFIG_INTERNAL_STATS
5261
5262    if (cpi->pass != 1)
5263    {
5264        cpi->bytes += *size;
5265
5266        if (cm->show_frame)
5267        {
5268            cpi->common.show_frame_mi = cpi->common.mi;
5269            cpi->count ++;
5270
5271            if (cpi->b_calculate_psnr)
5272            {
5273                uint64_t ye,ue,ve;
5274                double frame_psnr;
5275                YV12_BUFFER_CONFIG      *orig = cpi->Source;
5276                YV12_BUFFER_CONFIG      *recon = cpi->common.frame_to_show;
5277                int y_samples = orig->y_height * orig->y_width ;
5278                int uv_samples = orig->uv_height * orig->uv_width ;
5279                int t_samples = y_samples + 2 * uv_samples;
5280                double sq_error, sq_error2;
5281
5282                ye = calc_plane_error(orig->y_buffer, orig->y_stride,
5283                  recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height);
5284
5285                ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
5286                  recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);
5287
5288                ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
5289                  recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);
5290
5291                sq_error = (double)(ye + ue + ve);
5292
5293                frame_psnr = vpx_sse_to_psnr(t_samples, 255.0, sq_error);
5294
5295                cpi->total_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
5296                cpi->total_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
5297                cpi->total_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
5298                cpi->total_sq_error += sq_error;
5299                cpi->total  += frame_psnr;
5300#if CONFIG_POSTPROC
5301                {
5302                    YV12_BUFFER_CONFIG      *pp = &cm->post_proc_buffer;
5303                    double frame_psnr2, frame_ssim2 = 0;
5304                    double weight = 0;
5305
5306                    vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0);
5307                    vp8_clear_system_state();
5308
5309                    ye = calc_plane_error(orig->y_buffer, orig->y_stride,
5310                      pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height);
5311
5312                    ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
5313                      pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);
5314
5315                    ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
5316                      pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);
5317
5318                    sq_error2 = (double)(ye + ue + ve);
5319
5320                    frame_psnr2 = vpx_sse_to_psnr(t_samples, 255.0, sq_error2);
5321
5322                    cpi->totalp_y += vpx_sse_to_psnr(y_samples,
5323                                                     255.0, (double)ye);
5324                    cpi->totalp_u += vpx_sse_to_psnr(uv_samples,
5325                                                     255.0, (double)ue);
5326                    cpi->totalp_v += vpx_sse_to_psnr(uv_samples,
5327                                                     255.0, (double)ve);
5328                    cpi->total_sq_error2 += sq_error2;
5329                    cpi->totalp  += frame_psnr2;
5330
5331                    frame_ssim2 = vp8_calc_ssim(cpi->Source,
5332                      &cm->post_proc_buffer, 1, &weight);
5333
5334                    cpi->summed_quality += frame_ssim2 * weight;
5335                    cpi->summed_weights += weight;
5336
5337                    if (cpi->oxcf.number_of_layers > 1)
5338                    {
5339                         unsigned int i;
5340
5341                         for (i=cpi->current_layer;
5342                                       i<cpi->oxcf.number_of_layers; i++)
5343                         {
5344                             cpi->frames_in_layer[i]++;
5345
5346                             cpi->bytes_in_layer[i] += *size;
5347                             cpi->sum_psnr[i]       += frame_psnr;
5348                             cpi->sum_psnr_p[i]     += frame_psnr2;
5349                             cpi->total_error2[i]   += sq_error;
5350                             cpi->total_error2_p[i] += sq_error2;
5351                             cpi->sum_ssim[i]       += frame_ssim2 * weight;
5352                             cpi->sum_weights[i]    += weight;
5353                         }
5354                    }
5355                }
5356#endif
5357            }
5358
5359            if (cpi->b_calculate_ssimg)
5360            {
5361                double y, u, v, frame_all;
5362                frame_all =  vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
5363                    &y, &u, &v);
5364
5365                if (cpi->oxcf.number_of_layers > 1)
5366                {
5367                    unsigned int i;
5368
5369                    for (i=cpi->current_layer;
5370                         i<cpi->oxcf.number_of_layers; i++)
5371                    {
5372                        if (!cpi->b_calculate_psnr)
5373                            cpi->frames_in_layer[i]++;
5374
5375                        cpi->total_ssimg_y_in_layer[i] += y;
5376                        cpi->total_ssimg_u_in_layer[i] += u;
5377                        cpi->total_ssimg_v_in_layer[i] += v;
5378                        cpi->total_ssimg_all_in_layer[i] += frame_all;
5379                    }
5380                }
5381                else
5382                {
5383                    cpi->total_ssimg_y += y;
5384                    cpi->total_ssimg_u += u;
5385                    cpi->total_ssimg_v += v;
5386                    cpi->total_ssimg_all += frame_all;
5387                }
5388            }
5389
5390        }
5391    }
5392
5393#if 0
5394
5395    if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
5396    {
5397        skiptruecount += cpi->skip_true_count;
5398        skipfalsecount += cpi->skip_false_count;
5399    }
5400
5401#endif
5402#if 0
5403
5404    if (cpi->pass != 1)
5405    {
5406        FILE *f = fopen("skip.stt", "a");
5407        fprintf(f, "frame:%4d flags:%4x Q:%4d P:%4d Size:%5d\n", cpi->common.current_video_frame, *frame_flags, cpi->common.base_qindex, cpi->prob_skip_false, *size);
5408
5409        if (cpi->is_src_frame_alt_ref == 1)
5410            fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
5411
5412        fclose(f);
5413    }
5414
5415#endif
5416#endif
5417
5418#if HAVE_NEON
5419#if CONFIG_RUNTIME_CPU_DETECT
5420    if (cm->cpu_caps & HAS_NEON)
5421#endif
5422    {
5423        vp8_pop_neon(store_reg);
5424    }
5425#endif
5426
5427    cpi->common.error.setjmp = 0;
5428
5429    return 0;
5430}
5431
5432int vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
5433{
5434    if (cpi->common.refresh_alt_ref_frame)
5435        return -1;
5436    else
5437    {
5438        int ret;
5439
5440#if CONFIG_MULTITHREAD
5441        if(cpi->b_lpf_running)
5442        {
5443            sem_wait(&cpi->h_event_end_lpf);
5444            cpi->b_lpf_running = 0;
5445        }
5446#endif
5447
5448#if CONFIG_POSTPROC
5449        cpi->common.show_frame_mi = cpi->common.mi;
5450        ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5451#else
5452
5453        if (cpi->common.frame_to_show)
5454        {
5455            *dest = *cpi->common.frame_to_show;
5456            dest->y_width = cpi->common.Width;
5457            dest->y_height = cpi->common.Height;
5458            dest->uv_height = cpi->common.Height / 2;
5459            ret = 0;
5460        }
5461        else
5462        {
5463            ret = -1;
5464        }
5465
5466#endif
5467        vp8_clear_system_state();
5468        return ret;
5469    }
5470}
5471
5472int vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4])
5473{
5474    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5475    int internal_delta_q[MAX_MB_SEGMENTS];
5476    const int range = 63;
5477    int i;
5478
5479    // This method is currently incompatible with the cyclic refresh method
5480    if ( cpi->cyclic_refresh_mode_enabled )
5481        return -1;
5482
5483    // Check number of rows and columns match
5484    if (cpi->common.mb_rows != (int)rows || cpi->common.mb_cols != (int)cols)
5485        return -1;
5486
5487    // Range check the delta Q values and convert the external Q range values
5488    // to internal ones.
5489    if ( (abs(delta_q[0]) > range) || (abs(delta_q[1]) > range) ||
5490         (abs(delta_q[2]) > range) || (abs(delta_q[3]) > range) )
5491        return -1;
5492
5493    // Range check the delta lf values
5494    if ( (abs(delta_lf[0]) > range) || (abs(delta_lf[1]) > range) ||
5495         (abs(delta_lf[2]) > range) || (abs(delta_lf[3]) > range) )
5496        return -1;
5497
5498    if (!map)
5499    {
5500        disable_segmentation(cpi);
5501        return 0;
5502    }
5503
5504    // Translate the external delta q values to internal values.
5505    for ( i = 0; i < MAX_MB_SEGMENTS; i++ )
5506        internal_delta_q[i] =
5507            ( delta_q[i] >= 0 ) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];
5508
5509    /* Set the segmentation Map */
5510    set_segmentation_map(cpi, map);
5511
5512    /* Activate segmentation. */
5513    enable_segmentation(cpi);
5514
5515    /* Set up the quant segment data */
5516    feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
5517    feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
5518    feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
5519    feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];
5520
5521    /* Set up the loop segment data s */
5522    feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5523    feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5524    feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5525    feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5526
5527    cpi->segment_encode_breakout[0] = threshold[0];
5528    cpi->segment_encode_breakout[1] = threshold[1];
5529    cpi->segment_encode_breakout[2] = threshold[2];
5530    cpi->segment_encode_breakout[3] = threshold[3];
5531
5532    /* Initialise the feature data structure */
5533    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5534
5535    return 0;
5536}
5537
5538int vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols)
5539{
5540    if ((int)rows == cpi->common.mb_rows && (int)cols == cpi->common.mb_cols)
5541    {
5542        if (map)
5543        {
5544            vpx_memcpy(cpi->active_map, map, rows * cols);
5545            cpi->active_map_enabled = 1;
5546        }
5547        else
5548            cpi->active_map_enabled = 0;
5549
5550        return 0;
5551    }
5552    else
5553    {
5554        return -1 ;
5555    }
5556}
5557
5558int vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
5559{
5560    if (horiz_mode <= ONETWO)
5561        cpi->common.horiz_scale = horiz_mode;
5562    else
5563        return -1;
5564
5565    if (vert_mode <= ONETWO)
5566        cpi->common.vert_scale  = vert_mode;
5567    else
5568        return -1;
5569
5570    return 0;
5571}
5572
5573
5574
5575int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest)
5576{
5577    int i, j;
5578    int Total = 0;
5579
5580    unsigned char *src = source->y_buffer;
5581    unsigned char *dst = dest->y_buffer;
5582
5583    /* Loop through the Y plane raw and reconstruction data summing
5584     * (square differences)
5585     */
5586    for (i = 0; i < source->y_height; i += 16)
5587    {
5588        for (j = 0; j < source->y_width; j += 16)
5589        {
5590            unsigned int sse;
5591            Total += vp8_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
5592        }
5593
5594        src += 16 * source->y_stride;
5595        dst += 16 * dest->y_stride;
5596    }
5597
5598    return Total;
5599}
5600
5601
5602int vp8_get_quantizer(VP8_COMP *cpi)
5603{
5604    return cpi->common.base_qindex;
5605}
5606