onyx_if.c 174 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"
John Koleszar's avatar
John Koleszar committed
13
#include "vp8/common/onyxc_int.h"
John Koleszar's avatar
John Koleszar committed
14
#include "onyx_int.h"
John Koleszar's avatar
John Koleszar committed
15
#include "vp8/common/systemdependent.h"
John Koleszar's avatar
John Koleszar committed
16
#include "quantize.h"
John Koleszar's avatar
John Koleszar committed
17
#include "vp8/common/alloccommon.h"
John Koleszar's avatar
John Koleszar committed
18
19
20
21
#include "mcomp.h"
#include "firstpass.h"
#include "psnr.h"
#include "vpx_scale/vpxscale.h"
John Koleszar's avatar
John Koleszar committed
22
#include "vp8/common/extend.h"
John Koleszar's avatar
John Koleszar committed
23
#include "ratectrl.h"
John Koleszar's avatar
John Koleszar committed
24
#include "vp8/common/quant_common.h"
25
#include "segmentation.h"
26
#if CONFIG_POSTPROC
John Koleszar's avatar
John Koleszar committed
27
#include "vp8/common/postproc.h"
28
#endif
John Koleszar's avatar
John Koleszar committed
29
#include "vpx_mem/vpx_mem.h"
John Koleszar's avatar
John Koleszar committed
30
31
#include "vp8/common/swapyv12buffer.h"
#include "vp8/common/threading.h"
John Koleszar's avatar
John Koleszar committed
32
#include "vpx_ports/vpx_timer.h"
33
34
35
#if ARCH_ARM
#include "vpx_ports/arm.h"
#endif
Yunqing Wang's avatar
Yunqing Wang committed
36
37
38
#if CONFIG_MULTI_RES_ENCODING
#include "mr_dissim.h"
#endif
39
#include "encodeframe.h"
40

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

45
46
47
48
49
#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
50
51
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();
extern void vp8cx_create_encoder_threads(VP8_COMP *cpi);
extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
60
#if HAVE_NEON
John Koleszar's avatar
John Koleszar committed
61
62
63
64
65
extern void vp8_yv12_copy_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
extern void vp8_yv12_copy_src_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
#endif

int vp8_estimate_entropy_savings(VP8_COMP *cpi);
66

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

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

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

extern const int vp8_gf_interval_table[101];

75
#if CONFIG_INTERNAL_STATS
John Koleszar's avatar
John Koleszar committed
76
77
78
79
80
81
82
#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
83
    double *weight
John Koleszar's avatar
John Koleszar committed
84
85
);

86

John Koleszar's avatar
John Koleszar committed
87
88
89
90
91
92
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
93
    double *ssim_v
John Koleszar's avatar
John Koleszar committed
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
144
145
);


#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];

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

#ifdef PACKET_TESTING
extern FILE *vpxlogc;
#endif

218
219
220
221
222
223
224
225
226
227
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->target_bandwidth                 = cpi->oxcf.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;
228
229
230
    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;
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
    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->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->count_mb_ref_frame_usage,
            sizeof(cpi->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;
268
269
270
    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;
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
    cpi->buffer_level                     = lc->buffer_level;
    cpi->bits_off_target                  = lc->bits_off_target;
    cpi->total_actual_bits                = lc->total_actual_bits;
    //cpi->worst_quality                    = lc->worst_quality;
    cpi->active_worst_quality             = lc->active_worst_quality;
    //cpi->best_quality                     = lc->best_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->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->count_mb_ref_frame_usage,
            lc->count_mb_ref_frame_usage,
            sizeof(cpi->count_mb_ref_frame_usage));
}

John Koleszar's avatar
John Koleszar committed
297
298
299
300
301
302
303
304
305
306
307
308
309
static void setup_features(VP8_COMP *cpi)
{
    // Set up default state for MB feature flags
    cpi->mb.e_mbd.segmentation_enabled = 0;
    cpi->mb.e_mbd.update_mb_segmentation_map = 0;
    cpi->mb.e_mbd.update_mb_segmentation_data = 0;
    vpx_memset(cpi->mb.e_mbd.mb_segment_tree_probs, 255, sizeof(cpi->mb.e_mbd.mb_segment_tree_probs));
    vpx_memset(cpi->mb.e_mbd.segment_feature_data, 0, sizeof(cpi->mb.e_mbd.segment_feature_data));

    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;

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

352
    // Structure used to monitor GF usage
353
    vpx_free(cpi->gf_active_flags);
354
355
    cpi->gf_active_flags = 0;

356
357
358
359
360
361
    // Activity mask based per mb zbin adjustments
    vpx_free(cpi->mb_activity_map);
    cpi->mb_activity_map = 0;
    vpx_free(cpi->mb_norm_activity_map);
    cpi->mb_norm_activity_map = 0;

362
    vpx_free(cpi->mb.pip);
363
    cpi->mb.pip = 0;
John Koleszar's avatar
John Koleszar committed
364
365
}

John Koleszar's avatar
John Koleszar committed
366
static void enable_segmentation(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
367
368
369
370
371
372
{
    // 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;
}
John Koleszar's avatar
John Koleszar committed
373
static void disable_segmentation(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
374
375
376
377
378
379
380
{
    // 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]
John Koleszar's avatar
John Koleszar committed
381
static void set_segmentation_map(VP8_COMP *cpi, unsigned char *segmentation_map)
John Koleszar's avatar
John Koleszar committed
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
{
    // 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).
//
//
John Koleszar's avatar
John Koleszar committed
399
static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned char abs_delta)
John Koleszar's avatar
John Koleszar committed
400
401
402
403
404
405
{
    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
406
static void segmentation_test_function(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
{
    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));

    // MB loop to set local segmentation map
    /*for ( i = 0; i < cpi->common.mb_rows; i++ )
    {
        for ( j = 0; j < cpi->common.mb_cols; j++ )
        {
            //seg_map[(i*cpi->common.mb_cols) + j] = (j % 2) + ((i%2)* 2);
            //if ( j < cpi->common.mb_cols/2 )

            // Segment 1 around the edge else 0
            if ( (i == 0) || (j == 0) || (i == (cpi->common.mb_rows-1)) || (j == (cpi->common.mb_cols-1)) )
                seg_map[(i*cpi->common.mb_cols) + j] = 1;
            //else if ( (i < 2) || (j < 2) || (i > (cpi->common.mb_rows-3)) || (j > (cpi->common.mb_cols-3)) )
            //  seg_map[(i*cpi->common.mb_cols) + j] = 2;
            //else if ( (i < 5) || (j < 5) || (i > (cpi->common.mb_rows-6)) || (j > (cpi->common.mb_cols-6)) )
            //  seg_map[(i*cpi->common.mb_cols) + j] = 3;
            else
                seg_map[(i*cpi->common.mb_cols) + j] = 0;
        }
    }*/

    // Set the segmentation Map
John Koleszar's avatar
John Koleszar committed
435
    set_segmentation_map(cpi, seg_map);
John Koleszar's avatar
John Koleszar committed
436
437

    // Activate segmentation.
John Koleszar's avatar
John Koleszar committed
438
    enable_segmentation(cpi);
John Koleszar's avatar
John Koleszar committed
439
440
441
442
443
444
445
446
447
448
449
450
451
452

    // 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
John Koleszar's avatar
John Koleszar committed
453
    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
John Koleszar's avatar
John Koleszar committed
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526

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

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

    cpi->cyclic_refresh_q = Q;

    for (i = Q; i > 0; i--)
    {
        if (vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*(Q + 128)) / 64))
            //if ( vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*((2*Q)+96))/64) )
        {
            break;
        }
    }

    cpi->cyclic_refresh_q = i;

    // Only update for inter frames
    if (cpi->common.frame_type != KEY_FRAME)
    {
        // Cycle through the macro_block rows
        // MB loop to set local segmentation map
        for (i = cpi->cyclic_refresh_mode_index; i < mbs_in_frame; i++)
        {
            // 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;
            }
            else
            {
                seg_map[i] = 0;

                // Skip blocks that have been refreshed recently anyway.
                if (cpi->cyclic_refresh_map[i] < 0)
                    //cpi->cyclic_refresh_map[i] = cpi->cyclic_refresh_map[i] / 16;
                    cpi->cyclic_refresh_map[i]++;
            }


            if (block_count > 0)
                block_count--;
            else
                break;

        }

        // If we have gone through the frame reset to the start
        cpi->cyclic_refresh_mode_index = i;

        if (cpi->cyclic_refresh_mode_index >= mbs_in_frame)
            cpi->cyclic_refresh_mode_index = 0;
    }

    // Set the segmentation Map
John Koleszar's avatar
John Koleszar committed
527
    set_segmentation_map(cpi, seg_map);
John Koleszar's avatar
John Koleszar committed
528
529

    // Activate segmentation.
John Koleszar's avatar
John Koleszar committed
530
    enable_segmentation(cpi);
John Koleszar's avatar
John Koleszar committed
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545

    // 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
    // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1
John Koleszar's avatar
John Koleszar committed
546
    set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
John Koleszar's avatar
John Koleszar committed
547
548

    // Delete sementation map
549
    vpx_free(seg_map);
John Koleszar's avatar
John Koleszar committed
550
551
552
553
554

    seg_map = 0;

}

555
static void set_default_lf_deltas(VP8_COMP *cpi)
John Koleszar's avatar
John Koleszar committed
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
{
    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
    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
}

575
576
577
578
579
580
/* Convenience macros for mapping speed and mode into a continuous
 * range
 */
#define GOOD(x) (x+1)
#define RT(x) (x+7)

581
static int speed_map(int speed, const int *map)
582
583
584
585
586
587
588
589
590
591
{
    int res;

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

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

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

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

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

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

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

621
static const int thresh_mult_map_split1[] = {
622
623
624
625
    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
};

626
static const int thresh_mult_map_split2[] = {
627
628
629
630
    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
};

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

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

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

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

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

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

658
static const int mode_check_freq_map_split2[] = {
659
660
661
    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
662
663
664
665
666
667
668
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;
669
    int last_improved_quant = sf->improved_quant;
670
    int ref_frames;
John Koleszar's avatar
John Koleszar committed
671
672
673
674
675
676
677
678
679
680
681

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

    cpi->mbs_tested_so_far = 0;

682
    // best quality defaults
John Koleszar's avatar
John Koleszar committed
683
684
685
686
687
688
689
690
691
692
    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;
693
    sf->use_fastquant_for_pick = 0;
694
    sf->no_skip_block4x4_search = 1;
John Koleszar's avatar
John Koleszar committed
695
696
697

    sf->first_step = 0;
    sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
698
    sf->improved_mv_pred = 1;
John Koleszar's avatar
John Koleszar committed
699
700
701
702
703

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

704
705
706
707
708
709
710
711
712
    /* Count enabled references */
    ref_frames = 1;
    if (cpi->ref_frame_flags & VP8_LAST_FLAG)
        ref_frames++;
    if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
        ref_frames++;
    if (cpi->ref_frame_flags & VP8_ALT_FLAG)
        ref_frames++;

713
714
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
745
746
747
    /* 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);

748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
    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);
778
    Speed = cpi->Speed;
John Koleszar's avatar
John Koleszar committed
779
780
781
782
783
784
785
786
787
    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:
788
        if (Speed > 0)
John Koleszar's avatar
John Koleszar committed
789
        {
790
791
792
793
            /* Disable coefficient optimization above speed 0 */
            sf->optimize_coefficients = 0;
            sf->use_fastquant_for_pick = 1;
            sf->no_skip_block4x4_search = 0;
794

795
            sf->first_step = 1;
John Koleszar's avatar
John Koleszar committed
796
797
        }

798
        if (Speed > 2)
John Koleszar's avatar
John Koleszar committed
799
        {
800
801
802
            sf->improved_quant = 0;
            sf->improved_dct = 0;

803
804
            // Only do recode loop on key frames, golden frames and
            // alt ref frames
John Koleszar's avatar
John Koleszar committed
805
806
807
808
            sf->recode_loop = 2;

        }

809
        if (Speed > 3)
John Koleszar's avatar
John Koleszar committed
810
811
812
813
        {
            sf->auto_filter = 1;
            sf->recode_loop = 0; // recode loop off
            sf->RD = 0;         // Turn rd off
814

John Koleszar's avatar
John Koleszar committed
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
        }

        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;
835
836
837
838

            sf->use_fastquant_for_pick = 1;
            sf->no_skip_block4x4_search = 0;
            sf->first_step = 1;
John Koleszar's avatar
John Koleszar committed
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
        }

        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;
854
            sf->iterative_sub_pixel = 0;
John Koleszar's avatar
John Koleszar committed
855
856
857
858
        }

        if (Speed > 6)
        {
859
            unsigned int sum = 0;
John Koleszar's avatar
John Koleszar committed
860
            unsigned int total_mbs = cm->MBs;
861
862
            int i, thresh;
            unsigned int total_skip;
John Koleszar's avatar
John Koleszar committed
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893

            int min = 2000;

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

            min >>= 7;

            for (i = 0; i < min; i++)
            {
                sum += cpi->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->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;

894
            if (ref_frames > 1)
John Koleszar's avatar
John Koleszar committed
895
            {
896
897
898
                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
899
900
            }

901
            if (ref_frames > 2)
John Koleszar's avatar
John Koleszar committed
902
            {
903
904
905
                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
906
907
            }

908
            if (ref_frames > 3)
John Koleszar's avatar
John Koleszar committed
909
            {
910
911
912
                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
913
914
            }

915
            sf->improved_mv_pred = 0;
John Koleszar's avatar
John Koleszar committed
916
917
918
919
920
        }

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

921
922
923
        if(cm->version == 0)
        {
            cm->filter_type = NORMAL_LOOPFILTER;
John Koleszar's avatar
John Koleszar committed
924

925
926
927
928
929
            if (Speed >= 14)
                cm->filter_type = SIMPLE_LOOPFILTER;
        }
        else
        {
John Koleszar's avatar
John Koleszar committed
930
            cm->filter_type = SIMPLE_LOOPFILTER;
931
        }
John Koleszar's avatar
John Koleszar committed
932

933
        // This has a big hit on quality. Last resort
John Koleszar's avatar
John Koleszar committed
934
        if (Speed >= 15)
935
            sf->half_pixel_search = 0;
John Koleszar's avatar
John Koleszar committed
936
937
938

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

939
940
    }; /* switch */

941
942
943
944
945
946
947
948
949
    // 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;
    }

John Koleszar's avatar
John Koleszar committed
950
951
    if (cpi->sf.search_method == NSTEP)
    {
952
        vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
John Koleszar's avatar
John Koleszar committed
953
954
955
    }
    else if (cpi->sf.search_method == DIAMOND)
    {
956
        vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
John Koleszar's avatar
John Koleszar committed
957
958
959
960
    }

    if (cpi->sf.improved_dct)
    {
John Koleszar's avatar
John Koleszar committed
961
962
        cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
        cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
John Koleszar's avatar
John Koleszar committed
963
964
965
    }
    else
    {
John Koleszar's avatar
John Koleszar committed
966
967
968
        /* 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
969
970
    }

John Koleszar's avatar
John Koleszar committed
971
    cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
John Koleszar's avatar
John Koleszar committed
972
973
974

    if (cpi->sf.improved_quant)
    {
John Koleszar's avatar
John Koleszar committed
975
976
        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
977
978
979
    }
    else
    {
John Koleszar's avatar
John Koleszar committed
980
981
        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
982
    }
983
984
    if (cpi->sf.improved_quant != last_improved_quant)
        vp8cx_init_quantizer(cpi);
John Koleszar's avatar
John Koleszar committed
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002

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

1003
    if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
Yaowu Xu's avatar
Yaowu Xu committed
1004
        cpi->mb.optimize = 1;
John Koleszar's avatar
John Koleszar committed
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
    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
}
1015
1016
1017
#undef GOOD
#undef RT

John Koleszar's avatar
John Koleszar committed
1018
1019
static void alloc_raw_frame_buffers(VP8_COMP *cpi)
{
Attila Nagy's avatar
Attila Nagy committed
1020
#if VP8_TEMPORAL_ALT_REF
1021
    int width = (cpi->oxcf.Width + 15) & ~15;
John Koleszar's avatar
John Koleszar committed
1022
    int height = (cpi->oxcf.Height + 15) & ~15;
Attila Nagy's avatar
Attila Nagy committed
1023
#endif
John Koleszar's avatar
John Koleszar committed
1024

John Koleszar's avatar
John Koleszar committed
1025
1026
1027
1028
1029
    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");
John Koleszar's avatar
John Koleszar committed
1030
1031
1032

#if VP8_TEMPORAL_ALT_REF

John Koleszar's avatar
John Koleszar committed
1033
    if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
1034
                                    width, height, VP8BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
1035
1036
1037
1038
1039
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate altref buffer");

#endif
}
1040

1041
1042
1043
1044
1045
1046
1047
1048
1049
1050

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


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

1055
1056
1057
1058
    cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
                                (cpi->common.mb_rows + 1),
                                sizeof(PARTITION_INFO));
    if(!cpi->mb.pip)
John Koleszar's avatar
John Koleszar committed
1059
        return 1;
1060
1061
1062
1063
1064
1065

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

    return 0;
}

John Koleszar's avatar
John Koleszar committed
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
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");

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


John Koleszar's avatar
John Koleszar committed
1082
1083
1084
1085
1086
1087
1088
    if ((width & 0xf) != 0)
        width += 16 - (width & 0xf);

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


1089
    if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame,
John Koleszar's avatar
John Koleszar committed
1090
1091
1092
1093
                                    width, height, VP8BORDERINPIXELS))
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate last frame buffer");

1094
1095
    if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
                                    width, height, VP8BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
1096
1097
        vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                           "Failed to allocate scaled source buffer");
1098
1099
1100

    vpx_free(cpi->tok);

John Koleszar's avatar
John Koleszar committed
1101
    {
1102
1103
1104
#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
        unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
#else
John Koleszar's avatar
John Koleszar committed
1105
        unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1106
#endif
John Koleszar's avatar
John Koleszar committed
1107
1108
1109
1110
1111
1112
1113
        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->inter_zz_count = 0;
    cpi->gf_bad_count = 0;
    cpi->gf_update_recommended = 0;
1114
1115
1116


    // Structures used to minitor GF usage
1117
1118
1119
1120
    vpx_free(cpi->gf_active_flags);
    CHECK_MEM_ERROR(cpi->gf_active_flags,
                    vpx_calloc(1, cm->mb_rows * cm->mb_cols));
    cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1121

1122
1123
1124
1125
    vpx_free(cpi->mb_activity_map);
    CHECK_MEM_ERROR(cpi->mb_activity_map,
                    vpx_calloc(sizeof(unsigned int),
                    cm->mb_rows * cm->mb_cols));
1126

1127
1128
1129
1130
    vpx_free(cpi->mb_norm_activity_map);
    CHECK_MEM_ERROR(cpi->mb_norm_activity_map,
                    vpx_calloc(sizeof(unsigned int),
                    cm->mb_rows * cm->mb_cols));
1131

Attila Nagy's avatar
Attila Nagy committed
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
#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;
#endif
1142

1143
    vpx_free(cpi->tplist);
James Berry's avatar
James Berry committed
1144

1145
    CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cpi->common.mb_rows));
John Koleszar's avatar
John Koleszar committed
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
}


// 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_frame_rate(VP8_COMP *cpi, double framerate)
{
1174
1175
1176
    if(framerate < .1)
        framerate = 30;

1177
1178
    cpi->frame_rate             = framerate;
    cpi->output_frame_rate      = framerate;
1179
1180
1181
1182
1183
    cpi->per_frame_bandwidth    = (int)(cpi->oxcf.target_bandwidth /
                                  cpi->output_frame_rate);
    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);
John Koleszar's avatar
John Koleszar committed
1184

1185
    // Set Maximum gf/arf interval
1186
1187
1188
1189
    cpi->max_gf_interval = ((int)(cpi->output_frame_rate / 2.0) + 2);

    if(cpi->max_gf_interval < 12)
        cpi->max_gf_interval = 12;
John Koleszar's avatar
John Koleszar committed
1190

1191
    // Extended interval for genuinely static scenes
1192
    cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
John Koleszar's avatar
John Koleszar committed
1193

1194
     // Special conditions when altr ref frame enabled in lagged compress mode
1195
    if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
John Koleszar's avatar
John Koleszar committed
1196
1197
1198
    {
        if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
            cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1199

1200
1201
        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;
John Koleszar's avatar
John Koleszar committed
1202
    }
1203

1204
1205
    if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
        cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
John Koleszar's avatar
John Koleszar committed
1206
1207
}

1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219

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

    return llval * llnum / llden;
}


John Koleszar's avatar
John Koleszar committed
1220
static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
John Koleszar's avatar
John Koleszar committed
1221
1222
1223
{
    VP8_COMMON *cm = &cpi->common;

Paul Wilkins's avatar
Paul Wilkins committed
1224
    cpi->oxcf = *oxcf;
John Koleszar's avatar
John Koleszar committed
1225
1226
1227
1228
1229
1230
1231
1232

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

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

1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
    /* 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->frame_rate = (double)(oxcf->timebase.den) /
                      (double)(oxcf->timebase.num);

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

1245
1246
    cpi->ref_frame_rate = cpi->frame_rate;

Paul Wilkins's avatar
Paul Wilkins committed
1247
    // change includes all joint functionality
John Koleszar's avatar
John Koleszar committed
1248
    vp8_change_config(cpi, oxcf);
John Koleszar's avatar
John Koleszar committed
1249

Paul Wilkins's avatar
Paul Wilkins committed
1250
1251
1252
1253
1254
1255
    // 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
1256
    cpi->buffer_level                 = cpi->oxcf.starting_buffer_level;
John Koleszar's avatar
John Koleszar committed
1257
1258
    cpi->bits_off_target              = cpi->oxcf.starting_buffer_level;

1259
1260
    cpi->rolling_target_bits          = cpi->av_per_frame_bandwidth;
    cpi->rolling_actual_bits          = cpi->av_per_frame_bandwidth;
1261
1262
    cpi->long_rolling_target_bits     = cpi->av_per_frame_bandwidth;
    cpi->long_rolling_actual_bits     = cpi->av_per_frame_bandwidth;
John Koleszar's avatar
John Koleszar committed
1263
1264

    cpi->total_actual_bits            = 0;
1265
    cpi->total_target_vs_actual       = 0;
John Koleszar's avatar
John Koleszar committed
1266

1267
1268
1269
    // Temporal scalabilty
    if (cpi->oxcf.number_of_layers > 1)
    {
1270
1271
        unsigned int i;
        double prev_layer_frame_rate=0;
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281

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

            // Layer configuration
            lc->frame_rate =
                        cpi->output_frame_rate / cpi->oxcf.rate_decimator[i];
            lc->target_bandwidth = cpi->oxcf.target_bitrate[i] * 1000;

1282
1283
1284
1285
            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;

1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
            lc->starting_buffer_level =
              rescale(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(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(oxcf->maximum_buffer_size,
                          lc->target_bandwidth, 1000);

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

            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.0;

            prev_layer_frame_rate = lc->frame_rate;
        }
    }

John Koleszar's avatar
John Koleszar committed
1330
1331
1332
1333
1334
1335
#if VP8_TEMPORAL_ALT_REF
    {
        int i;

        cpi->fixed_divide[0] = 0;

1336
1337
        for (i = 1; i < 512; i++)
            cpi->fixed_divide[i] = 0x80000 / i;
John Koleszar's avatar
John Koleszar committed
1338
1339
1340
1341
    }
#endif
}

John Koleszar's avatar
John Koleszar committed
1342
static void update_layer_contexts (VP8_COMP *cpi)
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
{
    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_frame_rate=0;

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

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

            lc->starting_buffer_level = rescale(
                          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(
                          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(
                          oxcf->maximum_buffer_size_in_ms,
                          lc->target_bandwidth, 1000);

            // Work out the average size of a frame within this layer
            if (i > 0