2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
12 #include "vpx_config.h"
13 #include "vp8/common/onyxc_int.h"
15 #include "vp8/common/systemdependent.h"
17 #include "vp8/common/alloccommon.h"
19 #include "firstpass.h"
21 #include "vpx_scale/vpxscale.h"
22 #include "vp8/common/extend.h"
24 #include "vp8/common/quant_common.h"
25 #include "segmentation.h"
27 #include "vp8/common/postproc.h"
29 #include "vpx_mem/vpx_mem.h"
30 #include "vp8/common/swapyv12buffer.h"
31 #include "vp8/common/threading.h"
32 #include "vpx_ports/vpx_timer.h"
34 #include "vpx_ports/arm.h"
36 #if CONFIG_MULTI_RES_ENCODING
37 #include "mr_dissim.h"
39 #include "encodeframe.h"
45 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
46 extern int vp8_update_coef_context(VP8_COMP *cpi);
47 extern void vp8_update_coef_probs(VP8_COMP *cpi);
50 extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
51 extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
52 extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
54 extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
55 extern void print_parms(VP8_CONFIG *ocf, char *filenam);
56 extern unsigned int vp8_get_processor_freq();
57 extern void print_tree_update_probs();
58 extern void vp8cx_create_encoder_threads(VP8_COMP *cpi);
59 extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
61 extern void vp8_yv12_copy_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
62 extern void vp8_yv12_copy_src_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
65 int vp8_estimate_entropy_savings(VP8_COMP *cpi);
67 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
69 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
71 static void set_default_lf_deltas(VP8_COMP *cpi);
73 extern const int vp8_gf_interval_table[101];
75 #if CONFIG_INTERNAL_STATS
78 extern double vp8_calc_ssim
80 YV12_BUFFER_CONFIG *source,
81 YV12_BUFFER_CONFIG *dest,
87 extern double vp8_calc_ssimg
89 YV12_BUFFER_CONFIG *source,
90 YV12_BUFFER_CONFIG *dest,
100 #ifdef OUTPUT_YUV_SRC
111 extern int skip_true_count;
112 extern int skip_false_count;
117 extern int intra_mode_stats[10][10][10];
121 unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
122 unsigned int tot_pm = 0;
123 unsigned int cnt_pm = 0;
124 unsigned int tot_ef = 0;
125 unsigned int cnt_ef = 0;
129 extern unsigned __int64 Sectionbits[50];
130 extern int y_modes[5] ;
131 extern int uv_modes[4] ;
132 extern int b_modes[10] ;
134 extern int inter_y_modes[10] ;
135 extern int inter_uv_modes[4] ;
136 extern unsigned int inter_b_modes[15];
139 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
141 extern const int qrounding_factors[129];
142 extern const int qzbin_factors[129];
143 extern void vp8cx_init_quantizer(VP8_COMP *cpi);
144 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] =
149 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
150 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
151 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
152 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
153 3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,
154 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
155 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
156 16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23
158 static const unsigned char kf_high_motion_minq[QINDEX_RANGE] =
160 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
161 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
162 1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,
163 3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6,
164 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
165 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
166 16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21,
167 21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30
169 static const unsigned char gf_low_motion_minq[QINDEX_RANGE] =
171 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
172 3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,
173 7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,
174 11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,
175 19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,
176 27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,
177 35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,
178 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] =
182 0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4,
183 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
184 9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,
185 14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,
186 22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,
187 30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,
188 38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48,
189 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
191 static const unsigned char gf_high_motion_minq[QINDEX_RANGE] =
193 0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4,
194 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
195 9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
196 17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,
197 25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,
198 33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,
199 41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54,
200 55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
202 static const unsigned char inter_minq[QINDEX_RANGE] =
204 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
205 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
206 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
207 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
208 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
209 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
210 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
211 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
214 #ifdef PACKET_TESTING
215 extern FILE *vpxlogc;
218 static void save_layer_context(VP8_COMP *cpi)
220 LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
222 // Save layer dependent coding state
223 lc->target_bandwidth = cpi->target_bandwidth;
224 //lc->target_bandwidth = cpi->oxcf.target_bandwidth;
225 lc->starting_buffer_level = cpi->oxcf.starting_buffer_level;
226 lc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level;
227 lc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size;
228 lc->starting_buffer_level_in_ms = cpi->oxcf.starting_buffer_level_in_ms;
229 lc->optimal_buffer_level_in_ms = cpi->oxcf.optimal_buffer_level_in_ms;
230 lc->maximum_buffer_size_in_ms = cpi->oxcf.maximum_buffer_size_in_ms;
231 lc->buffer_level = cpi->buffer_level;
232 lc->bits_off_target = cpi->bits_off_target;
233 lc->total_actual_bits = cpi->total_actual_bits;
234 lc->worst_quality = cpi->worst_quality;
235 lc->active_worst_quality = cpi->active_worst_quality;
236 lc->best_quality = cpi->best_quality;
237 lc->active_best_quality = cpi->active_best_quality;
238 lc->ni_av_qi = cpi->ni_av_qi;
239 lc->ni_tot_qi = cpi->ni_tot_qi;
240 lc->ni_frames = cpi->ni_frames;
241 lc->avg_frame_qindex = cpi->avg_frame_qindex;
242 lc->rate_correction_factor = cpi->rate_correction_factor;
243 lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
244 lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor;
245 lc->zbin_over_quant = cpi->zbin_over_quant;
246 lc->inter_frame_target = cpi->inter_frame_target;
247 lc->total_byte_count = cpi->total_byte_count;
248 lc->filter_level = cpi->common.filter_level;
250 lc->last_frame_percent_intra = cpi->last_frame_percent_intra;
252 memcpy (lc->count_mb_ref_frame_usage,
253 cpi->count_mb_ref_frame_usage,
254 sizeof(cpi->count_mb_ref_frame_usage));
257 static void restore_layer_context(VP8_COMP *cpi, const int layer)
259 LAYER_CONTEXT *lc = &cpi->layer_context[layer];
261 // Restore layer dependent coding state
262 cpi->current_layer = layer;
263 cpi->target_bandwidth = lc->target_bandwidth;
264 cpi->oxcf.target_bandwidth = lc->target_bandwidth;
265 cpi->oxcf.starting_buffer_level = lc->starting_buffer_level;
266 cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level;
267 cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size;
268 cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
269 cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms;
270 cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms;
271 cpi->buffer_level = lc->buffer_level;
272 cpi->bits_off_target = lc->bits_off_target;
273 cpi->total_actual_bits = lc->total_actual_bits;
274 //cpi->worst_quality = lc->worst_quality;
275 cpi->active_worst_quality = lc->active_worst_quality;
276 //cpi->best_quality = lc->best_quality;
277 cpi->active_best_quality = lc->active_best_quality;
278 cpi->ni_av_qi = lc->ni_av_qi;
279 cpi->ni_tot_qi = lc->ni_tot_qi;
280 cpi->ni_frames = lc->ni_frames;
281 cpi->avg_frame_qindex = lc->avg_frame_qindex;
282 cpi->rate_correction_factor = lc->rate_correction_factor;
283 cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
284 cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor;
285 cpi->zbin_over_quant = lc->zbin_over_quant;
286 cpi->inter_frame_target = lc->inter_frame_target;
287 cpi->total_byte_count = lc->total_byte_count;
288 cpi->common.filter_level = lc->filter_level;
290 cpi->last_frame_percent_intra = lc->last_frame_percent_intra;
292 memcpy (cpi->count_mb_ref_frame_usage,
293 lc->count_mb_ref_frame_usage,
294 sizeof(cpi->count_mb_ref_frame_usage));
297 static void setup_features(VP8_COMP *cpi)
299 // Set up default state for MB feature flags
300 cpi->mb.e_mbd.segmentation_enabled = 0;
301 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
302 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
303 vpx_memset(cpi->mb.e_mbd.mb_segment_tree_probs, 255, sizeof(cpi->mb.e_mbd.mb_segment_tree_probs));
304 vpx_memset(cpi->mb.e_mbd.segment_feature_data, 0, sizeof(cpi->mb.e_mbd.segment_feature_data));
306 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
307 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
308 vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
309 vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
310 vpx_memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
311 vpx_memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
313 set_default_lf_deltas(cpi);
318 static void dealloc_raw_frame_buffers(VP8_COMP *cpi);
321 static void dealloc_compressor_data(VP8_COMP *cpi)
323 vpx_free(cpi->tplist);
326 // Delete last frame MV storage buffers
330 vpx_free(cpi->lf_ref_frame_sign_bias);
331 cpi->lf_ref_frame_sign_bias = 0;
333 vpx_free(cpi->lf_ref_frame);
334 cpi->lf_ref_frame = 0;
336 // Delete sementation map
337 vpx_free(cpi->segmentation_map);
338 cpi->segmentation_map = 0;
340 vpx_free(cpi->active_map);
343 vp8_de_alloc_frame_buffers(&cpi->common);
345 vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
346 vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
347 dealloc_raw_frame_buffers(cpi);
352 // Structure used to monitor GF usage
353 vpx_free(cpi->gf_active_flags);
354 cpi->gf_active_flags = 0;
356 // Activity mask based per mb zbin adjustments
357 vpx_free(cpi->mb_activity_map);
358 cpi->mb_activity_map = 0;
359 vpx_free(cpi->mb_norm_activity_map);
360 cpi->mb_norm_activity_map = 0;
362 vpx_free(cpi->mb.pip);
366 static void enable_segmentation(VP8_COMP *cpi)
368 // Set the appropriate feature bit
369 cpi->mb.e_mbd.segmentation_enabled = 1;
370 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
371 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
373 static void disable_segmentation(VP8_COMP *cpi)
375 // Clear the appropriate feature bit
376 cpi->mb.e_mbd.segmentation_enabled = 0;
379 // Valid values for a segment are 0 to 3
380 // Segmentation map is arrange as [Rows][Columns]
381 static void set_segmentation_map(VP8_COMP *cpi, unsigned char *segmentation_map)
383 // Copy in the new segmentation map
384 vpx_memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));
386 // Signal that the map should be updated.
387 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
388 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
391 // The values given for each segment can be either deltas (from the default value chosen for the frame) or absolute values.
393 // Valid range for abs values is (0-127 for MB_LVL_ALT_Q) , (0-63 for SEGMENT_ALT_LF)
394 // Valid range for delta values are (+/-127 for MB_LVL_ALT_Q) , (+/-63 for SEGMENT_ALT_LF)
396 // abs_delta = SEGMENT_DELTADATA (deltas) abs_delta = SEGMENT_ABSDATA (use the absolute values given).
399 static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned char abs_delta)
401 cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
402 vpx_memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
406 static void segmentation_test_function(VP8_COMP *cpi)
408 unsigned char *seg_map;
409 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
411 // Create a temporary map for segmentation data.
412 CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
414 // MB loop to set local segmentation map
415 /*for ( i = 0; i < cpi->common.mb_rows; i++ )
417 for ( j = 0; j < cpi->common.mb_cols; j++ )
419 //seg_map[(i*cpi->common.mb_cols) + j] = (j % 2) + ((i%2)* 2);
420 //if ( j < cpi->common.mb_cols/2 )
422 // Segment 1 around the edge else 0
423 if ( (i == 0) || (j == 0) || (i == (cpi->common.mb_rows-1)) || (j == (cpi->common.mb_cols-1)) )
424 seg_map[(i*cpi->common.mb_cols) + j] = 1;
425 //else if ( (i < 2) || (j < 2) || (i > (cpi->common.mb_rows-3)) || (j > (cpi->common.mb_cols-3)) )
426 // seg_map[(i*cpi->common.mb_cols) + j] = 2;
427 //else if ( (i < 5) || (j < 5) || (i > (cpi->common.mb_rows-6)) || (j > (cpi->common.mb_cols-6)) )
428 // seg_map[(i*cpi->common.mb_cols) + j] = 3;
430 seg_map[(i*cpi->common.mb_cols) + j] = 0;
434 // Set the segmentation Map
435 set_segmentation_map(cpi, seg_map);
437 // Activate segmentation.
438 enable_segmentation(cpi);
440 // Set up the quant segment data
441 feature_data[MB_LVL_ALT_Q][0] = 0;
442 feature_data[MB_LVL_ALT_Q][1] = 4;
443 feature_data[MB_LVL_ALT_Q][2] = 0;
444 feature_data[MB_LVL_ALT_Q][3] = 0;
445 // Set up the loop segment data
446 feature_data[MB_LVL_ALT_LF][0] = 0;
447 feature_data[MB_LVL_ALT_LF][1] = 0;
448 feature_data[MB_LVL_ALT_LF][2] = 0;
449 feature_data[MB_LVL_ALT_LF][3] = 0;
451 // Initialise the feature data structure
452 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
453 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
455 // Delete sementation map
462 // A simple function to cyclically refresh the background at a lower Q
463 static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
465 unsigned char *seg_map;
466 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
468 int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
469 int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
471 // Create a temporary map for segmentation data.
472 CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
474 cpi->cyclic_refresh_q = Q;
476 for (i = Q; i > 0; i--)
478 if (vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*(Q + 128)) / 64))
479 //if ( vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*((2*Q)+96))/64) )
485 cpi->cyclic_refresh_q = i;
487 // Only update for inter frames
488 if (cpi->common.frame_type != KEY_FRAME)
490 // Cycle through the macro_block rows
491 // MB loop to set local segmentation map
492 for (i = cpi->cyclic_refresh_mode_index; i < mbs_in_frame; i++)
494 // If the MB is as a candidate for clean up then mark it for possible boost/refresh (segment 1)
495 // The segment id may get reset to 0 later if the MB gets coded anything other than last frame 0,0
496 // as only (last frame 0,0) MBs are eligable for refresh : that is to say Mbs likely to be background blocks.
497 if (cpi->cyclic_refresh_map[i] == 0)
505 // Skip blocks that have been refreshed recently anyway.
506 if (cpi->cyclic_refresh_map[i] < 0)
507 //cpi->cyclic_refresh_map[i] = cpi->cyclic_refresh_map[i] / 16;
508 cpi->cyclic_refresh_map[i]++;
519 // If we have gone through the frame reset to the start
520 cpi->cyclic_refresh_mode_index = i;
522 if (cpi->cyclic_refresh_mode_index >= mbs_in_frame)
523 cpi->cyclic_refresh_mode_index = 0;
526 // Set the segmentation Map
527 set_segmentation_map(cpi, seg_map);
529 // Activate segmentation.
530 enable_segmentation(cpi);
532 // Set up the quant segment data
533 feature_data[MB_LVL_ALT_Q][0] = 0;
534 feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
535 feature_data[MB_LVL_ALT_Q][2] = 0;
536 feature_data[MB_LVL_ALT_Q][3] = 0;
538 // Set up the loop segment data
539 feature_data[MB_LVL_ALT_LF][0] = 0;
540 feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
541 feature_data[MB_LVL_ALT_LF][2] = 0;
542 feature_data[MB_LVL_ALT_LF][3] = 0;
544 // Initialise the feature data structure
545 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
546 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
548 // Delete sementation map
555 static void set_default_lf_deltas(VP8_COMP *cpi)
557 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
558 cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
560 vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
561 vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
563 // Test of ref frame deltas
564 cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
565 cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
566 cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
567 cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
569 cpi->mb.e_mbd.mode_lf_deltas[0] = 4; // BPRED
570 cpi->mb.e_mbd.mode_lf_deltas[1] = -2; // Zero
571 cpi->mb.e_mbd.mode_lf_deltas[2] = 2; // New mv
572 cpi->mb.e_mbd.mode_lf_deltas[3] = 4; // Split mv
575 /* Convenience macros for mapping speed and mode into a continuous
578 #define GOOD(x) (x+1)
581 static int speed_map(int speed, const int *map)
588 } while(speed >= *map++);
592 static const int thresh_mult_map_znn[] = {
593 /* map common to zero, nearest, and near */
594 0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
597 static const int thresh_mult_map_vhpred[] = {
598 1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(1), 2000,
599 RT(7), INT_MAX, INT_MAX
602 static const int thresh_mult_map_bpred[] = {
603 2000, GOOD(0), 2500, GOOD(2), 5000, GOOD(3), 7500, RT(0), 2500, RT(1), 5000,
604 RT(6), INT_MAX, INT_MAX
607 static const int thresh_mult_map_tm[] = {
608 1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 0, RT(1), 1000, RT(2), 2000,
609 RT(7), INT_MAX, INT_MAX
612 static const int thresh_mult_map_new1[] = {
613 1000, GOOD(2), 2000, RT(0), 2000, INT_MAX
616 static const int thresh_mult_map_new2[] = {
617 1000, GOOD(2), 2000, GOOD(3), 2500, GOOD(5), 4000, RT(0), 2000, RT(2), 2500,
621 static const int thresh_mult_map_split1[] = {
622 2500, GOOD(0), 1700, GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
623 RT(0), 5000, RT(1), 10000, RT(2), 25000, RT(3), INT_MAX, INT_MAX
626 static const int thresh_mult_map_split2[] = {
627 5000, GOOD(0), 4500, GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
628 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 /* {zero,nearest}{2,3} */
633 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 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 0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(10), 1<<2, RT(11), 1<<3, RT(12), 1<<4,
645 static const int mode_check_freq_map_new1[] = {
646 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 0, GOOD(5), 4, RT(0), 0, RT(3), 4, RT(10), 1<<3, RT(11), 1<<4, RT(12), 1<<5,
654 static const int mode_check_freq_map_split1[] = {
655 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 0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
662 void vp8_set_speed_features(VP8_COMP *cpi)
664 SPEED_FEATURES *sf = &cpi->sf;
665 int Mode = cpi->compressor_speed;
666 int Speed = cpi->Speed;
668 VP8_COMMON *cm = &cpi->common;
669 int last_improved_quant = sf->improved_quant;
672 // Initialise default mode frequency sampling variables
673 for (i = 0; i < MAX_MODES; i ++)
675 cpi->mode_check_freq[i] = 0;
676 cpi->mode_test_hit_counts[i] = 0;
677 cpi->mode_chosen_counts[i] = 0;
680 cpi->mbs_tested_so_far = 0;
682 // best quality defaults
684 sf->search_method = NSTEP;
685 sf->improved_quant = 1;
686 sf->improved_dct = 1;
689 sf->quarter_pixel_search = 1;
690 sf->half_pixel_search = 1;
691 sf->iterative_sub_pixel = 1;
692 sf->optimize_coefficients = 1;
693 sf->use_fastquant_for_pick = 0;
694 sf->no_skip_block4x4_search = 1;
697 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
698 sf->improved_mv_pred = 1;
700 // default thresholds to 0
701 for (i = 0; i < MAX_MODES; i++)
702 sf->thresh_mult[i] = 0;
704 /* Count enabled references */
706 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
708 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
710 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
713 /* Convert speed to continuous range, with clamping */
725 sf->thresh_mult[THR_ZERO1] =
726 sf->thresh_mult[THR_NEAREST1] =
727 sf->thresh_mult[THR_NEAR1] =
728 sf->thresh_mult[THR_DC] = 0; /* always */
730 sf->thresh_mult[THR_ZERO2] =
731 sf->thresh_mult[THR_ZERO3] =
732 sf->thresh_mult[THR_NEAREST2] =
733 sf->thresh_mult[THR_NEAREST3] =
734 sf->thresh_mult[THR_NEAR2] =
735 sf->thresh_mult[THR_NEAR3] = speed_map(Speed, thresh_mult_map_znn);
737 sf->thresh_mult[THR_V_PRED] =
738 sf->thresh_mult[THR_H_PRED] = speed_map(Speed, thresh_mult_map_vhpred);
739 sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
740 sf->thresh_mult[THR_TM] = speed_map(Speed, thresh_mult_map_tm);
741 sf->thresh_mult[THR_NEW1] = speed_map(Speed, thresh_mult_map_new1);
742 sf->thresh_mult[THR_NEW2] =
743 sf->thresh_mult[THR_NEW3] = speed_map(Speed, thresh_mult_map_new2);
744 sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
745 sf->thresh_mult[THR_SPLIT2] =
746 sf->thresh_mult[THR_SPLIT3] = speed_map(Speed, thresh_mult_map_split2);
748 cpi->mode_check_freq[THR_ZERO1] =
749 cpi->mode_check_freq[THR_NEAREST1] =
750 cpi->mode_check_freq[THR_NEAR1] =
751 cpi->mode_check_freq[THR_TM] =
752 cpi->mode_check_freq[THR_DC] = 0; /* always */
754 cpi->mode_check_freq[THR_ZERO2] =
755 cpi->mode_check_freq[THR_ZERO3] =
756 cpi->mode_check_freq[THR_NEAREST2] =
757 cpi->mode_check_freq[THR_NEAREST3] = speed_map(Speed,
758 mode_check_freq_map_zn2);
760 cpi->mode_check_freq[THR_NEAR2] =
761 cpi->mode_check_freq[THR_NEAR3] = speed_map(Speed,
762 mode_check_freq_map_near2);
764 cpi->mode_check_freq[THR_V_PRED] =
765 cpi->mode_check_freq[THR_H_PRED] =
766 cpi->mode_check_freq[THR_B_PRED] = speed_map(Speed,
767 mode_check_freq_map_vhbpred);
768 cpi->mode_check_freq[THR_NEW1] = speed_map(Speed,
769 mode_check_freq_map_new1);
770 cpi->mode_check_freq[THR_NEW2] =
771 cpi->mode_check_freq[THR_NEW3] = speed_map(Speed,
772 mode_check_freq_map_new2);
773 cpi->mode_check_freq[THR_SPLIT1] = speed_map(Speed,
774 mode_check_freq_map_split1);
775 cpi->mode_check_freq[THR_SPLIT2] =
776 cpi->mode_check_freq[THR_SPLIT3] = speed_map(Speed,
777 mode_check_freq_map_split2);
781 #if !(CONFIG_REALTIME_ONLY)
782 case 0: // best quality mode
784 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
790 /* Disable coefficient optimization above speed 0 */
791 sf->optimize_coefficients = 0;
792 sf->use_fastquant_for_pick = 1;
793 sf->no_skip_block4x4_search = 0;
800 sf->improved_quant = 0;
801 sf->improved_dct = 0;
803 // Only do recode loop on key frames, golden frames and
812 sf->recode_loop = 0; // recode loop off
813 sf->RD = 0; // Turn rd off
819 sf->auto_filter = 0; // Faster selection of loop filter
825 sf->optimize_coefficients = 0;
828 sf->iterative_sub_pixel = 1;
829 sf->search_method = NSTEP;
833 sf->improved_quant = 0;
834 sf->improved_dct = 0;
836 sf->use_fastquant_for_pick = 1;
837 sf->no_skip_block4x4_search = 0;
842 sf->auto_filter = 0; // Faster selection of loop filter
852 sf->auto_filter = 0; // Faster selection of loop filter
853 sf->search_method = HEX;
854 sf->iterative_sub_pixel = 0;
859 unsigned int sum = 0;
860 unsigned int total_mbs = cm->MBs;
862 unsigned int total_skip;
866 if (cpi->oxcf.encode_breakout > 2000)
867 min = cpi->oxcf.encode_breakout;
871 for (i = 0; i < min; i++)
873 sum += cpi->error_bins[i];
879 // i starts from 2 to make sure thresh started from 2048
880 for (; i < 1024; i++)
882 sum += cpi->error_bins[i];
884 if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
896 sf->thresh_mult[THR_NEW1 ] = thresh;
897 sf->thresh_mult[THR_NEAREST1 ] = thresh >> 1;
898 sf->thresh_mult[THR_NEAR1 ] = thresh >> 1;
903 sf->thresh_mult[THR_NEW2] = thresh << 1;
904 sf->thresh_mult[THR_NEAREST2 ] = thresh;
905 sf->thresh_mult[THR_NEAR2 ] = thresh;
910 sf->thresh_mult[THR_NEW3] = thresh << 1;
911 sf->thresh_mult[THR_NEAREST3 ] = thresh;
912 sf->thresh_mult[THR_NEAR3 ] = thresh;
915 sf->improved_mv_pred = 0;
919 sf->quarter_pixel_search = 0;
923 cm->filter_type = NORMAL_LOOPFILTER;
926 cm->filter_type = SIMPLE_LOOPFILTER;
930 cm->filter_type = SIMPLE_LOOPFILTER;
933 // This has a big hit on quality. Last resort
935 sf->half_pixel_search = 0;
937 vpx_memset(cpi->error_bins, 0, sizeof(cpi->error_bins));
941 // Slow quant, dct and trellis not worthwhile for first pass
942 // so make sure they are always turned off.
943 if ( cpi->pass == 1 )
945 sf->improved_quant = 0;
946 sf->optimize_coefficients = 0;
947 sf->improved_dct = 0;
950 if (cpi->sf.search_method == NSTEP)
952 vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
954 else if (cpi->sf.search_method == DIAMOND)
956 vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
959 if (cpi->sf.improved_dct)
961 cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
962 cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
966 /* No fast FDCT defined for any platform at this time. */
967 cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
968 cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
971 cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
973 if (cpi->sf.improved_quant)
975 cpi->mb.quantize_b = vp8_regular_quantize_b;
976 cpi->mb.quantize_b_pair = vp8_regular_quantize_b_pair;
980 cpi->mb.quantize_b = vp8_fast_quantize_b;
981 cpi->mb.quantize_b_pair = vp8_fast_quantize_b_pair;
983 if (cpi->sf.improved_quant != last_improved_quant)
984 vp8cx_init_quantizer(cpi);
986 if (cpi->sf.iterative_sub_pixel == 1)
988 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
990 else if (cpi->sf.quarter_pixel_search)
992 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
994 else if (cpi->sf.half_pixel_search)
996 cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1000 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1003 if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
1004 cpi->mb.optimize = 1;
1006 cpi->mb.optimize = 0;
1008 if (cpi->common.full_pixel)
1009 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1012 frames_at_speed[cpi->Speed]++;
1018 static void alloc_raw_frame_buffers(VP8_COMP *cpi)
1020 #if VP8_TEMPORAL_ALT_REF
1021 int width = (cpi->oxcf.Width + 15) & ~15;
1022 int height = (cpi->oxcf.Height + 15) & ~15;
1025 cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
1026 cpi->oxcf.lag_in_frames);
1028 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1029 "Failed to allocate lag buffers");
1031 #if VP8_TEMPORAL_ALT_REF
1033 if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
1034 width, height, VP8BORDERINPIXELS))
1035 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1036 "Failed to allocate altref buffer");
1042 static void dealloc_raw_frame_buffers(VP8_COMP *cpi)
1044 #if VP8_TEMPORAL_ALT_REF
1045 vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
1047 vp8_lookahead_destroy(cpi->lookahead);
1051 static int vp8_alloc_partition_data(VP8_COMP *cpi)
1053 vpx_free(cpi->mb.pip);
1055 cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
1056 (cpi->common.mb_rows + 1),
1057 sizeof(PARTITION_INFO));
1061 cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1066 void vp8_alloc_compressor_data(VP8_COMP *cpi)
1068 VP8_COMMON *cm = & cpi->common;
1070 int width = cm->Width;
1071 int height = cm->Height;
1073 if (vp8_alloc_frame_buffers(cm, width, height))
1074 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1075 "Failed to allocate frame buffers");
1077 if (vp8_alloc_partition_data(cpi))
1078 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1079 "Failed to allocate partition data");
1082 if ((width & 0xf) != 0)
1083 width += 16 - (width & 0xf);
1085 if ((height & 0xf) != 0)
1086 height += 16 - (height & 0xf);
1089 if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame,
1090 width, height, VP8BORDERINPIXELS))
1091 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1092 "Failed to allocate last frame buffer");
1094 if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
1095 width, height, VP8BORDERINPIXELS))
1096 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1097 "Failed to allocate scaled source buffer");
1102 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
1103 unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
1105 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1107 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1110 // Data used for real time vc mode to see if gf needs refreshing
1111 cpi->inter_zz_count = 0;
1112 cpi->gf_bad_count = 0;
1113 cpi->gf_update_recommended = 0;
1116 // Structures used to minitor GF usage
1117 vpx_free(cpi->gf_active_flags);
1118 CHECK_MEM_ERROR(cpi->gf_active_flags,
1119 vpx_calloc(1, cm->mb_rows * cm->mb_cols));
1120 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1122 vpx_free(cpi->mb_activity_map);
1123 CHECK_MEM_ERROR(cpi->mb_activity_map,
1124 vpx_calloc(sizeof(unsigned int),
1125 cm->mb_rows * cm->mb_cols));
1127 vpx_free(cpi->mb_norm_activity_map);
1128 CHECK_MEM_ERROR(cpi->mb_norm_activity_map,
1129 vpx_calloc(sizeof(unsigned int),
1130 cm->mb_rows * cm->mb_cols));
1132 #if CONFIG_MULTITHREAD
1134 cpi->mt_sync_range = 1;
1135 else if (width <= 1280)
1136 cpi->mt_sync_range = 4;
1137 else if (width <= 2560)
1138 cpi->mt_sync_range = 8;
1140 cpi->mt_sync_range = 16;
1143 vpx_free(cpi->tplist);
1145 CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cpi->common.mb_rows));
1150 static const int q_trans[] =
1152 0, 1, 2, 3, 4, 5, 7, 8,
1153 9, 10, 12, 13, 15, 17, 18, 19,
1154 20, 21, 23, 24, 25, 26, 27, 28,
1155 29, 30, 31, 33, 35, 37, 39, 41,
1156 43, 45, 47, 49, 51, 53, 55, 57,
1157 59, 61, 64, 67, 70, 73, 76, 79,
1158 82, 85, 88, 91, 94, 97, 100, 103,
1159 106, 109, 112, 115, 118, 121, 124, 127,
1162 int vp8_reverse_trans(int x)
1166 for (i = 0; i < 64; i++)
1167 if (q_trans[i] >= x)
1172 void vp8_new_frame_rate(VP8_COMP *cpi, double framerate)
1177 cpi->frame_rate = framerate;
1178 cpi->output_frame_rate = framerate;
1179 cpi->per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth /
1180 cpi->output_frame_rate);
1181 cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
1182 cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth *
1183 cpi->oxcf.two_pass_vbrmin_section / 100);
1185 // Set Maximum gf/arf interval
1186 cpi->max_gf_interval = ((int)(cpi->output_frame_rate / 2.0) + 2);
1188 if(cpi->max_gf_interval < 12)
1189 cpi->max_gf_interval = 12;
1191 // Extended interval for genuinely static scenes
1192 cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1194 // Special conditions when altr ref frame enabled in lagged compress mode
1195 if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
1197 if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1198 cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1200 if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1201 cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1204 if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
1205 cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1210 rescale(int val, int num, int denom)
1212 int64_t llnum = num;
1213 int64_t llden = denom;
1214 int64_t llval = val;
1216 return llval * llnum / llden;
1220 static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
1222 VP8_COMMON *cm = &cpi->common;
1227 cpi->auto_adjust_gold_quantizer = 1;
1230 cm->version = oxcf->Version;
1231 vp8_setup_version(cm);
1233 /* frame rate is not available on the first frame, as it's derived from
1234 * the observed timestamps. The actual value used here doesn't matter
1235 * too much, as it will adapt quickly. If the reciprocal of the timebase
1236 * seems like a reasonable framerate, then use that as a guess, otherwise
1239 cpi->frame_rate = (double)(oxcf->timebase.den) /
1240 (double)(oxcf->timebase.num);
1242 if (cpi->frame_rate > 180)
1243 cpi->frame_rate = 30;
1245 cpi->ref_frame_rate = cpi->frame_rate;
1247 // change includes all joint functionality
1248 vp8_change_config(cpi, oxcf);
1250 // Initialize active best and worst q and average q values.
1251 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1252 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1253 cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
1255 // Initialise the starting buffer levels
1256 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
1257 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
1259 cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
1260 cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
1261 cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
1262 cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
1264 cpi->total_actual_bits = 0;
1265 cpi->total_target_vs_actual = 0;
1267 // Temporal scalabilty
1268 if (cpi->oxcf.number_of_layers > 1)
1271 double prev_layer_frame_rate=0;
1273 for (i=0; i<cpi->oxcf.number_of_layers; i++)
1275 LAYER_CONTEXT *lc = &cpi->layer_context[i];
1277 // Layer configuration
1279 cpi->output_frame_rate / cpi->oxcf.rate_decimator[i];
1280 lc->target_bandwidth = cpi->oxcf.target_bitrate[i] * 1000;
1282 lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
1283 lc->optimal_buffer_level_in_ms = oxcf->optimal_buffer_level;
1284 lc->maximum_buffer_size_in_ms = oxcf->maximum_buffer_size;
1286 lc->starting_buffer_level =
1287 rescale(oxcf->starting_buffer_level,
1288 lc->target_bandwidth, 1000);
1290 if (oxcf->optimal_buffer_level == 0)
1291 lc->optimal_buffer_level = lc->target_bandwidth / 8;
1293 lc->optimal_buffer_level =
1294 rescale(oxcf->optimal_buffer_level,
1295 lc->target_bandwidth, 1000);
1297 if (oxcf->maximum_buffer_size == 0)
1298 lc->maximum_buffer_size = lc->target_bandwidth / 8;
1300 lc->maximum_buffer_size =
1301 rescale(oxcf->maximum_buffer_size,
1302 lc->target_bandwidth, 1000);
1304 // Work out the average size of a frame within this layer
1306 lc->avg_frame_size_for_layer = (cpi->oxcf.target_bitrate[i] -
1307 cpi->oxcf.target_bitrate[i-1]) * 1000 /
1308 (lc->frame_rate - prev_layer_frame_rate);
1310 lc->active_worst_quality = cpi->oxcf.worst_allowed_q;
1311 lc->active_best_quality = cpi->oxcf.best_allowed_q;
1312 lc->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
1314 lc->buffer_level = lc->starting_buffer_level;
1315 lc->bits_off_target = lc->starting_buffer_level;
1317 lc->total_actual_bits = 0;
1321 lc->rate_correction_factor = 1.0;
1322 lc->key_frame_rate_correction_factor = 1.0;
1323 lc->gf_rate_correction_factor = 1.0;
1324 lc->inter_frame_target = 0.0;
1326 prev_layer_frame_rate = lc->frame_rate;
1330 #if VP8_TEMPORAL_ALT_REF
1334 cpi->fixed_divide[0] = 0;
1336 for (i = 1; i < 512; i++)
1337 cpi->fixed_divide[i] = 0x80000 / i;
1342 static void update_layer_contexts (VP8_COMP *cpi)
1344 VP8_CONFIG *oxcf = &cpi->oxcf;
1346 /* Update snapshots of the layer contexts to reflect new parameters */
1347 if (oxcf->number_of_layers > 1)
1350 double prev_layer_frame_rate=0;
1352 for (i=0; i<oxcf->number_of_layers; i++)
1354 LAYER_CONTEXT *lc = &cpi->layer_context[i];
1357 cpi->ref_frame_rate / oxcf->rate_decimator[i];
1358 lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
1360 lc->starting_buffer_level = rescale(
1361 oxcf->starting_buffer_level_in_ms,
1362 lc->target_bandwidth, 1000);
1364 if (oxcf->optimal_buffer_level == 0)
1365 lc->optimal_buffer_level = lc->target_bandwidth / 8;
1367 lc->optimal_buffer_level = rescale(
1368 oxcf->optimal_buffer_level_in_ms,
1369 lc->target_bandwidth, 1000);
1371 if (oxcf->maximum_buffer_size == 0)
1372 lc->maximum_buffer_size = lc->target_bandwidth / 8;
1374 lc->maximum_buffer_size = rescale(
1375 oxcf->maximum_buffer_size_in_ms,
1376 lc->target_bandwidth, 1000);
1378 // Work out the average size of a frame within this layer
1380 lc->avg_frame_size_for_layer = (oxcf->target_bitrate[i] -
1381 oxcf->target_bitrate[i-1]) * 1000 /
1382 (lc->frame_rate - prev_layer_frame_rate);
1384 lc->active_worst_quality = oxcf->worst_allowed_q;
1385 lc->active_best_quality = oxcf->best_allowed_q;
1386 lc->avg_frame_qindex = oxcf->worst_allowed_q;
1388 prev_layer_frame_rate = lc->frame_rate;
1393 void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
1395 VP8_COMMON *cm = &cpi->common;
1404 #if CONFIG_MULTITHREAD
1405 /* wait for the last picture loopfilter thread done */
1406 if (cpi->b_lpf_running)
1408 sem_wait(&cpi->h_event_end_lpf);
1409 cpi->b_lpf_running = 0;
1413 if (cm->version != oxcf->Version)
1415 cm->version = oxcf->Version;
1416 vp8_setup_version(cm);
1419 last_w = cpi->oxcf.Width;
1420 last_h = cpi->oxcf.Height;
1424 switch (cpi->oxcf.Mode)
1429 cpi->compressor_speed = 2;
1431 if (cpi->oxcf.cpu_used < -16)
1433 cpi->oxcf.cpu_used = -16;
1436 if (cpi->oxcf.cpu_used > 16)
1437 cpi->oxcf.cpu_used = 16;
1441 case MODE_GOODQUALITY:
1443 cpi->compressor_speed = 1;
1445 if (cpi->oxcf.cpu_used < -5)
1447 cpi->oxcf.cpu_used = -5;
1450 if (cpi->oxcf.cpu_used > 5)
1451 cpi->oxcf.cpu_used = 5;
1455 case MODE_BESTQUALITY:
1457 cpi->compressor_speed = 0;
1460 case MODE_FIRSTPASS:
1462 cpi->compressor_speed = 1;
1464 case MODE_SECONDPASS:
1466 cpi->compressor_speed = 1;
1468 if (cpi->oxcf.cpu_used < -5)
1470 cpi->oxcf.cpu_used = -5;
1473 if (cpi->oxcf.cpu_used > 5)
1474 cpi->oxcf.cpu_used = 5;
1477 case MODE_SECONDPASS_BEST:
1479 cpi->compressor_speed = 0;
1484 cpi->auto_worst_q = 1;
1486 cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1487 cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1488 cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1490 if (oxcf->fixed_q >= 0)
1492 if (oxcf->worst_allowed_q < 0)
1493 cpi->oxcf.fixed_q = q_trans[0];
1495 cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1497 if (oxcf->alt_q < 0)
1498 cpi->oxcf.alt_q = q_trans[0];
1500 cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1502 if (oxcf->key_q < 0)
1503 cpi->oxcf.key_q = q_trans[0];
1505 cpi->oxcf.key_q = q_trans[oxcf->key_q];
1507 if (oxcf->gold_q < 0)
1508 cpi->oxcf.gold_q = q_trans[0];
1510 cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1514 cpi->baseline_gf_interval =
1515 cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1517 cpi->ref_frame_flags = VP8_ALT_FLAG | VP8_GOLD_FLAG | VP8_LAST_FLAG;
1519 //cpi->use_golden_frame_only = 0;
1520 //cpi->use_last_frame_only = 0;
1521 cm->refresh_golden_frame = 0;
1522 cm->refresh_last_frame = 1;
1523 cm->refresh_entropy_probs = 1;
1525 #if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
1526 cpi->oxcf.token_partitions = 3;
1529 if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
1530 cm->multi_token_partition =
1531 (TOKEN_PARTITION) cpi->oxcf.token_partitions;
1533 setup_features(cpi);
1538 for (i = 0; i < MAX_MB_SEGMENTS; i++)
1539 cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1542 // At the moment the first order values may not be > MAXQ
1543 if (cpi->oxcf.fixed_q > MAXQ)
1544 cpi->oxcf.fixed_q = MAXQ;
1546 // local file playback mode == really big buffer
1547 if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
1549 cpi->oxcf.starting_buffer_level = 60000;
1550 cpi->oxcf.optimal_buffer_level = 60000;
1551 cpi->oxcf.maximum_buffer_size = 240000;
1552 cpi->oxcf.starting_buffer_level_in_ms = 60000;
1553 cpi->oxcf.optimal_buffer_level_in_ms = 60000;
1554 cpi->oxcf.maximum_buffer_size_in_ms = 240000;
1557 // Convert target bandwidth from Kbit/s to Bit/s
1558 cpi->oxcf.target_bandwidth *= 1000;
1560 cpi->oxcf.starting_buffer_level =
1561 rescale(cpi->oxcf.starting_buffer_level,
1562 cpi->oxcf.target_bandwidth, 1000);
1564 // Set or reset optimal and maximum buffer levels.
1565 if (cpi->oxcf.optimal_buffer_level == 0)
1566 cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1568 cpi->oxcf.optimal_buffer_level =
1569 rescale(cpi->oxcf.optimal_buffer_level,
1570 cpi->oxcf.target_bandwidth, 1000);
1572 if (cpi->oxcf.maximum_buffer_size == 0)
1573 cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1575 cpi->oxcf.maximum_buffer_size =
1576 rescale(cpi->oxcf.maximum_buffer_size,
1577 cpi->oxcf.target_bandwidth, 1000);
1579 // Set up frame rate and related parameters rate control values.
1580 vp8_new_frame_rate(cpi, cpi->frame_rate);
1582 // Set absolute upper and lower quality limits
1583 cpi->worst_quality = cpi->oxcf.worst_allowed_q;
1584 cpi->best_quality = cpi->oxcf.best_allowed_q;
1586 // active values should only be modified if out of new range
1587 if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
1589 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1592 else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
1594 cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1596 if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
1598 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1601 else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
1603 cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1606 cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
1608 cpi->cq_target_quality = cpi->oxcf.cq_level;
1610 // Only allow dropped frames in buffered mode
1611 cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1613 cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1616 cm->Width = cpi->oxcf.Width;
1617 cm->Height = cpi->oxcf.Height;
1619 /* TODO(jkoleszar): if an internal spatial resampling is active,
1620 * and we downsize the input image, maybe we should clear the
1621 * internal scale immediately rather than waiting for it to
1625 // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
1626 if (cpi->oxcf.Sharpness > 7)
1627 cpi->oxcf.Sharpness = 7;
1629 cm->sharpness_level = cpi->oxcf.Sharpness;
1631 if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
1633 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
1634 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
1636 Scale2Ratio(cm->horiz_scale, &hr, &hs);
1637 Scale2Ratio(cm->vert_scale, &vr, &vs);
1639 // always go to the next whole number
1640 cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1641 cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1644 if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height)
1645 cpi->force_next_frame_intra = 1;
1647 if (((cm->Width + 15) & 0xfffffff0) !=
1648 cm->yv12_fb[cm->lst_fb_idx].y_width ||
1649 ((cm->Height + 15) & 0xfffffff0) !=
1650 cm->yv12_fb[cm->lst_fb_idx].y_height ||
1651 cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
1653 alloc_raw_frame_buffers(cpi);
1654 vp8_alloc_compressor_data(cpi);
1657 if (cpi->oxcf.fixed_q >= 0)
1659 cpi->last_q[0] = cpi->oxcf.fixed_q;
1660 cpi->last_q[1] = cpi->oxcf.fixed_q;
1663 cpi->Speed = cpi->oxcf.cpu_used;
1665 // force to allowlag to 0 if lag_in_frames is 0;
1666 if (cpi->oxcf.lag_in_frames == 0)
1668 cpi->oxcf.allow_lag = 0;
1670 // Limit on lag buffers as these are not currently dynamically allocated
1671 else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
1672 cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1675 cpi->alt_ref_source = NULL;
1676 cpi->is_src_frame_alt_ref = 0;
1678 #if CONFIG_TEMPORAL_DENOISING
1679 if (cpi->oxcf.noise_sensitivity)
1681 if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc)
1683 int width = (cpi->oxcf.Width + 15) & ~15;
1684 int height = (cpi->oxcf.Height + 15) & ~15;
1685 vp8_denoiser_allocate(&cpi->denoiser, width, height);
1691 // Experimental RD Code
1692 cpi->frame_distortion = 0;
1693 cpi->last_frame_distortion = 0;
1698 #define M_LOG2_E 0.693147180559945309417
1699 #define log2f(x) (log (x) / (float) M_LOG2_E)
1700 static void cal_mvsadcosts(int *mvsadcost[2])
1704 mvsadcost [0] [0] = 300;
1705 mvsadcost [1] [0] = 300;
1709 double z = 256 * (2 * (log2f(8 * i) + .6));
1710 mvsadcost [0][i] = (int) z;
1711 mvsadcost [1][i] = (int) z;
1712 mvsadcost [0][-i] = (int) z;
1713 mvsadcost [1][-i] = (int) z;
1715 while (++i <= mvfp_max);
1718 struct VP8_COMP* vp8_create_compressor(VP8_CONFIG *oxcf)
1725 cpi = vpx_memalign(32, sizeof(VP8_COMP));
1726 // Check that the CPI instance is valid
1732 vpx_memset(cpi, 0, sizeof(VP8_COMP));
1734 if (setjmp(cm->error.jmp))
1736 cpi->common.error.setjmp = 0;
1737 vp8_remove_compressor(&cpi);
1741 cpi->common.error.setjmp = 1;
1743 CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));
1745 vp8_create_common(&cpi->common);
1747 init_config(cpi, oxcf);
1749 memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
1750 cpi->common.current_video_frame = 0;
1751 cpi->kf_overspend_bits = 0;
1752 cpi->kf_bitrate_adjustment = 0;
1753 cpi->frames_till_gf_update_due = 0;
1754 cpi->gf_overspend_bits = 0;
1755 cpi->non_gf_bitrate_adjustment = 0;
1756 cpi->prob_last_coded = 128;
1757 cpi->prob_gf_coded = 128;
1758 cpi->prob_intra_coded = 63;
1760 // Prime the recent reference frame usage counters.
1761 // Hereafter they will be maintained as a sort of moving average
1762 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
1763 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
1764 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1765 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1767 // Set reference frame sign bias for ALTREF frame to 1 (for now)
1768 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1770 cpi->twopass.gf_decay_rate = 0;
1771 cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1773 cpi->gold_is_last = 0 ;
1774 cpi->alt_is_last = 0 ;
1775 cpi->gold_is_alt = 0 ;
1777 // allocate memory for storing last frame's MVs for MV prediction.
1778 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int_mv)));
1779 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int)));
1780 CHECK_MEM_ERROR(cpi->lf_ref_frame, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int)));
1782 // Create the encoder segmentation map and set all entries to 0
1783 CHECK_MEM_ERROR(cpi->segmentation_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
1784 CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
1785 vpx_memset(cpi->active_map , 1, (cpi->common.mb_rows * cpi->common.mb_cols));
1786 cpi->active_map_enabled = 0;
1789 // Experimental code for lagged and one pass
1790 // Initialise one_pass GF frames stats
1791 // Update stats used for GF selection
1794 cpi->one_pass_frame_index = 0;
1796 for (i = 0; i < MAX_LAG_BUFFERS; i++)
1798 cpi->one_pass_frame_stats[i].frames_so_far = 0;
1799 cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1800 cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1801 cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1802 cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1803 cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1804 cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1805 cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1806 cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1811 // Should we use the cyclic refresh method.
1812 // Currently this is tied to error resilliant mode
1813 cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
1814 cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 40;
1815 cpi->cyclic_refresh_mode_index = 0;
1816 cpi->cyclic_refresh_q = 32;
1818 if (cpi->cyclic_refresh_mode_enabled)
1820 CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1823 cpi->cyclic_refresh_map = (signed char *) NULL;
1825 // Test function for segmentation
1826 //segmentation_test_function( cpi);
1828 #ifdef ENTROPY_STATS
1829 init_context_counters();
1832 /*Initialize the feed-forward activity masking.*/
1833 cpi->activity_avg = 90<<12;
1835 cpi->frames_since_key = 8; // Give a sensible default for the first frame.
1836 cpi->key_frame_frequency = cpi->oxcf.key_freq;
1837 cpi->this_key_frame_forced = 0;
1838 cpi->next_key_frame_forced = 0;
1840 cpi->source_alt_ref_pending = 0;
1841 cpi->source_alt_ref_active = 0;
1842 cpi->common.refresh_alt_ref_frame = 0;
1844 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1845 #if CONFIG_INTERNAL_STATS
1846 cpi->b_calculate_ssimg = 0;
1851 if (cpi->b_calculate_psnr)
1853 cpi->total_sq_error = 0.0;
1854 cpi->total_sq_error2 = 0.0;
1859 cpi->totalp_y = 0.0;
1860 cpi->totalp_u = 0.0;
1861 cpi->totalp_v = 0.0;
1863 cpi->tot_recode_hits = 0;
1864 cpi->summed_quality = 0;
1865 cpi->summed_weights = 0;
1868 if (cpi->b_calculate_ssimg)
1870 cpi->total_ssimg_y = 0;
1871 cpi->total_ssimg_u = 0;
1872 cpi->total_ssimg_v = 0;
1873 cpi->total_ssimg_all = 0;
1879 #define LLONG_MAX 9223372036854775807LL
1881 cpi->first_time_stamp_ever = LLONG_MAX;
1883 cpi->frames_till_gf_update_due = 0;
1884 cpi->key_frame_count = 1;
1886 cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
1889 cpi->total_byte_count = 0;
1891 cpi->drop_frame = 0;
1892 cpi->drop_count = 0;
1893 cpi->max_drop_count = 0;
1894 cpi->max_consec_dropped_frames = 4;
1896 cpi->rate_correction_factor = 1.0;
1897 cpi->key_frame_rate_correction_factor = 1.0;
1898 cpi->gf_rate_correction_factor = 1.0;
1899 cpi->twopass.est_max_qcorrection_factor = 1.0;
1901 for (i = 0; i < KEY_FRAME_CONTEXT; i++)
1903 cpi->prior_key_frame_distance[i] = (int)cpi->output_frame_rate;
1906 #ifdef OUTPUT_YUV_SRC
1907 yuv_file = fopen("bd.yuv", "ab");
1911 framepsnr = fopen("framepsnr.stt", "a");
1912 kf_list = fopen("kf_list.stt", "w");
1915 cpi->output_pkt_list = oxcf->output_pkt_list;
1917 #if !(CONFIG_REALTIME_ONLY)
1921 vp8_init_first_pass(cpi);
1923 else if (cpi->pass == 2)
1925 size_t packet_sz = sizeof(FIRSTPASS_STATS);
1926 int packets = oxcf->two_pass_stats_in.sz / packet_sz;
1928 cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1929 cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1930 cpi->twopass.stats_in_end = (void*)((char *)cpi->twopass.stats_in
1931 + (packets - 1) * packet_sz);
1932 vp8_init_second_pass(cpi);
1937 if (cpi->compressor_speed == 2)
1939 cpi->cpu_freq = 0; //vp8_get_processor_freq();
1940 cpi->avg_encode_time = 0;
1941 cpi->avg_pick_mode_time = 0;
1944 vp8_set_speed_features(cpi);
1946 // Set starting values of RD threshold multipliers (128 = *1)
1947 for (i = 0; i < MAX_MODES; i++)
1949 cpi->rd_thresh_mult[i] = 128;
1952 #ifdef ENTROPY_STATS
1953 init_mv_ref_counts();
1956 #if CONFIG_MULTITHREAD
1957 vp8cx_create_encoder_threads(cpi);
1960 cpi->fn_ptr[BLOCK_16X16].sdf = vp8_sad16x16;
1961 cpi->fn_ptr[BLOCK_16X16].vf = vp8_variance16x16;
1962 cpi->fn_ptr[BLOCK_16X16].svf = vp8_sub_pixel_variance16x16;
1963 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h = vp8_variance_halfpixvar16x16_h;
1964 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v = vp8_variance_halfpixvar16x16_v;
1965 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = vp8_variance_halfpixvar16x16_hv;
1966 cpi->fn_ptr[BLOCK_16X16].sdx3f = vp8_sad16x16x3;
1967 cpi->fn_ptr[BLOCK_16X16].sdx8f = vp8_sad16x16x8;
1968 cpi->fn_ptr[BLOCK_16X16].sdx4df = vp8_sad16x16x4d;
1970 cpi->fn_ptr[BLOCK_16X8].sdf = vp8_sad16x8;
1971 cpi->fn_ptr[BLOCK_16X8].vf = vp8_variance16x8;
1972 cpi->fn_ptr[BLOCK_16X8].svf = vp8_sub_pixel_variance16x8;
1973 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h = NULL;
1974 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v = NULL;
1975 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
1976 cpi->fn_ptr[BLOCK_16X8].sdx3f = vp8_sad16x8x3;
1977 cpi->fn_ptr[BLOCK_16X8].sdx8f = vp8_sad16x8x8;
1978 cpi->fn_ptr[BLOCK_16X8].sdx4df = vp8_sad16x8x4d;
1980 cpi->fn_ptr[BLOCK_8X16].sdf = vp8_sad8x16;
1981 cpi->fn_ptr[BLOCK_8X16].vf = vp8_variance8x16;
1982 cpi->fn_ptr[BLOCK_8X16].svf = vp8_sub_pixel_variance8x16;
1983 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h = NULL;
1984 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v = NULL;
1985 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
1986 cpi->fn_ptr[BLOCK_8X16].sdx3f = vp8_sad8x16x3;
1987 cpi->fn_ptr[BLOCK_8X16].sdx8f = vp8_sad8x16x8;
1988 cpi->fn_ptr[BLOCK_8X16].sdx4df = vp8_sad8x16x4d;
1990 cpi->fn_ptr[BLOCK_8X8].sdf = vp8_sad8x8;
1991 cpi->fn_ptr[BLOCK_8X8].vf = vp8_variance8x8;
1992 cpi->fn_ptr[BLOCK_8X8].svf = vp8_sub_pixel_variance8x8;
1993 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h = NULL;
1994 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v = NULL;
1995 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
1996 cpi->fn_ptr[BLOCK_8X8].sdx3f = vp8_sad8x8x3;
1997 cpi->fn_ptr[BLOCK_8X8].sdx8f = vp8_sad8x8x8;
1998 cpi->fn_ptr[BLOCK_8X8].sdx4df = vp8_sad8x8x4d;
2000 cpi->fn_ptr[BLOCK_4X4].sdf = vp8_sad4x4;
2001 cpi->fn_ptr[BLOCK_4X4].vf = vp8_variance4x4;
2002 cpi->fn_ptr[BLOCK_4X4].svf = vp8_sub_pixel_variance4x4;
2003 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h = NULL;
2004 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v = NULL;
2005 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
2006 cpi->fn_ptr[BLOCK_4X4].sdx3f = vp8_sad4x4x3;
2007 cpi->fn_ptr[BLOCK_4X4].sdx8f = vp8_sad4x4x8;
2008 cpi->fn_ptr[BLOCK_4X4].sdx4df = vp8_sad4x4x4d;
2010 #if ARCH_X86 || ARCH_X86_64
2011 cpi->fn_ptr[BLOCK_16X16].copymem = vp8_copy32xn;
2012 cpi->fn_ptr[BLOCK_16X8].copymem = vp8_copy32xn;
2013 cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn;
2014 cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn;
2015 cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn;
2018 cpi->full_search_sad = vp8_full_search_sad;
2019 cpi->diamond_search_sad = vp8_diamond_search_sad;
2020 cpi->refining_search_sad = vp8_refining_search_sad;
2022 // make sure frame 1 is okay
2023 cpi->error_bins[0] = cpi->common.MBs;
2025 //vp8cx_init_quantizer() is first called here. Add check in vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only called later
2026 //when needed. This will avoid unnecessary calls of vp8cx_init_quantizer() for every frame.
2027 vp8cx_init_quantizer(cpi);
2029 vp8_loop_filter_init(cm);
2031 cpi->common.error.setjmp = 0;
2033 #if CONFIG_MULTI_RES_ENCODING
2035 /* Calculate # of MBs in a row in lower-resolution level image. */
2036 if (cpi->oxcf.mr_encoder_id > 0)
2037 vp8_cal_low_res_mb_cols(cpi);
2041 /* setup RD costs to MACROBLOCK struct */
2043 cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max+1];
2044 cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max+1];
2045 cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max+1];
2046 cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max+1];
2048 cal_mvsadcosts(cpi->mb.mvsadcost);
2050 cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
2051 cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
2052 cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
2053 cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
2054 cpi->mb.token_costs = cpi->rd_costs.token_costs;
2060 void vp8_remove_compressor(VP8_COMP **ptr)
2062 VP8_COMP *cpi = *ptr;
2067 if (cpi && (cpi->common.current_video_frame > 0))
2069 #if !(CONFIG_REALTIME_ONLY)
2073 vp8_end_second_pass(cpi);
2078 #ifdef ENTROPY_STATS
2079 print_context_counters();
2080 print_tree_update_probs();
2081 print_mode_context();
2084 #if CONFIG_INTERNAL_STATS
2088 FILE *f = fopen("opsnr.stt", "a");
2089 double time_encoded = (cpi->last_end_time_stamp_seen
2090 - cpi->first_time_stamp_ever) / 10000000.000;
2091 double total_encode_time = (cpi->time_receive_data +
2092 cpi->time_compress_data) / 1000.000;
2093 double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
2095 if (cpi->b_calculate_psnr)
2097 YV12_BUFFER_CONFIG *lst_yv12 =
2098 &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
2100 if (cpi->oxcf.number_of_layers > 1)
2104 fprintf(f, "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2105 "GLPsnrP\tVPXSSIM\t\n");
2106 for (i=0; i<cpi->oxcf.number_of_layers; i++)
2108 double dr = (double)cpi->bytes_in_layer[i] *
2109 8.0 / 1000.0 / time_encoded;
2110 double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
2111 lst_yv12->y_width * lst_yv12->y_height;
2112 double total_psnr = vp8_mse2psnr(samples, 255.0,
2113 cpi->total_error2[i]);
2114 double total_psnr2 = vp8_mse2psnr(samples, 255.0,
2115 cpi->total_error2_p[i]);
2116 double total_ssim = 100 * pow(cpi->sum_ssim[i] /
2117 cpi->sum_weights[i], 8.0);
2119 fprintf(f, "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2122 cpi->sum_psnr[i] / cpi->frames_in_layer[i],
2124 cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
2125 total_psnr2, total_ssim);
2130 double samples = 3.0 / 2 * cpi->count *
2131 lst_yv12->y_width * lst_yv12->y_height;
2132 double total_psnr = vp8_mse2psnr(samples, 255.0,
2133 cpi->total_sq_error);
2134 double total_psnr2 = vp8_mse2psnr(samples, 255.0,
2135 cpi->total_sq_error2);
2136 double total_ssim = 100 * pow(cpi->summed_quality /
2137 cpi->summed_weights, 8.0);
2139 fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2140 "GLPsnrP\tVPXSSIM\t Time(us)\n");
2141 fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2143 dr, cpi->total / cpi->count, total_psnr,
2144 cpi->totalp / cpi->count, total_psnr2,
2145 total_ssim, total_encode_time);
2149 if (cpi->b_calculate_ssimg)
2151 if (cpi->oxcf.number_of_layers > 1)
2155 fprintf(f, "Layer\tBitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
2157 for (i=0; i<cpi->oxcf.number_of_layers; i++)
2159 double dr = (double)cpi->bytes_in_layer[i] *
2160 8.0 / 1000.0 / time_encoded;
2161 fprintf(f, "%5d\t%7.3f\t%6.4f\t"
2162 "%6.4f\t%6.4f\t%6.4f\t%8.0f\n",
2164 cpi->total_ssimg_y_in_layer[i] /
2165 cpi->frames_in_layer[i],
2166 cpi->total_ssimg_u_in_layer[i] /
2167 cpi->frames_in_layer[i],
2168 cpi->total_ssimg_v_in_layer[i] /
2169 cpi->frames_in_layer[i],
2170 cpi->total_ssimg_all_in_layer[i] /
2171 cpi->frames_in_layer[i],
2177 fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
2179 fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
2180 cpi->total_ssimg_y / cpi->count,
2181 cpi->total_ssimg_u / cpi->count,
2182 cpi->total_ssimg_v / cpi->count,
2183 cpi->total_ssimg_all / cpi->count, total_encode_time);
2189 f = fopen("qskip.stt", "a");
2190 fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2201 if (cpi->compressor_speed == 2)
2204 FILE *f = fopen("cxspeed.stt", "a");
2205 cnt_pm /= cpi->common.MBs;
2207 for (i = 0; i < 16; i++)
2208 fprintf(f, "%5d", frames_at_speed[i]);
2211 //fprintf(f, "%10d PM %10d %10d %10d EF %10d %10d %10d\n", cpi->Speed, cpi->avg_pick_mode_time, (tot_pm/cnt_pm), cnt_pm, cpi->avg_encode_time, 0, 0);
2220 extern int count_mb_seg[4];
2221 FILE *f = fopen("modes.stt", "a");
2222 double dr = (double)cpi->frame_rate * (double)bytes * (double)8 / (double)count / (double)1000 ;
2223 fprintf(f, "intra_mode in Intra Frames:\n");
2224 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
2225 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
2230 for (i = 0; i < 10; i++)
2231 fprintf(f, "%8d, ", b_modes[i]);
2237 fprintf(f, "Modes in Inter Frames:\n");
2238 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2239 inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
2240 inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
2241 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2246 for (i = 0; i < 15; i++)
2247 fprintf(f, "%8d, ", inter_b_modes[i]);
2252 fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
2253 fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);
2261 #ifdef ENTROPY_STATS
2264 FILE *fmode = fopen("modecontext.c", "w");
2266 fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
2267 fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
2268 fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
2270 for (i = 0; i < 10; i++)
2273 fprintf(fmode, " { //Above Mode : %d\n", i);
2275 for (j = 0; j < 10; j++)
2278 fprintf(fmode, " {");
2280 for (k = 0; k < 10; k++)
2282 if (!intra_mode_stats[i][j][k])
2283 fprintf(fmode, " %5d, ", 1);
2285 fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2288 fprintf(fmode, "}, // left_mode %d\n", j);
2292 fprintf(fmode, " },\n");
2296 fprintf(fmode, "};\n");
2302 #if defined(SECTIONBITS_OUTPUT)
2307 FILE *f = fopen("tokenbits.stt", "a");
2309 for (i = 0; i < 28; i++)
2310 fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2320 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2321 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
2322 printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame, cpi->time_receive_data / 1000, cpi->time_encode_mb_row / 1000, cpi->time_compress_data / 1000, (cpi->time_receive_data + cpi->time_compress_data) / 1000);
2328 #if CONFIG_MULTITHREAD
2329 vp8cx_remove_encoder_threads(cpi);
2332 #if CONFIG_TEMPORAL_DENOISING
2333 vp8_denoiser_free(&cpi->denoiser);
2335 dealloc_compressor_data(cpi);
2336 vpx_free(cpi->mb.ss);
2338 vpx_free(cpi->cyclic_refresh_map);
2340 vp8_remove_common(&cpi->common);
2344 #ifdef OUTPUT_YUV_SRC
2364 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2365 unsigned char *recon, int recon_stride,
2366 unsigned int cols, unsigned int rows)
2368 unsigned int row, col;
2369 uint64_t total_sse = 0;
2372 for (row = 0; row + 16 <= rows; row += 16)
2374 for (col = 0; col + 16 <= cols; col += 16)
2378 vp8_mse16x16(orig + col, orig_stride,
2379 recon + col, recon_stride,
2384 /* Handle odd-sized width */
2387 unsigned int border_row, border_col;
2388 unsigned char *border_orig = orig;
2389 unsigned char *border_recon = recon;
2391 for (border_row = 0; border_row < 16; border_row++)
2393 for (border_col = col; border_col < cols; border_col++)
2395 diff = border_orig[border_col] - border_recon[border_col];
2396 total_sse += diff * diff;
2399 border_orig += orig_stride;
2400 border_recon += recon_stride;
2404 orig += orig_stride * 16;
2405 recon += recon_stride * 16;
2408 /* Handle odd-sized height */
2409 for (; row < rows; row++)
2411 for (col = 0; col < cols; col++)
2413 diff = orig[col] - recon[col];
2414 total_sse += diff * diff;
2417 orig += orig_stride;
2418 recon += recon_stride;
2421 vp8_clear_system_state();
2426 static void generate_psnr_packet(VP8_COMP *cpi)
2428 YV12_BUFFER_CONFIG *orig = cpi->Source;
2429 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
2430 struct vpx_codec_cx_pkt pkt;
2433 unsigned int width = cpi->common.Width;
2434 unsigned int height = cpi->common.Height;
2436 pkt.kind = VPX_CODEC_PSNR_PKT;
2437 sse = calc_plane_error(orig->y_buffer, orig->y_stride,
2438 recon->y_buffer, recon->y_stride,
2440 pkt.data.psnr.sse[0] = sse;
2441 pkt.data.psnr.sse[1] = sse;
2442 pkt.data.psnr.samples[0] = width * height;
2443 pkt.data.psnr.samples[1] = width * height;
2445 width = (width + 1) / 2;
2446 height = (height + 1) / 2;
2448 sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
2449 recon->u_buffer, recon->uv_stride,
2451 pkt.data.psnr.sse[0] += sse;
2452 pkt.data.psnr.sse[2] = sse;
2453 pkt.data.psnr.samples[0] += width * height;
2454 pkt.data.psnr.samples[2] = width * height;
2456 sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
2457 recon->v_buffer, recon->uv_stride,
2459 pkt.data.psnr.sse[0] += sse;
2460 pkt.data.psnr.sse[3] = sse;
2461 pkt.data.psnr.samples[0] += width * height;
2462 pkt.data.psnr.samples[3] = width * height;
2464 for (i = 0; i < 4; i++)
2465 pkt.data.psnr.psnr[i] = vp8_mse2psnr(pkt.data.psnr.samples[i], 255.0,
2466 pkt.data.psnr.sse[i]);
2468 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2472 int vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags)
2474 if (ref_frame_flags > 7)
2477 cpi->ref_frame_flags = ref_frame_flags;
2480 int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags)
2482 if (ref_frame_flags > 7)
2485 cpi->common.refresh_golden_frame = 0;
2486 cpi->common.refresh_alt_ref_frame = 0;
2487 cpi->common.refresh_last_frame = 0;
2489 if (ref_frame_flags & VP8_LAST_FLAG)
2490 cpi->common.refresh_last_frame = 1;
2492 if (ref_frame_flags & VP8_GOLD_FLAG)
2493 cpi->common.refresh_golden_frame = 1;
2495 if (ref_frame_flags & VP8_ALT_FLAG)
2496 cpi->common.refresh_alt_ref_frame = 1;
2501 int vp8_get_reference(VP8_COMP *cpi, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2503 VP8_COMMON *cm = &cpi->common;
2506 if (ref_frame_flag == VP8_LAST_FLAG)
2507 ref_fb_idx = cm->lst_fb_idx;
2508 else if (ref_frame_flag == VP8_GOLD_FLAG)
2509 ref_fb_idx = cm->gld_fb_idx;
2510 else if (ref_frame_flag == VP8_ALT_FLAG)
2511 ref_fb_idx = cm->alt_fb_idx;
2515 vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
2519 int vp8_set_reference(VP8_COMP *cpi, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2521 VP8_COMMON *cm = &cpi->common;
2525 if (ref_frame_flag == VP8_LAST_FLAG)
2526 ref_fb_idx = cm->lst_fb_idx;
2527 else if (ref_frame_flag == VP8_GOLD_FLAG)
2528 ref_fb_idx = cm->gld_fb_idx;
2529 else if (ref_frame_flag == VP8_ALT_FLAG)
2530 ref_fb_idx = cm->alt_fb_idx;
2534 vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
2538 int vp8_update_entropy(VP8_COMP *cpi, int update)
2540 VP8_COMMON *cm = &cpi->common;
2541 cm->refresh_entropy_probs = update;
2548 void vp8_write_yuv_frame(const char *name, YV12_BUFFER_CONFIG *s)
2550 FILE *yuv_file = fopen(name, "ab");
2551 unsigned char *src = s->y_buffer;
2552 int h = s->y_height;
2556 fwrite(src, s->y_width, 1, yuv_file);
2566 fwrite(src, s->uv_width, 1, yuv_file);
2567 src += s->uv_stride;
2576 fwrite(src, s->uv_width, 1, yuv_file);
2577 src += s->uv_stride;
2586 static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
2588 VP8_COMMON *cm = &cpi->common;
2590 // are we resizing the image
2591 if (cm->horiz_scale != 0 || cm->vert_scale != 0)
2593 #if CONFIG_SPATIAL_RESAMPLING
2594 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2595 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2598 if (cm->vert_scale == 3)
2603 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2604 Scale2Ratio(cm->vert_scale, &vr, &vs);
2606 vp8_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2607 tmp_height, hs, hr, vs, vr, 0);
2609 vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2610 cpi->Source = &cpi->scaled_source;
2618 static void resize_key_frame(VP8_COMP *cpi)
2620 #if CONFIG_SPATIAL_RESAMPLING
2621 VP8_COMMON *cm = &cpi->common;
2623 // Do we need to apply resampling for one pass cbr.
2624 // In one pass this is more limited than in two pass cbr
2625 // The test and any change is only made one per key frame sequence
2626 if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
2628 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2629 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2630 int new_width, new_height;
2632 // If we are below the resample DOWN watermark then scale down a notch.
2633 if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2635 cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2636 cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2638 // Should we now start scaling back up
2639 else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2641 cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2642 cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2645 // Get the new hieght and width
2646 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2647 Scale2Ratio(cm->vert_scale, &vr, &vs);
2648 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2649 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2651 // If the image size has changed we need to reallocate the buffers
2652 // and resample the source image
2653 if ((cm->Width != new_width) || (cm->Height != new_height))
2655 cm->Width = new_width;
2656 cm->Height = new_height;
2657 vp8_alloc_compressor_data(cpi);
2658 scale_and_extend_source(cpi->un_scaled_source, cpi);
2666 static void update_alt_ref_frame_stats(VP8_COMP *cpi)
2668 VP8_COMMON *cm = &cpi->common;
2670 // Select an interval before next GF or altref
2671 if (!cpi->auto_gold)
2672 cpi->frames_till_gf_update_due = cpi->goldfreq;
2674 if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
2676 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2678 // Set the bits per frame that we should try and recover in subsequent inter frames
2679 // to account for the extra GF spend... note that his does not apply for GF updates
2680 // that occur coincident with a key frame as the extra cost of key frames is dealt
2683 cpi->gf_overspend_bits += cpi->projected_frame_size;
2684 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2687 // Update data structure that monitors level of reference to last GF
2688 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2689 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2691 // this frame refreshes means next frames don't unless specified by user
2692 cpi->common.frames_since_golden = 0;
2694 // Clear the alternate reference update pending flag.
2695 cpi->source_alt_ref_pending = 0;
2697 // Set the alternate refernce frame active flag
2698 cpi->source_alt_ref_active = 1;
2702 static void update_golden_frame_stats(VP8_COMP *cpi)
2704 VP8_COMMON *cm = &cpi->common;
2706 // Update the Golden frame usage counts.
2707 if (cm->refresh_golden_frame)
2709 // Select an interval before next GF
2710 if (!cpi->auto_gold)
2711 cpi->frames_till_gf_update_due = cpi->goldfreq;
2713 if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
2715 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2717 // Set the bits per frame that we should try and recover in subsequent inter frames
2718 // to account for the extra GF spend... note that his does not apply for GF updates
2719 // that occur coincident with a key frame as the extra cost of key frames is dealt
2721 if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
2723 // Calcluate GF bits to be recovered
2724 // Projected size - av frame bits available for inter frames for clip as a whole
2725 cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
2728 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2732 // Update data structure that monitors level of reference to last GF
2733 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2734 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2736 // this frame refreshes means next frames don't unless specified by user
2737 cm->refresh_golden_frame = 0;
2738 cpi->common.frames_since_golden = 0;
2740 //if ( cm->frame_type == KEY_FRAME )
2742 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2743 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2744 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2745 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2749 // // Carry a potrtion of count over to begining of next gf sequence
2750 // cpi->recent_ref_frame_usage[INTRA_FRAME] >>= 5;
2751 // cpi->recent_ref_frame_usage[LAST_FRAME] >>= 5;
2752 // cpi->recent_ref_frame_usage[GOLDEN_FRAME] >>= 5;
2753 // cpi->recent_ref_frame_usage[ALTREF_FRAME] >>= 5;
2756 // ******** Fixed Q test code only ************
2757 // If we are going to use the ALT reference for the next group of frames set a flag to say so.
2758 if (cpi->oxcf.fixed_q >= 0 &&
2759 cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
2761 cpi->source_alt_ref_pending = 1;
2762 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2765 if (!cpi->source_alt_ref_pending)
2766 cpi->source_alt_ref_active = 0;
2768 // Decrement count down till next gf
2769 if (cpi->frames_till_gf_update_due > 0)
2770 cpi->frames_till_gf_update_due--;
2773 else if (!cpi->common.refresh_alt_ref_frame)
2775 // Decrement count down till next gf
2776 if (cpi->frames_till_gf_update_due > 0)
2777 cpi->frames_till_gf_update_due--;
2779 if (cpi->common.frames_till_alt_ref_frame)
2780 cpi->common.frames_till_alt_ref_frame --;
2782 cpi->common.frames_since_golden ++;
2784 if (cpi->common.frames_since_golden > 1)
2786 cpi->recent_ref_frame_usage[INTRA_FRAME] += cpi->count_mb_ref_frame_usage[INTRA_FRAME];
2787 cpi->recent_ref_frame_usage[LAST_FRAME] += cpi->count_mb_ref_frame_usage[LAST_FRAME];
2788 cpi->recent_ref_frame_usage[GOLDEN_FRAME] += cpi->count_mb_ref_frame_usage[GOLDEN_FRAME];
2789 cpi->recent_ref_frame_usage[ALTREF_FRAME] += cpi->count_mb_ref_frame_usage[ALTREF_FRAME];
2794 // This function updates the reference frame probability estimates that
2795 // will be used during mode selection
2796 static void update_rd_ref_frame_probs(VP8_COMP *cpi)
2798 VP8_COMMON *cm = &cpi->common;
2800 const int *const rfct = cpi->count_mb_ref_frame_usage;
2801 const int rf_intra = rfct[INTRA_FRAME];
2802 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2804 if (cm->frame_type == KEY_FRAME)
2806 cpi->prob_intra_coded = 255;
2807 cpi->prob_last_coded = 128;
2808 cpi->prob_gf_coded = 128;
2810 else if (!(rf_intra + rf_inter))
2812 cpi->prob_intra_coded = 63;
2813 cpi->prob_last_coded = 128;
2814 cpi->prob_gf_coded = 128;
2817 // update reference frame costs since we can do better than what we got last frame.
2818 if (cpi->oxcf.number_of_layers == 1)
2820 if (cpi->common.refresh_alt_ref_frame)
2822 cpi->prob_intra_coded += 40;
2823 cpi->prob_last_coded = 200;
2824 cpi->prob_gf_coded = 1;
2826 else if (cpi->common.frames_since_golden == 0)
2828 cpi->prob_last_coded = 214;
2830 else if (cpi->common.frames_since_golden == 1)
2832 cpi->prob_last_coded = 192;
2833 cpi->prob_gf_coded = 220;
2835 else if (cpi->source_alt_ref_active)
2837 cpi->prob_gf_coded -= 20;
2839 if (cpi->prob_gf_coded < 10)
2840 cpi->prob_gf_coded = 10;
2842 if (!cpi->source_alt_ref_active)
2843 cpi->prob_gf_coded = 255;
2848 // 1 = key, 0 = inter
2849 static int decide_key_frame(VP8_COMP *cpi)
2851 VP8_COMMON *cm = &cpi->common;
2853 int code_key_frame = 0;
2857 if (cpi->Speed > 11)
2860 // Clear down mmx registers
2861 vp8_clear_system_state(); //__asm emms;
2863 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
2865 double change = 1.0 * abs((int)(cpi->intra_error - cpi->last_intra_error)) / (1 + cpi->last_intra_error);
2866 double change2 = 1.0 * abs((int)(cpi->prediction_error - cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
2867 double minerror = cm->MBs * 256;
2871 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
2872 && cpi->prediction_error > minerror
2873 && (change > .25 || change2 > .25))
2875 FILE *f = fopen("intra_inter.stt", "a");
2877 if (cpi->prediction_error <= 0)
2878 cpi->prediction_error = 1;
2880 fprintf(f, "%d %d %d %d %14.4f\n",
2881 cm->current_video_frame,
2882 (int) cpi->prediction_error,
2883 (int) cpi->intra_error,
2884 (int)((10 * cpi->intra_error) / cpi->prediction_error),
2892 cpi->last_intra_error = cpi->intra_error;
2893 cpi->last_prediction_error = cpi->prediction_error;
2895 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
2896 && cpi->prediction_error > minerror
2897 && (change > .25 || change2 > .25))
2899 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
2907 // If the following are true we might as well code a key frame
2908 if (((cpi->this_frame_percent_intra == 100) &&
2909 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
2910 ((cpi->this_frame_percent_intra > 95) &&
2911 (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
2915 // in addition if the following are true and this is not a golden frame then code a key frame
2916 // Note that on golden frames there often seems to be a pop in intra useage anyway hence this
2917 // restriction is designed to prevent spurious key frames. The Intra pop needs to be investigated.
2918 else if (((cpi->this_frame_percent_intra > 60) &&
2919 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
2920 ((cpi->this_frame_percent_intra > 75) &&
2921 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
2922 ((cpi->this_frame_percent_intra > 90) &&
2923 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
2925 if (!cm->refresh_golden_frame)
2929 return code_key_frame;
2933 #if !(CONFIG_REALTIME_ONLY)
2934 static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
2939 vp8_set_quantizer(cpi, 26);
2941 vp8_first_pass(cpi);
2946 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
2954 sprintf(filename, "cx\\y%04d.raw", this_frame);
2955 yframe = fopen(filename, "wb");
2957 for (i = 0; i < frame->y_height; i++)
2958 fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
2961 sprintf(filename, "cx\\u%04d.raw", this_frame);
2962 yframe = fopen(filename, "wb");
2964 for (i = 0; i < frame->uv_height; i++)
2965 fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
2968 sprintf(filename, "cx\\v%04d.raw", this_frame);
2969 yframe = fopen(filename, "wb");
2971 for (i = 0; i < frame->uv_height; i++)
2972 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
2977 // return of 0 means drop frame
2979 // Function to test for conditions that indeicate we should loop
2980 // back and recode a frame.
2981 static int recode_loop_test( VP8_COMP *cpi,
2982 int high_limit, int low_limit,
2983 int q, int maxq, int minq )
2985 int force_recode = 0;
2986 VP8_COMMON *cm = &cpi->common;
2988 // Is frame recode allowed at all
2989 // Yes if either recode mode 1 is selected or mode two is selcted
2990 // and the frame is a key frame. golden frame or alt_ref_frame
2991 if ( (cpi->sf.recode_loop == 1) ||
2992 ( (cpi->sf.recode_loop == 2) &&
2993 ( (cm->frame_type == KEY_FRAME) ||
2994 cm->refresh_golden_frame ||
2995 cm->refresh_alt_ref_frame ) ) )
2997 // General over and under shoot tests
2998 if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
2999 ((cpi->projected_frame_size < low_limit) && (q > minq)) )
3003 // Special Constrained quality tests
3004 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3006 // Undershoot and below auto cq level
3007 if ( (q > cpi->cq_target_quality) &&
3008 (cpi->projected_frame_size <
3009 ((cpi->this_frame_target * 7) >> 3)))
3013 // Severe undershoot and between auto and user cq level
3014 else if ( (q > cpi->oxcf.cq_level) &&
3015 (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
3016 (cpi->active_best_quality > cpi->oxcf.cq_level))
3019 cpi->active_best_quality = cpi->oxcf.cq_level;
3024 return force_recode;
3027 static void update_reference_frames(VP8_COMMON *cm)
3029 YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
3031 // At this point the new frame has been encoded.
3032 // If any buffer copy / swapping is signaled it should be done here.
3034 if (cm->frame_type == KEY_FRAME)
3036 yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FLAG | VP8_ALT_FLAG ;
3038 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3039 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3041 cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
3043 else /* For non key frames */
3045 if (cm->refresh_alt_ref_frame)
3047 assert(!cm->copy_buffer_to_arf);
3049 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALT_FLAG;
3050 cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3051 cm->alt_fb_idx = cm->new_fb_idx;
3053 else if (cm->copy_buffer_to_arf)
3055 assert(!(cm->copy_buffer_to_arf & ~0x3));
3057 if (cm->copy_buffer_to_arf == 1)
3059 if(cm->alt_fb_idx != cm->lst_fb_idx)
3061 yv12_fb[cm->lst_fb_idx].flags |= VP8_ALT_FLAG;
3062 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3063 cm->alt_fb_idx = cm->lst_fb_idx;
3066 else /* if (cm->copy_buffer_to_arf == 2) */
3068 if(cm->alt_fb_idx != cm->gld_fb_idx)
3070 yv12_fb[cm->gld_fb_idx].flags |= VP8_ALT_FLAG;
3071 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3072 cm->alt_fb_idx = cm->gld_fb_idx;
3077 if (cm->refresh_golden_frame)
3079 assert(!cm->copy_buffer_to_gf);
3081 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FLAG;
3082 cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3083 cm->gld_fb_idx = cm->new_fb_idx;
3085 else if (cm->copy_buffer_to_gf)
3087 assert(!(cm->copy_buffer_to_arf & ~0x3));
3089 if (cm->copy_buffer_to_gf == 1)
3091 if(cm->gld_fb_idx != cm->lst_fb_idx)
3093 yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FLAG;
3094 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3095 cm->gld_fb_idx = cm->lst_fb_idx;
3098 else /* if (cm->copy_buffer_to_gf == 2) */
3100 if(cm->alt_fb_idx != cm->gld_fb_idx)
3102 yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FLAG;
3103 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3104 cm->gld_fb_idx = cm->alt_fb_idx;
3110 if (cm->refresh_last_frame)
3112 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FLAG;
3113 cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FLAG;
3114 cm->lst_fb_idx = cm->new_fb_idx;
3118 void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
3122 cm->filter_level = 0;
3126 struct vpx_usec_timer timer;
3128 vp8_clear_system_state();
3130 vpx_usec_timer_start(&timer);
3131 if (cpi->sf.auto_filter == 0)
3132 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3135 vp8cx_pick_filter_level(cpi->Source, cpi);
3137 vpx_usec_timer_mark(&timer);
3138 cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3141 #if CONFIG_MULTITHREAD
3142 if (cpi->b_multi_threaded)
3143 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3146 if (cm->filter_level > 0)
3148 vp8cx_set_alt_lf_level(cpi, cm->filter_level);
3149 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd);
3152 vp8_yv12_extend_frame_borders(cm->frame_to_show);
3153 #if CONFIG_TEMPORAL_DENOISING
3154 if (cpi->oxcf.noise_sensitivity)
3156 vp8_yv12_extend_frame_borders(&cpi->denoiser.yv12_running_avg);
3161 static void encode_frame_to_data_rate
3164 unsigned long *size,
3165 unsigned char *dest,
3166 unsigned char* dest_end,
3167 unsigned int *frame_flags
3171 int frame_over_shoot_limit;
3172 int frame_under_shoot_limit;
3177 VP8_COMMON *cm = &cpi->common;
3178 int active_worst_qchanged = 0;
3180 #if !(CONFIG_REALTIME_ONLY)
3184 int zbin_oq_low = 0;
3187 int overshoot_seen = 0;
3188 int undershoot_seen = 0;
3191 int drop_mark = cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100;
3192 int drop_mark75 = drop_mark * 2 / 3;
3193 int drop_mark50 = drop_mark / 4;
3194 int drop_mark25 = drop_mark / 8;
3197 // Clear down mmx registers to allow floating point in what follows
3198 vp8_clear_system_state();
3200 #if CONFIG_MULTITHREAD
3201 /* wait for the last picture loopfilter thread done */
3202 if (cpi->b_lpf_running)
3204 sem_wait(&cpi->h_event_end_lpf);
3205 cpi->b_lpf_running = 0;
3209 // Test code for segmentation of gf/arf (0,0)
3210 //segmentation_test_function( cpi);
3212 if(cpi->force_next_frame_intra)
3214 cm->frame_type = KEY_FRAME; /* delayed intra frame */
3215 cpi->force_next_frame_intra = 0;
3218 // For an alt ref frame in 2 pass we skip the call to the second pass function that sets the target bandwidth
3219 #if !(CONFIG_REALTIME_ONLY)
3223 if (cpi->common.refresh_alt_ref_frame)
3225 cpi->per_frame_bandwidth = cpi->twopass.gf_bits; // Per frame bit target for the alt ref frame
3226 cpi->target_bandwidth = cpi->twopass.gf_bits * cpi->output_frame_rate; // per second target bitrate
3231 cpi->per_frame_bandwidth = (int)(cpi->target_bandwidth / cpi->output_frame_rate);
3233 // Default turn off buffer to buffer copying
3234 cm->copy_buffer_to_gf = 0;
3235 cm->copy_buffer_to_arf = 0;
3237 // Clear zbin over-quant value and mode boost values.
3238 cpi->zbin_over_quant = 0;
3239 cpi->zbin_mode_boost = 0;
3241 // Enable or disable mode based tweaking of the zbin
3242 // For 2 Pass Only used where GF/ARF prediction quality
3243 // is above a threshold
3244 cpi->zbin_mode_boost_enabled = 1;
3247 if ( cpi->gfu_boost <= 400 )
3249 cpi->zbin_mode_boost_enabled = 0;
3253 // Current default encoder behaviour for the altref sign bias
3254 if (cpi->source_alt_ref_active)
3255 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3257 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3259 // Check to see if a key frame is signalled
3260 // For two pass with auto key frame enabled cm->frame_type may already be set, but not for one pass.
3261 if ((cm->current_video_frame == 0) ||
3262 (cm->frame_flags & FRAMEFLAGS_KEY) ||
3263 (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
3265 // Key frame from VFW/auto-keyframe/first frame
3266 cm->frame_type = KEY_FRAME;
3269 #if CONFIG_MULTI_RES_ENCODING
3270 /* In multi-resolution encoding, frame_type is decided by lowest-resolution
3271 * encoder. Same frame_type is adopted while encoding at other resolution.
3273 if (cpi->oxcf.mr_encoder_id)
3276 ((LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info)->frame_type;
3280 // Set default state for segment and mode based loop filter update flags
3281 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
3282 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
3283 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
3285 // Set various flags etc to special state if it is a key frame
3286 if (cm->frame_type == KEY_FRAME)
3290 // Reset the loop filter deltas and segmentation map
3291 setup_features(cpi);
3293 // If segmentation is enabled force a map update for key frames
3294 if (cpi->mb.e_mbd.segmentation_enabled)
3296 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3297 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3300 // The alternate reference frame cannot be active for a key frame
3301 cpi->source_alt_ref_active = 0;
3303 // Reset the RD threshold multipliers to default of * 1 (128)
3304 for (i = 0; i < MAX_MODES; i++)
3306 cpi->rd_thresh_mult[i] = 128;
3310 // Test code for segmentation
3311 //if ( (cm->frame_type == KEY_FRAME) || ((cm->current_video_frame % 2) == 0))
3312 //if ( (cm->current_video_frame % 2) == 0 )
3313 // enable_segmentation(cpi);
3315 // disable_segmentation(cpi);
3318 // Experimental code for lagged compress and one pass
3319 // Initialise one_pass GF frames stats
3320 // Update stats used for GF selection
3321 //if ( cpi->pass == 0 )
3323 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3325 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3326 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3327 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3328 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3329 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3330 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3331 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3332 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3333 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3337 update_rd_ref_frame_probs(cpi);
3339 if (cpi->drop_frames_allowed)
3341 // The reset to decimation 0 is only done here for one pass.
3342 // Once it is set two pass leaves decimation on till the next kf.
3343 if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
3344 cpi->decimation_factor --;
3346 if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
3347 cpi->decimation_factor = 1;
3349 else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
3351 cpi->decimation_factor = 3;
3353 else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
3355 cpi->decimation_factor = 2;
3357 else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
3359 cpi->decimation_factor = 1;
3361 //vpx_log("Encoder: Decimation Factor: %d \n",cpi->decimation_factor);
3364 // The following decimates the frame rate according to a regular pattern (i.e. to 1/2 or 2/3 frame rate)
3365 // This can be used to help prevent buffer under-run in CBR mode. Alternatively it might be desirable in
3366 // some situations to drop frame rate but throw more bits at each frame.
3368 // Note that dropping a key frame can be problematic if spatial resampling is also active
3369 if (cpi->decimation_factor > 0)
3371 switch (cpi->decimation_factor)
3374 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
3377 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3380 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3384 // Note that we should not throw out a key frame (especially when spatial resampling is enabled).
3385 if ((cm->frame_type == KEY_FRAME)) // && cpi->oxcf.allow_spatial_resampling )
3387 cpi->decimation_count = cpi->decimation_factor;
3389 else if (cpi->decimation_count > 0)
3391 cpi->decimation_count --;
3393 cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3394 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
3395 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
3397 cm->current_video_frame++;
3398 cpi->frames_since_key++;
3400 #if CONFIG_INTERNAL_STATS
3404 cpi->buffer_level = cpi->bits_off_target;
3406 if (cpi->oxcf.number_of_layers > 1)
3410 // Propagate bits saved by dropping the frame to higher layers
3411 for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
3413 LAYER_CONTEXT *lc = &cpi->layer_context[i];
3414 lc->bits_off_target += cpi->av_per_frame_bandwidth;
3415 if (lc->bits_off_target > lc->maximum_buffer_size)
3416 lc->bits_off_target = lc->maximum_buffer_size;
3417 lc->buffer_level = lc->bits_off_target;
3424 cpi->decimation_count = cpi->decimation_factor;
3427 // Decide how big to make the frame
3428 if (!vp8_pick_frame_size(cpi))
3430 cm->current_video_frame++;
3431 cpi->frames_since_key++;
3435 // Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
3436 // This has a knock on effect on active best quality as well.
3437 // For CBR if the buffer reaches its maximum level then we can no longer
3438 // save up bits for later frames so we might as well use them up
3439 // on the current frame.
3440 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
3441 (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
3443 int Adjustment = cpi->active_worst_quality / 4; // Max adjustment is 1/4
3449 if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
3451 buff_lvl_step = (cpi->oxcf.maximum_buffer_size - cpi->oxcf.optimal_buffer_level) / Adjustment;
3454 Adjustment = (cpi->buffer_level - cpi->oxcf.optimal_buffer_level) / buff_lvl_step;
3459 cpi->active_worst_quality -= Adjustment;
3461 if(cpi->active_worst_quality < cpi->active_best_quality)
3462 cpi->active_worst_quality = cpi->active_best_quality;
3466 // Set an active best quality and if necessary active worst quality
3467 // There is some odd behavior for one pass here that needs attention.
3468 if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
3470 vp8_clear_system_state();
3472 Q = cpi->active_worst_quality;
3474 if ( cm->frame_type == KEY_FRAME )
3476 if ( cpi->pass == 2 )
3478 if (cpi->gfu_boost > 600)
3479 cpi->active_best_quality = kf_low_motion_minq[Q];
3481 cpi->active_best_quality = kf_high_motion_minq[Q];
3483 // Special case for key frames forced because we have reached
3484 // the maximum key frame interval. Here force the Q to a range
3485 // based on the ambient Q to reduce the risk of popping
3486 if ( cpi->this_key_frame_forced )
3488 if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
3489 cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
3490 else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
3491 cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3494 // One pass more conservative
3496 cpi->active_best_quality = kf_high_motion_minq[Q];
3499 else if (cpi->oxcf.number_of_layers==1 &&
3500 (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame))
3502 // Use the lower of cpi->active_worst_quality and recent
3503 // average Q as basis for GF/ARF Q limit unless last frame was
3505 if ( (cpi->frames_since_key > 1) &&
3506 (cpi->avg_frame_qindex < cpi->active_worst_quality) )
3508 Q = cpi->avg_frame_qindex;
3511 // For constrained quality dont allow Q less than the cq level
3512 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3513 (Q < cpi->cq_target_quality) )
3515 Q = cpi->cq_target_quality;
3518 if ( cpi->pass == 2 )
3520 if ( cpi->gfu_boost > 1000 )
3521 cpi->active_best_quality = gf_low_motion_minq[Q];
3522 else if ( cpi->gfu_boost < 400 )
3523 cpi->active_best_quality = gf_high_motion_minq[Q];
3525 cpi->active_best_quality = gf_mid_motion_minq[Q];
3527 // Constrained quality use slightly lower active best.
3528 if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
3530 cpi->active_best_quality =
3531 cpi->active_best_quality * 15/16;
3534 // One pass more conservative
3536 cpi->active_best_quality = gf_high_motion_minq[Q];
3540 cpi->active_best_quality = inter_minq[Q];
3542 // For the constant/constrained quality mode we dont want
3543 // q to fall below the cq level.
3544 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3545 (cpi->active_best_quality < cpi->cq_target_quality) )
3547 // If we are strongly undershooting the target rate in the last
3548 // frames then use the user passed in cq value not the auto
3550 if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
3551 cpi->active_best_quality = cpi->oxcf.cq_level;
3553 cpi->active_best_quality = cpi->cq_target_quality;
3557 // If CBR and the buffer is as full then it is reasonable to allow
3558 // higher quality on the frames to prevent bits just going to waste.
3559 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3561 // Note that the use of >= here elliminates the risk of a devide
3562 // by 0 error in the else if clause
3563 if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
3564 cpi->active_best_quality = cpi->best_quality;
3566 else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
3568 int Fraction = ((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128) / (cpi->oxcf.maximum_buffer_size - cpi->oxcf.optimal_buffer_level);
3569 int min_qadjustment = ((cpi->active_best_quality - cpi->best_quality) * Fraction) / 128;
3571 cpi->active_best_quality -= min_qadjustment;
3575 // Make sure constrained quality mode limits are adhered to for the first
3576 // few frames of one pass encodes
3577 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3579 if ( (cm->frame_type == KEY_FRAME) ||
3580 cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
3582 cpi->active_best_quality = cpi->best_quality;
3584 else if (cpi->active_best_quality < cpi->cq_target_quality)
3586 cpi->active_best_quality = cpi->cq_target_quality;
3590 // Clip the active best and worst quality values to limits
3591 if (cpi->active_worst_quality > cpi->worst_quality)
3592 cpi->active_worst_quality = cpi->worst_quality;
3594 if (cpi->active_best_quality < cpi->best_quality)
3595 cpi->active_best_quality = cpi->best_quality;
3597 if ( cpi->active_worst_quality < cpi->active_best_quality )
3598 cpi->active_worst_quality = cpi->active_best_quality;
3600 // Determine initial Q to try
3601 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3603 #if !(CONFIG_REALTIME_ONLY)
3605 // Set highest allowed value for Zbin over quant
3606 if (cm->frame_type == KEY_FRAME)
3607 zbin_oq_high = 0; //ZBIN_OQ_MAX/16
3608 else if ((cpi->oxcf.number_of_layers == 1) && ((cm->refresh_alt_ref_frame ||
3609 (cm->refresh_golden_frame && !cpi->source_alt_ref_active))))
3614 zbin_oq_high = ZBIN_OQ_MAX;
3617 // Setup background Q adjustment for error resilient mode.
3618 // For multi-layer encodes only enable this for the base layer.
3619 if (cpi->cyclic_refresh_mode_enabled && (cpi->current_layer==0))
3620 cyclic_background_refresh(cpi, Q, 0);
3622 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3624 #if !(CONFIG_REALTIME_ONLY)
3625 // Limit Q range for the adaptive loop.
3626 bottom_index = cpi->active_best_quality;
3627 top_index = cpi->active_worst_quality;
3628 q_low = cpi->active_best_quality;
3629 q_high = cpi->active_worst_quality;
3632 vp8_save_coding_context(cpi);
3636 scale_and_extend_source(cpi->un_scaled_source, cpi);
3638 #if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
3640 if (cpi->oxcf.noise_sensitivity > 0)
3645 switch (cpi->oxcf.noise_sensitivity)
3668 if (cm->frame_type == KEY_FRAME)
3670 vp8_de_noise(cpi->Source, cpi->Source, l , 1, 0);
3674 vp8_de_noise(cpi->Source, cpi->Source, l , 1, 0);
3676 src = cpi->Source->y_buffer;
3678 if (cpi->Source->y_stride < 0)
3680 src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
3687 #ifdef OUTPUT_YUV_SRC
3688 vp8_write_yuv_frame(cpi->Source);
3693 vp8_clear_system_state(); //__asm emms;
3696 if(cpi->is_src_frame_alt_ref)
3700 vp8_set_quantizer(cpi, Q);
3702 // setup skip prob for costing in mode/mv decision
3703 if (cpi->common.mb_no_coeff_skip)
3705 cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
3707 if (cm->frame_type != KEY_FRAME)
3709 if (cpi->common.refresh_alt_ref_frame)
3711 if (cpi->last_skip_false_probs[2] != 0)
3712 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3715 if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
3716 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3717 else if (cpi->last_skip_false_probs[2]!=0)
3718 cpi->prob_skip_false = (cpi->last_skip_false_probs[2] + cpi->prob_skip_false ) / 2;
3721 else if (cpi->common.refresh_golden_frame)
3723 if (cpi->last_skip_false_probs[1] != 0)
3724 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3727 if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
3728 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3729 else if (cpi->last_skip_false_probs[1]!=0)
3730 cpi->prob_skip_false = (cpi->last_skip_false_probs[1] + cpi->prob_skip_false ) / 2;
3735 if (cpi->last_skip_false_probs[0] != 0)
3736 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3739 if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
3740 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3741 else if(cpi->last_skip_false_probs[0]!=0)
3742 cpi->prob_skip_false = (cpi->last_skip_false_probs[0] + cpi->prob_skip_false ) / 2;
3746 //as this is for cost estimate, let's make sure it does not go extreme eitehr way
3747 if (cpi->prob_skip_false < 5)
3748 cpi->prob_skip_false = 5;
3750 if (cpi->prob_skip_false > 250)
3751 cpi->prob_skip_false = 250;
3753 if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref)
3754 cpi->prob_skip_false = 1;
3761 FILE *f = fopen("skip.stt", "a");
3762 fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
3770 if (cm->frame_type == KEY_FRAME)
3772 resize_key_frame(cpi);
3773 vp8_setup_key_frame(cpi);
3778 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
3780 if(cpi->oxcf.error_resilient_mode)
3781 cm->refresh_entropy_probs = 0;
3783 if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
3785 if (cm->frame_type == KEY_FRAME)
3786 cm->refresh_entropy_probs = 1;
3789 if (cm->refresh_entropy_probs == 0)
3791 // save a copy for later refresh
3792 vpx_memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
3795 vp8_update_coef_context(cpi);
3797 vp8_update_coef_probs(cpi);
3799 // transform / motion compensation build reconstruction frame
3800 // +pack coef partitions
3801 vp8_encode_frame(cpi);
3803 /* cpi->projected_frame_size is not needed for RT mode */
3806 // transform / motion compensation build reconstruction frame
3807 vp8_encode_frame(cpi);
3809 cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
3810 cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
3812 vp8_clear_system_state(); //__asm emms;
3814 // Test to see if the stats generated for this frame indicate that we should have coded a key frame
3815 // (assuming that we didn't)!
3816 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
3818 int key_frame_decision = decide_key_frame(cpi);
3820 if (cpi->compressor_speed == 2)
3822 /* we don't do re-encoding in realtime mode
3823 * if key frame is decided then we force it on next frame */
3824 cpi->force_next_frame_intra = key_frame_decision;
3826 #if !(CONFIG_REALTIME_ONLY)
3827 else if (key_frame_decision)
3829 // Reset all our sizing numbers and recode
3830 cm->frame_type = KEY_FRAME;
3832 vp8_pick_frame_size(cpi);
3834 // Clear the Alt reference frame active flag when we have a key frame
3835 cpi->source_alt_ref_active = 0;
3837 // Reset the loop filter deltas and segmentation map
3838 setup_features(cpi);
3840 // If segmentation is enabled force a map update for key frames
3841 if (cpi->mb.e_mbd.segmentation_enabled)
3843 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3844 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3847 vp8_restore_coding_context(cpi);
3849 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3851 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3853 // Limit Q range for the adaptive loop.
3854 bottom_index = cpi->active_best_quality;
3855 top_index = cpi->active_worst_quality;
3856 q_low = cpi->active_best_quality;
3857 q_high = cpi->active_worst_quality;
3867 vp8_clear_system_state();
3869 if (frame_over_shoot_limit == 0)
3870 frame_over_shoot_limit = 1;
3872 // Are we are overshooting and up against the limit of active max Q.
3873 if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
3874 (Q == cpi->active_worst_quality) &&
3875 (cpi->active_worst_quality < cpi->worst_quality) &&
3876 (cpi->projected_frame_size > frame_over_shoot_limit))
3878 int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;
3880 // If so is there any scope for relaxing it
3881 while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
3883 cpi->active_worst_quality++;
3885 over_size_percent = (int)(over_size_percent * 0.96); // Assume 1 qstep = about 4% on frame size.
3887 #if !(CONFIG_REALTIME_ONLY)
3888 top_index = cpi->active_worst_quality;
3890 // If we have updated the active max Q do not call vp8_update_rate_correction_factors() this loop.
3891 active_worst_qchanged = 1;
3894 active_worst_qchanged = 0;
3896 #if !(CONFIG_REALTIME_ONLY)
3897 // Special case handling for forced key frames
3898 if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
3901 int kf_err = vp8_calc_ss_err(cpi->Source,
3902 &cm->yv12_fb[cm->new_fb_idx]);
3904 // The key frame is not good enough
3905 if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
3908 q_high = (Q > q_low) ? (Q - 1) : q_low;
3911 Q = (q_high + q_low) >> 1;
3913 // The key frame is much better than the previous frame
3914 else if ( kf_err < (cpi->ambient_err >> 1) )
3917 q_low = (Q < q_high) ? (Q + 1) : q_high;
3920 Q = (q_high + q_low + 1) >> 1;
3923 // Clamp Q to upper and lower limits:
3932 // Is the projected frame size out of range and are we allowed to attempt to recode.
3933 else if ( recode_loop_test( cpi,
3934 frame_over_shoot_limit, frame_under_shoot_limit,
3935 Q, top_index, bottom_index ) )
3940 // Frame size out of permitted range:
3941 // Update correction factor & compute new Q to try...
3943 // Frame is too large
3944 if (cpi->projected_frame_size > cpi->this_frame_target)
3946 //if ( cpi->zbin_over_quant == 0 )
3947 q_low = (Q < q_high) ? (Q + 1) : q_high; // Raise Qlow as to at least the current value
3949 if (cpi->zbin_over_quant > 0) // If we are using over quant do the same for zbin_oq_low
3950 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi->zbin_over_quant + 1) : zbin_oq_high;
3952 //if ( undershoot_seen || (Q == MAXQ) )
3953 if (undershoot_seen)
3955 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3956 if (!active_worst_qchanged)
3957 vp8_update_rate_correction_factors(cpi, 1);
3959 Q = (q_high + q_low + 1) / 2;
3961 // Adjust cpi->zbin_over_quant (only allowed when Q is max)
3963 cpi->zbin_over_quant = 0;
3966 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi->zbin_over_quant + 1) : zbin_oq_high;
3967 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
3972 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3973 if (!active_worst_qchanged)
3974 vp8_update_rate_correction_factors(cpi, 0);
3976 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3978 while (((Q < q_low) || (cpi->zbin_over_quant < zbin_oq_low)) && (Retries < 10))
3980 vp8_update_rate_correction_factors(cpi, 0);
3981 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3988 // Frame is too small
3991 if (cpi->zbin_over_quant == 0)
3992 q_high = (Q > q_low) ? (Q - 1) : q_low; // Lower q_high if not using over quant
3993 else // else lower zbin_oq_high
3994 zbin_oq_high = (cpi->zbin_over_quant > zbin_oq_low) ? (cpi->zbin_over_quant - 1) : zbin_oq_low;
3998 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3999 if (!active_worst_qchanged)
4000 vp8_update_rate_correction_factors(cpi, 1);
4002 Q = (q_high + q_low) / 2;
4004 // Adjust cpi->zbin_over_quant (only allowed when Q is max)
4006 cpi->zbin_over_quant = 0;
4008 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
4012 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
4013 if (!active_worst_qchanged)
4014 vp8_update_rate_correction_factors(cpi, 0);
4016 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4018 // Special case reset for qlow for constrained quality.
4019 // This should only trigger where there is very substantial
4020 // undershoot on a frame and the auto cq level is above
4021 // the user passsed in value.
4022 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4028 while (((Q > q_high) || (cpi->zbin_over_quant > zbin_oq_high)) && (Retries < 10))
4030 vp8_update_rate_correction_factors(cpi, 0);
4031 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4036 undershoot_seen = 1;
4039 // Clamp Q to upper and lower limits:
4045 // Clamp cpi->zbin_over_quant
4046 cpi->zbin_over_quant = (cpi->zbin_over_quant < zbin_oq_low) ? zbin_oq_low : (cpi->zbin_over_quant > zbin_oq_high) ? zbin_oq_high : cpi->zbin_over_quant;
4054 if (cpi->is_src_frame_alt_ref)
4059 vp8_restore_coding_context(cpi);
4061 #if CONFIG_INTERNAL_STATS
4062 cpi->tot_recode_hits++;
4069 // Experimental code for lagged and one pass
4070 // Update stats used for one pass GF selection
4074 double frame_intra_error;
4075 double frame_coded_error;
4076 double frame_pcnt_inter;
4077 double frame_pcnt_motion;
4079 double frame_mvr_abs;
4081 double frame_mvc_abs;
4084 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4085 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4086 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4090 // Special case code to reduce pulsing when key frames are forced at a
4091 // fixed interval. Note the reconstruction error if it is the frame before
4092 // the force key frame
4093 if ( cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0) )
4095 cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
4096 &cm->yv12_fb[cm->new_fb_idx]);
4099 /* This frame's MVs are saved and will be used in next frame's MV predictor.
4100 * Last frame has one more line(add to bottom) and one more column(add to
4101 * right) than cm->mip. The edge elements are initialized to 0.
4103 #if CONFIG_MULTI_RES_ENCODING
4104 if(!cpi->oxcf.mr_encoder_id && cm->show_frame)
4106 if(cm->show_frame) /* do not save for altref frame */
4111 /* Point to beginning of allocated MODE_INFO arrays. */
4112 MODE_INFO *tmp = cm->mip;
4114 if(cm->frame_type != KEY_FRAME)
4116 for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
4118 for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
4120 if(tmp->mbmi.ref_frame != INTRA_FRAME)
4121 cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;
4123 cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4124 cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
4131 #if CONFIG_MULTI_RES_ENCODING
4132 vp8_cal_dissimilarity(cpi);
4135 // Update the GF useage maps.
4136 // This is done after completing the compression of a frame when all
4137 // modes etc. are finalized but before loop filter
4138 if (cpi->oxcf.number_of_layers == 1)
4139 vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4141 if (cm->frame_type == KEY_FRAME)
4142 cm->refresh_last_frame = 1;
4146 FILE *f = fopen("gfactive.stt", "a");
4147 fprintf(f, "%8d %8d %8d %8d %8d\n", cm->current_video_frame, (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols), cpi->this_iiratio, cpi->next_iiratio, cm->refresh_golden_frame);
4152 // For inter frames the current default behavior is that when
4153 // cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4154 // This is purely an encoder decision at present.
4155 if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
4156 cm->copy_buffer_to_arf = 2;
4158 cm->copy_buffer_to_arf = 0;
4160 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4162 #if CONFIG_MULTITHREAD
4163 if (cpi->b_multi_threaded)
4165 sem_post(&cpi->h_event_start_lpf); /* start loopfilter in separate thread */
4166 cpi->b_lpf_running = 1;
4171 vp8_loopfilter_frame(cpi, cm);
4174 update_reference_frames(cm);
4176 #if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
4177 if (cpi->oxcf.error_resilient_mode)
4179 cm->refresh_entropy_probs = 0;
4183 #if CONFIG_MULTITHREAD
4184 /* wait that filter_level is picked so that we can continue with stream packing */
4185 if (cpi->b_multi_threaded)
4186 sem_wait(&cpi->h_event_end_lpf);
4189 // build the bitstream
4190 vp8_pack_bitstream(cpi, dest, dest_end, size);
4192 #if CONFIG_MULTITHREAD
4193 /* if PSNR packets are generated we have to wait for the lpf */
4194 if (cpi->b_lpf_running && cpi->b_calculate_psnr)
4196 sem_wait(&cpi->h_event_end_lpf);
4197 cpi->b_lpf_running = 0;
4201 /* Move storing frame_type out of the above loop since it is also
4202 * needed in motion search besides loopfilter */
4203 cm->last_frame_type = cm->frame_type;
4205 // Update rate control heuristics
4206 cpi->total_byte_count += (*size);
4207 cpi->projected_frame_size = (*size) << 3;
4209 if (cpi->oxcf.number_of_layers > 1)
4212 for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
4213 cpi->layer_context[i].total_byte_count += (*size);
4216 if (!active_worst_qchanged)
4217 vp8_update_rate_correction_factors(cpi, 2);
4219 cpi->last_q[cm->frame_type] = cm->base_qindex;
4221 if (cm->frame_type == KEY_FRAME)
4223 vp8_adjust_key_frame_context(cpi);
4226 // Keep a record of ambient average Q.
4227 if (cm->frame_type != KEY_FRAME)
4228 cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4230 // Keep a record from which we can calculate the average Q excluding GF updates and key frames
4231 if ((cm->frame_type != KEY_FRAME) && ((cpi->oxcf.number_of_layers > 1) ||
4232 (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)))
4236 // Calculate the average Q for normal inter frames (not key or GFU
4238 if ( cpi->pass == 2 )
4240 cpi->ni_tot_qi += Q;
4241 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4245 // Damp value for first few frames
4246 if (cpi->ni_frames > 150 )
4248 cpi->ni_tot_qi += Q;
4249 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4251 // For one pass, early in the clip ... average the current frame Q
4252 // value with the worstq entered by the user as a dampening measure
4255 cpi->ni_tot_qi += Q;
4256 cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4259 // If the average Q is higher than what was used in the last frame
4260 // (after going through the recode loop to keep the frame size within range)
4261 // then use the last frame value - 1.
4262 // The -1 is designed to stop Q and hence the data rate, from progressively
4263 // falling away during difficult sections, but at the same time reduce the number of
4264 // itterations around the recode loop.
4265 if (Q > cpi->ni_av_qi)
4266 cpi->ni_av_qi = Q - 1;
4272 // If the frame was massively oversize and we are below optimal buffer level drop next frame
4273 if ((cpi->drop_frames_allowed) &&
4274 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
4275 (cpi->buffer_level < cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100) &&
4276 (cpi->projected_frame_size > (4 * cpi->this_frame_target)))
4278 cpi->drop_frame = 1;
4283 // Set the count for maximum consecutive dropped frames based upon the ratio of
4284 // this frame size to the target average per frame bandwidth.
4285 // (cpi->av_per_frame_bandwidth > 0) is just a sanity check to prevent / 0.
4286 if (cpi->drop_frames_allowed && (cpi->av_per_frame_bandwidth > 0))
4288 cpi->max_drop_count = cpi->projected_frame_size / cpi->av_per_frame_bandwidth;
4290 if (cpi->max_drop_count > cpi->max_consec_dropped_frames)
4291 cpi->max_drop_count = cpi->max_consec_dropped_frames;
4294 // Update the buffer level variable.
4295 // Non-viewable frames are a special case and are treated as pure overhead.
4296 if ( !cm->show_frame )
4297 cpi->bits_off_target -= cpi->projected_frame_size;
4299 cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4301 // Clip the buffer level to the maximum specified buffer size
4302 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
4303 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
4305 // Rolling monitors of whether we are over or underspending used to help regulate min and Max Q in two pass.
4306 cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
4307 cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
4308 cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
4309 cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;
4311 // Actual bits spent
4312 cpi->total_actual_bits += cpi->projected_frame_size;
4315 cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);
4317 cpi->buffer_level = cpi->bits_off_target;
4319 // Propagate values to higher temporal layers
4320 if (cpi->oxcf.number_of_layers > 1)
4324 for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
4326 LAYER_CONTEXT *lc = &cpi->layer_context[i];
4327 int bits_off_for_this_layer = lc->target_bandwidth / lc->frame_rate
4328 - cpi->projected_frame_size;
4330 lc->bits_off_target += bits_off_for_this_layer;
4332 // Clip buffer level to maximum buffer size for the layer
4333 if (lc->bits_off_target > lc->maximum_buffer_size)
4334 lc->bits_off_target = lc->maximum_buffer_size;
4336 lc->total_actual_bits += cpi->projected_frame_size;
4337 lc->total_target_vs_actual += bits_off_for_this_layer;
4338 lc->buffer_level = lc->bits_off_target;
4342 // Update bits left to the kf and gf groups to account for overshoot or undershoot on these frames
4343 if (cm->frame_type == KEY_FRAME)
4345 cpi->twopass.kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4347 if (cpi->twopass.kf_group_bits < 0)
4348 cpi->twopass.kf_group_bits = 0 ;
4350 else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4352 cpi->twopass.gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4354 if (cpi->twopass.gf_group_bits < 0)
4355 cpi->twopass.gf_group_bits = 0 ;
4358 if (cm->frame_type != KEY_FRAME)
4360 if (cpi->common.refresh_alt_ref_frame)
4362 cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4363 cpi->last_skip_probs_q[2] = cm->base_qindex;
4365 else if (cpi->common.refresh_golden_frame)
4367 cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4368 cpi->last_skip_probs_q[1] = cm->base_qindex;
4372 cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4373 cpi->last_skip_probs_q[0] = cm->base_qindex;
4375 //update the baseline
4376 cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4381 #if 0 && CONFIG_INTERNAL_STATS
4383 FILE *f = fopen("tmp.stt", "a");
4385 vp8_clear_system_state(); //__asm emms;
4387 if (cpi->twopass.total_left_stats.coded_error != 0.0)
4388 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %10d %6d %6d"
4389 "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f"
4391 cpi->common.current_video_frame, cpi->this_frame_target,
4392 cpi->projected_frame_size,
4393 (cpi->projected_frame_size - cpi->this_frame_target),
4394 (int)cpi->total_target_vs_actual,
4396 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4397 (int)cpi->total_actual_bits, cm->base_qindex,
4398 cpi->active_best_quality, cpi->active_worst_quality,
4399 cpi->ni_av_qi, cpi->cq_target_quality,
4400 cpi->zbin_over_quant,
4401 //cpi->avg_frame_qindex, cpi->zbin_over_quant,
4402 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4403 cm->frame_type, cpi->gfu_boost,
4404 cpi->twopass.est_max_qcorrection_factor,
4405 (int)cpi->twopass.bits_left,
4406 cpi->twopass.total_left_stats.coded_error,
4407 (double)cpi->twopass.bits_left /
4408 cpi->twopass.total_left_stats.coded_error,
4409 cpi->tot_recode_hits);
4411 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %10d %6d %6d"
4412 "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f"
4414 cpi->common.current_video_frame,
4415 cpi->this_frame_target, cpi->projected_frame_size,
4416 (cpi->projected_frame_size - cpi->this_frame_target),
4417 (int)cpi->total_target_vs_actual,
4419 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4420 (int)cpi->total_actual_bits, cm->base_qindex,
4421 cpi->active_best_quality, cpi->active_worst_quality,
4422 cpi->ni_av_qi, cpi->cq_target_quality,
4423 cpi->zbin_over_quant,
4424 //cpi->avg_frame_qindex, cpi->zbin_over_quant,
4425 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4426 cm->frame_type, cpi->gfu_boost,
4427 cpi->twopass.est_max_qcorrection_factor,
4428 (int)cpi->twopass.bits_left,
4429 cpi->twopass.total_left_stats.coded_error,
4430 cpi->tot_recode_hits);
4435 FILE *fmodes = fopen("Modes.stt", "a");
4438 fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4439 cpi->common.current_video_frame,
4440 cm->frame_type, cm->refresh_golden_frame,
4441 cm->refresh_alt_ref_frame);
4443 for (i = 0; i < MAX_MODES; i++)
4444 fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
4446 fprintf(fmodes, "\n");
4454 // If this was a kf or Gf note the Q
4455 if ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4456 cm->last_kf_gf_q = cm->base_qindex;
4458 if (cm->refresh_golden_frame == 1)
4459 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4461 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
4463 if (cm->refresh_alt_ref_frame == 1)
4464 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4466 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
4469 if (cm->refresh_last_frame & cm->refresh_golden_frame) // both refreshed
4470 cpi->gold_is_last = 1;
4471 else if (cm->refresh_last_frame ^ cm->refresh_golden_frame) // 1 refreshed but not the other
4472 cpi->gold_is_last = 0;
4474 if (cm->refresh_last_frame & cm->refresh_alt_ref_frame) // both refreshed
4475 cpi->alt_is_last = 1;
4476 else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame) // 1 refreshed but not the other
4477 cpi->alt_is_last = 0;
4479 if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame) // both refreshed
4480 cpi->gold_is_alt = 1;
4481 else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame) // 1 refreshed but not the other
4482 cpi->gold_is_alt = 0;
4484 cpi->ref_frame_flags = VP8_ALT_FLAG | VP8_GOLD_FLAG | VP8_LAST_FLAG;
4486 if (cpi->gold_is_last)
4487 cpi->ref_frame_flags &= ~VP8_GOLD_FLAG;
4489 if (cpi->alt_is_last)
4490 cpi->ref_frame_flags &= ~VP8_ALT_FLAG;
4492 if (cpi->gold_is_alt)
4493 cpi->ref_frame_flags &= ~VP8_ALT_FLAG;
4496 if (!cpi->oxcf.error_resilient_mode)
4498 if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
4499 // Update the alternate reference frame stats as appropriate.
4500 update_alt_ref_frame_stats(cpi);
4502 // Update the Golden frame stats as appropriate.
4503 update_golden_frame_stats(cpi);
4506 if (cm->frame_type == KEY_FRAME)
4508 // Tell the caller that the frame was coded as a key frame
4509 *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4511 // As this frame is a key frame the next defaults to an inter frame.
4512 cm->frame_type = INTER_FRAME;
4514 cpi->last_frame_percent_intra = 100;
4518 *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
4520 cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4523 // Clear the one shot update flags for segmentation map and mode/ref loop filter deltas.
4524 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4525 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4526 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4529 // Dont increment frame counters if this was an altref buffer update not a real frame
4532 cm->current_video_frame++;
4533 cpi->frames_since_key++;
4536 // reset to normal state now that we are done.
4544 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
4545 recon_file = fopen(filename, "wb");
4546 fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4547 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4553 //vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show);
4559 static void check_gf_quality(VP8_COMP *cpi)
4561 VP8_COMMON *cm = &cpi->common;
4562 int gf_active_pct = (100 * cpi->gf_active_count) / (cm->mb_rows * cm->mb_cols);
4563 int gf_ref_usage_pct = (cpi->count_mb_ref_frame_usage[GOLDEN_FRAME] * 100) / (cm->mb_rows * cm->mb_cols);
4564 int last_ref_zz_useage = (cpi->inter_zz_count * 100) / (cm->mb_rows * cm->mb_cols);
4566 // Gf refresh is not currently being signalled
4567 if (cpi->gf_update_recommended == 0)
4569 if (cpi->common.frames_since_golden > 7)
4572 if ((gf_active_pct < 10) || ((gf_active_pct + gf_ref_usage_pct) < 15))
4574 // ...but last frame zero zero usage is reasonbable so a new gf might be appropriate
4575 if (last_ref_zz_useage >= 25)
4577 cpi->gf_bad_count ++;
4579 if (cpi->gf_bad_count >= 8) // Check that the condition is stable
4581 cpi->gf_update_recommended = 1;
4582 cpi->gf_bad_count = 0;
4586 cpi->gf_bad_count = 0; // Restart count as the background is not stable enough
4589 cpi->gf_bad_count = 0; // Gf useage has picked up so reset count
4592 // If the signal is set but has not been read should we cancel it.
4593 else if (last_ref_zz_useage < 15)
4595 cpi->gf_update_recommended = 0;
4596 cpi->gf_bad_count = 0;
4601 FILE *f = fopen("gfneeded.stt", "a");
4602 fprintf(f, "%10d %10d %10d %10d %10ld \n",
4603 cm->current_video_frame,
4604 cpi->common.frames_since_golden,
4605 gf_active_pct, gf_ref_usage_pct,
4606 cpi->gf_update_recommended);
4613 #if !(CONFIG_REALTIME_ONLY)
4614 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned char * dest_end, unsigned int *frame_flags)
4617 if (!cpi->common.refresh_alt_ref_frame)
4618 vp8_second_pass(cpi);
4620 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
4621 cpi->twopass.bits_left -= 8 * *size;
4623 if (!cpi->common.refresh_alt_ref_frame)
4625 double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
4626 *cpi->oxcf.two_pass_vbrmin_section / 100);
4627 cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->frame_rate);
4632 //For ARM NEON, d8-d15 are callee-saved registers, and need to be saved by us.
4634 extern void vp8_push_neon(int64_t *store);
4635 extern void vp8_pop_neon(int64_t *store);
4639 int vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time)
4642 int64_t store_reg[8];
4644 VP8_COMMON *cm = &cpi->common;
4645 struct vpx_usec_timer timer;
4649 #if CONFIG_RUNTIME_CPU_DETECT
4650 if (cm->cpu_caps & HAS_NEON)
4653 vp8_push_neon(store_reg);
4657 vpx_usec_timer_start(&timer);
4659 /* Reinit the lookahead buffer if the frame size changes */
4660 if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height)
4662 assert(cpi->oxcf.lag_in_frames < 2);
4663 dealloc_raw_frame_buffers(cpi);
4664 alloc_raw_frame_buffers(cpi);
4667 if(vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
4668 frame_flags, cpi->active_map_enabled ? cpi->active_map : NULL))
4670 cm->clr_type = sd->clrtype;
4671 vpx_usec_timer_mark(&timer);
4672 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
4675 #if CONFIG_RUNTIME_CPU_DETECT
4676 if (cm->cpu_caps & HAS_NEON)
4679 vp8_pop_neon(store_reg);
4687 static int frame_is_reference(const VP8_COMP *cpi)
4689 const VP8_COMMON *cm = &cpi->common;
4690 const MACROBLOCKD *xd = &cpi->mb.e_mbd;
4692 return cm->frame_type == KEY_FRAME || cm->refresh_last_frame
4693 || cm->refresh_golden_frame || cm->refresh_alt_ref_frame
4694 || cm->copy_buffer_to_gf || cm->copy_buffer_to_arf
4695 || cm->refresh_entropy_probs
4696 || xd->mode_ref_lf_delta_update
4697 || xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
4701 int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, unsigned char *dest_end, int64_t *time_stamp, int64_t *time_end, int flush)
4704 int64_t store_reg[8];
4707 struct vpx_usec_timer tsctimer;
4708 struct vpx_usec_timer ticktimer;
4709 struct vpx_usec_timer cmptimer;
4710 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
4717 if (setjmp(cpi->common.error.jmp))
4719 cpi->common.error.setjmp = 0;
4720 return VPX_CODEC_CORRUPT_FRAME;
4723 cpi->common.error.setjmp = 1;
4726 #if CONFIG_RUNTIME_CPU_DETECT
4727 if (cm->cpu_caps & HAS_NEON)
4730 vp8_push_neon(store_reg);
4734 vpx_usec_timer_start(&cmptimer);
4738 #if !(CONFIG_REALTIME_ONLY)
4739 // Should we code an alternate reference frame
4740 if (cpi->oxcf.error_resilient_mode == 0 &&
4741 cpi->oxcf.play_alternate &&
4742 cpi->source_alt_ref_pending)
4744 if ((cpi->source = vp8_lookahead_peek(cpi->lookahead,
4745 cpi->frames_till_gf_update_due,
4748 cpi->alt_ref_source = cpi->source;
4749 if (cpi->oxcf.arnr_max_frames > 0)
4751 vp8_temporal_filter_prepare_c(cpi,
4752 cpi->frames_till_gf_update_due);
4753 force_src_buffer = &cpi->alt_ref_buffer;
4755 cm->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
4756 cm->refresh_alt_ref_frame = 1;
4757 cm->refresh_golden_frame = 0;
4758 cm->refresh_last_frame = 0;
4760 cpi->source_alt_ref_pending = 0; // Clear Pending alt Ref flag.
4761 cpi->is_src_frame_alt_ref = 0;
4768 /* Read last frame source if we are encoding first pass. */
4769 if (cpi->pass == 1 && cm->current_video_frame > 0)
4771 if((cpi->last_source = vp8_lookahead_peek(cpi->lookahead, 1,
4772 PEEK_BACKWARD)) == NULL)
4777 if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush)))
4781 cpi->is_src_frame_alt_ref = cpi->alt_ref_source
4782 && (cpi->source == cpi->alt_ref_source);
4784 if(cpi->is_src_frame_alt_ref)
4785 cpi->alt_ref_source = NULL;
4791 cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
4792 cpi->un_scaled_source = cpi->Source;
4793 *time_stamp = cpi->source->ts_start;
4794 *time_end = cpi->source->ts_end;
4795 *frame_flags = cpi->source->flags;
4797 if (cpi->pass == 1 && cm->current_video_frame > 0)
4799 cpi->last_frame_unscaled_source = &cpi->last_source->img;
4805 #if !(CONFIG_REALTIME_ONLY)
4807 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done)
4809 vp8_end_first_pass(cpi); /* get last stats packet */
4810 cpi->twopass.first_pass_done = 1;
4816 #if CONFIG_RUNTIME_CPU_DETECT
4817 if (cm->cpu_caps & HAS_NEON)
4820 vp8_pop_neon(store_reg);
4826 if (cpi->source->ts_start < cpi->first_time_stamp_ever)
4828 cpi->first_time_stamp_ever = cpi->source->ts_start;
4829 cpi->last_end_time_stamp_seen = cpi->source->ts_start;
4832 // adjust frame rates based on timestamps given
4835 int64_t this_duration;
4838 if (cpi->source->ts_start == cpi->first_time_stamp_ever)
4840 this_duration = cpi->source->ts_end - cpi->source->ts_start;
4845 int64_t last_duration;
4847 this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
4848 last_duration = cpi->last_end_time_stamp_seen
4849 - cpi->last_time_stamp_seen;
4850 // do a step update if the duration changes by 10%
4852 step = ((this_duration - last_duration) * 10 / last_duration);
4858 cpi->ref_frame_rate = 10000000.0 / this_duration;
4861 double avg_duration, interval;
4863 /* Average this frame's rate into the last second's average
4864 * frame rate. If we haven't seen 1 second yet, then average
4865 * over the whole interval seen.
4867 interval = cpi->source->ts_end - cpi->first_time_stamp_ever;
4868 if(interval > 10000000.0)
4869 interval = 10000000;
4871 avg_duration = 10000000.0 / cpi->ref_frame_rate;
4872 avg_duration *= (interval - avg_duration + this_duration);
4873 avg_duration /= interval;
4875 cpi->ref_frame_rate = 10000000.0 / avg_duration;
4878 if (cpi->oxcf.number_of_layers > 1)
4882 // Update frame rates for each layer
4883 for (i=0; i<cpi->oxcf.number_of_layers; i++)
4885 LAYER_CONTEXT *lc = &cpi->layer_context[i];
4886 lc->frame_rate = cpi->ref_frame_rate /
4887 cpi->oxcf.rate_decimator[i];
4891 vp8_new_frame_rate(cpi, cpi->ref_frame_rate);
4894 cpi->last_time_stamp_seen = cpi->source->ts_start;
4895 cpi->last_end_time_stamp_seen = cpi->source->ts_end;
4898 if (cpi->oxcf.number_of_layers > 1)
4902 update_layer_contexts (cpi);
4904 // Restore layer specific context & set frame rate
4905 layer = cpi->oxcf.layer_id[
4906 cm->current_video_frame % cpi->oxcf.periodicity];
4907 restore_layer_context (cpi, layer);
4908 vp8_new_frame_rate (cpi, cpi->layer_context[layer].frame_rate);
4911 if (cpi->compressor_speed == 2)
4913 if (cpi->oxcf.number_of_layers == 1)
4914 check_gf_quality(cpi);
4915 vpx_usec_timer_start(&tsctimer);
4916 vpx_usec_timer_start(&ticktimer);
4919 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
4922 const int num_part = (1 << cm->multi_token_partition);
4923 /* the available bytes in dest */
4924 const unsigned long dest_size = dest_end - dest;
4925 const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
4927 unsigned char *dp = dest;
4929 cpi->partition_d[0] = dp;
4930 dp += dest_size/10; /* reserve 1/10 for control partition */
4931 cpi->partition_d_end[0] = dp;
4933 for(i = 0; i < num_part; i++)
4935 cpi->partition_d[i + 1] = dp;
4936 dp += tok_part_buff_size;
4937 cpi->partition_d_end[i + 1] = dp;
4942 // start with a 0 size frame
4945 // Clear down mmx registers
4946 vp8_clear_system_state(); //__asm emms;
4948 cm->frame_type = INTER_FRAME;
4949 cm->frame_flags = *frame_flags;
4953 if (cm->refresh_alt_ref_frame)
4955 //cm->refresh_golden_frame = 1;
4956 cm->refresh_golden_frame = 0;
4957 cm->refresh_last_frame = 0;
4961 cm->refresh_golden_frame = 0;
4962 cm->refresh_last_frame = 1;
4966 /* find a free buffer for the new frame */
4969 for(; i < NUM_YV12_BUFFERS; i++)
4971 if(!cm->yv12_fb[i].flags)
4978 assert(i < NUM_YV12_BUFFERS );
4980 #if !(CONFIG_REALTIME_ONLY)
4984 Pass1Encode(cpi, size, dest, frame_flags);
4986 else if (cpi->pass == 2)
4988 Pass2Encode(cpi, size, dest, dest_end, frame_flags);
4992 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
4994 if (cpi->compressor_speed == 2)
4996 unsigned int duration, duration2;
4997 vpx_usec_timer_mark(&tsctimer);
4998 vpx_usec_timer_mark(&ticktimer);
5000 duration = vpx_usec_timer_elapsed(&ticktimer);
5001 duration2 = (unsigned int)((double)duration / 2);
5003 if (cm->frame_type != KEY_FRAME)
5005 if (cpi->avg_encode_time == 0)
5006 cpi->avg_encode_time = duration;
5008 cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
5013 //if(*frame_flags!=1)
5016 if (cpi->avg_pick_mode_time == 0)
5017 cpi->avg_pick_mode_time = duration2;
5019 cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
5025 if (cm->refresh_entropy_probs == 0)
5027 vpx_memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
5030 // Save the contexts separately for alt ref, gold and last.
5031 // (TODO jbb -> Optimize this with pointers to avoid extra copies. )
5032 if(cm->refresh_alt_ref_frame)
5033 vpx_memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
5035 if(cm->refresh_golden_frame)
5036 vpx_memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
5038 if(cm->refresh_last_frame)
5039 vpx_memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
5041 // if its a dropped frame honor the requests on subsequent frames
5044 cpi->droppable = !frame_is_reference(cpi);
5046 // return to normal state
5047 cm->refresh_entropy_probs = 1;
5048 cm->refresh_alt_ref_frame = 0;
5049 cm->refresh_golden_frame = 0;
5050 cm->refresh_last_frame = 1;
5051 cm->frame_type = INTER_FRAME;
5055 // Save layer specific state
5056 if (cpi->oxcf.number_of_layers > 1)
5057 save_layer_context (cpi);
5059 vpx_usec_timer_mark(&cmptimer);
5060 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
5062 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
5064 generate_psnr_packet(cpi);
5067 #if CONFIG_INTERNAL_STATS
5071 cpi->bytes += *size;
5078 if (cpi->b_calculate_psnr)
5082 YV12_BUFFER_CONFIG *orig = cpi->Source;
5083 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
5084 int y_samples = orig->y_height * orig->y_width ;
5085 int uv_samples = orig->uv_height * orig->uv_width ;
5086 int t_samples = y_samples + 2 * uv_samples;
5087 int64_t sq_error, sq_error2;
5089 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
5090 recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height);
5092 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
5093 recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);
5095 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
5096 recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);
5098 sq_error = ye + ue + ve;
5100 frame_psnr = vp8_mse2psnr(t_samples, 255.0, sq_error);
5102 cpi->total_y += vp8_mse2psnr(y_samples, 255.0, ye);
5103 cpi->total_u += vp8_mse2psnr(uv_samples, 255.0, ue);
5104 cpi->total_v += vp8_mse2psnr(uv_samples, 255.0, ve);
5105 cpi->total_sq_error += sq_error;
5106 cpi->total += frame_psnr;
5109 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
5110 double frame_psnr2, frame_ssim2 = 0;
5113 vp8_deblock(cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0);
5114 vp8_clear_system_state();
5116 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
5117 pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height);
5119 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
5120 pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);
5122 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
5123 pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);
5125 sq_error2 = ye + ue + ve;
5127 frame_psnr2 = vp8_mse2psnr(t_samples, 255.0, sq_error2);
5129 cpi->totalp_y += vp8_mse2psnr(y_samples, 255.0, ye);
5130 cpi->totalp_u += vp8_mse2psnr(uv_samples, 255.0, ue);
5131 cpi->totalp_v += vp8_mse2psnr(uv_samples, 255.0, ve);
5132 cpi->total_sq_error2 += sq_error2;
5133 cpi->totalp += frame_psnr2;
5135 frame_ssim2 = vp8_calc_ssim(cpi->Source,
5136 &cm->post_proc_buffer, 1, &weight);
5138 cpi->summed_quality += frame_ssim2 * weight;
5139 cpi->summed_weights += weight;
5141 if (cpi->oxcf.number_of_layers > 1)
5145 for (i=cpi->current_layer;
5146 i<cpi->oxcf.number_of_layers; i++)
5148 cpi->frames_in_layer[i]++;
5150 cpi->bytes_in_layer[i] += *size;
5151 cpi->sum_psnr[i] += frame_psnr;
5152 cpi->sum_psnr_p[i] += frame_psnr2;
5153 cpi->total_error2[i] += sq_error;
5154 cpi->total_error2_p[i] += sq_error2;
5155 cpi->sum_ssim[i] += frame_ssim2 * weight;
5156 cpi->sum_weights[i] += weight;
5163 if (cpi->b_calculate_ssimg)
5165 double y, u, v, frame_all;
5166 frame_all = vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
5169 if (cpi->oxcf.number_of_layers > 1)
5173 for (i=cpi->current_layer;
5174 i<cpi->oxcf.number_of_layers; i++)
5176 if (!cpi->b_calculate_psnr)
5177 cpi->frames_in_layer[i]++;
5179 cpi->total_ssimg_y_in_layer[i] += y;
5180 cpi->total_ssimg_u_in_layer[i] += u;
5181 cpi->total_ssimg_v_in_layer[i] += v;
5182 cpi->total_ssimg_all_in_layer[i] += frame_all;
5187 cpi->total_ssimg_y += y;
5188 cpi->total_ssimg_u += u;
5189 cpi->total_ssimg_v += v;
5190 cpi->total_ssimg_all += frame_all;
5199 if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
5201 skiptruecount += cpi->skip_true_count;
5202 skipfalsecount += cpi->skip_false_count;
5210 FILE *f = fopen("skip.stt", "a");
5211 fprintf(f, "frame:%4d flags:%4x Q:%4d P:%4d Size:%5d\n", cpi->common.current_video_frame, *frame_flags, cpi->common.base_qindex, cpi->prob_skip_false, *size);
5213 if (cpi->is_src_frame_alt_ref == 1)
5214 fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
5223 #if CONFIG_RUNTIME_CPU_DETECT
5224 if (cm->cpu_caps & HAS_NEON)
5227 vp8_pop_neon(store_reg);
5231 cpi->common.error.setjmp = 0;
5236 int vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
5238 if (cpi->common.refresh_alt_ref_frame)
5244 #if CONFIG_MULTITHREAD
5245 if(cpi->b_lpf_running)
5247 sem_wait(&cpi->h_event_end_lpf);
5248 cpi->b_lpf_running = 0;
5253 ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5256 if (cpi->common.frame_to_show)
5258 *dest = *cpi->common.frame_to_show;
5259 dest->y_width = cpi->common.Width;
5260 dest->y_height = cpi->common.Height;
5261 dest->uv_height = cpi->common.Height / 2;
5269 #endif //!CONFIG_POSTPROC
5270 vp8_clear_system_state();
5275 int vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4])
5277 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5279 if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
5284 disable_segmentation(cpi);
5288 // Set the segmentation Map
5289 set_segmentation_map(cpi, map);
5291 // Activate segmentation.
5292 enable_segmentation(cpi);
5294 // Set up the quant segment data
5295 feature_data[MB_LVL_ALT_Q][0] = delta_q[0];
5296 feature_data[MB_LVL_ALT_Q][1] = delta_q[1];
5297 feature_data[MB_LVL_ALT_Q][2] = delta_q[2];
5298 feature_data[MB_LVL_ALT_Q][3] = delta_q[3];
5300 // Set up the loop segment data s
5301 feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5302 feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5303 feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5304 feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5306 cpi->segment_encode_breakout[0] = threshold[0];
5307 cpi->segment_encode_breakout[1] = threshold[1];
5308 cpi->segment_encode_breakout[2] = threshold[2];
5309 cpi->segment_encode_breakout[3] = threshold[3];
5311 // Initialise the feature data structure
5312 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
5313 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5318 int vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols)
5320 if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols)
5324 vpx_memcpy(cpi->active_map, map, rows * cols);
5325 cpi->active_map_enabled = 1;
5328 cpi->active_map_enabled = 0;
5334 //cpi->active_map_enabled = 0;
5339 int vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
5341 if (horiz_mode <= ONETWO)
5342 cpi->common.horiz_scale = horiz_mode;
5346 if (vert_mode <= ONETWO)
5347 cpi->common.vert_scale = vert_mode;
5356 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest)
5361 unsigned char *src = source->y_buffer;
5362 unsigned char *dst = dest->y_buffer;
5364 // Loop through the Y plane raw and reconstruction data summing (square differences)
5365 for (i = 0; i < source->y_height; i += 16)
5367 for (j = 0; j < source->y_width; j += 16)
5370 Total += vp8_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
5373 src += 16 * source->y_stride;
5374 dst += 16 * dest->y_stride;
5381 int vp8_get_quantizer(VP8_COMP *cpi)
5383 return cpi->common.base_qindex;