/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


#include "vpx_config.h"
#include "./vpx_scale_rtcd.h"
#include "vp8/common/onyxc_int.h"
#include "vp8/common/blockd.h"
#include "onyx_int.h"
#include "vp8/common/systemdependent.h"
#include "quantize.h"
#include "vp8/common/alloccommon.h"
#include "mcomp.h"
#include "firstpass.h"
#include "vpx/internal/vpx_psnr.h"
#include "vpx_scale/vpx_scale.h"
#include "vp8/common/extend.h"
#include "ratectrl.h"
#include "vp8/common/quant_common.h"
#include "segmentation.h"
#if CONFIG_POSTPROC
#include "vp8/common/postproc.h"
#endif
#include "vpx_mem/vpx_mem.h"
#include "vp8/common/swapyv12buffer.h"
#include "vp8/common/threading.h"
#include "vpx_ports/vpx_timer.h"
#if ARCH_ARM
#include "vpx_ports/arm.h"
#endif
#if CONFIG_MULTI_RES_ENCODING
#include "mr_dissim.h"
#endif
#include "encodeframe.h"

#include <math.h>
#include <stdio.h>
#include <limits.h>

#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
extern int vp8_update_coef_context(VP8_COMP *cpi);
extern void vp8_update_coef_probs(VP8_COMP *cpi);
#endif

extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);

extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
extern void print_parms(VP8_CONFIG *ocf, char *filenam);
extern unsigned int vp8_get_processor_freq();
extern void print_tree_update_probs();
extern int vp8cx_create_encoder_threads(VP8_COMP *cpi);
extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);

int vp8_estimate_entropy_savings(VP8_COMP *cpi);

int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);

extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);

static void set_default_lf_deltas(VP8_COMP *cpi);

extern const int vp8_gf_interval_table[101];

#if CONFIG_INTERNAL_STATS
#include "math.h"

extern double vp8_calc_ssim
(
    YV12_BUFFER_CONFIG *source,
    YV12_BUFFER_CONFIG *dest,
    int lumamask,
    double *weight
);


extern double vp8_calc_ssimg
(
    YV12_BUFFER_CONFIG *source,
    YV12_BUFFER_CONFIG *dest,
    double *ssim_y,
    double *ssim_u,
    double *ssim_v
);


#endif


#ifdef OUTPUT_YUV_SRC
FILE *yuv_file;
#endif
#ifdef OUTPUT_YUV_DENOISED
FILE *yuv_denoised_file;
#endif

#if 0
FILE *framepsnr;
FILE *kf_list;
FILE *keyfile;
#endif

#if 0
extern int skip_true_count;
extern int skip_false_count;
#endif


#ifdef VP8_ENTROPY_STATS
extern int intra_mode_stats[10][10][10];
#endif

#ifdef SPEEDSTATS
unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned int tot_pm = 0;
unsigned int cnt_pm = 0;
unsigned int tot_ef = 0;
unsigned int cnt_ef = 0;
#endif

#ifdef MODE_STATS
extern unsigned __int64 Sectionbits[50];
extern int y_modes[5]  ;
extern int uv_modes[4] ;
extern int b_modes[10]  ;

extern int inter_y_modes[10] ;
extern int inter_uv_modes[4] ;
extern unsigned int inter_b_modes[15];
#endif

extern const int vp8_bits_per_mb[2][QINDEX_RANGE];

extern const int qrounding_factors[129];
extern const int qzbin_factors[129];
extern void vp8cx_init_quantizer(VP8_COMP *cpi);
extern const int vp8cx_base_skip_false_prob[128];

/* Tables relating active max Q to active min Q */
static const unsigned char kf_low_motion_minq[QINDEX_RANGE] =
{
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
    3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,
    6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
    11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
    16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23
};
static const unsigned char kf_high_motion_minq[QINDEX_RANGE] =
{
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,
    3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6,
    6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
    11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
    16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21,
    21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30
};
static const unsigned char gf_low_motion_minq[QINDEX_RANGE] =
{
    0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
    3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,
    7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,
    11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,
    19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,
    27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,
    35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,
    43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
};
static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] =
{
    0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4,
    4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
    9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,
    14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,
    22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,
    30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,
    38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48,
    49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
};
static const unsigned char gf_high_motion_minq[QINDEX_RANGE] =
{
    0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4,
    4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
    9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
    17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,
    25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,
    33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,
    41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54,
    55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
};
static const unsigned char inter_minq[QINDEX_RANGE] =
{
    0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
    9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
    20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
    32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
    44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
    57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
    71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
    86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
};

#ifdef PACKET_TESTING
extern FILE *vpxlogc;
#endif

static void save_layer_context(VP8_COMP *cpi)
{
    LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];

    /* Save layer dependent coding state */
    lc->target_bandwidth                 = cpi->target_bandwidth;
    lc->starting_buffer_level            = cpi->oxcf.starting_buffer_level;
    lc->optimal_buffer_level             = cpi->oxcf.optimal_buffer_level;
    lc->maximum_buffer_size              = cpi->oxcf.maximum_buffer_size;
    lc->starting_buffer_level_in_ms      = cpi->oxcf.starting_buffer_level_in_ms;
    lc->optimal_buffer_level_in_ms       = cpi->oxcf.optimal_buffer_level_in_ms;
    lc->maximum_buffer_size_in_ms        = cpi->oxcf.maximum_buffer_size_in_ms;
    lc->buffer_level                     = cpi->buffer_level;
    lc->bits_off_target                  = cpi->bits_off_target;
    lc->total_actual_bits                = cpi->total_actual_bits;
    lc->worst_quality                    = cpi->worst_quality;
    lc->active_worst_quality             = cpi->active_worst_quality;
    lc->best_quality                     = cpi->best_quality;
    lc->active_best_quality              = cpi->active_best_quality;
    lc->ni_av_qi                         = cpi->ni_av_qi;
    lc->ni_tot_qi                        = cpi->ni_tot_qi;
    lc->ni_frames                        = cpi->ni_frames;
    lc->avg_frame_qindex                 = cpi->avg_frame_qindex;
    lc->rate_correction_factor           = cpi->rate_correction_factor;
    lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
    lc->gf_rate_correction_factor        = cpi->gf_rate_correction_factor;
    lc->zbin_over_quant                  = cpi->mb.zbin_over_quant;
    lc->inter_frame_target               = cpi->inter_frame_target;
    lc->total_byte_count                 = cpi->total_byte_count;
    lc->filter_level                     = cpi->common.filter_level;

    lc->last_frame_percent_intra         = cpi->last_frame_percent_intra;

    memcpy (lc->count_mb_ref_frame_usage,
            cpi->mb.count_mb_ref_frame_usage,
            sizeof(cpi->mb.count_mb_ref_frame_usage));
}

static void restore_layer_context(VP8_COMP *cpi, const int layer)
{
    LAYER_CONTEXT *lc = &cpi->layer_context[layer];

    /* Restore layer dependent coding state */
    cpi->current_layer                    = layer;
    cpi->target_bandwidth                 = lc->target_bandwidth;
    cpi->oxcf.target_bandwidth            = lc->target_bandwidth;
    cpi->oxcf.starting_buffer_level       = lc->starting_buffer_level;
    cpi->oxcf.optimal_buffer_level        = lc->optimal_buffer_level;
    cpi->oxcf.maximum_buffer_size         = lc->maximum_buffer_size;
    cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
    cpi->oxcf.optimal_buffer_level_in_ms  = lc->optimal_buffer_level_in_ms;
    cpi->oxcf.maximum_buffer_size_in_ms   = lc->maximum_buffer_size_in_ms;
    cpi->buffer_level                     = lc->buffer_level;
    cpi->bits_off_target                  = lc->bits_off_target;
    cpi->total_actual_bits                = lc->total_actual_bits;
    cpi->active_worst_quality             = lc->active_worst_quality;
    cpi->active_best_quality              = lc->active_best_quality;
    cpi->ni_av_qi                         = lc->ni_av_qi;
    cpi->ni_tot_qi                        = lc->ni_tot_qi;
    cpi->ni_frames                        = lc->ni_frames;
    cpi->avg_frame_qindex                 = lc->avg_frame_qindex;
    cpi->rate_correction_factor           = lc->rate_correction_factor;
    cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
    cpi->gf_rate_correction_factor        = lc->gf_rate_correction_factor;
    cpi->mb.zbin_over_quant                  = lc->zbin_over_quant;
    cpi->inter_frame_target               = lc->inter_frame_target;
    cpi->total_byte_count                 = lc->total_byte_count;
    cpi->common.filter_level              = lc->filter_level;

    cpi->last_frame_percent_intra         = lc->last_frame_percent_intra;

    memcpy (cpi->mb.count_mb_ref_frame_usage,
            lc->count_mb_ref_frame_usage,
            sizeof(cpi->mb.count_mb_ref_frame_usage));
}

static int rescale(int val, int num, int denom)
{
    int64_t llnum = num;
    int64_t llden = denom;
    int64_t llval = val;

    return (int)(llval * llnum / llden);
}

static void init_temporal_layer_context(VP8_COMP *cpi,
                                        VP8_CONFIG *oxcf,
                                        const int layer,
                                        double prev_layer_framerate)
{
    LAYER_CONTEXT *lc = &cpi->layer_context[layer];

    lc->framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[layer];
    lc->target_bandwidth = cpi->oxcf.target_bitrate[layer] * 1000;

    lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
    lc->optimal_buffer_level_in_ms  = oxcf->optimal_buffer_level;
    lc->maximum_buffer_size_in_ms   = oxcf->maximum_buffer_size;

    lc->starting_buffer_level =
        rescale((int)(oxcf->starting_buffer_level),
                lc->target_bandwidth, 1000);

    if (oxcf->optimal_buffer_level == 0)
      lc->optimal_buffer_level = lc->target_bandwidth / 8;
    else
      lc->optimal_buffer_level =
          rescale((int)(oxcf->optimal_buffer_level),
                  lc->target_bandwidth, 1000);

    if (oxcf->maximum_buffer_size == 0)
      lc->maximum_buffer_size = lc->target_bandwidth / 8;
    else
      lc->maximum_buffer_size =
          rescale((int)(oxcf->maximum_buffer_size),
                  lc->target_bandwidth, 1000);

    /* Work out the average size of a frame within this layer */
    if (layer > 0)
      lc->avg_frame_size_for_layer =
          (int)((cpi->oxcf.target_bitrate[layer] -
                cpi->oxcf.target_bitrate[layer-1]) * 1000 /
                (lc->framerate - prev_layer_framerate));

     lc->active_worst_quality         = cpi->oxcf.worst_allowed_q;
     lc->active_best_quality          = cpi->oxcf.best_allowed_q;
     lc->avg_frame_qindex             = cpi->oxcf.worst_allowed_q;

     lc->buffer_level                 = lc->starting_buffer_level;
     lc->bits_off_target              = lc->starting_buffer_level;

     lc->total_actual_bits                 = 0;
     lc->ni_av_qi                          = 0;
     lc->ni_tot_qi                         = 0;
     lc->ni_frames                         = 0;
     lc->rate_correction_factor            = 1.0;
     lc->key_frame_rate_correction_factor  = 1.0;
     lc->gf_rate_correction_factor         = 1.0;
     lc->inter_frame_target                = 0;
}

// Upon a run-time change in temporal layers, reset the layer context parameters
// for any "new" layers. For "existing" layers, let them inherit the parameters
// from the previous layer state (at the same layer #). In future we may want
// to better map the previous layer state(s) to the "new" ones.
static void reset_temporal_layer_change(VP8_COMP *cpi,
                                        VP8_CONFIG *oxcf,
                                        const int prev_num_layers)
{
    int i;
    double prev_layer_framerate = 0;
    const int curr_num_layers = cpi->oxcf.number_of_layers;
    // If the previous state was 1 layer, get current layer context from cpi.
    // We need this to set the layer context for the new layers below.
    if (prev_num_layers == 1)
    {
        cpi->current_layer = 0;
        save_layer_context(cpi);
    }
    for (i = 0; i < curr_num_layers; i++)
    {
        LAYER_CONTEXT *lc = &cpi->layer_context[i];
        if (i >= prev_num_layers)
        {
           init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
        }
        // The initial buffer levels are set based on their starting levels.
        // We could set the buffer levels based on the previous state (normalized
        // properly by the layer bandwidths) but we would need to keep track of
        // the previous set of layer bandwidths (i.e., target_bitrate[i])
        // before the layer change. For now, reset to the starting levels.
        lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
                           cpi->oxcf.target_bitrate[i];
        lc->bits_off_target = lc->buffer_level;
        // TDOD(marpan): Should we set the rate_correction_factor and
        // active_worst/best_quality to values derived from the previous layer
        // state (to smooth-out quality dips/rate fluctuation at transition)?

        // We need to treat the 1 layer case separately: oxcf.target_bitrate[i]
        // is not set for 1 layer, and the restore_layer_context/save_context()
        // are not called in the encoding loop, so we need to call it here to
        // pass the layer context state to |cpi|.
        if (curr_num_layers == 1)
        {
            lc->target_bandwidth = cpi->oxcf.target_bandwidth;
            lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
                               lc->target_bandwidth  / 1000;
            lc->bits_off_target = lc->buffer_level;
            restore_layer_context(cpi, 0);
        }
        prev_layer_framerate = cpi->output_framerate /
                               cpi->oxcf.rate_decimator[i];
    }
}

static void setup_features(VP8_COMP *cpi)
{
    // If segmentation enabled set the update flags
    if ( cpi->mb.e_mbd.segmentation_enabled )
    {
        cpi->mb.e_mbd.update_mb_segmentation_map = 1;
        cpi->mb.e_mbd.update_mb_segmentation_data = 1;
    }
    else
    {
        cpi->mb.e_mbd.update_mb_segmentation_map = 0;
        cpi->mb.e_mbd.update_mb_segmentation_data = 0;
    }

    cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
    cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
    vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
    vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
    vpx_memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
    vpx_memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));

    set_default_lf_deltas(cpi);

}


static void dealloc_raw_frame_buffers(VP8_COMP *cpi);


static void dealloc_compressor_data(VP8_COMP *cpi)
{
    vpx_free(cpi->tplist);
    cpi->tplist = NULL;

    /* Delete last frame MV storage buffers */
    vpx_free(cpi->lfmv);
    cpi->lfmv = 0;

    vpx_free(cpi->lf_ref_frame_sign_bias);
    cpi->lf_ref_frame_sign_bias = 0;

    vpx_free(cpi->lf_ref_frame);
    cpi->lf_ref_frame = 0;

    /* Delete sementation map */
    vpx_free(cpi->segmentation_map);
    cpi->segmentation_map = 0;

    vpx_free(cpi->active_map);
    cpi->active_map = 0;

    vp8_de_alloc_frame_buffers(&cpi->common);

    vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
    vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
    dealloc_raw_frame_buffers(cpi);

    vpx_free(cpi->tok);
    cpi->tok = 0;

    /* Structure used to monitor GF usage */
    vpx_free(cpi->gf_active_flags);
    cpi->gf_active_flags = 0;

    /* Activity mask based per mb zbin adjustments */
    vpx_free(cpi->mb_activity_map);
    cpi->mb_activity_map = 0;

    vpx_free(cpi->mb.pip);
    cpi->mb.pip = 0;

#if CONFIG_MULTITHREAD
    vpx_free(cpi->mt_current_mb_col);
    cpi->mt_current_mb_col = NULL;
#endif
}

static void enable_segmentation(VP8_COMP *cpi)
{
    /* Set the appropriate feature bit */
    cpi->mb.e_mbd.segmentation_enabled = 1;
    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
}
static void disable_segmentation(VP8_COMP *cpi)
{
    /* Clear the appropriate feature bit */
    cpi->mb.e_mbd.segmentation_enabled = 0;
}

/* Valid values for a segment are 0 to 3
 * Segmentation map is arrange as [Rows][Columns]
 */
static void set_segmentation_map(VP8_COMP *cpi, unsigned char *segmentation_map)
{
    /* Copy in the new segmentation map */
    vpx_memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));

    /* Signal that the map should be updated. */
    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
}

/* The values given for each segment can be either deltas (from the default
 * value chosen for the frame) or absolute values.
 *
 * Valid range for abs values is:
 *    (0-127 for MB_LVL_ALT_Q), (0-63 for SEGMENT_ALT_LF)
 * Valid range for delta values are:
 *    (+/-127 for MB_LVL_ALT_Q), (+/-63 for SEGMENT_ALT_LF)
 *
 * abs_delta = SEGMENT_DELTADATA (deltas)
 * abs_delta = SEGMENT_ABSDATA (use the absolute values given).
 *
 */
static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned char abs_delta)
{
    cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
    vpx_memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
}


static void segmentation_test_function(VP8_COMP *cpi)
{
    unsigned char *seg_map;
    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];

    // Create a temporary map for segmentation data.
    CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));

    // Set the segmentation Map
    set_segmentation_map(cpi, seg_map);

    // Activate segmentation.
    enable_segmentation(cpi);

    // Set up the quant segment data
    feature_data[MB_LVL_ALT_Q][0] = 0;
    feature_data[MB_LVL_ALT_Q][1] = 4;
    feature_data[MB_LVL_ALT_Q][2] = 0;
    feature_data[MB_LVL_ALT_Q][3] = 0;
    // Set up the loop segment data
    feature_data[MB_LVL_ALT_LF][0] = 0;
    feature_data[MB_LVL_ALT_LF][1] = 0;
    feature_data[MB_LVL_ALT_LF][2] = 0;
    feature_data[MB_LVL_ALT_LF][3] = 0;

    // Initialise the feature data structure
    // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1
    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);

    // Delete sementation map
    vpx_free(seg_map);

    seg_map = 0;
}

/* A simple function to cyclically refresh the background at a lower Q */
static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
{
    unsigned char *seg_map = cpi->segmentation_map;
    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
    int i;
    int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
    int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;

    cpi->cyclic_refresh_q = Q / 2;

    // Set every macroblock to be eligible for update.
    // For key frame this will reset seg map to 0.
    vpx_memset(cpi->segmentation_map, 0, mbs_in_frame);

    if (cpi->common.frame_type != KEY_FRAME)
    {
        /* Cycle through the macro_block rows */
        /* MB loop to set local segmentation map */
        i = cpi->cyclic_refresh_mode_index;
        assert(i < mbs_in_frame);
        do
        {
          /* If the MB is as a candidate for clean up then mark it for
           * possible boost/refresh (segment 1) The segment id may get
           * reset to 0 later if the MB gets coded anything other than
           * last frame 0,0 as only (last frame 0,0) MBs are eligable for
           * refresh : that is to say Mbs likely to be background blocks.
           */
          if (cpi->cyclic_refresh_map[i] == 0)
          {
              seg_map[i] = 1;
              block_count --;
          }
          else if (cpi->cyclic_refresh_map[i] < 0)
              cpi->cyclic_refresh_map[i]++;

          i++;
          if (i == mbs_in_frame)
              i = 0;

        }
        while(block_count && i != cpi->cyclic_refresh_mode_index);

        cpi->cyclic_refresh_mode_index = i;
    }

    /* Activate segmentation. */
    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
    enable_segmentation(cpi);

    /* Set up the quant segment data */
    feature_data[MB_LVL_ALT_Q][0] = 0;
    feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
    feature_data[MB_LVL_ALT_Q][2] = 0;
    feature_data[MB_LVL_ALT_Q][3] = 0;

    /* Set up the loop segment data */
    feature_data[MB_LVL_ALT_LF][0] = 0;
    feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
    feature_data[MB_LVL_ALT_LF][2] = 0;
    feature_data[MB_LVL_ALT_LF][3] = 0;

    /* Initialise the feature data structure */
    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);

}

static void set_default_lf_deltas(VP8_COMP *cpi)
{
    cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
    cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;

    vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
    vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));

    /* Test of ref frame deltas */
    cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
    cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
    cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
    cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;

    cpi->mb.e_mbd.mode_lf_deltas[0] = 4;               /* BPRED */

    if(cpi->oxcf.Mode == MODE_REALTIME)
      cpi->mb.e_mbd.mode_lf_deltas[1] = -12;              /* Zero */
    else
      cpi->mb.e_mbd.mode_lf_deltas[1] = -2;              /* Zero */

    cpi->mb.e_mbd.mode_lf_deltas[2] = 2;               /* New mv */
    cpi->mb.e_mbd.mode_lf_deltas[3] = 4;               /* Split mv */
}

/* Convenience macros for mapping speed and mode into a continuous
 * range
 */
#define GOOD(x) (x+1)
#define RT(x) (x+7)

static int speed_map(int speed, const int *map)
{
    int res;

    do
    {
        res = *map++;
    } while(speed >= *map++);
    return res;
}

static const int thresh_mult_map_znn[] = {
    /* map common to zero, nearest, and near */
    0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
};

static const int thresh_mult_map_vhpred[] = {
    1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(1), 2000,
    RT(7), INT_MAX, INT_MAX
};

static const int thresh_mult_map_bpred[] = {
    2000, GOOD(0), 2500, GOOD(2), 5000, GOOD(3), 7500, RT(0), 2500, RT(1), 5000,
    RT(6), INT_MAX, INT_MAX
};

static const int thresh_mult_map_tm[] = {
    1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 0, RT(1), 1000, RT(2), 2000,
    RT(7), INT_MAX, INT_MAX
};

static const int thresh_mult_map_new1[] = {
    1000, GOOD(2), 2000, RT(0), 2000, INT_MAX
};

static const int thresh_mult_map_new2[] = {
    1000, GOOD(2), 2000, GOOD(3), 2500, GOOD(5), 4000, RT(0), 2000, RT(2), 2500,
    RT(5), 4000, INT_MAX
};

static const int thresh_mult_map_split1[] = {
    2500, GOOD(0), 1700, GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
    RT(0), 5000, RT(1), 10000, RT(2), 25000, RT(3), INT_MAX, INT_MAX
};

static const int thresh_mult_map_split2[] = {
    5000, GOOD(0), 4500, GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
    RT(0), 10000, RT(1), 20000, RT(2), 50000, RT(3), INT_MAX, INT_MAX
};

static const int mode_check_freq_map_zn2[] = {
    /* {zero,nearest}{2,3} */
    0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
};

static const int mode_check_freq_map_vhbpred[] = {
    0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(5), 4, INT_MAX
};

static const int mode_check_freq_map_near2[] = {
    0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(10), 1<<2, RT(11), 1<<3, RT(12), 1<<4,
    INT_MAX
};

static const int mode_check_freq_map_new1[] = {
    0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
};

static const int mode_check_freq_map_new2[] = {
    0, GOOD(5), 4, RT(0), 0, RT(3), 4, RT(10), 1<<3, RT(11), 1<<4, RT(12), 1<<5,
    INT_MAX
};

static const int mode_check_freq_map_split1[] = {
    0, GOOD(2), 2, GOOD(3), 7, RT(1), 2, RT(2), 7, INT_MAX
};

static const int mode_check_freq_map_split2[] = {
    0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
};

void vp8_set_speed_features(VP8_COMP *cpi)
{
    SPEED_FEATURES *sf = &cpi->sf;
    int Mode = cpi->compressor_speed;
    int Speed = cpi->Speed;
    int i;
    VP8_COMMON *cm = &cpi->common;
    int last_improved_quant = sf->improved_quant;
    int ref_frames;

    /* Initialise default mode frequency sampling variables */
    for (i = 0; i < MAX_MODES; i ++)
    {
        cpi->mode_check_freq[i] = 0;
    }

    cpi->mb.mbs_tested_so_far = 0;

    /* best quality defaults */
    sf->RD = 1;
    sf->search_method = NSTEP;
    sf->improved_quant = 1;
    sf->improved_dct = 1;
    sf->auto_filter = 1;
    sf->recode_loop = 1;
    sf->quarter_pixel_search = 1;
    sf->half_pixel_search = 1;
    sf->iterative_sub_pixel = 1;
    sf->optimize_coefficients = 1;
    sf->use_fastquant_for_pick = 0;
    sf->no_skip_block4x4_search = 1;

    sf->first_step = 0;
    sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
    sf->improved_mv_pred = 1;

    /* default thresholds to 0 */
    for (i = 0; i < MAX_MODES; i++)
        sf->thresh_mult[i] = 0;

    /* Count enabled references */
    ref_frames = 1;
    if (cpi->ref_frame_flags & VP8_LAST_FRAME)
        ref_frames++;
    if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
        ref_frames++;
    if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
        ref_frames++;

    /* Convert speed to continuous range, with clamping */
    if (Mode == 0)
        Speed = 0;
    else if (Mode == 2)
        Speed = RT(Speed);
    else
    {
        if (Speed > 5)
            Speed = 5;
        Speed = GOOD(Speed);
    }

    sf->thresh_mult[THR_ZERO1] =
    sf->thresh_mult[THR_NEAREST1] =
    sf->thresh_mult[THR_NEAR1] =
    sf->thresh_mult[THR_DC] = 0; /* always */

    sf->thresh_mult[THR_ZERO2] =
    sf->thresh_mult[THR_ZERO3] =
    sf->thresh_mult[THR_NEAREST2] =
    sf->thresh_mult[THR_NEAREST3] =
    sf->thresh_mult[THR_NEAR2]  =
    sf->thresh_mult[THR_NEAR3]  = speed_map(Speed, thresh_mult_map_znn);

    sf->thresh_mult[THR_V_PRED] =
    sf->thresh_mult[THR_H_PRED] = speed_map(Speed, thresh_mult_map_vhpred);
    sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
    sf->thresh_mult[THR_TM]     = speed_map(Speed, thresh_mult_map_tm);
    sf->thresh_mult[THR_NEW1]   = speed_map(Speed, thresh_mult_map_new1);
    sf->thresh_mult[THR_NEW2]   =
    sf->thresh_mult[THR_NEW3]   = speed_map(Speed, thresh_mult_map_new2);
    sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
    sf->thresh_mult[THR_SPLIT2] =
    sf->thresh_mult[THR_SPLIT3] = speed_map(Speed, thresh_mult_map_split2);

    cpi->mode_check_freq[THR_ZERO1] =
    cpi->mode_check_freq[THR_NEAREST1] =
    cpi->mode_check_freq[THR_NEAR1] =
    cpi->mode_check_freq[THR_TM]     =
    cpi->mode_check_freq[THR_DC] = 0; /* always */

    cpi->mode_check_freq[THR_ZERO2] =
    cpi->mode_check_freq[THR_ZERO3] =
    cpi->mode_check_freq[THR_NEAREST2] =
    cpi->mode_check_freq[THR_NEAREST3] = speed_map(Speed,
                                                   mode_check_freq_map_zn2);

    cpi->mode_check_freq[THR_NEAR2]  =
    cpi->mode_check_freq[THR_NEAR3]  = speed_map(Speed,
                                                 mode_check_freq_map_near2);

    cpi->mode_check_freq[THR_V_PRED] =
    cpi->mode_check_freq[THR_H_PRED] =
    cpi->mode_check_freq[THR_B_PRED] = speed_map(Speed,
                                                 mode_check_freq_map_vhbpred);
    cpi->mode_check_freq[THR_NEW1]   = speed_map(Speed,
                                                 mode_check_freq_map_new1);
    cpi->mode_check_freq[THR_NEW2]   =
    cpi->mode_check_freq[THR_NEW3]   = speed_map(Speed,
                                                 mode_check_freq_map_new2);
    cpi->mode_check_freq[THR_SPLIT1] = speed_map(Speed,
                                                 mode_check_freq_map_split1);
    cpi->mode_check_freq[THR_SPLIT2] =
    cpi->mode_check_freq[THR_SPLIT3] = speed_map(Speed,
                                                 mode_check_freq_map_split2);
    Speed = cpi->Speed;
    switch (Mode)
    {
#if !(CONFIG_REALTIME_ONLY)
    case 0: /* best quality mode */
        sf->first_step = 0;
        sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
        break;
    case 1:
    case 3:
        if (Speed > 0)
        {
            /* Disable coefficient optimization above speed 0 */
            sf->optimize_coefficients = 0;
            sf->use_fastquant_for_pick = 1;
            sf->no_skip_block4x4_search = 0;

            sf->first_step = 1;
        }

        if (Speed > 2)
        {
            sf->improved_quant = 0;
            sf->improved_dct = 0;

            /* Only do recode loop on key frames, golden frames and
             * alt ref frames
             */
            sf->recode_loop = 2;

        }

        if (Speed > 3)
        {
            sf->auto_filter = 1;
            sf->recode_loop = 0; /* recode loop off */
            sf->RD = 0;         /* Turn rd off */

        }

        if (Speed > 4)
        {
            sf->auto_filter = 0;  /* Faster selection of loop filter */
        }

        break;
#endif
    case 2:
        sf->optimize_coefficients = 0;
        sf->recode_loop = 0;
        sf->auto_filter = 1;
        sf->iterative_sub_pixel = 1;
        sf->search_method = NSTEP;

        if (Speed > 0)
        {
            sf->improved_quant = 0;
            sf->improved_dct = 0;

            sf->use_fastquant_for_pick = 1;
            sf->no_skip_block4x4_search = 0;
            sf->first_step = 1;
        }

        if (Speed > 2)
            sf->auto_filter = 0;  /* Faster selection of loop filter */

        if (Speed > 3)
        {
            sf->RD = 0;
            sf->auto_filter = 1;
        }

        if (Speed > 4)
        {
            sf->auto_filter = 0;  /* Faster selection of loop filter */
            sf->search_method = HEX;
            sf->iterative_sub_pixel = 0;
        }

        if (Speed > 6)
        {
            unsigned int sum = 0;
            unsigned int total_mbs = cm->MBs;
            int thresh;
            unsigned int total_skip;

            int min = 2000;

            if (cpi->oxcf.encode_breakout > 2000)
                min = cpi->oxcf.encode_breakout;

            min >>= 7;

            for (i = 0; i < min; i++)
            {
                sum += cpi->mb.error_bins[i];
            }

            total_skip = sum;
            sum = 0;

            /* i starts from 2 to make sure thresh started from 2048 */
            for (; i < 1024; i++)
            {
                sum += cpi->mb.error_bins[i];

                if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
                    break;
            }

            i--;
            thresh = (i << 7);

            if (thresh < 2000)
                thresh = 2000;

            if (ref_frames > 1)
            {
                sf->thresh_mult[THR_NEW1 ] = thresh;
                sf->thresh_mult[THR_NEAREST1  ] = thresh >> 1;
                sf->thresh_mult[THR_NEAR1     ] = thresh >> 1;
            }

            if (ref_frames > 2)
            {
                sf->thresh_mult[THR_NEW2] = thresh << 1;
                sf->thresh_mult[THR_NEAREST2 ] = thresh;
                sf->thresh_mult[THR_NEAR2    ] = thresh;
            }

            if (ref_frames > 3)
            {
                sf->thresh_mult[THR_NEW3] = thresh << 1;
                sf->thresh_mult[THR_NEAREST3 ] = thresh;
                sf->thresh_mult[THR_NEAR3    ] = thresh;
            }

            sf->improved_mv_pred = 0;
        }

        if (Speed > 8)
            sf->quarter_pixel_search = 0;

        if(cm->version == 0)
        {
            cm->filter_type = NORMAL_LOOPFILTER;

            if (Speed >= 14)
                cm->filter_type = SIMPLE_LOOPFILTER;
        }
        else
        {
            cm->filter_type = SIMPLE_LOOPFILTER;
        }

        /* This has a big hit on quality. Last resort */
        if (Speed >= 15)
            sf->half_pixel_search = 0;

        vpx_memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));

    }; /* switch */

    /* Slow quant, dct and trellis not worthwhile for first pass
     * so make sure they are always turned off.
     */
    if ( cpi->pass == 1 )
    {
        sf->improved_quant = 0;
        sf->optimize_coefficients = 0;
        sf->improved_dct = 0;
    }

    if (cpi->sf.search_method == NSTEP)
    {
        vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
    }
    else if (cpi->sf.search_method == DIAMOND)
    {
        vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
    }

    if (cpi->sf.improved_dct)
    {
        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
    }
    else
    {
        /* No fast FDCT defined for any platform at this time. */
        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
    }

    cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;

    if (cpi->sf.improved_quant)
    {
        cpi->mb.quantize_b      = vp8_regular_quantize_b;
        cpi->mb.quantize_b_pair = vp8_regular_quantize_b_pair;
    }
    else
    {
        cpi->mb.quantize_b      = vp8_fast_quantize_b;
        cpi->mb.quantize_b_pair = vp8_fast_quantize_b_pair;
    }
    if (cpi->sf.improved_quant != last_improved_quant)
        vp8cx_init_quantizer(cpi);

    if (cpi->sf.iterative_sub_pixel == 1)
    {
        cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
    }
    else if (cpi->sf.quarter_pixel_search)
    {
        cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
    }
    else if (cpi->sf.half_pixel_search)
    {
        cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
    }
    else
    {
        cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
    }

    if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
        cpi->mb.optimize = 1;
    else
        cpi->mb.optimize = 0;

    if (cpi->common.full_pixel)
        cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;

#ifdef SPEEDSTATS
    frames_at_speed[cpi->Speed]++;
#endif
}
#undef GOOD
#undef RT

static void alloc_raw_frame_buffers(VP8_COMP *cpi)
{
#if VP8_TEMPORAL_ALT_REF
    int width = (cpi->oxcf.Width + 15) & ~15;
    int height = (cpi->oxcf.Height + 15) & ~15;
#endif

    cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
                                        cpi->oxcf.lag_in_frames);
    if(!cpi->lookahead)
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate lag buffers");

#if VP8_TEMPORAL_ALT_REF

    if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
                                    width, height, VP8BORDERINPIXELS))
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate altref buffer");

#endif
}


static void dealloc_raw_frame_buffers(VP8_COMP *cpi)
{
#if VP8_TEMPORAL_ALT_REF
    vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
#endif
    vp8_lookahead_destroy(cpi->lookahead);
}


static int vp8_alloc_partition_data(VP8_COMP *cpi)
{
        vpx_free(cpi->mb.pip);

    cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
                                (cpi->common.mb_rows + 1),
                                sizeof(PARTITION_INFO));
    if(!cpi->mb.pip)
        return 1;

    cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;

    return 0;
}

void vp8_alloc_compressor_data(VP8_COMP *cpi)
{
    VP8_COMMON *cm = & cpi->common;

    int width = cm->Width;
    int height = cm->Height;

    if (vp8_alloc_frame_buffers(cm, width, height))
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate frame buffers");

    if (vp8_alloc_partition_data(cpi))
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate partition data");


    if ((width & 0xf) != 0)
        width += 16 - (width & 0xf);

    if ((height & 0xf) != 0)
        height += 16 - (height & 0xf);


    if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame,
                                    width, height, VP8BORDERINPIXELS))
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate last frame buffer");

    if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
                                    width, height, VP8BORDERINPIXELS))
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate scaled source buffer");

    vpx_free(cpi->tok);

    {
#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
        unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
#else
        unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
#endif
        CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
    }

    /* Data used for real time vc mode to see if gf needs refreshing */
    cpi->zeromv_count = 0;


    /* Structures used to monitor GF usage */
    vpx_free(cpi->gf_active_flags);
    CHECK_MEM_ERROR(cpi->gf_active_flags,
                    vpx_calloc(sizeof(*cpi->gf_active_flags),
                    cm->mb_rows * cm->mb_cols));
    cpi->gf_active_count = cm->mb_rows * cm->mb_cols;

    vpx_free(cpi->mb_activity_map);
    CHECK_MEM_ERROR(cpi->mb_activity_map,
                    vpx_calloc(sizeof(*cpi->mb_activity_map),
                    cm->mb_rows * cm->mb_cols));

    /* allocate memory for storing last frame's MVs for MV prediction. */
    vpx_free(cpi->lfmv);
    CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
                    sizeof(*cpi->lfmv)));
    vpx_free(cpi->lf_ref_frame_sign_bias);
    CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
                    vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
                    sizeof(*cpi->lf_ref_frame_sign_bias)));
    vpx_free(cpi->lf_ref_frame);
    CHECK_MEM_ERROR(cpi->lf_ref_frame,
                    vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
                    sizeof(*cpi->lf_ref_frame)));

    /* Create the encoder segmentation map and set all entries to 0 */
    vpx_free(cpi->segmentation_map);
    CHECK_MEM_ERROR(cpi->segmentation_map,
                    vpx_calloc(cm->mb_rows * cm->mb_cols,
                    sizeof(*cpi->segmentation_map)));
    cpi->cyclic_refresh_mode_index = 0;
    vpx_free(cpi->active_map);
    CHECK_MEM_ERROR(cpi->active_map,
                    vpx_calloc(cm->mb_rows * cm->mb_cols,
                    sizeof(*cpi->active_map)));
    vpx_memset(cpi->active_map , 1, (cm->mb_rows * cm->mb_cols));

#if CONFIG_MULTITHREAD
    if (width < 640)
        cpi->mt_sync_range = 1;
    else if (width <= 1280)
        cpi->mt_sync_range = 4;
    else if (width <= 2560)
        cpi->mt_sync_range = 8;
    else
        cpi->mt_sync_range = 16;

    if (cpi->oxcf.multi_threaded > 1)
    {
        vpx_free(cpi->mt_current_mb_col);
        CHECK_MEM_ERROR(cpi->mt_current_mb_col,
                    vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
    }

#endif

    vpx_free(cpi->tplist);
    CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
}


/* Quant MOD */
static const int q_trans[] =
{
    0,   1,  2,  3,  4,  5,  7,  8,
    9,  10, 12, 13, 15, 17, 18, 19,
    20,  21, 23, 24, 25, 26, 27, 28,
    29,  30, 31, 33, 35, 37, 39, 41,
    43,  45, 47, 49, 51, 53, 55, 57,
    59,  61, 64, 67, 70, 73, 76, 79,
    82,  85, 88, 91, 94, 97, 100, 103,
    106, 109, 112, 115, 118, 121, 124, 127,
};

int vp8_reverse_trans(int x)
{
    int i;

    for (i = 0; i < 64; i++)
        if (q_trans[i] >= x)
            return i;

    return 63;
}
void vp8_new_framerate(VP8_COMP *cpi, double framerate)
{
    if(framerate < .1)
        framerate = 30;

    cpi->framerate              = framerate;
    cpi->output_framerate       = framerate;
    cpi->per_frame_bandwidth    = (int)(cpi->oxcf.target_bandwidth /
                                  cpi->output_framerate);
    cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
    cpi->min_frame_bandwidth    = (int)(cpi->av_per_frame_bandwidth *
                                  cpi->oxcf.two_pass_vbrmin_section / 100);

    /* Set Maximum gf/arf interval */
    cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);

    if(cpi->max_gf_interval < 12)
        cpi->max_gf_interval = 12;

    /* Extended interval for genuinely static scenes */
    cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;

     /* Special conditions when altr ref frame enabled in lagged compress mode */
    if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
    {
        if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
            cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;

        if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
            cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
    }

    if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
        cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
}


static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
{
    VP8_COMMON *cm = &cpi->common;

    cpi->oxcf = *oxcf;

    cpi->auto_gold = 1;
    cpi->auto_adjust_gold_quantizer = 1;

    cm->version = oxcf->Version;
    vp8_setup_version(cm);

    /* frame rate is not available on the first frame, as it's derived from
     * the observed timestamps. The actual value used here doesn't matter
     * too much, as it will adapt quickly. If the reciprocal of the timebase
     * seems like a reasonable framerate, then use that as a guess, otherwise
     * use 30.
     */
    cpi->framerate = (double)(oxcf->timebase.den) /
                     (double)(oxcf->timebase.num);

    if (cpi->framerate > 180)
        cpi->framerate = 30;

    cpi->ref_framerate = cpi->framerate;

    /* change includes all joint functionality */
    vp8_change_config(cpi, oxcf);

    /* Initialize active best and worst q and average q values. */
    cpi->active_worst_quality         = cpi->oxcf.worst_allowed_q;
    cpi->active_best_quality          = cpi->oxcf.best_allowed_q;
    cpi->avg_frame_qindex             = cpi->oxcf.worst_allowed_q;

    /* Initialise the starting buffer levels */
    cpi->buffer_level                 = cpi->oxcf.starting_buffer_level;
    cpi->bits_off_target              = cpi->oxcf.starting_buffer_level;

    cpi->rolling_target_bits          = cpi->av_per_frame_bandwidth;
    cpi->rolling_actual_bits          = cpi->av_per_frame_bandwidth;
    cpi->long_rolling_target_bits     = cpi->av_per_frame_bandwidth;
    cpi->long_rolling_actual_bits     = cpi->av_per_frame_bandwidth;

    cpi->total_actual_bits            = 0;
    cpi->total_target_vs_actual       = 0;

    /* Temporal scalabilty */
    if (cpi->oxcf.number_of_layers > 1)
    {
        unsigned int i;
        double prev_layer_framerate=0;

        for (i=0; i<cpi->oxcf.number_of_layers; i++)
        {
            init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
            prev_layer_framerate = cpi->output_framerate /
                                   cpi->oxcf.rate_decimator[i];
        }
    }

#if VP8_TEMPORAL_ALT_REF
    {
        int i;

        cpi->fixed_divide[0] = 0;

        for (i = 1; i < 512; i++)
            cpi->fixed_divide[i] = 0x80000 / i;
    }
#endif
}

static void update_layer_contexts (VP8_COMP *cpi)
{
    VP8_CONFIG *oxcf = &cpi->oxcf;

    /* Update snapshots of the layer contexts to reflect new parameters */
    if (oxcf->number_of_layers > 1)
    {
        unsigned int i;
        double prev_layer_framerate=0;

        assert(oxcf->number_of_layers <= VPX_TS_MAX_LAYERS);
        for (i=0; i<oxcf->number_of_layers; i++)
        {
            LAYER_CONTEXT *lc = &cpi->layer_context[i];

            lc->framerate =
                cpi->ref_framerate / oxcf->rate_decimator[i];
            lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;

            lc->starting_buffer_level = rescale(
                          (int)oxcf->starting_buffer_level_in_ms,
                          lc->target_bandwidth, 1000);

            if (oxcf->optimal_buffer_level == 0)
                lc->optimal_buffer_level = lc->target_bandwidth / 8;
            else
                lc->optimal_buffer_level = rescale(
                          (int)oxcf->optimal_buffer_level_in_ms,
                          lc->target_bandwidth, 1000);

            if (oxcf->maximum_buffer_size == 0)
                lc->maximum_buffer_size = lc->target_bandwidth / 8;
            else
                lc->maximum_buffer_size = rescale(
                          (int)oxcf->maximum_buffer_size_in_ms,
                          lc->target_bandwidth, 1000);

            /* Work out the average size of a frame within this layer */
            if (i > 0)
                lc->avg_frame_size_for_layer =
                   (int)((oxcf->target_bitrate[i] -
                          oxcf->target_bitrate[i-1]) * 1000 /
                          (lc->framerate - prev_layer_framerate));

            prev_layer_framerate = lc->framerate;
        }
    }
}

void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
{
    VP8_COMMON *cm = &cpi->common;
    int last_w, last_h, prev_number_of_layers;

    if (!cpi)
        return;

    if (!oxcf)
        return;

#if CONFIG_MULTITHREAD
    /*  wait for the last picture loopfilter thread done */
    if (cpi->b_lpf_running)
    {
        sem_wait(&cpi->h_event_end_lpf);
        cpi->b_lpf_running = 0;
    }
#endif

    if (cm->version != oxcf->Version)
    {
        cm->version = oxcf->Version;
        vp8_setup_version(cm);
    }

    last_w = cpi->oxcf.Width;
    last_h = cpi->oxcf.Height;
    prev_number_of_layers = cpi->oxcf.number_of_layers;

    cpi->oxcf = *oxcf;

    switch (cpi->oxcf.Mode)
    {

    case MODE_REALTIME:
        cpi->pass = 0;
        cpi->compressor_speed = 2;

        if (cpi->oxcf.cpu_used < -16)
        {
            cpi->oxcf.cpu_used = -16;
        }

        if (cpi->oxcf.cpu_used > 16)
            cpi->oxcf.cpu_used = 16;

        break;

    case MODE_GOODQUALITY:
        cpi->pass = 0;
        cpi->compressor_speed = 1;

        if (cpi->oxcf.cpu_used < -5)
        {
            cpi->oxcf.cpu_used = -5;
        }

        if (cpi->oxcf.cpu_used > 5)
            cpi->oxcf.cpu_used = 5;

        break;

    case MODE_BESTQUALITY:
        cpi->pass = 0;
        cpi->compressor_speed = 0;
        break;

    case MODE_FIRSTPASS:
        cpi->pass = 1;
        cpi->compressor_speed = 1;
        break;
    case MODE_SECONDPASS:
        cpi->pass = 2;
        cpi->compressor_speed = 1;

        if (cpi->oxcf.cpu_used < -5)
        {
            cpi->oxcf.cpu_used = -5;
        }

        if (cpi->oxcf.cpu_used > 5)
            cpi->oxcf.cpu_used = 5;

        break;
    case MODE_SECONDPASS_BEST:
        cpi->pass = 2;
        cpi->compressor_speed = 0;
        break;
    }

    if (cpi->pass == 0)
        cpi->auto_worst_q = 1;

    cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
    cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
    cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];

    if (oxcf->fixed_q >= 0)
    {
        if (oxcf->worst_allowed_q < 0)
            cpi->oxcf.fixed_q = q_trans[0];
        else
            cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];

        if (oxcf->alt_q < 0)
            cpi->oxcf.alt_q = q_trans[0];
        else
            cpi->oxcf.alt_q = q_trans[oxcf->alt_q];

        if (oxcf->key_q < 0)
            cpi->oxcf.key_q = q_trans[0];
        else
            cpi->oxcf.key_q = q_trans[oxcf->key_q];

        if (oxcf->gold_q < 0)
            cpi->oxcf.gold_q = q_trans[0];
        else
            cpi->oxcf.gold_q = q_trans[oxcf->gold_q];

    }

    cpi->baseline_gf_interval =
        cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;

    cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;

    cm->refresh_golden_frame = 0;
    cm->refresh_last_frame = 1;
    cm->refresh_entropy_probs = 1;

#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
    cpi->oxcf.token_partitions = 3;
#endif

    if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
        cm->multi_token_partition =
            (TOKEN_PARTITION) cpi->oxcf.token_partitions;

    setup_features(cpi);

    {
        int i;

        for (i = 0; i < MAX_MB_SEGMENTS; i++)
            cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
    }

    /* At the moment the first order values may not be > MAXQ */
    if (cpi->oxcf.fixed_q > MAXQ)
        cpi->oxcf.fixed_q = MAXQ;

    /* local file playback mode == really big buffer */
    if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
    {
        cpi->oxcf.starting_buffer_level       = 60000;
        cpi->oxcf.optimal_buffer_level        = 60000;
        cpi->oxcf.maximum_buffer_size         = 240000;
        cpi->oxcf.starting_buffer_level_in_ms = 60000;
        cpi->oxcf.optimal_buffer_level_in_ms  = 60000;
        cpi->oxcf.maximum_buffer_size_in_ms   = 240000;
    }

    /* Convert target bandwidth from Kbit/s to Bit/s */
    cpi->oxcf.target_bandwidth       *= 1000;

    cpi->oxcf.starting_buffer_level =
        rescale((int)cpi->oxcf.starting_buffer_level,
                cpi->oxcf.target_bandwidth, 1000);

    /* Set or reset optimal and maximum buffer levels. */
    if (cpi->oxcf.optimal_buffer_level == 0)
        cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
    else
        cpi->oxcf.optimal_buffer_level =
            rescale((int)cpi->oxcf.optimal_buffer_level,
                    cpi->oxcf.target_bandwidth, 1000);

    if (cpi->oxcf.maximum_buffer_size == 0)
        cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
    else
        cpi->oxcf.maximum_buffer_size =
            rescale((int)cpi->oxcf.maximum_buffer_size,
                    cpi->oxcf.target_bandwidth, 1000);
    // Under a configuration change, where maximum_buffer_size may change,
    // keep buffer level clipped to the maximum allowed buffer size.
    if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
      cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
      cpi->buffer_level = cpi->bits_off_target;
    }

    /* Set up frame rate and related parameters rate control values. */
    vp8_new_framerate(cpi, cpi->framerate);

    /* Set absolute upper and lower quality limits */
    cpi->worst_quality               = cpi->oxcf.worst_allowed_q;
    cpi->best_quality                = cpi->oxcf.best_allowed_q;

    /* active values should only be modified if out of new range */
    if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
    {
      cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
    }
    /* less likely */
    else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
    {
      cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
    }
    if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
    {
      cpi->active_best_quality = cpi->oxcf.best_allowed_q;
    }
    /* less likely */
    else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
    {
      cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
    }

    cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;

    cpi->cq_target_quality = cpi->oxcf.cq_level;

    /* Only allow dropped frames in buffered mode */
    cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;

    cpi->target_bandwidth = cpi->oxcf.target_bandwidth;

    // Check if the number of temporal layers has changed, and if so reset the
    // pattern counter and set/initialize the temporal layer context for the
    // new layer configuration.
    if (cpi->oxcf.number_of_layers != prev_number_of_layers)
    {
        // If the number of temporal layers are changed we must start at the
        // base of the pattern cycle, so reset temporal_pattern_counter.
        cpi->temporal_pattern_counter = 0;
        reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
    }

    cm->Width       = cpi->oxcf.Width;
    cm->Height      = cpi->oxcf.Height;

    /* TODO(jkoleszar): if an internal spatial resampling is active,
     * and we downsize the input image, maybe we should clear the
     * internal scale immediately rather than waiting for it to
     * correct.
     */

    /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
    if (cpi->oxcf.Sharpness > 7)
        cpi->oxcf.Sharpness = 7;

    cm->sharpness_level = cpi->oxcf.Sharpness;

    if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
    {
        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);

        Scale2Ratio(cm->horiz_scale, &hr, &hs);
        Scale2Ratio(cm->vert_scale, &vr, &vs);

        /* always go to the next whole number */
        cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
        cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
    }

    if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height)
        cpi->force_next_frame_intra = 1;

    if (((cm->Width + 15) & 0xfffffff0) !=
          cm->yv12_fb[cm->lst_fb_idx].y_width ||
        ((cm->Height + 15) & 0xfffffff0) !=
          cm->yv12_fb[cm->lst_fb_idx].y_height ||
        cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
    {
        dealloc_raw_frame_buffers(cpi);
        alloc_raw_frame_buffers(cpi);
        vp8_alloc_compressor_data(cpi);
    }

    if (cpi->oxcf.fixed_q >= 0)
    {
        cpi->last_q[0] = cpi->oxcf.fixed_q;
        cpi->last_q[1] = cpi->oxcf.fixed_q;
    }

    cpi->Speed = cpi->oxcf.cpu_used;

    /* force to allowlag to 0 if lag_in_frames is 0; */
    if (cpi->oxcf.lag_in_frames == 0)
    {
        cpi->oxcf.allow_lag = 0;
    }
    /* Limit on lag buffers as these are not currently dynamically allocated */
    else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
        cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;

    /* YX Temp */
    cpi->alt_ref_source = NULL;
    cpi->is_src_frame_alt_ref = 0;

#if CONFIG_TEMPORAL_DENOISING
    if (cpi->oxcf.noise_sensitivity)
    {
      if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc)
      {
        int width = (cpi->oxcf.Width + 15) & ~15;
        int height = (cpi->oxcf.Height + 15) & ~15;
        vp8_denoiser_allocate(&cpi->denoiser, width, height,
                              cpi->common.mb_rows, cpi->common.mb_cols);
      }
    }
#endif

#if 0
    /* Experimental RD Code */
    cpi->frame_distortion = 0;
    cpi->last_frame_distortion = 0;
#endif

}

#ifndef M_LOG2_E
#define M_LOG2_E 0.693147180559945309417
#endif
#define log2f(x) (log (x) / (float) M_LOG2_E)

static void cal_mvsadcosts(int *mvsadcost[2])
{
    int i = 1;

    mvsadcost [0] [0] = 300;
    mvsadcost [1] [0] = 300;

    do
    {
        double z = 256 * (2 * (log2f(8 * i) + .6));
        mvsadcost [0][i] = (int) z;
        mvsadcost [1][i] = (int) z;
        mvsadcost [0][-i] = (int) z;
        mvsadcost [1][-i] = (int) z;
    }
    while (++i <= mvfp_max);
}

struct VP8_COMP* vp8_create_compressor(VP8_CONFIG *oxcf)
{
    int i;

    VP8_COMP *cpi;
    VP8_COMMON *cm;

    cpi = vpx_memalign(32, sizeof(VP8_COMP));
    /* Check that the CPI instance is valid */
    if (!cpi)
        return 0;

    cm = &cpi->common;

    vpx_memset(cpi, 0, sizeof(VP8_COMP));

    if (setjmp(cm->error.jmp))
    {
        cpi->common.error.setjmp = 0;
        vp8_remove_compressor(&cpi);
        return 0;
    }

    cpi->common.error.setjmp = 1;

    CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));

    vp8_create_common(&cpi->common);

    init_config(cpi, oxcf);

    memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
    cpi->common.current_video_frame   = 0;
    cpi->temporal_pattern_counter     = 0;
    cpi->kf_overspend_bits            = 0;
    cpi->kf_bitrate_adjustment        = 0;
    cpi->frames_till_gf_update_due      = 0;
    cpi->gf_overspend_bits            = 0;
    cpi->non_gf_bitrate_adjustment     = 0;
    cpi->prob_last_coded              = 128;
    cpi->prob_gf_coded                = 128;
    cpi->prob_intra_coded             = 63;

    /* Prime the recent reference frame usage counters.
     * Hereafter they will be maintained as a sort of moving average
     */
    cpi->recent_ref_frame_usage[INTRA_FRAME]  = 1;
    cpi->recent_ref_frame_usage[LAST_FRAME]   = 1;
    cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
    cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;

    /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
    cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;

    cpi->twopass.gf_decay_rate = 0;
    cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;

    cpi->gold_is_last = 0 ;
    cpi->alt_is_last  = 0 ;
    cpi->gold_is_alt  = 0 ;

    cpi->active_map_enabled = 0;

#if 0
    /* Experimental code for lagged and one pass */
    /* Initialise one_pass GF frames stats */
    /* Update stats used for GF selection */
    if (cpi->pass == 0)
    {
        cpi->one_pass_frame_index = 0;

        for (i = 0; i < MAX_LAG_BUFFERS; i++)
        {
            cpi->one_pass_frame_stats[i].frames_so_far = 0;
            cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
            cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
            cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
            cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
            cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
            cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
            cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
            cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
        }
    }
#endif

    /* Should we use the cyclic refresh method.
     * Currently this is tied to error resilliant mode
     */
    cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
    cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 5;
    cpi->cyclic_refresh_mode_index = 0;
    cpi->cyclic_refresh_q = 32;

    if (cpi->cyclic_refresh_mode_enabled)
    {
        CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
    }
    else
        cpi->cyclic_refresh_map = (signed char *) NULL;

#ifdef VP8_ENTROPY_STATS
    init_context_counters();
#endif

    /*Initialize the feed-forward activity masking.*/
    cpi->activity_avg = 90<<12;

    /* Give a sensible default for the first frame. */
    cpi->frames_since_key = 8;
    cpi->key_frame_frequency = cpi->oxcf.key_freq;
    cpi->this_key_frame_forced = 0;
    cpi->next_key_frame_forced = 0;

    cpi->source_alt_ref_pending = 0;
    cpi->source_alt_ref_active = 0;
    cpi->common.refresh_alt_ref_frame = 0;

    cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
#if CONFIG_INTERNAL_STATS
    cpi->b_calculate_ssimg = 0;

    cpi->count = 0;
    cpi->bytes = 0;

    if (cpi->b_calculate_psnr)
    {
        cpi->total_sq_error = 0.0;
        cpi->total_sq_error2 = 0.0;
        cpi->total_y = 0.0;
        cpi->total_u = 0.0;
        cpi->total_v = 0.0;
        cpi->total = 0.0;
        cpi->totalp_y = 0.0;
        cpi->totalp_u = 0.0;
        cpi->totalp_v = 0.0;
        cpi->totalp = 0.0;
        cpi->tot_recode_hits = 0;
        cpi->summed_quality = 0;
        cpi->summed_weights = 0;
    }

    if (cpi->b_calculate_ssimg)
    {
        cpi->total_ssimg_y = 0;
        cpi->total_ssimg_u = 0;
        cpi->total_ssimg_v = 0;
        cpi->total_ssimg_all = 0;
    }

#endif

    cpi->first_time_stamp_ever = 0x7FFFFFFF;

    cpi->frames_till_gf_update_due      = 0;
    cpi->key_frame_count              = 1;

    cpi->ni_av_qi                     = cpi->oxcf.worst_allowed_q;
    cpi->ni_tot_qi                    = 0;
    cpi->ni_frames                   = 0;
    cpi->total_byte_count             = 0;

    cpi->drop_frame                  = 0;

    cpi->rate_correction_factor         = 1.0;
    cpi->key_frame_rate_correction_factor = 1.0;
    cpi->gf_rate_correction_factor  = 1.0;
    cpi->twopass.est_max_qcorrection_factor  = 1.0;

    for (i = 0; i < KEY_FRAME_CONTEXT; i++)
    {
        cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
    }

#ifdef OUTPUT_YUV_SRC
    yuv_file = fopen("bd.yuv", "ab");
#endif
#ifdef OUTPUT_YUV_DENOISED
    yuv_denoised_file = fopen("denoised.yuv", "ab");
#endif

#if 0
    framepsnr = fopen("framepsnr.stt", "a");
    kf_list = fopen("kf_list.stt", "w");
#endif

    cpi->output_pkt_list = oxcf->output_pkt_list;

#if !(CONFIG_REALTIME_ONLY)

    if (cpi->pass == 1)
    {
        vp8_init_first_pass(cpi);
    }
    else if (cpi->pass == 2)
    {
        size_t packet_sz = sizeof(FIRSTPASS_STATS);
        int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);

        cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
        cpi->twopass.stats_in = cpi->twopass.stats_in_start;
        cpi->twopass.stats_in_end = (void*)((char *)cpi->twopass.stats_in
                            + (packets - 1) * packet_sz);
        vp8_init_second_pass(cpi);
    }

#endif

    if (cpi->compressor_speed == 2)
    {
        cpi->avg_encode_time      = 0;
        cpi->avg_pick_mode_time    = 0;
    }

    vp8_set_speed_features(cpi);

    /* Set starting values of RD threshold multipliers (128 = *1) */
    for (i = 0; i < MAX_MODES; i++)
    {
        cpi->mb.rd_thresh_mult[i] = 128;
    }

#ifdef VP8_ENTROPY_STATS
    init_mv_ref_counts();
#endif

#if CONFIG_MULTITHREAD
    if(vp8cx_create_encoder_threads(cpi))
    {
        vp8_remove_compressor(&cpi);
        return 0;
    }
#endif

    cpi->fn_ptr[BLOCK_16X16].sdf            = vp8_sad16x16;
    cpi->fn_ptr[BLOCK_16X16].vf             = vp8_variance16x16;
    cpi->fn_ptr[BLOCK_16X16].svf            = vp8_sub_pixel_variance16x16;
    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h  = vp8_variance_halfpixvar16x16_h;
    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v  = vp8_variance_halfpixvar16x16_v;
    cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = vp8_variance_halfpixvar16x16_hv;
    cpi->fn_ptr[BLOCK_16X16].sdx3f          = vp8_sad16x16x3;
    cpi->fn_ptr[BLOCK_16X16].sdx8f          = vp8_sad16x16x8;
    cpi->fn_ptr[BLOCK_16X16].sdx4df         = vp8_sad16x16x4d;

    cpi->fn_ptr[BLOCK_16X8].sdf            = vp8_sad16x8;
    cpi->fn_ptr[BLOCK_16X8].vf             = vp8_variance16x8;
    cpi->fn_ptr[BLOCK_16X8].svf            = vp8_sub_pixel_variance16x8;
    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h  = NULL;
    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v  = NULL;
    cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
    cpi->fn_ptr[BLOCK_16X8].sdx3f          = vp8_sad16x8x3;
    cpi->fn_ptr[BLOCK_16X8].sdx8f          = vp8_sad16x8x8;
    cpi->fn_ptr[BLOCK_16X8].sdx4df         = vp8_sad16x8x4d;

    cpi->fn_ptr[BLOCK_8X16].sdf            = vp8_sad8x16;
    cpi->fn_ptr[BLOCK_8X16].vf             = vp8_variance8x16;
    cpi->fn_ptr[BLOCK_8X16].svf            = vp8_sub_pixel_variance8x16;
    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h  = NULL;
    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v  = NULL;
    cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
    cpi->fn_ptr[BLOCK_8X16].sdx3f          = vp8_sad8x16x3;
    cpi->fn_ptr[BLOCK_8X16].sdx8f          = vp8_sad8x16x8;
    cpi->fn_ptr[BLOCK_8X16].sdx4df         = vp8_sad8x16x4d;

    cpi->fn_ptr[BLOCK_8X8].sdf            = vp8_sad8x8;
    cpi->fn_ptr[BLOCK_8X8].vf             = vp8_variance8x8;
    cpi->fn_ptr[BLOCK_8X8].svf            = vp8_sub_pixel_variance8x8;
    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h  = NULL;
    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v  = NULL;
    cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
    cpi->fn_ptr[BLOCK_8X8].sdx3f          = vp8_sad8x8x3;
    cpi->fn_ptr[BLOCK_8X8].sdx8f          = vp8_sad8x8x8;
    cpi->fn_ptr[BLOCK_8X8].sdx4df         = vp8_sad8x8x4d;

    cpi->fn_ptr[BLOCK_4X4].sdf            = vp8_sad4x4;
    cpi->fn_ptr[BLOCK_4X4].vf             = vp8_variance4x4;
    cpi->fn_ptr[BLOCK_4X4].svf            = vp8_sub_pixel_variance4x4;
    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h  = NULL;
    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v  = NULL;
    cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
    cpi->fn_ptr[BLOCK_4X4].sdx3f          = vp8_sad4x4x3;
    cpi->fn_ptr[BLOCK_4X4].sdx8f          = vp8_sad4x4x8;
    cpi->fn_ptr[BLOCK_4X4].sdx4df         = vp8_sad4x4x4d;

#if ARCH_X86 || ARCH_X86_64
    cpi->fn_ptr[BLOCK_16X16].copymem      = vp8_copy32xn;
    cpi->fn_ptr[BLOCK_16X8].copymem       = vp8_copy32xn;
    cpi->fn_ptr[BLOCK_8X16].copymem       = vp8_copy32xn;
    cpi->fn_ptr[BLOCK_8X8].copymem        = vp8_copy32xn;
    cpi->fn_ptr[BLOCK_4X4].copymem        = vp8_copy32xn;
#endif

    cpi->full_search_sad = vp8_full_search_sad;
    cpi->diamond_search_sad = vp8_diamond_search_sad;
    cpi->refining_search_sad = vp8_refining_search_sad;

    /* make sure frame 1 is okay */
    cpi->mb.error_bins[0] = cpi->common.MBs;

    /* vp8cx_init_quantizer() is first called here. Add check in
     * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
     * called later when needed. This will avoid unnecessary calls of
     * vp8cx_init_quantizer() for every frame.
     */
    vp8cx_init_quantizer(cpi);

    vp8_loop_filter_init(cm);

    cpi->common.error.setjmp = 0;

#if CONFIG_MULTI_RES_ENCODING

    /* Calculate # of MBs in a row in lower-resolution level image. */
    if (cpi->oxcf.mr_encoder_id > 0)
        vp8_cal_low_res_mb_cols(cpi);

#endif

    /* setup RD costs to MACROBLOCK struct */

    cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max+1];
    cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max+1];
    cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max+1];
    cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max+1];

    cal_mvsadcosts(cpi->mb.mvsadcost);

    cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
    cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
    cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
    cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
    cpi->mb.token_costs = cpi->rd_costs.token_costs;

    /* setup block ptrs & offsets */
    vp8_setup_block_ptrs(&cpi->mb);
    vp8_setup_block_dptrs(&cpi->mb.e_mbd);

    return  cpi;
}


void vp8_remove_compressor(VP8_COMP **ptr)
{
    VP8_COMP *cpi = *ptr;

    if (!cpi)
        return;

    if (cpi && (cpi->common.current_video_frame > 0))
    {
#if !(CONFIG_REALTIME_ONLY)

        if (cpi->pass == 2)
        {
            vp8_end_second_pass(cpi);
        }

#endif

#ifdef VP8_ENTROPY_STATS
        print_context_counters();
        print_tree_update_probs();
        print_mode_context();
#endif

#if CONFIG_INTERNAL_STATS

        if (cpi->pass != 1)
        {
            FILE *f = fopen("opsnr.stt", "a");
            double time_encoded = (cpi->last_end_time_stamp_seen
                                   - cpi->first_time_stamp_ever) / 10000000.000;
            double total_encode_time = (cpi->time_receive_data +
                                            cpi->time_compress_data) / 1000.000;
            double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;

            if (cpi->b_calculate_psnr)
            {
                YV12_BUFFER_CONFIG *lst_yv12 =
                              &cpi->common.yv12_fb[cpi->common.lst_fb_idx];

                if (cpi->oxcf.number_of_layers > 1)
                {
                    int i;

                    fprintf(f, "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
                               "GLPsnrP\tVPXSSIM\t\n");
                    for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
                    {
                        double dr = (double)cpi->bytes_in_layer[i] *
                                              8.0 / 1000.0  / time_encoded;
                        double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
                                         lst_yv12->y_width * lst_yv12->y_height;
                        double total_psnr =
                            vpx_sse_to_psnr(samples, 255.0,
                                            cpi->total_error2[i]);
                        double total_psnr2 =
                            vpx_sse_to_psnr(samples, 255.0,
                                            cpi->total_error2_p[i]);
                        double total_ssim = 100 * pow(cpi->sum_ssim[i] /
                                                      cpi->sum_weights[i], 8.0);

                        fprintf(f, "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
                                   "%7.3f\t%7.3f\n",
                                   i, dr,
                                   cpi->sum_psnr[i] / cpi->frames_in_layer[i],
                                   total_psnr,
                                   cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
                                   total_psnr2, total_ssim);
                    }
                }
                else
                {
                    double samples = 3.0 / 2 * cpi->count *
                                        lst_yv12->y_width * lst_yv12->y_height;
                    double total_psnr = vpx_sse_to_psnr(samples, 255.0,
                                                        cpi->total_sq_error);
                    double total_psnr2 = vpx_sse_to_psnr(samples, 255.0,
                                                         cpi->total_sq_error2);
                    double total_ssim = 100 * pow(cpi->summed_quality /
                                                      cpi->summed_weights, 8.0);

                    fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
                               "GLPsnrP\tVPXSSIM\t  Time(us)\n");
                    fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
                               "%7.3f\t%8.0f\n",
                               dr, cpi->total / cpi->count, total_psnr,
                               cpi->totalp / cpi->count, total_psnr2,
                               total_ssim, total_encode_time);
                }
            }

            if (cpi->b_calculate_ssimg)
            {
                if (cpi->oxcf.number_of_layers > 1)
                {
                    int i;

                    fprintf(f, "Layer\tBitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
                               "Time(us)\n");
                    for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
                    {
                        double dr = (double)cpi->bytes_in_layer[i] *
                                    8.0 / 1000.0  / time_encoded;
                        fprintf(f, "%5d\t%7.3f\t%6.4f\t"
                                "%6.4f\t%6.4f\t%6.4f\t%8.0f\n",
                                i, dr,
                                cpi->total_ssimg_y_in_layer[i] /
                                     cpi->frames_in_layer[i],
                                cpi->total_ssimg_u_in_layer[i] /
                                     cpi->frames_in_layer[i],
                                cpi->total_ssimg_v_in_layer[i] /
                                     cpi->frames_in_layer[i],
                                cpi->total_ssimg_all_in_layer[i] /
                                     cpi->frames_in_layer[i],
                                total_encode_time);
                    }
                }
                else
                {
                    fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
                               "Time(us)\n");
                    fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
                            cpi->total_ssimg_y / cpi->count,
                            cpi->total_ssimg_u / cpi->count,
                            cpi->total_ssimg_v / cpi->count,
                            cpi->total_ssimg_all / cpi->count, total_encode_time);
                }
            }

            fclose(f);
#if 0
            f = fopen("qskip.stt", "a");
            fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
            fclose(f);
#endif

        }

#endif


#ifdef SPEEDSTATS

        if (cpi->compressor_speed == 2)
        {
            int i;
            FILE *f = fopen("cxspeed.stt", "a");
            cnt_pm /= cpi->common.MBs;

            for (i = 0; i < 16; i++)
                fprintf(f, "%5d", frames_at_speed[i]);

            fprintf(f, "\n");
            fclose(f);
        }

#endif


#ifdef MODE_STATS
        {
            extern int count_mb_seg[4];
            FILE *f = fopen("modes.stt", "a");
            double dr = (double)cpi->framerate * (double)bytes * (double)8 / (double)count / (double)1000 ;
            fprintf(f, "intra_mode in Intra Frames:\n");
            fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
            fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
            fprintf(f, "B: ");
            {
                int i;

                for (i = 0; i < 10; i++)
                    fprintf(f, "%8d, ", b_modes[i]);

                fprintf(f, "\n");

            }

            fprintf(f, "Modes in Inter Frames:\n");
            fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
                    inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
                    inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
            fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
            fprintf(f, "B: ");
            {
                int i;

                for (i = 0; i < 15; i++)
                    fprintf(f, "%8d, ", inter_b_modes[i]);

                fprintf(f, "\n");

            }
            fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
            fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);



            fclose(f);
        }
#endif

#ifdef VP8_ENTROPY_STATS
        {
            int i, j, k;
            FILE *fmode = fopen("modecontext.c", "w");

            fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
            fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
            fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");

            for (i = 0; i < 10; i++)
            {

                fprintf(fmode, "    { /* Above Mode :  %d */\n", i);

                for (j = 0; j < 10; j++)
                {

                    fprintf(fmode, "        {");

                    for (k = 0; k < 10; k++)
                    {
                        if (!intra_mode_stats[i][j][k])
                            fprintf(fmode, " %5d, ", 1);
                        else
                            fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
                    }

                    fprintf(fmode, "}, /* left_mode %d */\n", j);

                }

                fprintf(fmode, "    },\n");

            }

            fprintf(fmode, "};\n");
            fclose(fmode);
        }
#endif


#if defined(SECTIONBITS_OUTPUT)

        if (0)
        {
            int i;
            FILE *f = fopen("tokenbits.stt", "a");

            for (i = 0; i < 28; i++)
                fprintf(f, "%8d", (int)(Sectionbits[i] / 256));

            fprintf(f, "\n");
            fclose(f);
        }

#endif

#if 0
        {
            printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
            printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
            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);
        }
#endif

    }

#if CONFIG_MULTITHREAD
    vp8cx_remove_encoder_threads(cpi);
#endif

#if CONFIG_TEMPORAL_DENOISING
    vp8_denoiser_free(&cpi->denoiser);
#endif
    dealloc_compressor_data(cpi);
    vpx_free(cpi->mb.ss);
    vpx_free(cpi->tok);
    vpx_free(cpi->cyclic_refresh_map);

    vp8_remove_common(&cpi->common);
    vpx_free(cpi);
    *ptr = 0;

#ifdef OUTPUT_YUV_SRC
    fclose(yuv_file);
#endif
#ifdef OUTPUT_YUV_DENOISED
    fclose(yuv_denoised_file);
#endif

#if 0

    if (keyfile)
        fclose(keyfile);

    if (framepsnr)
        fclose(framepsnr);

    if (kf_list)
        fclose(kf_list);

#endif

}


static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
                                 unsigned char *recon, int recon_stride,
                                 unsigned int cols, unsigned int rows)
{
    unsigned int row, col;
    uint64_t total_sse = 0;
    int diff;

    for (row = 0; row + 16 <= rows; row += 16)
    {
        for (col = 0; col + 16 <= cols; col += 16)
        {
            unsigned int sse;

            vp8_mse16x16(orig + col, orig_stride,
                                            recon + col, recon_stride,
                                            &sse);
            total_sse += sse;
        }

        /* Handle odd-sized width */
        if (col < cols)
        {
            unsigned int   border_row, border_col;
            unsigned char *border_orig = orig;
            unsigned char *border_recon = recon;

            for (border_row = 0; border_row < 16; border_row++)
            {
                for (border_col = col; border_col < cols; border_col++)
                {
                    diff = border_orig[border_col] - border_recon[border_col];
                    total_sse += diff * diff;
                }

                border_orig += orig_stride;
                border_recon += recon_stride;
            }
        }

        orig += orig_stride * 16;
        recon += recon_stride * 16;
    }

    /* Handle odd-sized height */
    for (; row < rows; row++)
    {
        for (col = 0; col < cols; col++)
        {
            diff = orig[col] - recon[col];
            total_sse += diff * diff;
        }

        orig += orig_stride;
        recon += recon_stride;
    }

    vp8_clear_system_state();
    return total_sse;
}


static void generate_psnr_packet(VP8_COMP *cpi)
{
    YV12_BUFFER_CONFIG      *orig = cpi->Source;
    YV12_BUFFER_CONFIG      *recon = cpi->common.frame_to_show;
    struct vpx_codec_cx_pkt  pkt;
    uint64_t                 sse;
    int                      i;
    unsigned int             width = cpi->common.Width;
    unsigned int             height = cpi->common.Height;

    pkt.kind = VPX_CODEC_PSNR_PKT;
    sse = calc_plane_error(orig->y_buffer, orig->y_stride,
                           recon->y_buffer, recon->y_stride,
                           width, height);
    pkt.data.psnr.sse[0] = sse;
    pkt.data.psnr.sse[1] = sse;
    pkt.data.psnr.samples[0] = width * height;
    pkt.data.psnr.samples[1] = width * height;

    width = (width + 1) / 2;
    height = (height + 1) / 2;

    sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
                           recon->u_buffer, recon->uv_stride,
                           width, height);
    pkt.data.psnr.sse[0] += sse;
    pkt.data.psnr.sse[2] = sse;
    pkt.data.psnr.samples[0] += width * height;
    pkt.data.psnr.samples[2] = width * height;

    sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
                           recon->v_buffer, recon->uv_stride,
                           width, height);
    pkt.data.psnr.sse[0] += sse;
    pkt.data.psnr.sse[3] = sse;
    pkt.data.psnr.samples[0] += width * height;
    pkt.data.psnr.samples[3] = width * height;

    for (i = 0; i < 4; i++)
        pkt.data.psnr.psnr[i] = vpx_sse_to_psnr(pkt.data.psnr.samples[i], 255.0,
                                                (double)(pkt.data.psnr.sse[i]));

    vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
}


int vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags)
{
    if (ref_frame_flags > 7)
        return -1 ;

    cpi->ref_frame_flags = ref_frame_flags;
    return 0;
}
int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags)
{
    if (ref_frame_flags > 7)
        return -1 ;

    cpi->common.refresh_golden_frame = 0;
    cpi->common.refresh_alt_ref_frame = 0;
    cpi->common.refresh_last_frame   = 0;

    if (ref_frame_flags & VP8_LAST_FRAME)
        cpi->common.refresh_last_frame = 1;

    if (ref_frame_flags & VP8_GOLD_FRAME)
        cpi->common.refresh_golden_frame = 1;

    if (ref_frame_flags & VP8_ALTR_FRAME)
        cpi->common.refresh_alt_ref_frame = 1;

    return 0;
}

int vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
{
    VP8_COMMON *cm = &cpi->common;
    int ref_fb_idx;

    if (ref_frame_flag == VP8_LAST_FRAME)
        ref_fb_idx = cm->lst_fb_idx;
    else if (ref_frame_flag == VP8_GOLD_FRAME)
        ref_fb_idx = cm->gld_fb_idx;
    else if (ref_frame_flag == VP8_ALTR_FRAME)
        ref_fb_idx = cm->alt_fb_idx;
    else
        return -1;

    vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);

    return 0;
}
int vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
{
    VP8_COMMON *cm = &cpi->common;

    int ref_fb_idx;

    if (ref_frame_flag == VP8_LAST_FRAME)
        ref_fb_idx = cm->lst_fb_idx;
    else if (ref_frame_flag == VP8_GOLD_FRAME)
        ref_fb_idx = cm->gld_fb_idx;
    else if (ref_frame_flag == VP8_ALTR_FRAME)
        ref_fb_idx = cm->alt_fb_idx;
    else
        return -1;

    vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);

    return 0;
}
int vp8_update_entropy(VP8_COMP *cpi, int update)
{
    VP8_COMMON *cm = &cpi->common;
    cm->refresh_entropy_probs = update;

    return 0;
}


#if defined(OUTPUT_YUV_SRC) || defined(OUTPUT_YUV_DENOISED)
void vp8_write_yuv_frame(FILE *yuv_file, YV12_BUFFER_CONFIG *s)
{
    unsigned char *src = s->y_buffer;
    int h = s->y_height;

    do
    {
        fwrite(src, s->y_width, 1,  yuv_file);
        src += s->y_stride;
    }
    while (--h);

    src = s->u_buffer;
    h = s->uv_height;

    do
    {
        fwrite(src, s->uv_width, 1,  yuv_file);
        src += s->uv_stride;
    }
    while (--h);

    src = s->v_buffer;
    h = s->uv_height;

    do
    {
        fwrite(src, s->uv_width, 1, yuv_file);
        src += s->uv_stride;
    }
    while (--h);
}
#endif

static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
{
    VP8_COMMON *cm = &cpi->common;

    /* are we resizing the image */
    if (cm->horiz_scale != 0 || cm->vert_scale != 0)
    {
#if CONFIG_SPATIAL_RESAMPLING
        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
        int tmp_height;

        if (cm->vert_scale == 3)
            tmp_height = 9;
        else
            tmp_height = 11;

        Scale2Ratio(cm->horiz_scale, &hr, &hs);
        Scale2Ratio(cm->vert_scale, &vr, &vs);

        vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
                        tmp_height, hs, hr, vs, vr, 0);

        vp8_yv12_extend_frame_borders(&cpi->scaled_source);
        cpi->Source = &cpi->scaled_source;
#endif
    }
    else
        cpi->Source = sd;
}


static int resize_key_frame(VP8_COMP *cpi)
{
#if CONFIG_SPATIAL_RESAMPLING
    VP8_COMMON *cm = &cpi->common;

    /* Do we need to apply resampling for one pass cbr.
     * In one pass this is more limited than in two pass cbr.
     * The test and any change is only made once per key frame sequence.
     */
    if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
    {
        int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
        int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
        int new_width, new_height;

        /* If we are below the resample DOWN watermark then scale down a
         * notch.
         */
        if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
        {
            cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
            cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
        }
        /* Should we now start scaling back up */
        else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
        {
            cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
            cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
        }

        /* Get the new height and width */
        Scale2Ratio(cm->horiz_scale, &hr, &hs);
        Scale2Ratio(cm->vert_scale, &vr, &vs);
        new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
        new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;

        /* If the image size has changed we need to reallocate the buffers
         * and resample the source image
         */
        if ((cm->Width != new_width) || (cm->Height != new_height))
        {
            cm->Width = new_width;
            cm->Height = new_height;
            vp8_alloc_compressor_data(cpi);
            scale_and_extend_source(cpi->un_scaled_source, cpi);
            return 1;
        }
    }

#endif
    return 0;
}


static void update_alt_ref_frame_stats(VP8_COMP *cpi)
{
    VP8_COMMON *cm = &cpi->common;

    /* Select an interval before next GF or altref */
    if (!cpi->auto_gold)
        cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;

    if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
    {
        cpi->current_gf_interval = cpi->frames_till_gf_update_due;

        /* Set the bits per frame that we should try and recover in
         * subsequent inter frames to account for the extra GF spend...
         * note that his does not apply for GF updates that occur
         * coincident with a key frame as the extra cost of key frames is
         * dealt with elsewhere.
         */
        cpi->gf_overspend_bits += cpi->projected_frame_size;
        cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
    }

    /* Update data structure that monitors level of reference to last GF */
    vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
    cpi->gf_active_count = cm->mb_rows * cm->mb_cols;

    /* this frame refreshes means next frames don't unless specified by user */
    cpi->frames_since_golden = 0;

    /* Clear the alternate reference update pending flag. */
    cpi->source_alt_ref_pending = 0;

    /* Set the alternate reference frame active flag */
    cpi->source_alt_ref_active = 1;


}
static void update_golden_frame_stats(VP8_COMP *cpi)
{
    VP8_COMMON *cm = &cpi->common;

    /* Update the Golden frame usage counts. */
    if (cm->refresh_golden_frame)
    {
        /* Select an interval before next GF */
        if (!cpi->auto_gold)
            cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;

        if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
        {
            cpi->current_gf_interval = cpi->frames_till_gf_update_due;

            /* Set the bits per frame that we should try and recover in
             * subsequent inter frames to account for the extra GF spend...
             * note that his does not apply for GF updates that occur
             * coincident with a key frame as the extra cost of key frames
             * is dealt with elsewhere.
             */
            if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
            {
                /* Calcluate GF bits to be recovered
                 * Projected size - av frame bits available for inter
                 * frames for clip as a whole
                 */
                cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
            }

            cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;

        }

        /* Update data structure that monitors level of reference to last GF */
        vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
        cpi->gf_active_count = cm->mb_rows * cm->mb_cols;

        /* this frame refreshes means next frames don't unless specified by
         * user
         */
        cm->refresh_golden_frame = 0;
        cpi->frames_since_golden = 0;

        cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
        cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
        cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
        cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;

        /* ******** Fixed Q test code only ************ */
        /* If we are going to use the ALT reference for the next group of
         * frames set a flag to say so.
         */
        if (cpi->oxcf.fixed_q >= 0 &&
            cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
        {
            cpi->source_alt_ref_pending = 1;
            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
        }

        if (!cpi->source_alt_ref_pending)
            cpi->source_alt_ref_active = 0;

        /* Decrement count down till next gf */
        if (cpi->frames_till_gf_update_due > 0)
            cpi->frames_till_gf_update_due--;

    }
    else if (!cpi->common.refresh_alt_ref_frame)
    {
        /* Decrement count down till next gf */
        if (cpi->frames_till_gf_update_due > 0)
            cpi->frames_till_gf_update_due--;

        if (cpi->frames_till_alt_ref_frame)
            cpi->frames_till_alt_ref_frame --;

        cpi->frames_since_golden ++;

        if (cpi->frames_since_golden > 1)
        {
            cpi->recent_ref_frame_usage[INTRA_FRAME] +=
                cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
            cpi->recent_ref_frame_usage[LAST_FRAME] +=
                cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
            cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
                cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
            cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
                cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
        }
    }
}

/* This function updates the reference frame probability estimates that
 * will be used during mode selection
 */
static void update_rd_ref_frame_probs(VP8_COMP *cpi)
{
    VP8_COMMON *cm = &cpi->common;

    const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
    const int rf_intra = rfct[INTRA_FRAME];
    const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];

    if (cm->frame_type == KEY_FRAME)
    {
        cpi->prob_intra_coded = 255;
        cpi->prob_last_coded  = 128;
        cpi->prob_gf_coded  = 128;
    }
    else if (!(rf_intra + rf_inter))
    {
        cpi->prob_intra_coded = 63;
        cpi->prob_last_coded  = 128;
        cpi->prob_gf_coded    = 128;
    }

    /* update reference frame costs since we can do better than what we got
     * last frame.
     */
    if (cpi->oxcf.number_of_layers == 1)
    {
        if (cpi->common.refresh_alt_ref_frame)
        {
            cpi->prob_intra_coded += 40;
            if (cpi->prob_intra_coded > 255)
                cpi->prob_intra_coded = 255;
            cpi->prob_last_coded = 200;
            cpi->prob_gf_coded = 1;
        }
        else if (cpi->frames_since_golden == 0)
        {
            cpi->prob_last_coded = 214;
        }
        else if (cpi->frames_since_golden == 1)
        {
            cpi->prob_last_coded = 192;
            cpi->prob_gf_coded = 220;
        }
        else if (cpi->source_alt_ref_active)
        {
            cpi->prob_gf_coded -= 20;

            if (cpi->prob_gf_coded < 10)
                cpi->prob_gf_coded = 10;
        }
        if (!cpi->source_alt_ref_active)
            cpi->prob_gf_coded = 255;
    }
}


/* 1 = key, 0 = inter */
static int decide_key_frame(VP8_COMP *cpi)
{
    VP8_COMMON *cm = &cpi->common;

    int code_key_frame = 0;

    cpi->kf_boost = 0;

    if (cpi->Speed > 11)
        return 0;

    /* Clear down mmx registers */
    vp8_clear_system_state();

    if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
    {
        double change = 1.0 * abs((int)(cpi->mb.intra_error -
            cpi->last_intra_error)) / (1 + cpi->last_intra_error);
        double change2 = 1.0 * abs((int)(cpi->mb.prediction_error -
            cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
        double minerror = cm->MBs * 256;

        cpi->last_intra_error = cpi->mb.intra_error;
        cpi->last_prediction_error = cpi->mb.prediction_error;

        if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15
            && cpi->mb.prediction_error > minerror
            && (change > .25 || change2 > .25))
        {
            /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
            return 1;
        }

        return 0;

    }

    /* If the following are true we might as well code a key frame */
    if (((cpi->this_frame_percent_intra == 100) &&
         (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
        ((cpi->this_frame_percent_intra > 95) &&
         (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
    {
        code_key_frame = 1;
    }
    /* in addition if the following are true and this is not a golden frame
     * then code a key frame Note that on golden frames there often seems
     * to be a pop in intra useage anyway hence this restriction is
     * designed to prevent spurious key frames. The Intra pop needs to be
     * investigated.
     */
    else if (((cpi->this_frame_percent_intra > 60) &&
              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
             ((cpi->this_frame_percent_intra > 75) &&
              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
             ((cpi->this_frame_percent_intra > 90) &&
              (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
    {
        if (!cm->refresh_golden_frame)
            code_key_frame = 1;
    }

    return code_key_frame;

}

#if !(CONFIG_REALTIME_ONLY)
static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
{
    (void) size;
    (void) dest;
    (void) frame_flags;
    vp8_set_quantizer(cpi, 26);

    vp8_first_pass(cpi);
}
#endif

#if 0
void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
{

    /* write the frame */
    FILE *yframe;
    int i;
    char filename[255];

    sprintf(filename, "cx\\y%04d.raw", this_frame);
    yframe = fopen(filename, "wb");

    for (i = 0; i < frame->y_height; i++)
        fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);

    fclose(yframe);
    sprintf(filename, "cx\\u%04d.raw", this_frame);
    yframe = fopen(filename, "wb");

    for (i = 0; i < frame->uv_height; i++)
        fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);

    fclose(yframe);
    sprintf(filename, "cx\\v%04d.raw", this_frame);
    yframe = fopen(filename, "wb");

    for (i = 0; i < frame->uv_height; i++)
        fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);

    fclose(yframe);
}
#endif
/* return of 0 means drop frame */

/* Function to test for conditions that indeicate we should loop
 * back and recode a frame.
 */
static int recode_loop_test( VP8_COMP *cpi,
                              int high_limit, int low_limit,
                              int q, int maxq, int minq )
{
    int force_recode = 0;
    VP8_COMMON *cm = &cpi->common;

    /* Is frame recode allowed at all
     * Yes if either recode mode 1 is selected or mode two is selcted
     * and the frame is a key frame. golden frame or alt_ref_frame
     */
    if ( (cpi->sf.recode_loop == 1) ||
         ( (cpi->sf.recode_loop == 2) &&
           ( (cm->frame_type == KEY_FRAME) ||
             cm->refresh_golden_frame ||
             cm->refresh_alt_ref_frame ) ) )
    {
        /* General over and under shoot tests */
        if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
             ((cpi->projected_frame_size < low_limit) && (q > minq)) )
        {
            force_recode = 1;
        }
        /* Special Constrained quality tests */
        else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
        {
            /* Undershoot and below auto cq level */
            if ( (q > cpi->cq_target_quality) &&
                 (cpi->projected_frame_size <
                     ((cpi->this_frame_target * 7) >> 3)))
            {
                force_recode = 1;
            }
            /* Severe undershoot and between auto and user cq level */
            else if ( (q > cpi->oxcf.cq_level) &&
                      (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
                      (cpi->active_best_quality > cpi->oxcf.cq_level))
            {
                force_recode = 1;
                cpi->active_best_quality = cpi->oxcf.cq_level;
            }
        }
    }

    return force_recode;
}

static void update_reference_frames(VP8_COMP *cpi)
{
    VP8_COMMON *cm = &cpi->common;
    YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;

    /* At this point the new frame has been encoded.
     * If any buffer copy / swapping is signaled it should be done here.
     */

    if (cm->frame_type == KEY_FRAME)
    {
        yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME ;

        yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
        yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;

        cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;

#if CONFIG_MULTI_RES_ENCODING
        cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
        cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
#endif
    }
    else    /* For non key frames */
    {
        if (cm->refresh_alt_ref_frame)
        {
            assert(!cm->copy_buffer_to_arf);

            cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
            cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
            cm->alt_fb_idx = cm->new_fb_idx;

#if CONFIG_MULTI_RES_ENCODING
            cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
#endif
        }
        else if (cm->copy_buffer_to_arf)
        {
            assert(!(cm->copy_buffer_to_arf & ~0x3));

            if (cm->copy_buffer_to_arf == 1)
            {
                if(cm->alt_fb_idx != cm->lst_fb_idx)
                {
                    yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
                    yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
                    cm->alt_fb_idx = cm->lst_fb_idx;

#if CONFIG_MULTI_RES_ENCODING
                    cpi->current_ref_frames[ALTREF_FRAME] =
                        cpi->current_ref_frames[LAST_FRAME];
#endif
                }
            }
            else /* if (cm->copy_buffer_to_arf == 2) */
            {
                if(cm->alt_fb_idx != cm->gld_fb_idx)
                {
                    yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
                    yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
                    cm->alt_fb_idx = cm->gld_fb_idx;

#if CONFIG_MULTI_RES_ENCODING
                    cpi->current_ref_frames[ALTREF_FRAME] =
                        cpi->current_ref_frames[GOLDEN_FRAME];
#endif
                }
            }
        }

        if (cm->refresh_golden_frame)
        {
            assert(!cm->copy_buffer_to_gf);

            cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
            cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
            cm->gld_fb_idx = cm->new_fb_idx;

#if CONFIG_MULTI_RES_ENCODING
            cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
#endif
        }
        else if (cm->copy_buffer_to_gf)
        {
            assert(!(cm->copy_buffer_to_arf & ~0x3));

            if (cm->copy_buffer_to_gf == 1)
            {
                if(cm->gld_fb_idx != cm->lst_fb_idx)
                {
                    yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
                    yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
                    cm->gld_fb_idx = cm->lst_fb_idx;

#if CONFIG_MULTI_RES_ENCODING
                    cpi->current_ref_frames[GOLDEN_FRAME] =
                        cpi->current_ref_frames[LAST_FRAME];
#endif
                }
            }
            else /* if (cm->copy_buffer_to_gf == 2) */
            {
                if(cm->alt_fb_idx != cm->gld_fb_idx)
                {
                    yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
                    yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
                    cm->gld_fb_idx = cm->alt_fb_idx;

#if CONFIG_MULTI_RES_ENCODING
                    cpi->current_ref_frames[GOLDEN_FRAME] =
                        cpi->current_ref_frames[ALTREF_FRAME];
#endif
                }
            }
        }
    }

    if (cm->refresh_last_frame)
    {
        cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
        cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
        cm->lst_fb_idx = cm->new_fb_idx;

#if CONFIG_MULTI_RES_ENCODING
        cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
#endif
    }

#if CONFIG_TEMPORAL_DENOISING
    if (cpi->oxcf.noise_sensitivity)
    {
        /* we shouldn't have to keep multiple copies as we know in advance which
         * buffer we should start - for now to get something up and running
         * I've chosen to copy the buffers
         */
        if (cm->frame_type == KEY_FRAME)
        {
            int i;
            vp8_yv12_copy_frame(
                    cpi->Source,
                    &cpi->denoiser.yv12_running_avg[LAST_FRAME]);

            vp8_yv12_extend_frame_borders(
                    &cpi->denoiser.yv12_running_avg[LAST_FRAME]);

            for (i = 2; i < MAX_REF_FRAMES - 1; i++)
                vp8_yv12_copy_frame(
                        &cpi->denoiser.yv12_running_avg[LAST_FRAME],
                        &cpi->denoiser.yv12_running_avg[i]);
        }
        else /* For non key frames */
        {
            vp8_yv12_extend_frame_borders(
                    &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);

            if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf)
            {
                vp8_yv12_copy_frame(
                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
                        &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
            }
            if (cm->refresh_golden_frame || cm->copy_buffer_to_gf)
            {
                vp8_yv12_copy_frame(
                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
                        &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
            }
            if(cm->refresh_last_frame)
            {
                vp8_yv12_copy_frame(
                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
                        &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
            }
        }

    }
#endif

}

void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
{
    const FRAME_TYPE frame_type = cm->frame_type;

    if (cm->no_lpf)
    {
        cm->filter_level = 0;
    }
    else
    {
        struct vpx_usec_timer timer;

        vp8_clear_system_state();

        vpx_usec_timer_start(&timer);
        if (cpi->sf.auto_filter == 0)
            vp8cx_pick_filter_level_fast(cpi->Source, cpi);

        else
            vp8cx_pick_filter_level(cpi->Source, cpi);

        if (cm->filter_level > 0)
        {
            vp8cx_set_alt_lf_level(cpi, cm->filter_level);
        }

        vpx_usec_timer_mark(&timer);
        cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
    }

#if CONFIG_MULTITHREAD
    if (cpi->b_multi_threaded)
        sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
#endif

    if (cm->filter_level > 0)
    {
        vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
    }

    vp8_yv12_extend_frame_borders(cm->frame_to_show);

}

static void encode_frame_to_data_rate
(
    VP8_COMP *cpi,
    unsigned long *size,
    unsigned char *dest,
    unsigned char* dest_end,
    unsigned int *frame_flags
)
{
    int Q;
    int frame_over_shoot_limit;
    int frame_under_shoot_limit;

    int Loop = 0;
    int loop_count;

    VP8_COMMON *cm = &cpi->common;
    int active_worst_qchanged = 0;

#if !(CONFIG_REALTIME_ONLY)
    int q_low;
    int q_high;
    int zbin_oq_high;
    int zbin_oq_low = 0;
    int top_index;
    int bottom_index;
    int overshoot_seen = 0;
    int undershoot_seen = 0;
#endif

    int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
                          cpi->oxcf.optimal_buffer_level / 100);
    int drop_mark75 = drop_mark * 2 / 3;
    int drop_mark50 = drop_mark / 4;
    int drop_mark25 = drop_mark / 8;


    /* Clear down mmx registers to allow floating point in what follows */
    vp8_clear_system_state();

#if CONFIG_MULTITHREAD
    /*  wait for the last picture loopfilter thread done */
    if (cpi->b_lpf_running)
    {
        sem_wait(&cpi->h_event_end_lpf);
        cpi->b_lpf_running = 0;
    }
#endif

    if(cpi->force_next_frame_intra)
    {
        cm->frame_type = KEY_FRAME;  /* delayed intra frame */
        cpi->force_next_frame_intra = 0;
    }

    /* For an alt ref frame in 2 pass we skip the call to the second pass
     * function that sets the target bandwidth
     */
#if !(CONFIG_REALTIME_ONLY)

    if (cpi->pass == 2)
    {
        if (cpi->common.refresh_alt_ref_frame)
        {
            /* Per frame bit target for the alt ref frame */
            cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
            /* per second target bitrate */
            cpi->target_bandwidth = (int)(cpi->twopass.gf_bits *
                                          cpi->output_framerate);
        }
    }
    else
#endif
        cpi->per_frame_bandwidth  = (int)(cpi->target_bandwidth / cpi->output_framerate);

    /* Default turn off buffer to buffer copying */
    cm->copy_buffer_to_gf = 0;
    cm->copy_buffer_to_arf = 0;

    /* Clear zbin over-quant value and mode boost values. */
    cpi->mb.zbin_over_quant = 0;
    cpi->mb.zbin_mode_boost = 0;

    /* Enable or disable mode based tweaking of the zbin
     * For 2 Pass Only used where GF/ARF prediction quality
     * is above a threshold
     */
    cpi->mb.zbin_mode_boost_enabled = 1;
    if (cpi->pass == 2)
    {
        if ( cpi->gfu_boost <= 400 )
        {
            cpi->mb.zbin_mode_boost_enabled = 0;
        }
    }

    /* Current default encoder behaviour for the altref sign bias */
    if (cpi->source_alt_ref_active)
        cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
    else
        cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;

    /* Check to see if a key frame is signaled
     * For two pass with auto key frame enabled cm->frame_type may already
     * be set, but not for one pass.
     */
    if ((cm->current_video_frame == 0) ||
        (cm->frame_flags & FRAMEFLAGS_KEY) ||
        (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
    {
        /* Key frame from VFW/auto-keyframe/first frame */
        cm->frame_type = KEY_FRAME;
    }

#if CONFIG_MULTI_RES_ENCODING
    /* In multi-resolution encoding, frame_type is decided by lowest-resolution
     * encoder. Same frame_type is adopted while encoding at other resolution.
     */
    if (cpi->oxcf.mr_encoder_id)
    {
        LOWER_RES_FRAME_INFO* low_res_frame_info
                        = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info;

        cm->frame_type = low_res_frame_info->frame_type;

        if(cm->frame_type != KEY_FRAME)
        {
            cpi->mr_low_res_mv_avail = 1;
            cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);

            if (cpi->ref_frame_flags & VP8_LAST_FRAME)
                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[LAST_FRAME]
                         == low_res_frame_info->low_res_ref_frames[LAST_FRAME]);

            if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[GOLDEN_FRAME]
                         == low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);

            if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
                cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
                         == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
        }
    }
#endif

    /* Set various flags etc to special state if it is a key frame */
    if (cm->frame_type == KEY_FRAME)
    {
        int i;

        // Set the loop filter deltas and segmentation map update
        setup_features(cpi);

        /* The alternate reference frame cannot be active for a key frame */
        cpi->source_alt_ref_active = 0;

        /* Reset the RD threshold multipliers to default of * 1 (128) */
        for (i = 0; i < MAX_MODES; i++)
        {
            cpi->mb.rd_thresh_mult[i] = 128;
        }
    }

#if 0
    /* Experimental code for lagged compress and one pass
     * Initialise one_pass GF frames stats
     * Update stats used for GF selection
     */
    {
        cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;

        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
    }
#endif

    update_rd_ref_frame_probs(cpi);

    if (cpi->drop_frames_allowed)
    {
        /* The reset to decimation 0 is only done here for one pass.
         * Once it is set two pass leaves decimation on till the next kf.
         */
        if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
            cpi->decimation_factor --;

        if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
            cpi->decimation_factor = 1;

        else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
        {
            cpi->decimation_factor = 3;
        }
        else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
        {
            cpi->decimation_factor = 2;
        }
        else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
        {
            cpi->decimation_factor = 1;
        }
    }

    /* The following decimates the frame rate according to a regular
     * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
     * prevent buffer under-run in CBR mode. Alternatively it might be
     * desirable in some situations to drop frame rate but throw more bits
     * at each frame.
     *
     * Note that dropping a key frame can be problematic if spatial
     * resampling is also active
     */
    if (cpi->decimation_factor > 0)
    {
        switch (cpi->decimation_factor)
        {
        case 1:
            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 3 / 2;
            break;
        case 2:
            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 5 / 4;
            break;
        case 3:
            cpi->per_frame_bandwidth  = cpi->per_frame_bandwidth * 5 / 4;
            break;
        }

        /* Note that we should not throw out a key frame (especially when
         * spatial resampling is enabled).
         */
        if (cm->frame_type == KEY_FRAME)
        {
            cpi->decimation_count = cpi->decimation_factor;
        }
        else if (cpi->decimation_count > 0)
        {
            cpi->decimation_count --;

            cpi->bits_off_target += cpi->av_per_frame_bandwidth;
            if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
                cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;

#if CONFIG_MULTI_RES_ENCODING
            vp8_store_drop_frame_info(cpi);
#endif

            cm->current_video_frame++;
            cpi->frames_since_key++;
            // We advance the temporal pattern for dropped frames.
            cpi->temporal_pattern_counter++;

#if CONFIG_INTERNAL_STATS
            cpi->count ++;
#endif

            cpi->buffer_level = cpi->bits_off_target;

            if (cpi->oxcf.number_of_layers > 1)
            {
                unsigned int i;

                /* Propagate bits saved by dropping the frame to higher
                 * layers
                 */
                for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
                {
                    LAYER_CONTEXT *lc = &cpi->layer_context[i];
                    lc->bits_off_target += (int)(lc->target_bandwidth /
                                                 lc->framerate);
                    if (lc->bits_off_target > lc->maximum_buffer_size)
                        lc->bits_off_target = lc->maximum_buffer_size;
                    lc->buffer_level = lc->bits_off_target;
                }
            }

            return;
        }
        else
            cpi->decimation_count = cpi->decimation_factor;
    }
    else
        cpi->decimation_count = 0;

    /* Decide how big to make the frame */
    if (!vp8_pick_frame_size(cpi))
    {
        /*TODO: 2 drop_frame and return code could be put together. */
#if CONFIG_MULTI_RES_ENCODING
        vp8_store_drop_frame_info(cpi);
#endif
        cm->current_video_frame++;
        cpi->frames_since_key++;
        // We advance the temporal pattern for dropped frames.
        cpi->temporal_pattern_counter++;
        return;
    }

    /* Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
     * This has a knock on effect on active best quality as well.
     * For CBR if the buffer reaches its maximum level then we can no longer
     * save up bits for later frames so we might as well use them up
     * on the current frame.
     */
    if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
        (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
    {
        /* Max adjustment is 1/4 */
        int Adjustment = cpi->active_worst_quality / 4;

        if (Adjustment)
        {
            int buff_lvl_step;

            if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
            {
                buff_lvl_step = (int)
                                ((cpi->oxcf.maximum_buffer_size -
                                  cpi->oxcf.optimal_buffer_level) /
                                  Adjustment);

                if (buff_lvl_step)
                    Adjustment = (int)
                                 ((cpi->buffer_level -
                                 cpi->oxcf.optimal_buffer_level) /
                                 buff_lvl_step);
                else
                    Adjustment = 0;
            }

            cpi->active_worst_quality -= Adjustment;

            if(cpi->active_worst_quality < cpi->active_best_quality)
                cpi->active_worst_quality = cpi->active_best_quality;
        }
    }

    /* Set an active best quality and if necessary active worst quality
     * There is some odd behavior for one pass here that needs attention.
     */
    if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
    {
        vp8_clear_system_state();

        Q = cpi->active_worst_quality;

        if ( cm->frame_type == KEY_FRAME )
        {
            if ( cpi->pass == 2 )
            {
                if (cpi->gfu_boost > 600)
                   cpi->active_best_quality = kf_low_motion_minq[Q];
                else
                   cpi->active_best_quality = kf_high_motion_minq[Q];

                /* Special case for key frames forced because we have reached
                 * the maximum key frame interval. Here force the Q to a range
                 * based on the ambient Q to reduce the risk of popping
                 */
                if ( cpi->this_key_frame_forced )
                {
                    if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
                        cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
                    else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
                        cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
                }
            }
            /* One pass more conservative */
            else
               cpi->active_best_quality = kf_high_motion_minq[Q];
        }

        else if (cpi->oxcf.number_of_layers==1 &&
                (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame))
        {
            /* Use the lower of cpi->active_worst_quality and recent
             * average Q as basis for GF/ARF Q limit unless last frame was
             * a key frame.
             */
            if ( (cpi->frames_since_key > 1) &&
               (cpi->avg_frame_qindex < cpi->active_worst_quality) )
            {
                Q = cpi->avg_frame_qindex;
            }

            /* For constrained quality dont allow Q less than the cq level */
            if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
                 (Q < cpi->cq_target_quality) )
            {
                Q = cpi->cq_target_quality;
            }

            if ( cpi->pass == 2 )
            {
                if ( cpi->gfu_boost > 1000 )
                    cpi->active_best_quality = gf_low_motion_minq[Q];
                else if ( cpi->gfu_boost < 400 )
                    cpi->active_best_quality = gf_high_motion_minq[Q];
                else
                    cpi->active_best_quality = gf_mid_motion_minq[Q];

                /* Constrained quality use slightly lower active best. */
                if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
                {
                    cpi->active_best_quality =
                        cpi->active_best_quality * 15/16;
                }
            }
            /* One pass more conservative */
            else
                cpi->active_best_quality = gf_high_motion_minq[Q];
        }
        else
        {
            cpi->active_best_quality = inter_minq[Q];

            /* For the constant/constrained quality mode we dont want
             * q to fall below the cq level.
             */
            if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
                (cpi->active_best_quality < cpi->cq_target_quality) )
            {
                /* If we are strongly undershooting the target rate in the last
                 * frames then use the user passed in cq value not the auto
                 * cq value.
                 */
                if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
                    cpi->active_best_quality = cpi->oxcf.cq_level;
                else
                    cpi->active_best_quality = cpi->cq_target_quality;
            }
        }

        /* If CBR and the buffer is as full then it is reasonable to allow
         * higher quality on the frames to prevent bits just going to waste.
         */
        if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
        {
            /* Note that the use of >= here elliminates the risk of a devide
             * by 0 error in the else if clause
             */
            if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
                cpi->active_best_quality = cpi->best_quality;

            else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
            {
                int Fraction = (int)
                  (((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128)
                  / (cpi->oxcf.maximum_buffer_size -
                  cpi->oxcf.optimal_buffer_level));
                int min_qadjustment = ((cpi->active_best_quality -
                                        cpi->best_quality) * Fraction) / 128;

                cpi->active_best_quality -= min_qadjustment;
            }
        }
    }
    /* Make sure constrained quality mode limits are adhered to for the first
     * few frames of one pass encodes
     */
    else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
    {
        if ( (cm->frame_type == KEY_FRAME) ||
             cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
        {
             cpi->active_best_quality = cpi->best_quality;
        }
        else if (cpi->active_best_quality < cpi->cq_target_quality)
        {
            cpi->active_best_quality = cpi->cq_target_quality;
        }
    }

    /* Clip the active best and worst quality values to limits */
    if (cpi->active_worst_quality > cpi->worst_quality)
        cpi->active_worst_quality = cpi->worst_quality;

    if (cpi->active_best_quality < cpi->best_quality)
        cpi->active_best_quality = cpi->best_quality;

    if ( cpi->active_worst_quality < cpi->active_best_quality )
        cpi->active_worst_quality = cpi->active_best_quality;

    /* Determine initial Q to try */
    Q = vp8_regulate_q(cpi, cpi->this_frame_target);

#if !(CONFIG_REALTIME_ONLY)

    /* Set highest allowed value for Zbin over quant */
    if (cm->frame_type == KEY_FRAME)
        zbin_oq_high = 0;
    else if ((cpi->oxcf.number_of_layers == 1) && ((cm->refresh_alt_ref_frame ||
              (cm->refresh_golden_frame && !cpi->source_alt_ref_active))))
    {
          zbin_oq_high = 16;
    }
    else
        zbin_oq_high = ZBIN_OQ_MAX;
#endif

    /* Setup background Q adjustment for error resilient mode.
     * For multi-layer encodes only enable this for the base layer.
    */
    if (cpi->cyclic_refresh_mode_enabled)
    {
      if (cpi->current_layer==0)
        cyclic_background_refresh(cpi, Q, 0);
      else
        disable_segmentation(cpi);
    }

    vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);

#if !(CONFIG_REALTIME_ONLY)
    /* Limit Q range for the adaptive loop. */
    bottom_index = cpi->active_best_quality;
    top_index    = cpi->active_worst_quality;
    q_low  = cpi->active_best_quality;
    q_high = cpi->active_worst_quality;
#endif

    vp8_save_coding_context(cpi);

    loop_count = 0;

    scale_and_extend_source(cpi->un_scaled_source, cpi);

#if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)

    if (cpi->oxcf.noise_sensitivity > 0)
    {
        unsigned char *src;
        int l = 0;

        switch (cpi->oxcf.noise_sensitivity)
        {
        case 1:
            l = 20;
            break;
        case 2:
            l = 40;
            break;
        case 3:
            l = 60;
            break;
        case 4:
            l = 80;
            break;
        case 5:
            l = 100;
            break;
        case 6:
            l = 150;
            break;
        }


        if (cm->frame_type == KEY_FRAME)
        {
            vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1,  0);
        }
        else
        {
            vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1,  0);

            src = cpi->Source->y_buffer;

            if (cpi->Source->y_stride < 0)
            {
                src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
            }
        }
    }

#endif

#ifdef OUTPUT_YUV_SRC
    vp8_write_yuv_frame(yuv_file, cpi->Source);
#endif

    do
    {
        vp8_clear_system_state();

        vp8_set_quantizer(cpi, Q);

        /* setup skip prob for costing in mode/mv decision */
        if (cpi->common.mb_no_coeff_skip)
        {
            cpi->prob_skip_false = cpi->base_skip_false_prob[Q];

            if (cm->frame_type != KEY_FRAME)
            {
                if (cpi->common.refresh_alt_ref_frame)
                {
                    if (cpi->last_skip_false_probs[2] != 0)
                        cpi->prob_skip_false = cpi->last_skip_false_probs[2];

                    /*
                                        if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
                       cpi->prob_skip_false = cpi->last_skip_false_probs[2];
                                        else if (cpi->last_skip_false_probs[2]!=0)
                       cpi->prob_skip_false = (cpi->last_skip_false_probs[2]  + cpi->prob_skip_false ) / 2;
                       */
                }
                else if (cpi->common.refresh_golden_frame)
                {
                    if (cpi->last_skip_false_probs[1] != 0)
                        cpi->prob_skip_false = cpi->last_skip_false_probs[1];

                    /*
                                        if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
                       cpi->prob_skip_false = cpi->last_skip_false_probs[1];
                                        else if (cpi->last_skip_false_probs[1]!=0)
                       cpi->prob_skip_false = (cpi->last_skip_false_probs[1]  + cpi->prob_skip_false ) / 2;
                       */
                }
                else
                {
                    if (cpi->last_skip_false_probs[0] != 0)
                        cpi->prob_skip_false = cpi->last_skip_false_probs[0];

                    /*
                    if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
                        cpi->prob_skip_false = cpi->last_skip_false_probs[0];
                    else if(cpi->last_skip_false_probs[0]!=0)
                        cpi->prob_skip_false = (cpi->last_skip_false_probs[0]  + cpi->prob_skip_false ) / 2;
                        */
                }

                /* as this is for cost estimate, let's make sure it does not
                 * go extreme eitehr way
                 */
                if (cpi->prob_skip_false < 5)
                    cpi->prob_skip_false = 5;

                if (cpi->prob_skip_false > 250)
                    cpi->prob_skip_false = 250;

                if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref)
                    cpi->prob_skip_false = 1;
            }

#if 0

            if (cpi->pass != 1)
            {
                FILE *f = fopen("skip.stt", "a");
                fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
                fclose(f);
            }

#endif

        }

        if (cm->frame_type == KEY_FRAME)
        {
            if(resize_key_frame(cpi))
            {
              /* If the frame size has changed, need to reset Q, quantizer,
               * and background refresh.
               */
              Q = vp8_regulate_q(cpi, cpi->this_frame_target);
              if (cpi->cyclic_refresh_mode_enabled)
              {
                if (cpi->current_layer==0)
                  cyclic_background_refresh(cpi, Q, 0);
                else
                  disable_segmentation(cpi);
              }
              vp8_set_quantizer(cpi, Q);
            }

            vp8_setup_key_frame(cpi);
        }



#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
        {
            if(cpi->oxcf.error_resilient_mode)
                cm->refresh_entropy_probs = 0;

            if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
            {
                if (cm->frame_type == KEY_FRAME)
                    cm->refresh_entropy_probs = 1;
            }

            if (cm->refresh_entropy_probs == 0)
            {
                /* save a copy for later refresh */
                vpx_memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
            }

            vp8_update_coef_context(cpi);

            vp8_update_coef_probs(cpi);

            /* transform / motion compensation build reconstruction frame
             * +pack coef partitions
             */
            vp8_encode_frame(cpi);

            /* cpi->projected_frame_size is not needed for RT mode */
        }
#else
        /* transform / motion compensation build reconstruction frame */
        vp8_encode_frame(cpi);

        cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
        cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
#endif
        vp8_clear_system_state();

        /* Test to see if the stats generated for this frame indicate that
         * we should have coded a key frame (assuming that we didn't)!
         */

        if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME
            && cpi->compressor_speed != 2)
        {
#if !(CONFIG_REALTIME_ONLY)
            if (decide_key_frame(cpi))
            {
                /* Reset all our sizing numbers and recode */
                cm->frame_type = KEY_FRAME;

                vp8_pick_frame_size(cpi);

                /* Clear the Alt reference frame active flag when we have
                 * a key frame
                 */
                cpi->source_alt_ref_active = 0;

                // Set the loop filter deltas and segmentation map update
                setup_features(cpi);

                vp8_restore_coding_context(cpi);

                Q = vp8_regulate_q(cpi, cpi->this_frame_target);

                vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);

                /* Limit Q range for the adaptive loop. */
                bottom_index = cpi->active_best_quality;
                top_index    = cpi->active_worst_quality;
                q_low  = cpi->active_best_quality;
                q_high = cpi->active_worst_quality;

                loop_count++;
                Loop = 1;

                continue;
            }
#endif
        }

        vp8_clear_system_state();

        if (frame_over_shoot_limit == 0)
            frame_over_shoot_limit = 1;

        /* Are we are overshooting and up against the limit of active max Q. */
        if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
            (Q == cpi->active_worst_quality)                     &&
            (cpi->active_worst_quality < cpi->worst_quality)      &&
            (cpi->projected_frame_size > frame_over_shoot_limit))
        {
            int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;

            /* If so is there any scope for relaxing it */
            while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
            {
                cpi->active_worst_quality++;
                /* Assume 1 qstep = about 4% on frame size. */
                over_size_percent = (int)(over_size_percent * 0.96);
            }
#if !(CONFIG_REALTIME_ONLY)
            top_index = cpi->active_worst_quality;
#endif
            /* If we have updated the active max Q do not call
             * vp8_update_rate_correction_factors() this loop.
             */
            active_worst_qchanged = 1;
        }
        else
            active_worst_qchanged = 0;

#if !(CONFIG_REALTIME_ONLY)
        /* Special case handling for forced key frames */
        if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
        {
            int last_q = Q;
            int kf_err = vp8_calc_ss_err(cpi->Source,
                                         &cm->yv12_fb[cm->new_fb_idx]);

            /* The key frame is not good enough */
            if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
            {
                /* Lower q_high */
                q_high = (Q > q_low) ? (Q - 1) : q_low;

                /* Adjust Q */
                Q = (q_high + q_low) >> 1;
            }
            /* The key frame is much better than the previous frame */
            else if ( kf_err < (cpi->ambient_err >> 1) )
            {
                /* Raise q_low */
                q_low = (Q < q_high) ? (Q + 1) : q_high;

                /* Adjust Q */
                Q = (q_high + q_low + 1) >> 1;
            }

            /* Clamp Q to upper and lower limits: */
            if (Q > q_high)
                Q = q_high;
            else if (Q < q_low)
                Q = q_low;

            Loop = Q != last_q;
        }

        /* Is the projected frame size out of range and are we allowed
         * to attempt to recode.
         */
        else if ( recode_loop_test( cpi,
                               frame_over_shoot_limit, frame_under_shoot_limit,
                               Q, top_index, bottom_index ) )
        {
            int last_q = Q;
            int Retries = 0;

            /* Frame size out of permitted range. Update correction factor
             * & compute new Q to try...
             */

            /* Frame is too large */
            if (cpi->projected_frame_size > cpi->this_frame_target)
            {
                /* Raise Qlow as to at least the current value */
                q_low = (Q < q_high) ? (Q + 1) : q_high;

                /* If we are using over quant do the same for zbin_oq_low */
                if (cpi->mb.zbin_over_quant > 0)
                    zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
                        (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;

                if (undershoot_seen)
                {
                    /* Update rate_correction_factor unless
                     * cpi->active_worst_quality has changed.
                     */
                    if (!active_worst_qchanged)
                        vp8_update_rate_correction_factors(cpi, 1);

                    Q = (q_high + q_low + 1) / 2;

                    /* Adjust cpi->zbin_over_quant (only allowed when Q
                     * is max)
                     */
                    if (Q < MAXQ)
                        cpi->mb.zbin_over_quant = 0;
                    else
                    {
                        zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
                            (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
                        cpi->mb.zbin_over_quant =
                            (zbin_oq_high + zbin_oq_low) / 2;
                    }
                }
                else
                {
                    /* Update rate_correction_factor unless
                     * cpi->active_worst_quality has changed.
                     */
                    if (!active_worst_qchanged)
                        vp8_update_rate_correction_factors(cpi, 0);

                    Q = vp8_regulate_q(cpi, cpi->this_frame_target);

                    while (((Q < q_low) ||
                        (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
                        (Retries < 10))
                    {
                        vp8_update_rate_correction_factors(cpi, 0);
                        Q = vp8_regulate_q(cpi, cpi->this_frame_target);
                        Retries ++;
                    }
                }

                overshoot_seen = 1;
            }
            /* Frame is too small */
            else
            {
                if (cpi->mb.zbin_over_quant == 0)
                    /* Lower q_high if not using over quant */
                    q_high = (Q > q_low) ? (Q - 1) : q_low;
                else
                    /* else lower zbin_oq_high */
                    zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low) ?
                        (cpi->mb.zbin_over_quant - 1) : zbin_oq_low;

                if (overshoot_seen)
                {
                    /* Update rate_correction_factor unless
                     * cpi->active_worst_quality has changed.
                     */
                    if (!active_worst_qchanged)
                        vp8_update_rate_correction_factors(cpi, 1);

                    Q = (q_high + q_low) / 2;

                    /* Adjust cpi->zbin_over_quant (only allowed when Q
                     * is max)
                     */
                    if (Q < MAXQ)
                        cpi->mb.zbin_over_quant = 0;
                    else
                        cpi->mb.zbin_over_quant =
                            (zbin_oq_high + zbin_oq_low) / 2;
                }
                else
                {
                    /* Update rate_correction_factor unless
                     * cpi->active_worst_quality has changed.
                     */
                    if (!active_worst_qchanged)
                        vp8_update_rate_correction_factors(cpi, 0);

                    Q = vp8_regulate_q(cpi, cpi->this_frame_target);

                    /* Special case reset for qlow for constrained quality.
                     * This should only trigger where there is very substantial
                     * undershoot on a frame and the auto cq level is above
                     * the user passsed in value.
                     */
                    if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
                         (Q < q_low) )
                    {
                        q_low = Q;
                    }

                    while (((Q > q_high) ||
                        (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
                        (Retries < 10))
                    {
                        vp8_update_rate_correction_factors(cpi, 0);
                        Q = vp8_regulate_q(cpi, cpi->this_frame_target);
                        Retries ++;
                    }
                }

                undershoot_seen = 1;
            }

            /* Clamp Q to upper and lower limits: */
            if (Q > q_high)
                Q = q_high;
            else if (Q < q_low)
                Q = q_low;

            /* Clamp cpi->zbin_over_quant */
            cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low) ?
                zbin_oq_low : (cpi->mb.zbin_over_quant > zbin_oq_high) ?
                    zbin_oq_high : cpi->mb.zbin_over_quant;

            Loop = Q != last_q;
        }
        else
#endif
            Loop = 0;

        if (cpi->is_src_frame_alt_ref)
            Loop = 0;

        if (Loop == 1)
        {
            vp8_restore_coding_context(cpi);
            loop_count++;
#if CONFIG_INTERNAL_STATS
            cpi->tot_recode_hits++;
#endif
        }
    }
    while (Loop == 1);

#if 0
    /* Experimental code for lagged and one pass
     * Update stats used for one pass GF selection
     */
    {
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
        cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
    }
#endif

    /* Special case code to reduce pulsing when key frames are forced at a
     * fixed interval. Note the reconstruction error if it is the frame before
     * the force key frame
     */
    if ( cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0) )
    {
        cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
                                           &cm->yv12_fb[cm->new_fb_idx]);
    }

    /* This frame's MVs are saved and will be used in next frame's MV predictor.
     * Last frame has one more line(add to bottom) and one more column(add to
     * right) than cm->mip. The edge elements are initialized to 0.
     */
#if CONFIG_MULTI_RES_ENCODING
    if(!cpi->oxcf.mr_encoder_id && cm->show_frame)
#else
    if(cm->show_frame)   /* do not save for altref frame */
#endif
    {
        int mb_row;
        int mb_col;
        /* Point to beginning of allocated MODE_INFO arrays. */
        MODE_INFO *tmp = cm->mip;

        if(cm->frame_type != KEY_FRAME)
        {
            for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
            {
                for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
                {
                    if(tmp->mbmi.ref_frame != INTRA_FRAME)
                        cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;

                    cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
                    cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
                    tmp++;
                }
            }
        }
    }

    /* Count last ref frame 0,0 usage on current encoded frame. */
    {
        int mb_row;
        int mb_col;
        /* Point to beginning of MODE_INFO arrays. */
        MODE_INFO *tmp = cm->mi;

        cpi->zeromv_count = 0;

        if(cm->frame_type != KEY_FRAME)
        {
            for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
            {
                for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++)
                {
                    if(tmp->mbmi.mode == ZEROMV)
                        cpi->zeromv_count++;
                    tmp++;
                }
                tmp++;
            }
        }
    }

#if CONFIG_MULTI_RES_ENCODING
    vp8_cal_dissimilarity(cpi);
#endif

    /* Update the GF useage maps.
     * This is done after completing the compression of a frame when all
     * modes etc. are finalized but before loop filter
     */
    if (cpi->oxcf.number_of_layers == 1)
        vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);

    if (cm->frame_type == KEY_FRAME)
        cm->refresh_last_frame = 1;

#if 0
    {
        FILE *f = fopen("gfactive.stt", "a");
        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);
        fclose(f);
    }
#endif

    /* For inter frames the current default behavior is that when
     * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
     * This is purely an encoder decision at present.
     */
    if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
        cm->copy_buffer_to_arf  = 2;
    else
        cm->copy_buffer_to_arf  = 0;

    cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];

#if CONFIG_MULTITHREAD
    if (cpi->b_multi_threaded)
    {
        /* start loopfilter in separate thread */
        sem_post(&cpi->h_event_start_lpf);
        cpi->b_lpf_running = 1;
    }
    else
#endif
    {
        vp8_loopfilter_frame(cpi, cm);
    }

    update_reference_frames(cpi);

#ifdef OUTPUT_YUV_DENOISED
    vp8_write_yuv_frame(yuv_denoised_file,
                        &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
#endif

#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
    if (cpi->oxcf.error_resilient_mode)
    {
        cm->refresh_entropy_probs = 0;
    }
#endif

#if CONFIG_MULTITHREAD
    /* wait that filter_level is picked so that we can continue with stream packing */
    if (cpi->b_multi_threaded)
        sem_wait(&cpi->h_event_end_lpf);
#endif

    /* build the bitstream */
    vp8_pack_bitstream(cpi, dest, dest_end, size);

#if CONFIG_MULTITHREAD
    /* if PSNR packets are generated we have to wait for the lpf */
    if (cpi->b_lpf_running && cpi->b_calculate_psnr)
    {
        sem_wait(&cpi->h_event_end_lpf);
        cpi->b_lpf_running = 0;
    }
#endif

    /* Move storing frame_type out of the above loop since it is also
     * needed in motion search besides loopfilter */
    cm->last_frame_type = cm->frame_type;

    /* Update rate control heuristics */
    cpi->total_byte_count += (*size);
    cpi->projected_frame_size = (*size) << 3;

    if (cpi->oxcf.number_of_layers > 1)
    {
        unsigned int i;
        for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
          cpi->layer_context[i].total_byte_count += (*size);
    }

    if (!active_worst_qchanged)
        vp8_update_rate_correction_factors(cpi, 2);

    cpi->last_q[cm->frame_type] = cm->base_qindex;

    if (cm->frame_type == KEY_FRAME)
    {
        vp8_adjust_key_frame_context(cpi);
    }

    /* Keep a record of ambient average Q. */
    if (cm->frame_type != KEY_FRAME)
        cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;

    /* Keep a record from which we can calculate the average Q excluding
     * GF updates and key frames
     */
    if ((cm->frame_type != KEY_FRAME) && ((cpi->oxcf.number_of_layers > 1) ||
        (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)))
    {
        cpi->ni_frames++;

        /* Calculate the average Q for normal inter frames (not key or GFU
         * frames).
         */
        if ( cpi->pass == 2 )
        {
            cpi->ni_tot_qi += Q;
            cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
        }
        else
        {
            /* Damp value for first few frames */
            if (cpi->ni_frames > 150 )
            {
                cpi->ni_tot_qi += Q;
                cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
            }
            /* For one pass, early in the clip ... average the current frame Q
             * value with the worstq entered by the user as a dampening measure
             */
            else
            {
                cpi->ni_tot_qi += Q;
                cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
            }

            /* If the average Q is higher than what was used in the last
             * frame (after going through the recode loop to keep the frame
             * size within range) then use the last frame value - 1. The -1
             * is designed to stop Q and hence the data rate, from
             * progressively falling away during difficult sections, but at
             * the same time reduce the number of itterations around the
             * recode loop.
             */
            if (Q > cpi->ni_av_qi)
                cpi->ni_av_qi = Q - 1;
        }
    }

    /* Update the buffer level variable. */
    /* Non-viewable frames are a special case and are treated as pure overhead. */
    if ( !cm->show_frame )
        cpi->bits_off_target -= cpi->projected_frame_size;
    else
        cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;

    /* Clip the buffer level to the maximum specified buffer size */
    if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
        cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;

    /* Rolling monitors of whether we are over or underspending used to
     * help regulate min and Max Q in two pass.
     */
    cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
    cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
    cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
    cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;

    /* Actual bits spent */
    cpi->total_actual_bits += cpi->projected_frame_size;

    /* Debug stats */
    cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);

    cpi->buffer_level = cpi->bits_off_target;

    /* Propagate values to higher temporal layers */
    if (cpi->oxcf.number_of_layers > 1)
    {
        unsigned int i;

        for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
        {
            LAYER_CONTEXT *lc = &cpi->layer_context[i];
            int bits_off_for_this_layer =
               (int)(lc->target_bandwidth / lc->framerate -
                     cpi->projected_frame_size);

            lc->bits_off_target += bits_off_for_this_layer;

            /* Clip buffer level to maximum buffer size for the layer */
            if (lc->bits_off_target > lc->maximum_buffer_size)
                lc->bits_off_target = lc->maximum_buffer_size;

            lc->total_actual_bits += cpi->projected_frame_size;
            lc->total_target_vs_actual += bits_off_for_this_layer;
            lc->buffer_level = lc->bits_off_target;
        }
    }

    /* Update bits left to the kf and gf groups to account for overshoot
     * or undershoot on these frames
     */
    if (cm->frame_type == KEY_FRAME)
    {
        cpi->twopass.kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;

        if (cpi->twopass.kf_group_bits < 0)
            cpi->twopass.kf_group_bits = 0 ;
    }
    else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
    {
        cpi->twopass.gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;

        if (cpi->twopass.gf_group_bits < 0)
            cpi->twopass.gf_group_bits = 0 ;
    }

    if (cm->frame_type != KEY_FRAME)
    {
        if (cpi->common.refresh_alt_ref_frame)
        {
            cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
            cpi->last_skip_probs_q[2] = cm->base_qindex;
        }
        else if (cpi->common.refresh_golden_frame)
        {
            cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
            cpi->last_skip_probs_q[1] = cm->base_qindex;
        }
        else
        {
            cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
            cpi->last_skip_probs_q[0] = cm->base_qindex;

            /* update the baseline */
            cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;

        }
    }

#if 0 && CONFIG_INTERNAL_STATS
    {
        FILE *f = fopen("tmp.stt", "a");

        vp8_clear_system_state();

        if (cpi->twopass.total_left_stats.coded_error != 0.0)
            fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
                       "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
                       "%8.2lf %"PRId64" %10.3lf %10"PRId64" %8d\n",
                       cpi->common.current_video_frame, cpi->this_frame_target,
                       cpi->projected_frame_size,
                       (cpi->projected_frame_size - cpi->this_frame_target),
                       cpi->total_target_vs_actual,
                       cpi->buffer_level,
                       (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
                       cpi->total_actual_bits, cm->base_qindex,
                       cpi->active_best_quality, cpi->active_worst_quality,
                       cpi->ni_av_qi, cpi->cq_target_quality,
                       cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
                       cm->frame_type, cpi->gfu_boost,
                       cpi->twopass.est_max_qcorrection_factor,
                       cpi->twopass.bits_left,
                       cpi->twopass.total_left_stats.coded_error,
                       (double)cpi->twopass.bits_left /
                           cpi->twopass.total_left_stats.coded_error,
                       cpi->tot_recode_hits);
        else
            fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
                       "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
                       "%8.2lf %"PRId64" %10.3lf %8d\n",
                       cpi->common.current_video_frame, cpi->this_frame_target,
                       cpi->projected_frame_size,
                       (cpi->projected_frame_size - cpi->this_frame_target),
                       cpi->total_target_vs_actual,
                       cpi->buffer_level,
                       (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
                       cpi->total_actual_bits, cm->base_qindex,
                       cpi->active_best_quality, cpi->active_worst_quality,
                       cpi->ni_av_qi, cpi->cq_target_quality,
                       cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
                       cm->frame_type, cpi->gfu_boost,
                       cpi->twopass.est_max_qcorrection_factor,
                       cpi->twopass.bits_left,
                       cpi->twopass.total_left_stats.coded_error,
                       cpi->tot_recode_hits);

        fclose(f);

        {
            FILE *fmodes = fopen("Modes.stt", "a");

            fprintf(fmodes, "%6d:%1d:%1d:%1d ",
                        cpi->common.current_video_frame,
                        cm->frame_type, cm->refresh_golden_frame,
                        cm->refresh_alt_ref_frame);

            fprintf(fmodes, "\n");

            fclose(fmodes);
        }
    }

#endif

    if (cm->refresh_golden_frame == 1)
        cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
    else
        cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;

    if (cm->refresh_alt_ref_frame == 1)
        cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
    else
        cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;


    if (cm->refresh_last_frame & cm->refresh_golden_frame)
        /* both refreshed */
        cpi->gold_is_last = 1;
    else if (cm->refresh_last_frame ^ cm->refresh_golden_frame)
        /* 1 refreshed but not the other */
        cpi->gold_is_last = 0;

    if (cm->refresh_last_frame & cm->refresh_alt_ref_frame)
        /* both refreshed */
        cpi->alt_is_last = 1;
    else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame)
        /* 1 refreshed but not the other */
        cpi->alt_is_last = 0;

    if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame)
        /* both refreshed */
        cpi->gold_is_alt = 1;
    else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame)
        /* 1 refreshed but not the other */
        cpi->gold_is_alt = 0;

    cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;

    if (cpi->gold_is_last)
        cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;

    if (cpi->alt_is_last)
        cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;

    if (cpi->gold_is_alt)
        cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;


    if (!cpi->oxcf.error_resilient_mode)
    {
        if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
            /* Update the alternate reference frame stats as appropriate. */
            update_alt_ref_frame_stats(cpi);
        else
            /* Update the Golden frame stats as appropriate. */
            update_golden_frame_stats(cpi);
    }

    if (cm->frame_type == KEY_FRAME)
    {
        /* Tell the caller that the frame was coded as a key frame */
        *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;

        /* As this frame is a key frame  the next defaults to an inter frame. */
        cm->frame_type = INTER_FRAME;

        cpi->last_frame_percent_intra = 100;
    }
    else
    {
        *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;

        cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
    }

    /* Clear the one shot update flags for segmentation map and mode/ref
     * loop filter deltas.
     */
    cpi->mb.e_mbd.update_mb_segmentation_map = 0;
    cpi->mb.e_mbd.update_mb_segmentation_data = 0;
    cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;


    /* Dont increment frame counters if this was an altref buffer update
     * not a real frame
     */
    if (cm->show_frame)
    {
        cm->current_video_frame++;
        cpi->frames_since_key++;
        cpi->temporal_pattern_counter++;
    }

    /* reset to normal state now that we are done. */



#if 0
    {
        char filename[512];
        FILE *recon_file;
        sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
        recon_file = fopen(filename, "wb");
        fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
               cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
        fclose(recon_file);
    }
#endif

    /* DEBUG */
    /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */


}
#if !(CONFIG_REALTIME_ONLY)
static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned char * dest_end, unsigned int *frame_flags)
{

    if (!cpi->common.refresh_alt_ref_frame)
        vp8_second_pass(cpi);

    encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
    cpi->twopass.bits_left -= 8 * *size;

    if (!cpi->common.refresh_alt_ref_frame)
    {
        double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
            *cpi->oxcf.two_pass_vbrmin_section / 100);
        cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
    }
}
#endif

int vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time)
{
    struct vpx_usec_timer  timer;
    int                    res = 0;

    vpx_usec_timer_start(&timer);

    /* Reinit the lookahead buffer if the frame size changes */
    if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height)
    {
        assert(cpi->oxcf.lag_in_frames < 2);
        dealloc_raw_frame_buffers(cpi);
        alloc_raw_frame_buffers(cpi);
    }

    if(vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
                          frame_flags, cpi->active_map_enabled ? cpi->active_map : NULL))
        res = -1;
    vpx_usec_timer_mark(&timer);
    cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);

    return res;
}


static int frame_is_reference(const VP8_COMP *cpi)
{
    const VP8_COMMON *cm = &cpi->common;
    const MACROBLOCKD *xd = &cpi->mb.e_mbd;

    return cm->frame_type == KEY_FRAME || cm->refresh_last_frame
           || cm->refresh_golden_frame || cm->refresh_alt_ref_frame
           || cm->copy_buffer_to_gf || cm->copy_buffer_to_arf
           || cm->refresh_entropy_probs
           || xd->mode_ref_lf_delta_update
           || xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
}


int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, unsigned char *dest_end, int64_t *time_stamp, int64_t *time_end, int flush)
{
    VP8_COMMON *cm;
    struct vpx_usec_timer  tsctimer;
    struct vpx_usec_timer  ticktimer;
    struct vpx_usec_timer  cmptimer;
    YV12_BUFFER_CONFIG    *force_src_buffer = NULL;

    if (!cpi)
        return -1;

    cm = &cpi->common;

    if (setjmp(cpi->common.error.jmp))
    {
        cpi->common.error.setjmp = 0;
        vp8_clear_system_state();
        return VPX_CODEC_CORRUPT_FRAME;
    }

    cpi->common.error.setjmp = 1;

    vpx_usec_timer_start(&cmptimer);

    cpi->source = NULL;

#if !(CONFIG_REALTIME_ONLY)
    /* Should we code an alternate reference frame */
    if (cpi->oxcf.error_resilient_mode == 0 &&
        cpi->oxcf.play_alternate &&
        cpi->source_alt_ref_pending)
    {
        if ((cpi->source = vp8_lookahead_peek(cpi->lookahead,
                                              cpi->frames_till_gf_update_due,
                                              PEEK_FORWARD)))
        {
            cpi->alt_ref_source = cpi->source;
            if (cpi->oxcf.arnr_max_frames > 0)
            {
                vp8_temporal_filter_prepare_c(cpi,
                                              cpi->frames_till_gf_update_due);
                force_src_buffer = &cpi->alt_ref_buffer;
            }
            cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
            cm->refresh_alt_ref_frame = 1;
            cm->refresh_golden_frame = 0;
            cm->refresh_last_frame = 0;
            cm->show_frame = 0;
            /* Clear Pending alt Ref flag. */
            cpi->source_alt_ref_pending = 0;
            cpi->is_src_frame_alt_ref = 0;
        }
    }
#endif

    if (!cpi->source)
    {
        /* Read last frame source if we are encoding first pass. */
        if (cpi->pass == 1 && cm->current_video_frame > 0)
        {
            if((cpi->last_source = vp8_lookahead_peek(cpi->lookahead, 1,
                                                      PEEK_BACKWARD)) == NULL)
              return -1;
        }


        if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush)))
        {
            cm->show_frame = 1;

            cpi->is_src_frame_alt_ref = cpi->alt_ref_source
                                        && (cpi->source == cpi->alt_ref_source);

            if(cpi->is_src_frame_alt_ref)
                cpi->alt_ref_source = NULL;
        }
    }

    if (cpi->source)
    {
        cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
        cpi->un_scaled_source = cpi->Source;
        *time_stamp = cpi->source->ts_start;
        *time_end = cpi->source->ts_end;
        *frame_flags = cpi->source->flags;

        if (cpi->pass == 1 && cm->current_video_frame > 0)
        {
            cpi->last_frame_unscaled_source = &cpi->last_source->img;
        }
    }
    else
    {
        *size = 0;
#if !(CONFIG_REALTIME_ONLY)

        if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done)
        {
            vp8_end_first_pass(cpi);    /* get last stats packet */
            cpi->twopass.first_pass_done = 1;
        }

#endif

        return -1;
    }

    if (cpi->source->ts_start < cpi->first_time_stamp_ever)
    {
        cpi->first_time_stamp_ever = cpi->source->ts_start;
        cpi->last_end_time_stamp_seen = cpi->source->ts_start;
    }

    /* adjust frame rates based on timestamps given */
    if (cm->show_frame)
    {
        int64_t this_duration;
        int step = 0;

        if (cpi->source->ts_start == cpi->first_time_stamp_ever)
        {
            this_duration = cpi->source->ts_end - cpi->source->ts_start;
            step = 1;
        }
        else
        {
            int64_t last_duration;

            this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
            last_duration = cpi->last_end_time_stamp_seen
                            - cpi->last_time_stamp_seen;
            /* do a step update if the duration changes by 10% */
            if (last_duration)
                step = (int)(((this_duration - last_duration) *
                            10 / last_duration));
        }

        if (this_duration)
        {
            if (step)
                cpi->ref_framerate = 10000000.0 / this_duration;
            else
            {
                double avg_duration, interval;

                /* Average this frame's rate into the last second's average
                 * frame rate. If we haven't seen 1 second yet, then average
                 * over the whole interval seen.
                 */
                interval = (double)(cpi->source->ts_end -
                                    cpi->first_time_stamp_ever);
                if(interval > 10000000.0)
                    interval = 10000000;

                avg_duration = 10000000.0 / cpi->ref_framerate;
                avg_duration *= (interval - avg_duration + this_duration);
                avg_duration /= interval;

                cpi->ref_framerate = 10000000.0 / avg_duration;
            }

            if (cpi->oxcf.number_of_layers > 1)
            {
                unsigned int i;

                /* Update frame rates for each layer */
                assert(cpi->oxcf.number_of_layers <= VPX_TS_MAX_LAYERS);
                for (i=0; i<cpi->oxcf.number_of_layers; i++)
                {
                    LAYER_CONTEXT *lc = &cpi->layer_context[i];
                    lc->framerate = cpi->ref_framerate /
                                    cpi->oxcf.rate_decimator[i];
                }
            }
            else
                vp8_new_framerate(cpi, cpi->ref_framerate);
        }

        cpi->last_time_stamp_seen = cpi->source->ts_start;
        cpi->last_end_time_stamp_seen = cpi->source->ts_end;
    }

    if (cpi->oxcf.number_of_layers > 1)
    {
        int layer;

        update_layer_contexts (cpi);

        /* Restore layer specific context & set frame rate */
        layer = cpi->oxcf.layer_id[
                cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
        restore_layer_context (cpi, layer);
        vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
    }

    if (cpi->compressor_speed == 2)
    {
        vpx_usec_timer_start(&tsctimer);
        vpx_usec_timer_start(&ticktimer);
    }

    cpi->lf_zeromv_pct = (cpi->zeromv_count * 100)/cm->MBs;

#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
    {
        int i;
        const int num_part = (1 << cm->multi_token_partition);
        /* the available bytes in dest */
        const unsigned long dest_size = dest_end - dest;
        const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);

        unsigned char *dp = dest;

        cpi->partition_d[0] = dp;
        dp += dest_size/10;         /* reserve 1/10 for control partition */
        cpi->partition_d_end[0] = dp;

        for(i = 0; i < num_part; i++)
        {
            cpi->partition_d[i + 1] = dp;
            dp += tok_part_buff_size;
            cpi->partition_d_end[i + 1] = dp;
        }
    }
#endif

    /* start with a 0 size frame */
    *size = 0;

    /* Clear down mmx registers */
    vp8_clear_system_state();

    cm->frame_type = INTER_FRAME;
    cm->frame_flags = *frame_flags;

#if 0

    if (cm->refresh_alt_ref_frame)
    {
        cm->refresh_golden_frame = 0;
        cm->refresh_last_frame = 0;
    }
    else
    {
        cm->refresh_golden_frame = 0;
        cm->refresh_last_frame = 1;
    }

#endif
    /* find a free buffer for the new frame */
    {
        int i = 0;
        for(; i < NUM_YV12_BUFFERS; i++)
        {
            if(!cm->yv12_fb[i].flags)
            {
                cm->new_fb_idx = i;
                break;
            }
        }

        assert(i < NUM_YV12_BUFFERS );
    }
#if !(CONFIG_REALTIME_ONLY)

    if (cpi->pass == 1)
    {
        Pass1Encode(cpi, size, dest, frame_flags);
    }
    else if (cpi->pass == 2)
    {
        Pass2Encode(cpi, size, dest, dest_end, frame_flags);
    }
    else
#endif
        encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);

    if (cpi->compressor_speed == 2)
    {
        unsigned int duration, duration2;
        vpx_usec_timer_mark(&tsctimer);
        vpx_usec_timer_mark(&ticktimer);

        duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
        duration2 = (unsigned int)((double)duration / 2);

        if (cm->frame_type != KEY_FRAME)
        {
            if (cpi->avg_encode_time == 0)
                cpi->avg_encode_time = duration;
            else
                cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
        }

        if (duration2)
        {
            {

                if (cpi->avg_pick_mode_time == 0)
                    cpi->avg_pick_mode_time = duration2;
                else
                    cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
            }
        }

    }

    if (cm->refresh_entropy_probs == 0)
    {
        vpx_memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
    }

    /* Save the contexts separately for alt ref, gold and last. */
    /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
    if(cm->refresh_alt_ref_frame)
        vpx_memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));

    if(cm->refresh_golden_frame)
        vpx_memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));

    if(cm->refresh_last_frame)
        vpx_memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));

    /* if its a dropped frame honor the requests on subsequent frames */
    if (*size > 0)
    {
        cpi->droppable = !frame_is_reference(cpi);

        /* return to normal state */
        cm->refresh_entropy_probs = 1;
        cm->refresh_alt_ref_frame = 0;
        cm->refresh_golden_frame = 0;
        cm->refresh_last_frame = 1;
        cm->frame_type = INTER_FRAME;

    }

    /* Save layer specific state */
    if (cpi->oxcf.number_of_layers > 1)
        save_layer_context (cpi);

    vpx_usec_timer_mark(&cmptimer);
    cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);

    if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
    {
        generate_psnr_packet(cpi);
    }

#if CONFIG_INTERNAL_STATS

    if (cpi->pass != 1)
    {
        cpi->bytes += *size;

        if (cm->show_frame)
        {
            cpi->common.show_frame_mi = cpi->common.mi;
            cpi->count ++;

            if (cpi->b_calculate_psnr)
            {
                uint64_t ye,ue,ve;
                double frame_psnr;
                YV12_BUFFER_CONFIG      *orig = cpi->Source;
                YV12_BUFFER_CONFIG      *recon = cpi->common.frame_to_show;
                int y_samples = orig->y_height * orig->y_width ;
                int uv_samples = orig->uv_height * orig->uv_width ;
                int t_samples = y_samples + 2 * uv_samples;
                double sq_error;

                ye = calc_plane_error(orig->y_buffer, orig->y_stride,
                  recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height);

                ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
                  recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);

                ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
                  recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);

                sq_error = (double)(ye + ue + ve);

                frame_psnr = vpx_sse_to_psnr(t_samples, 255.0, sq_error);

                cpi->total_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
                cpi->total_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
                cpi->total_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
                cpi->total_sq_error += sq_error;
                cpi->total  += frame_psnr;
#if CONFIG_POSTPROC
                {
                    YV12_BUFFER_CONFIG      *pp = &cm->post_proc_buffer;
                    double sq_error2;
                    double frame_psnr2, frame_ssim2 = 0;
                    double weight = 0;

                    vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0);
                    vp8_clear_system_state();

                    ye = calc_plane_error(orig->y_buffer, orig->y_stride,
                      pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height);

                    ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
                      pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);

                    ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
                      pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);

                    sq_error2 = (double)(ye + ue + ve);

                    frame_psnr2 = vpx_sse_to_psnr(t_samples, 255.0, sq_error2);

                    cpi->totalp_y += vpx_sse_to_psnr(y_samples,
                                                     255.0, (double)ye);
                    cpi->totalp_u += vpx_sse_to_psnr(uv_samples,
                                                     255.0, (double)ue);
                    cpi->totalp_v += vpx_sse_to_psnr(uv_samples,
                                                     255.0, (double)ve);
                    cpi->total_sq_error2 += sq_error2;
                    cpi->totalp  += frame_psnr2;

                    frame_ssim2 = vp8_calc_ssim(cpi->Source,
                      &cm->post_proc_buffer, 1, &weight);

                    cpi->summed_quality += frame_ssim2 * weight;
                    cpi->summed_weights += weight;

                    if (cpi->oxcf.number_of_layers > 1)
                    {
                         unsigned int i;

                         for (i=cpi->current_layer;
                                       i<cpi->oxcf.number_of_layers; i++)
                         {
                             cpi->frames_in_layer[i]++;

                             cpi->bytes_in_layer[i] += *size;
                             cpi->sum_psnr[i]       += frame_psnr;
                             cpi->sum_psnr_p[i]     += frame_psnr2;
                             cpi->total_error2[i]   += sq_error;
                             cpi->total_error2_p[i] += sq_error2;
                             cpi->sum_ssim[i]       += frame_ssim2 * weight;
                             cpi->sum_weights[i]    += weight;
                         }
                    }
                }
#endif
            }

            if (cpi->b_calculate_ssimg)
            {
                double y, u, v, frame_all;
                frame_all =  vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
                    &y, &u, &v);

                if (cpi->oxcf.number_of_layers > 1)
                {
                    unsigned int i;

                    for (i=cpi->current_layer;
                         i<cpi->oxcf.number_of_layers; i++)
                    {
                        if (!cpi->b_calculate_psnr)
                            cpi->frames_in_layer[i]++;

                        cpi->total_ssimg_y_in_layer[i] += y;
                        cpi->total_ssimg_u_in_layer[i] += u;
                        cpi->total_ssimg_v_in_layer[i] += v;
                        cpi->total_ssimg_all_in_layer[i] += frame_all;
                    }
                }
                else
                {
                    cpi->total_ssimg_y += y;
                    cpi->total_ssimg_u += u;
                    cpi->total_ssimg_v += v;
                    cpi->total_ssimg_all += frame_all;
                }
            }

        }
    }

#if 0

    if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
    {
        skiptruecount += cpi->skip_true_count;
        skipfalsecount += cpi->skip_false_count;
    }

#endif
#if 0

    if (cpi->pass != 1)
    {
        FILE *f = fopen("skip.stt", "a");
        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);

        if (cpi->is_src_frame_alt_ref == 1)
            fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);

        fclose(f);
    }

#endif
#endif

    cpi->common.error.setjmp = 0;

    return 0;
}

int vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
{
    if (cpi->common.refresh_alt_ref_frame)
        return -1;
    else
    {
        int ret;

#if CONFIG_MULTITHREAD
        if(cpi->b_lpf_running)
        {
            sem_wait(&cpi->h_event_end_lpf);
            cpi->b_lpf_running = 0;
        }
#endif

#if CONFIG_POSTPROC
        cpi->common.show_frame_mi = cpi->common.mi;
        ret = vp8_post_proc_frame(&cpi->common, dest, flags);
#else

        if (cpi->common.frame_to_show)
        {
            *dest = *cpi->common.frame_to_show;
            dest->y_width = cpi->common.Width;
            dest->y_height = cpi->common.Height;
            dest->uv_height = cpi->common.Height / 2;
            ret = 0;
        }
        else
        {
            ret = -1;
        }

#endif
        vp8_clear_system_state();
        return ret;
    }
}

int vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4])
{
    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
    int internal_delta_q[MAX_MB_SEGMENTS];
    const int range = 63;
    int i;

    // This method is currently incompatible with the cyclic refresh method
    if ( cpi->cyclic_refresh_mode_enabled )
        return -1;

    // Check number of rows and columns match
    if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
        return -1;

    // Range check the delta Q values and convert the external Q range values
    // to internal ones.
    if ( (abs(delta_q[0]) > range) || (abs(delta_q[1]) > range) ||
         (abs(delta_q[2]) > range) || (abs(delta_q[3]) > range) )
        return -1;

    // Range check the delta lf values
    if ( (abs(delta_lf[0]) > range) || (abs(delta_lf[1]) > range) ||
         (abs(delta_lf[2]) > range) || (abs(delta_lf[3]) > range) )
        return -1;

    if (!map)
    {
        disable_segmentation(cpi);
        return 0;
    }

    // Translate the external delta q values to internal values.
    for ( i = 0; i < MAX_MB_SEGMENTS; i++ )
        internal_delta_q[i] =
            ( delta_q[i] >= 0 ) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];

    /* Set the segmentation Map */
    set_segmentation_map(cpi, map);

    /* Activate segmentation. */
    enable_segmentation(cpi);

    /* Set up the quant segment data */
    feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
    feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
    feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
    feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];

    /* Set up the loop segment data s */
    feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
    feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
    feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
    feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];

    cpi->segment_encode_breakout[0] = threshold[0];
    cpi->segment_encode_breakout[1] = threshold[1];
    cpi->segment_encode_breakout[2] = threshold[2];
    cpi->segment_encode_breakout[3] = threshold[3];

    /* Initialise the feature data structure */
    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);

    return 0;
}

int vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols)
{
    if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols)
    {
        if (map)
        {
            vpx_memcpy(cpi->active_map, map, rows * cols);
            cpi->active_map_enabled = 1;
        }
        else
            cpi->active_map_enabled = 0;

        return 0;
    }
    else
    {
        return -1 ;
    }
}

int vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
{
    if (horiz_mode <= ONETWO)
        cpi->common.horiz_scale = horiz_mode;
    else
        return -1;

    if (vert_mode <= ONETWO)
        cpi->common.vert_scale  = vert_mode;
    else
        return -1;

    return 0;
}



int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest)
{
    int i, j;
    int Total = 0;

    unsigned char *src = source->y_buffer;
    unsigned char *dst = dest->y_buffer;

    /* Loop through the Y plane raw and reconstruction data summing
     * (square differences)
     */
    for (i = 0; i < source->y_height; i += 16)
    {
        for (j = 0; j < source->y_width; j += 16)
        {
            unsigned int sse;
            Total += vp8_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
        }

        src += 16 * source->y_stride;
        dst += 16 * dest->y_stride;
    }

    return Total;
}


int vp8_get_quantizer(VP8_COMP *cpi)
{
    return cpi->common.base_qindex;
}
