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