onyx_if.c 175 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5 6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9 10 11
 */


12
#include "vpx_config.h"
13
#include "./vpx_scale_rtcd.h"
John Koleszar's avatar
John Koleszar committed
14
#include "vp8/common/onyxc_int.h"
15
#include "vp8/common/blockd.h"
John Koleszar's avatar
John Koleszar committed
16
#include "onyx_int.h"
John Koleszar's avatar
John Koleszar committed
17
#include "vp8/common/systemdependent.h"
John Koleszar's avatar
John Koleszar committed
18
#include "quantize.h"
John Koleszar's avatar
John Koleszar committed
19
#include "vp8/common/alloccommon.h"
John Koleszar's avatar
John Koleszar committed
20 21 22
#include "mcomp.h"
#include "firstpass.h"
#include "psnr.h"
Johann's avatar
Johann committed
23
#include "vpx_scale/vpx_scale.h"
John Koleszar's avatar
John Koleszar committed
24
#include "vp8/common/extend.h"
John Koleszar's avatar
John Koleszar committed
25
#include "ratectrl.h"
John Koleszar's avatar
John Koleszar committed
26
#include "vp8/common/quant_common.h"
27
#include "segmentation.h"
28
#if CONFIG_POSTPROC
John Koleszar's avatar
John Koleszar committed
29
#include "vp8/common/postproc.h"
30
#endif
John Koleszar's avatar
John Koleszar committed
31
#include "vpx_mem/vpx_mem.h"
John Koleszar's avatar
John Koleszar committed
32 33
#include "vp8/common/swapyv12buffer.h"
#include "vp8/common/threading.h"
John Koleszar's avatar
John Koleszar committed
34
#include "vpx_ports/vpx_timer.h"
35 36 37
#if ARCH_ARM
#include "vpx_ports/arm.h"
#endif
Yunqing Wang's avatar
Yunqing Wang committed
38 39 40
#if CONFIG_MULTI_RES_ENCODING
#include "mr_dissim.h"
#endif
41
#include "encodeframe.h"
42

John Koleszar's avatar
John Koleszar committed
43 44 45 46
#include <math.h>
#include <stdio.h>
#include <limits.h>

47 48 49 50 51
#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

John Koleszar's avatar
John Koleszar committed
52 53 54 55 56 57 58 59
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();
60
extern int vp8cx_create_encoder_threads(VP8_COMP *cpi);
John Koleszar's avatar
John Koleszar committed
61 62 63
extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);

int vp8_estimate_entropy_savings(VP8_COMP *cpi);
64

John Koleszar's avatar
John Koleszar committed
65
int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
John Koleszar's avatar
John Koleszar committed
66

John Koleszar's avatar
John Koleszar committed
67
extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
John Koleszar's avatar
John Koleszar committed
68

69
static void set_default_lf_deltas(VP8_COMP *cpi);
John Koleszar's avatar
John Koleszar committed
70 71 72

extern const int vp8_gf_interval_table[101];

73
#if CONFIG_INTERNAL_STATS
John Koleszar's avatar
John Koleszar committed
74 75 76 77 78 79 80
#include "math.h"

extern double vp8_calc_ssim
(
    YV12_BUFFER_CONFIG *source,
    YV12_BUFFER_CONFIG *dest,
    int lumamask,
John Koleszar's avatar
John Koleszar committed
81
    double *weight
John Koleszar's avatar
John Koleszar committed
82 83
);

84

John Koleszar's avatar
John Koleszar committed
85 86 87 88 89 90
extern double vp8_calc_ssimg
(
    YV12_BUFFER_CONFIG *source,
    YV12_BUFFER_CONFIG *dest,
    double *ssim_y,
    double *ssim_u,
John Koleszar's avatar
John Koleszar committed
91
    double *ssim_v
John Koleszar's avatar
John Koleszar committed
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
);


#endif


#ifdef OUTPUT_YUV_SRC
FILE *yuv_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 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];

John Koleszar's avatar
John Koleszar committed
144
/* Tables relating active max Q to active min Q */
145
static const unsigned char kf_low_motion_minq[QINDEX_RANGE] =
146
{
Paul Wilkins's avatar
CQ Mode  
Paul Wilkins committed
147 148 149 150 151 152 153 154
    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
155
};
156
static const unsigned char kf_high_motion_minq[QINDEX_RANGE] =
157
{
Paul Wilkins's avatar
CQ Mode  
Paul Wilkins committed
158 159 160 161 162 163 164 165
    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
166
};
167
static const unsigned char gf_low_motion_minq[QINDEX_RANGE] =
168 169 170 171 172 173 174 175 176 177
{
    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
};
178
static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] =
179 180 181 182 183 184 185 186
{
    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,
Paul Wilkins's avatar
CQ Mode  
Paul Wilkins committed
187
    49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
188
};
189
static const unsigned char gf_high_motion_minq[QINDEX_RANGE] =
190 191 192 193 194 195 196 197
{
    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,
Paul Wilkins's avatar
CQ Mode  
Paul Wilkins committed
198
    55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
199
};
200
static const unsigned char inter_minq[QINDEX_RANGE] =
201
{
Paul Wilkins's avatar
Paul Wilkins committed
202 203 204 205 206 207 208 209
    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
210
};
John Koleszar's avatar
John Koleszar committed
211 212 213 214 215

#ifdef PACKET_TESTING
extern FILE *vpxlogc;
#endif

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

John Koleszar's avatar
John Koleszar committed
220
    /* Save layer dependent coding state */
221 222 223 224
    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;
225 226 227
    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;
228 229 230 231 232 233 234 235 236 237 238 239 240 241
    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;
242
    lc->zbin_over_quant                  = cpi->mb.zbin_over_quant;
243 244 245 246 247 248 249
    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,
250 251
            cpi->mb.count_mb_ref_frame_usage,
            sizeof(cpi->mb.count_mb_ref_frame_usage));
252 253 254 255 256 257
}

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

John Koleszar's avatar
John Koleszar committed
258
    /* Restore layer dependent coding state */
259 260 261 262 263 264
    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;
265 266 267
    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;
268 269 270 271 272 273 274 275 276 277 278 279
    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;
280
    cpi->mb.zbin_over_quant                  = lc->zbin_over_quant;
281 282 283 284 285 286
    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;

287
    memcpy (cpi->mb.count_mb_ref_frame_usage,
288
            lc->count_mb_ref_frame_usage,
289
            sizeof(cpi->mb.count_mb_ref_frame_usage));
290 291
}

John Koleszar's avatar
John Koleszar committed
292 293
static void setup_features(VP8_COMP *cpi)
{
294 295 296 297 298 299 300 301 302 303 304
    // 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;
    }
John Koleszar's avatar
John Koleszar committed
305 306 307 308 309

    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));
310 311
    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));
John Koleszar's avatar
John Koleszar committed
312

313
    set_default_lf_deltas(cpi);
John Koleszar's avatar
John Koleszar committed
314 315 316 317

}


318 319 320
static void dealloc_raw_frame_buffers(VP8_COMP *cpi);


321
static void dealloc_compressor_data(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
322
{
323
    vpx_free(cpi->tplist);
324 325
    cpi->tplist = NULL;

John Koleszar's avatar
John Koleszar committed
326
    /* Delete last frame MV storage buffers */
327
    vpx_free(cpi->lfmv);
328 329
    cpi->lfmv = 0;

330
    vpx_free(cpi->lf_ref_frame_sign_bias);
331 332
    cpi->lf_ref_frame_sign_bias = 0;

333
    vpx_free(cpi->lf_ref_frame);
334
    cpi->lf_ref_frame = 0;
John Koleszar's avatar
John Koleszar committed
335

John Koleszar's avatar
John Koleszar committed
336
    /* Delete sementation map */
337
    vpx_free(cpi->segmentation_map);
John Koleszar's avatar
John Koleszar committed
338 339
    cpi->segmentation_map = 0;

340
    vpx_free(cpi->active_map);
John Koleszar's avatar
John Koleszar committed
341 342 343 344
    cpi->active_map = 0;

    vp8_de_alloc_frame_buffers(&cpi->common);

345
    vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
John Koleszar's avatar
John Koleszar committed
346
    vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
347
    dealloc_raw_frame_buffers(cpi);
John Koleszar's avatar
John Koleszar committed
348 349 350 351

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

John Koleszar's avatar
John Koleszar committed
352
    /* Structure used to monitor GF usage */
353
    vpx_free(cpi->gf_active_flags);
354 355
    cpi->gf_active_flags = 0;

John Koleszar's avatar
John Koleszar committed
356
    /* Activity mask based per mb zbin adjustments */
357 358 359
    vpx_free(cpi->mb_activity_map);
    cpi->mb_activity_map = 0;

360
    vpx_free(cpi->mb.pip);
361
    cpi->mb.pip = 0;
362 363 364 365 366

#if CONFIG_MULTITHREAD
    vpx_free(cpi->mt_current_mb_col);
    cpi->mt_current_mb_col = NULL;
#endif
John Koleszar's avatar
John Koleszar committed
367 368
}

John Koleszar's avatar
John Koleszar committed
369
static void enable_segmentation(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
370
{
John Koleszar's avatar
John Koleszar committed
371
    /* Set the appropriate feature bit */
John Koleszar's avatar
John Koleszar committed
372 373 374 375
    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;
}
John Koleszar's avatar
John Koleszar committed
376
static void disable_segmentation(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
377
{
John Koleszar's avatar
John Koleszar committed
378
    /* Clear the appropriate feature bit */
John Koleszar's avatar
John Koleszar committed
379 380 381
    cpi->mb.e_mbd.segmentation_enabled = 0;
}

John Koleszar's avatar
John Koleszar committed
382 383 384
/* Valid values for a segment are 0 to 3
 * Segmentation map is arrange as [Rows][Columns]
 */
John Koleszar's avatar
John Koleszar committed
385
static void set_segmentation_map(VP8_COMP *cpi, unsigned char *segmentation_map)
John Koleszar's avatar
John Koleszar committed
386
{
John Koleszar's avatar
John Koleszar committed
387
    /* Copy in the new segmentation map */
John Koleszar's avatar
John Koleszar committed
388 389
    vpx_memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));

John Koleszar's avatar
John Koleszar committed
390
    /* Signal that the map should be updated. */
John Koleszar's avatar
John Koleszar committed
391 392 393 394
    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
}

John Koleszar's avatar
John Koleszar committed
395 396 397 398 399 400 401 402 403 404 405 406
/* 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).
 *
 */
John Koleszar's avatar
John Koleszar committed
407
static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned char abs_delta)
John Koleszar's avatar
John Koleszar committed
408 409 410 411 412 413
{
    cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
    vpx_memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
}


John Koleszar's avatar
John Koleszar committed
414
static void segmentation_test_function(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
415 416 417 418
{
    unsigned char *seg_map;
    signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];

419
    // Create a temporary map for segmentation data.
John Koleszar's avatar
John Koleszar committed
420 421
    CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));

422
    // Set the segmentation Map
John Koleszar's avatar
John Koleszar committed
423
    set_segmentation_map(cpi, seg_map);
John Koleszar's avatar
John Koleszar committed
424

425
    // Activate segmentation.
John Koleszar's avatar
John Koleszar committed
426
    enable_segmentation(cpi);
John Koleszar's avatar
John Koleszar committed
427

428
    // Set up the quant segment data
John Koleszar's avatar
John Koleszar committed
429 430 431 432
    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;
433
    // Set up the loop segment data
John Koleszar's avatar
John Koleszar committed
434 435 436 437 438
    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;

439 440
    // Initialise the feature data structure
    // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1
John Koleszar's avatar
John Koleszar committed
441
    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
John Koleszar's avatar
John Koleszar committed
442

443
    // Delete sementation map
John Koleszar's avatar
John Koleszar committed
444
    vpx_free(seg_map);
John Koleszar's avatar
John Koleszar committed
445 446 447 448

    seg_map = 0;
}

John Koleszar's avatar
John Koleszar committed
449
/* A simple function to cyclically refresh the background at a lower Q */
John Koleszar's avatar
John Koleszar committed
450 451
static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
{
Marco Paniconi's avatar
Marco Paniconi committed
452
    unsigned char *seg_map = cpi->segmentation_map;
John Koleszar's avatar
John Koleszar committed
453 454 455 456 457
    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;

Marco Paniconi's avatar
Marco Paniconi committed
458
    cpi->cyclic_refresh_q = Q / 2;
John Koleszar's avatar
John Koleszar committed
459

Marco Paniconi's avatar
Marco Paniconi committed
460 461 462 463
    // 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);

John Koleszar's avatar
John Koleszar committed
464 465
    if (cpi->common.frame_type != KEY_FRAME)
    {
John Koleszar's avatar
John Koleszar committed
466 467
        /* Cycle through the macro_block rows */
        /* MB loop to set local segmentation map */
Marco Paniconi's avatar
Marco Paniconi committed
468
        i = cpi->cyclic_refresh_mode_index;
469
        assert(i < mbs_in_frame);
Marco Paniconi's avatar
Marco Paniconi committed
470
        do
John Koleszar's avatar
John Koleszar committed
471
        {
Marco Paniconi's avatar
Marco Paniconi committed
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
          /* 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;
John Koleszar's avatar
John Koleszar committed
489 490

        }
Marco Paniconi's avatar
Marco Paniconi committed
491
        while(block_count && i != cpi->cyclic_refresh_mode_index);
John Koleszar's avatar
John Koleszar committed
492 493 494 495

        cpi->cyclic_refresh_mode_index = i;
    }

John Koleszar's avatar
John Koleszar committed
496
    /* Activate segmentation. */
Marco Paniconi's avatar
Marco Paniconi committed
497 498
    cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    cpi->mb.e_mbd.update_mb_segmentation_data = 1;
John Koleszar's avatar
John Koleszar committed
499
    enable_segmentation(cpi);
John Koleszar's avatar
John Koleszar committed
500

John Koleszar's avatar
John Koleszar committed
501
    /* Set up the quant segment data */
John Koleszar's avatar
John Koleszar committed
502 503 504 505 506
    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;

John Koleszar's avatar
John Koleszar committed
507
    /* Set up the loop segment data */
John Koleszar's avatar
John Koleszar committed
508 509 510 511 512
    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;

John Koleszar's avatar
John Koleszar committed
513
    /* Initialise the feature data structure */
John Koleszar's avatar
John Koleszar committed
514
    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
John Koleszar's avatar
John Koleszar committed
515 516 517

}

518
static void set_default_lf_deltas(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
519 520 521 522 523 524 525
{
    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));

John Koleszar's avatar
John Koleszar committed
526
    /* Test of ref frame deltas */
John Koleszar's avatar
John Koleszar committed
527 528 529 530 531
    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;

John Koleszar's avatar
John Koleszar committed
532
    cpi->mb.e_mbd.mode_lf_deltas[0] = 4;               /* BPRED */
533 534 535 536 537 538

    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 */

John Koleszar's avatar
John Koleszar committed
539 540
    cpi->mb.e_mbd.mode_lf_deltas[2] = 2;               /* New mv */
    cpi->mb.e_mbd.mode_lf_deltas[3] = 4;               /* Split mv */
John Koleszar's avatar
John Koleszar committed
541 542
}

543 544 545 546 547 548
/* Convenience macros for mapping speed and mode into a continuous
 * range
 */
#define GOOD(x) (x+1)
#define RT(x) (x+7)

549
static int speed_map(int speed, const int *map)
550 551 552 553 554 555 556 557 558 559
{
    int res;

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

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

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

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

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

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

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

589
static const int thresh_mult_map_split1[] = {
590 591 592 593
    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
};

594
static const int thresh_mult_map_split2[] = {
595 596 597 598
    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
};

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

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

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

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

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

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

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

John Koleszar's avatar
John Koleszar committed
630 631 632 633 634 635 636
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;
637
    int last_improved_quant = sf->improved_quant;
638
    int ref_frames;
John Koleszar's avatar
John Koleszar committed
639

John Koleszar's avatar
John Koleszar committed
640
    /* Initialise default mode frequency sampling variables */
John Koleszar's avatar
John Koleszar committed
641 642 643 644 645 646
    for (i = 0; i < MAX_MODES; i ++)
    {
        cpi->mode_check_freq[i] = 0;
        cpi->mode_chosen_counts[i] = 0;
    }

647
    cpi->mb.mbs_tested_so_far = 0;
John Koleszar's avatar
John Koleszar committed
648

John Koleszar's avatar
John Koleszar committed
649
    /* best quality defaults */
John Koleszar's avatar
John Koleszar committed
650 651 652 653 654 655 656 657 658 659
    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;
660
    sf->use_fastquant_for_pick = 0;
661
    sf->no_skip_block4x4_search = 1;
John Koleszar's avatar
John Koleszar committed
662 663 664

    sf->first_step = 0;
    sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
665
    sf->improved_mv_pred = 1;
John Koleszar's avatar
John Koleszar committed
666

John Koleszar's avatar
John Koleszar committed
667
    /* default thresholds to 0 */
John Koleszar's avatar
John Koleszar committed
668 669 670
    for (i = 0; i < MAX_MODES; i++)
        sf->thresh_mult[i] = 0;

671 672
    /* Count enabled references */
    ref_frames = 1;
Johann's avatar
Johann committed
673
    if (cpi->ref_frame_flags & VP8_LAST_FRAME)
674
        ref_frames++;
Johann's avatar
Johann committed
675
    if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
676
        ref_frames++;
Johann's avatar
Johann committed
677
    if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
678 679
        ref_frames++;

680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
    /* 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);

715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
    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);
745
    Speed = cpi->Speed;
John Koleszar's avatar
John Koleszar committed
746 747 748
    switch (Mode)
    {
#if !(CONFIG_REALTIME_ONLY)
John Koleszar's avatar
John Koleszar committed
749
    case 0: /* best quality mode */
John Koleszar's avatar
John Koleszar committed
750 751 752 753 754
        sf->first_step = 0;
        sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
        break;
    case 1:
    case 3:
755
        if (Speed > 0)
John Koleszar's avatar
John Koleszar committed
756
        {
757 758 759 760
            /* Disable coefficient optimization above speed 0 */
            sf->optimize_coefficients = 0;
            sf->use_fastquant_for_pick = 1;
            sf->no_skip_block4x4_search = 0;
761

762
            sf->first_step = 1;
John Koleszar's avatar
John Koleszar committed
763 764
        }

765
        if (Speed > 2)
John Koleszar's avatar
John Koleszar committed
766
        {
767 768 769
            sf->improved_quant = 0;
            sf->improved_dct = 0;

John Koleszar's avatar
John Koleszar committed
770 771 772
            /* Only do recode loop on key frames, golden frames and
             * alt ref frames
             */
John Koleszar's avatar
John Koleszar committed
773 774 775 776
            sf->recode_loop = 2;

        }

777
        if (Speed > 3)
John Koleszar's avatar
John Koleszar committed
778 779
        {
            sf->auto_filter = 1;
John Koleszar's avatar
John Koleszar committed
780 781
            sf->recode_loop = 0; /* recode loop off */
            sf->RD = 0;         /* Turn rd off */
782

John Koleszar's avatar
John Koleszar committed
783 784 785 786
        }

        if (Speed > 4)
        {
John Koleszar's avatar
John Koleszar committed
787
            sf->auto_filter = 0;  /* Faster selection of loop filter */
John Koleszar's avatar
John Koleszar committed
788 789 790 791 792 793 794 795 796 797 798 799 800 801 802
        }

        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;
803 804 805 806

            sf->use_fastquant_for_pick = 1;
            sf->no_skip_block4x4_search = 0;
            sf->first_step = 1;
John Koleszar's avatar
John Koleszar committed
807 808 809
        }

        if (Speed > 2)
John Koleszar's avatar
John Koleszar committed
810
            sf->auto_filter = 0;  /* Faster selection of loop filter */
John Koleszar's avatar
John Koleszar committed
811 812 813 814 815 816 817 818 819

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

        if (Speed > 4)
        {
John Koleszar's avatar
John Koleszar committed
820
            sf->auto_filter = 0;  /* Faster selection of loop filter */
John Koleszar's avatar
John Koleszar committed
821
            sf->search_method = HEX;
822
            sf->iterative_sub_pixel = 0;
John Koleszar's avatar
John Koleszar committed
823 824 825 826
        }

        if (Speed > 6)
        {
827
            unsigned int sum = 0;
John Koleszar's avatar
John Koleszar committed
828
            unsigned int total_mbs = cm->MBs;
829 830
            int i, thresh;
            unsigned int total_skip;
John Koleszar's avatar
John Koleszar committed
831 832 833 834 835 836 837 838 839 840

            int min = 2000;

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

            min >>= 7;

            for (i = 0; i < min; i++)
            {
841
                sum += cpi->mb.error_bins[i];
John Koleszar's avatar
John Koleszar committed
842 843 844 845 846
            }

            total_skip = sum;
            sum = 0;

John Koleszar's avatar
John Koleszar committed
847
            /* i starts from 2 to make sure thresh started from 2048 */
John Koleszar's avatar
John Koleszar committed
848 849
            for (; i < 1024; i++)
            {
850
                sum += cpi->mb.error_bins[i];
John Koleszar's avatar
John Koleszar committed
851 852 853 854 855 856 857 858 859 860 861

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

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

            if (thresh < 2000)
                thresh = 2000;

862
            if (ref_frames > 1)
John Koleszar's avatar
John Koleszar committed
863
            {
864 865 866
                sf->thresh_mult[THR_NEW1 ] = thresh;
                sf->thresh_mult[THR_NEAREST1  ] = thresh >> 1;
                sf->thresh_mult[THR_NEAR1     ] = thresh >> 1;
John Koleszar's avatar
John Koleszar committed
867 868
            }

869
            if (ref_frames > 2)
John Koleszar's avatar
John Koleszar committed
870
            {
871 872 873
                sf->thresh_mult[THR_NEW2] = thresh << 1;
                sf->thresh_mult[THR_NEAREST2 ] = thresh;
                sf->thresh_mult[THR_NEAR2    ] = thresh;
John Koleszar's avatar
John Koleszar committed
874 875
            }

876
            if (ref_frames > 3)
John Koleszar's avatar
John Koleszar committed
877
            {
878 879 880
                sf->thresh_mult[THR_NEW3] = thresh << 1;
                sf->thresh_mult[THR_NEAREST3 ] = thresh;
                sf->thresh_mult[THR_NEAR3    ] = thresh;
John Koleszar's avatar
John Koleszar committed
881 882
            }

883
            sf->improved_mv_pred = 0;
John Koleszar's avatar
John Koleszar committed
884 885 886 887 888
        }

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

889 890 891
        if(cm->version == 0)
        {
            cm->filter_type = NORMAL_LOOPFILTER;
John Koleszar's avatar
John Koleszar committed
892

893 894 895 896 897
            if (Speed >= 14)
                cm->filter_type = SIMPLE_LOOPFILTER;
        }
        else
        {
John Koleszar's avatar
John Koleszar committed
898
            cm->filter_type = SIMPLE_LOOPFILTER;
899
        }
John Koleszar's avatar
John Koleszar committed
900

John Koleszar's avatar
John Koleszar committed
901
        /* This has a big hit on quality. Last resort */
John Koleszar's avatar
John Koleszar committed
902
        if (Speed >= 15)
903
            sf->half_pixel_search = 0;
John Koleszar's avatar
John Koleszar committed
904

905
        vpx_memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
John Koleszar's avatar
John Koleszar committed
906

907 908
    }; /* switch */

John Koleszar's avatar
John Koleszar committed
909 910 911
    /* Slow quant, dct and trellis not worthwhile for first pass
     * so make sure they are always turned off.
     */
912 913 914 915 916 917 918
    if ( cpi->pass == 1 )
    {
        sf->improved_quant = 0;
        sf->optimize_coefficients = 0;
        sf->improved_dct = 0;
    }

John Koleszar's avatar
John Koleszar committed
919 920
    if (cpi->sf.search_method == NSTEP)
    {
921
        vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
John Koleszar's avatar
John Koleszar committed
922 923 924
    }
    else if (cpi->sf.search_method == DIAMOND)
    {
925
        vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
John Koleszar's avatar
John Koleszar committed
926 927 928 929
    }

    if (cpi->sf.improved_dct)
    {
John Koleszar's avatar
John Koleszar committed
930 931
        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
John Koleszar's avatar
John Koleszar committed
932 933 934
    }
    else
    {
John Koleszar's avatar
John Koleszar committed
935 936 937
        /* No fast FDCT defined for any platform at this time. */
        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
John Koleszar's avatar
John Koleszar committed
938 939
    }

John Koleszar's avatar
John Koleszar committed
940
    cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
John Koleszar's avatar
John Koleszar committed
941 942 943

    if (cpi->sf.improved_quant)
    {
John Koleszar's avatar
John Koleszar committed
944 945
        cpi->mb.quantize_b      = vp8_regular_quantize_b;
        cpi->mb.quantize_b_pair = vp8_regular_quantize_b_pair;
John Koleszar's avatar
John Koleszar committed
946 947 948
    }
    else
    {
John Koleszar's avatar
John Koleszar committed
949 950
        cpi->mb.quantize_b      = vp8_fast_quantize_b;
        cpi->mb.quantize_b_pair = vp8_fast_quantize_b_pair;
John Koleszar's avatar
John Koleszar committed
951
    }
952 953
    if (cpi->sf.improved_quant != last_improved_quant)
        vp8cx_init_quantizer(cpi);
John Koleszar's avatar
John Koleszar committed
954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971

    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;
    }

972
    if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
Yaowu Xu's avatar
Yaowu Xu committed
973
        cpi->mb.optimize = 1;
John Koleszar's avatar
John Koleszar committed
974 975 976 977 978 979 980 981 982 983
    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
}