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 "vp8/common/onyxc_int.h"
14 #include "vp8/common/systemdependent.h"
16 #include "vp8/common/alloccommon.h"
18 #include "firstpass.h"
20 #include "vpx_scale/vpxscale.h"
21 #include "vp8/common/extend.h"
23 #include "vp8/common/quant_common.h"
24 #include "segmentation.h"
25 #include "vp8/common/g_common.h"
26 #include "vpx_scale/yv12extend.h"
27 #include "vp8/common/postproc.h"
28 #include "vpx_mem/vpx_mem.h"
29 #include "vp8/common/swapyv12buffer.h"
30 #include "vp8/common/threading.h"
31 #include "vpx_ports/vpx_timer.h"
32 #include "temporal_filter.h"
34 #include "vpx_ports/arm.h"
41 #if CONFIG_RUNTIME_CPU_DETECT
42 #define IF_RTCD(x) (x)
43 #define RTCD(x) &cpi->common.rtcd.x
45 #define IF_RTCD(x) NULL
49 extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
50 extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
51 extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
53 extern void vp8_init_loop_filter(VP8_COMMON *cm);
54 extern void vp8_loop_filter_frame(VP8_COMMON *cm, MACROBLOCKD *mbd, int filt_val);
55 extern void vp8_loop_filter_frame_yonly(VP8_COMMON *cm, MACROBLOCKD *mbd, int filt_val, int sharpness_lvl);
56 extern void vp8_dmachine_specific_config(VP8_COMP *cpi);
57 extern void vp8_cmachine_specific_config(VP8_COMP *cpi);
58 extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
59 extern void print_parms(VP8_CONFIG *ocf, char *filenam);
60 extern unsigned int vp8_get_processor_freq();
61 extern void print_tree_update_probs();
62 extern void vp8cx_create_encoder_threads(VP8_COMP *cpi);
63 extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
65 extern void vp8_yv12_copy_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
66 extern void vp8_yv12_copy_src_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
69 int vp8_estimate_entropy_savings(VP8_COMP *cpi);
70 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd);
72 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
74 static void set_default_lf_deltas(VP8_COMP *cpi);
76 extern const int vp8_gf_interval_table[101];
78 #if CONFIG_INTERNAL_STATS
81 extern double vp8_calc_ssim
83 YV12_BUFFER_CONFIG *source,
84 YV12_BUFFER_CONFIG *dest,
87 const vp8_variance_rtcd_vtable_t *rtcd
91 extern double vp8_calc_ssimg
93 YV12_BUFFER_CONFIG *source,
94 YV12_BUFFER_CONFIG *dest,
98 const vp8_variance_rtcd_vtable_t *rtcd
105 #ifdef OUTPUT_YUV_SRC
116 extern int skip_true_count;
117 extern int skip_false_count;
122 extern int intra_mode_stats[10][10][10];
126 unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
127 unsigned int tot_pm = 0;
128 unsigned int cnt_pm = 0;
129 unsigned int tot_ef = 0;
130 unsigned int cnt_ef = 0;
134 extern unsigned __int64 Sectionbits[50];
135 extern int y_modes[5] ;
136 extern int uv_modes[4] ;
137 extern int b_modes[10] ;
139 extern int inter_y_modes[10] ;
140 extern int inter_uv_modes[4] ;
141 extern unsigned int inter_b_modes[15];
144 extern void (*vp8_short_fdct4x4)(short *input, short *output, int pitch);
145 extern void (*vp8_short_fdct8x4)(short *input, short *output, int pitch);
147 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
149 extern const int qrounding_factors[129];
150 extern const int qzbin_factors[129];
151 extern void vp8cx_init_quantizer(VP8_COMP *cpi);
152 extern const int vp8cx_base_skip_false_prob[128];
154 // Tables relating active max Q to active min Q
155 static const int kf_low_motion_minq[QINDEX_RANGE] =
157 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
158 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
159 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
161 3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,
162 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
163 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
164 16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23
166 static const int kf_high_motion_minq[QINDEX_RANGE] =
168 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
169 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
170 1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,
171 3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6,
172 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
173 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
174 16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21,
175 21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30
177 static const int gf_low_motion_minq[QINDEX_RANGE] =
179 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
180 3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,
181 7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,
182 11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,
183 19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,
184 27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,
185 35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,
186 43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
188 static const int gf_mid_motion_minq[QINDEX_RANGE] =
190 0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4,
191 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
192 9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,
193 14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,
194 22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,
195 30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,
196 38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48,
197 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
199 static const int gf_high_motion_minq[QINDEX_RANGE] =
201 0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4,
202 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
203 9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
204 17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,
205 25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,
206 33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,
207 41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54,
208 55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
210 static const int inter_minq[QINDEX_RANGE] =
212 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
213 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
214 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
215 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
216 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
217 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
218 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
219 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
222 void vp8_initialize()
224 static int init_done = 0;
228 vp8_scale_machine_specific_config();
229 vp8_initialize_common();
230 //vp8_dmachine_specific_config();
231 vp8_tokenize_initialize();
236 #ifdef PACKET_TESTING
237 extern FILE *vpxlogc;
240 static void setup_features(VP8_COMP *cpi)
242 // Set up default state for MB feature flags
243 cpi->mb.e_mbd.segmentation_enabled = 0;
244 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
245 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
246 vpx_memset(cpi->mb.e_mbd.mb_segment_tree_probs, 255, sizeof(cpi->mb.e_mbd.mb_segment_tree_probs));
247 vpx_memset(cpi->mb.e_mbd.segment_feature_data, 0, sizeof(cpi->mb.e_mbd.segment_feature_data));
249 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
250 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
251 vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
252 vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
253 vpx_memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
254 vpx_memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
256 set_default_lf_deltas(cpi);
261 static void dealloc_compressor_data(VP8_COMP *cpi)
263 vpx_free(cpi->tplist);
266 // Delete last frame MV storage buffers
270 vpx_free(cpi->lf_ref_frame_sign_bias);
271 cpi->lf_ref_frame_sign_bias = 0;
273 vpx_free(cpi->lf_ref_frame);
274 cpi->lf_ref_frame = 0;
276 // Delete sementation map
277 vpx_free(cpi->segmentation_map);
278 cpi->segmentation_map = 0;
280 vpx_free(cpi->active_map);
283 vp8_de_alloc_frame_buffers(&cpi->common);
285 vp8_yv12_de_alloc_frame_buffer(&cpi->last_frame_uf);
286 vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
287 #if VP8_TEMPORAL_ALT_REF
288 vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
290 vp8_lookahead_destroy(cpi->lookahead);
295 // Structure used to monitor GF usage
296 vpx_free(cpi->gf_active_flags);
297 cpi->gf_active_flags = 0;
299 // Activity mask based per mb zbin adjustments
300 vpx_free(cpi->mb_activity_map);
301 cpi->mb_activity_map = 0;
302 vpx_free(cpi->mb_norm_activity_map);
303 cpi->mb_norm_activity_map = 0;
305 vpx_free(cpi->mb.pip);
308 #if !(CONFIG_REALTIME_ONLY)
309 vpx_free(cpi->twopass.total_stats);
310 cpi->twopass.total_stats = 0;
312 vpx_free(cpi->twopass.this_frame_stats);
313 cpi->twopass.this_frame_stats = 0;
317 static void enable_segmentation(VP8_PTR ptr)
319 VP8_COMP *cpi = (VP8_COMP *)(ptr);
321 // Set the appropriate feature bit
322 cpi->mb.e_mbd.segmentation_enabled = 1;
323 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
324 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
326 static void disable_segmentation(VP8_PTR ptr)
328 VP8_COMP *cpi = (VP8_COMP *)(ptr);
330 // Clear the appropriate feature bit
331 cpi->mb.e_mbd.segmentation_enabled = 0;
334 // Valid values for a segment are 0 to 3
335 // Segmentation map is arrange as [Rows][Columns]
336 static void set_segmentation_map(VP8_PTR ptr, unsigned char *segmentation_map)
338 VP8_COMP *cpi = (VP8_COMP *)(ptr);
340 // Copy in the new segmentation map
341 vpx_memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));
343 // Signal that the map should be updated.
344 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
345 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
348 // The values given for each segment can be either deltas (from the default value chosen for the frame) or absolute values.
350 // Valid range for abs values is (0-127 for MB_LVL_ALT_Q) , (0-63 for SEGMENT_ALT_LF)
351 // Valid range for delta values are (+/-127 for MB_LVL_ALT_Q) , (+/-63 for SEGMENT_ALT_LF)
353 // abs_delta = SEGMENT_DELTADATA (deltas) abs_delta = SEGMENT_ABSDATA (use the absolute values given).
356 static void set_segment_data(VP8_PTR ptr, signed char *feature_data, unsigned char abs_delta)
358 VP8_COMP *cpi = (VP8_COMP *)(ptr);
360 cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
361 vpx_memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
365 static void segmentation_test_function(VP8_PTR ptr)
367 VP8_COMP *cpi = (VP8_COMP *)(ptr);
369 unsigned char *seg_map;
370 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
372 // Create a temporary map for segmentation data.
373 CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
375 // MB loop to set local segmentation map
376 /*for ( i = 0; i < cpi->common.mb_rows; i++ )
378 for ( j = 0; j < cpi->common.mb_cols; j++ )
380 //seg_map[(i*cpi->common.mb_cols) + j] = (j % 2) + ((i%2)* 2);
381 //if ( j < cpi->common.mb_cols/2 )
383 // Segment 1 around the edge else 0
384 if ( (i == 0) || (j == 0) || (i == (cpi->common.mb_rows-1)) || (j == (cpi->common.mb_cols-1)) )
385 seg_map[(i*cpi->common.mb_cols) + j] = 1;
386 //else if ( (i < 2) || (j < 2) || (i > (cpi->common.mb_rows-3)) || (j > (cpi->common.mb_cols-3)) )
387 // seg_map[(i*cpi->common.mb_cols) + j] = 2;
388 //else if ( (i < 5) || (j < 5) || (i > (cpi->common.mb_rows-6)) || (j > (cpi->common.mb_cols-6)) )
389 // seg_map[(i*cpi->common.mb_cols) + j] = 3;
391 seg_map[(i*cpi->common.mb_cols) + j] = 0;
395 // Set the segmentation Map
396 set_segmentation_map(ptr, seg_map);
398 // Activate segmentation.
399 enable_segmentation(ptr);
401 // Set up the quant segment data
402 feature_data[MB_LVL_ALT_Q][0] = 0;
403 feature_data[MB_LVL_ALT_Q][1] = 4;
404 feature_data[MB_LVL_ALT_Q][2] = 0;
405 feature_data[MB_LVL_ALT_Q][3] = 0;
406 // Set up the loop segment data
407 feature_data[MB_LVL_ALT_LF][0] = 0;
408 feature_data[MB_LVL_ALT_LF][1] = 0;
409 feature_data[MB_LVL_ALT_LF][2] = 0;
410 feature_data[MB_LVL_ALT_LF][3] = 0;
412 // Initialise the feature data structure
413 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
414 set_segment_data(ptr, &feature_data[0][0], SEGMENT_DELTADATA);
416 // Delete sementation map
423 // A simple function to cyclically refresh the background at a lower Q
424 static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
426 unsigned char *seg_map;
427 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
429 int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
430 int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
432 // Create a temporary map for segmentation data.
433 CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
435 cpi->cyclic_refresh_q = Q;
437 for (i = Q; i > 0; i--)
439 if (vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*(Q + 128)) / 64))
440 //if ( vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*((2*Q)+96))/64) )
446 cpi->cyclic_refresh_q = i;
448 // Only update for inter frames
449 if (cpi->common.frame_type != KEY_FRAME)
451 // Cycle through the macro_block rows
452 // MB loop to set local segmentation map
453 for (i = cpi->cyclic_refresh_mode_index; i < mbs_in_frame; i++)
455 // If the MB is as a candidate for clean up then mark it for possible boost/refresh (segment 1)
456 // The segment id may get reset to 0 later if the MB gets coded anything other than last frame 0,0
457 // as only (last frame 0,0) MBs are eligable for refresh : that is to say Mbs likely to be background blocks.
458 if (cpi->cyclic_refresh_map[i] == 0)
466 // Skip blocks that have been refreshed recently anyway.
467 if (cpi->cyclic_refresh_map[i] < 0)
468 //cpi->cyclic_refresh_map[i] = cpi->cyclic_refresh_map[i] / 16;
469 cpi->cyclic_refresh_map[i]++;
480 // If we have gone through the frame reset to the start
481 cpi->cyclic_refresh_mode_index = i;
483 if (cpi->cyclic_refresh_mode_index >= mbs_in_frame)
484 cpi->cyclic_refresh_mode_index = 0;
487 // Set the segmentation Map
488 set_segmentation_map((VP8_PTR)cpi, seg_map);
490 // Activate segmentation.
491 enable_segmentation((VP8_PTR)cpi);
493 // Set up the quant segment data
494 feature_data[MB_LVL_ALT_Q][0] = 0;
495 feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
496 feature_data[MB_LVL_ALT_Q][2] = 0;
497 feature_data[MB_LVL_ALT_Q][3] = 0;
499 // Set up the loop segment data
500 feature_data[MB_LVL_ALT_LF][0] = 0;
501 feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
502 feature_data[MB_LVL_ALT_LF][2] = 0;
503 feature_data[MB_LVL_ALT_LF][3] = 0;
505 // Initialise the feature data structure
506 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
507 set_segment_data((VP8_PTR)cpi, &feature_data[0][0], SEGMENT_DELTADATA);
509 // Delete sementation map
516 static void set_default_lf_deltas(VP8_COMP *cpi)
518 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
519 cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
521 vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
522 vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
524 // Test of ref frame deltas
525 cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
526 cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
527 cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
528 cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
530 cpi->mb.e_mbd.mode_lf_deltas[0] = 4; // BPRED
531 cpi->mb.e_mbd.mode_lf_deltas[1] = -2; // Zero
532 cpi->mb.e_mbd.mode_lf_deltas[2] = 2; // New mv
533 cpi->mb.e_mbd.mode_lf_deltas[3] = 4; // Split mv
536 void vp8_set_speed_features(VP8_COMP *cpi)
538 SPEED_FEATURES *sf = &cpi->sf;
539 int Mode = cpi->compressor_speed;
540 int Speed = cpi->Speed;
542 VP8_COMMON *cm = &cpi->common;
543 int last_improved_quant = sf->improved_quant;
545 // Initialise default mode frequency sampling variables
546 for (i = 0; i < MAX_MODES; i ++)
548 cpi->mode_check_freq[i] = 0;
549 cpi->mode_test_hit_counts[i] = 0;
550 cpi->mode_chosen_counts[i] = 0;
553 cpi->mbs_tested_so_far = 0;
555 // best quality defaults
557 sf->search_method = NSTEP;
558 sf->improved_quant = 1;
559 sf->improved_dct = 1;
562 sf->quarter_pixel_search = 1;
563 sf->half_pixel_search = 1;
564 sf->full_freq[0] = 7;
565 sf->full_freq[1] = 7;
566 sf->min_fs_radius = 8;
567 sf->max_fs_radius = 32;
568 sf->iterative_sub_pixel = 1;
569 sf->optimize_coefficients = 1;
570 sf->use_fastquant_for_pick = 0;
571 sf->no_skip_block4x4_search = 1;
574 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
575 sf->improved_mv_pred = 1;
577 // default thresholds to 0
578 for (i = 0; i < MAX_MODES; i++)
579 sf->thresh_mult[i] = 0;
583 #if !(CONFIG_REALTIME_ONLY)
584 case 0: // best quality mode
585 sf->thresh_mult[THR_ZEROMV ] = 0;
586 sf->thresh_mult[THR_ZEROG ] = 0;
587 sf->thresh_mult[THR_ZEROA ] = 0;
588 sf->thresh_mult[THR_NEARESTMV] = 0;
589 sf->thresh_mult[THR_NEARESTG ] = 0;
590 sf->thresh_mult[THR_NEARESTA ] = 0;
591 sf->thresh_mult[THR_NEARMV ] = 0;
592 sf->thresh_mult[THR_NEARG ] = 0;
593 sf->thresh_mult[THR_NEARA ] = 0;
595 sf->thresh_mult[THR_DC ] = 0;
597 sf->thresh_mult[THR_V_PRED ] = 1000;
598 sf->thresh_mult[THR_H_PRED ] = 1000;
599 sf->thresh_mult[THR_B_PRED ] = 2000;
600 sf->thresh_mult[THR_TM ] = 1000;
602 sf->thresh_mult[THR_NEWMV ] = 1000;
603 sf->thresh_mult[THR_NEWG ] = 1000;
604 sf->thresh_mult[THR_NEWA ] = 1000;
606 sf->thresh_mult[THR_SPLITMV ] = 2500;
607 sf->thresh_mult[THR_SPLITG ] = 5000;
608 sf->thresh_mult[THR_SPLITA ] = 5000;
610 sf->full_freq[0] = 7;
611 sf->full_freq[1] = 15;
614 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
618 sf->thresh_mult[THR_NEARESTMV] = 0;
619 sf->thresh_mult[THR_ZEROMV ] = 0;
620 sf->thresh_mult[THR_DC ] = 0;
621 sf->thresh_mult[THR_NEARMV ] = 0;
622 sf->thresh_mult[THR_V_PRED ] = 1000;
623 sf->thresh_mult[THR_H_PRED ] = 1000;
624 sf->thresh_mult[THR_B_PRED ] = 2500;
625 sf->thresh_mult[THR_TM ] = 1000;
627 sf->thresh_mult[THR_NEARESTG ] = 1000;
628 sf->thresh_mult[THR_NEARESTA ] = 1000;
630 sf->thresh_mult[THR_ZEROG ] = 1000;
631 sf->thresh_mult[THR_ZEROA ] = 1000;
632 sf->thresh_mult[THR_NEARG ] = 1000;
633 sf->thresh_mult[THR_NEARA ] = 1000;
636 sf->thresh_mult[THR_ZEROMV ] = 0;
637 sf->thresh_mult[THR_ZEROG ] = 0;
638 sf->thresh_mult[THR_ZEROA ] = 0;
639 sf->thresh_mult[THR_NEARESTMV] = 0;
640 sf->thresh_mult[THR_NEARESTG ] = 0;
641 sf->thresh_mult[THR_NEARESTA ] = 0;
642 sf->thresh_mult[THR_NEARMV ] = 0;
643 sf->thresh_mult[THR_NEARG ] = 0;
644 sf->thresh_mult[THR_NEARA ] = 0;
646 // sf->thresh_mult[THR_DC ] = 0;
648 // sf->thresh_mult[THR_V_PRED ] = 1000;
649 // sf->thresh_mult[THR_H_PRED ] = 1000;
650 // sf->thresh_mult[THR_B_PRED ] = 2000;
651 // sf->thresh_mult[THR_TM ] = 1000;
653 sf->thresh_mult[THR_NEWMV ] = 1000;
654 sf->thresh_mult[THR_NEWG ] = 1000;
655 sf->thresh_mult[THR_NEWA ] = 1000;
657 sf->thresh_mult[THR_SPLITMV ] = 1700;
658 sf->thresh_mult[THR_SPLITG ] = 4500;
659 sf->thresh_mult[THR_SPLITA ] = 4500;
661 sf->thresh_mult[THR_NEWMV ] = 1500;
662 sf->thresh_mult[THR_NEWG ] = 1500;
663 sf->thresh_mult[THR_NEWA ] = 1500;
665 sf->thresh_mult[THR_SPLITMV ] = 5000;
666 sf->thresh_mult[THR_SPLITG ] = 10000;
667 sf->thresh_mult[THR_SPLITA ] = 10000;
669 sf->full_freq[0] = 15;
670 sf->full_freq[1] = 31;
674 /* Disable coefficient optimization above speed 0 */
675 sf->optimize_coefficients = 0;
676 sf->use_fastquant_for_pick = 1;
677 sf->no_skip_block4x4_search = 0;
681 cpi->mode_check_freq[THR_SPLITG] = 2;
682 cpi->mode_check_freq[THR_SPLITA] = 2;
683 cpi->mode_check_freq[THR_SPLITMV] = 0;
688 cpi->mode_check_freq[THR_SPLITG] = 4;
689 cpi->mode_check_freq[THR_SPLITA] = 4;
690 cpi->mode_check_freq[THR_SPLITMV] = 2;
692 sf->thresh_mult[THR_TM ] = 1500;
693 sf->thresh_mult[THR_V_PRED ] = 1500;
694 sf->thresh_mult[THR_H_PRED ] = 1500;
695 sf->thresh_mult[THR_B_PRED ] = 5000;
697 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
699 sf->thresh_mult[THR_NEWMV ] = 2000;
700 sf->thresh_mult[THR_SPLITMV ] = 10000;
703 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
705 sf->thresh_mult[THR_NEARESTG ] = 1500;
706 sf->thresh_mult[THR_ZEROG ] = 1500;
707 sf->thresh_mult[THR_NEARG ] = 1500;
708 sf->thresh_mult[THR_NEWG ] = 2000;
709 sf->thresh_mult[THR_SPLITG ] = 20000;
712 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
714 sf->thresh_mult[THR_NEARESTA ] = 1500;
715 sf->thresh_mult[THR_ZEROA ] = 1500;
716 sf->thresh_mult[THR_NEARA ] = 1500;
717 sf->thresh_mult[THR_NEWA ] = 2000;
718 sf->thresh_mult[THR_SPLITA ] = 20000;
724 cpi->mode_check_freq[THR_SPLITG] = 15;
725 cpi->mode_check_freq[THR_SPLITA] = 15;
726 cpi->mode_check_freq[THR_SPLITMV] = 7;
728 sf->thresh_mult[THR_TM ] = 2000;
729 sf->thresh_mult[THR_V_PRED ] = 2000;
730 sf->thresh_mult[THR_H_PRED ] = 2000;
731 sf->thresh_mult[THR_B_PRED ] = 7500;
733 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
735 sf->thresh_mult[THR_NEWMV ] = 2000;
736 sf->thresh_mult[THR_SPLITMV ] = 25000;
739 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
741 sf->thresh_mult[THR_NEARESTG ] = 2000;
742 sf->thresh_mult[THR_ZEROG ] = 2000;
743 sf->thresh_mult[THR_NEARG ] = 2000;
744 sf->thresh_mult[THR_NEWG ] = 2500;
745 sf->thresh_mult[THR_SPLITG ] = 50000;
748 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
750 sf->thresh_mult[THR_NEARESTA ] = 2000;
751 sf->thresh_mult[THR_ZEROA ] = 2000;
752 sf->thresh_mult[THR_NEARA ] = 2000;
753 sf->thresh_mult[THR_NEWA ] = 2500;
754 sf->thresh_mult[THR_SPLITA ] = 50000;
757 sf->improved_quant = 0;
758 sf->improved_dct = 0;
760 // Only do recode loop on key frames, golden frames and
764 sf->full_freq[0] = 31;
765 sf->full_freq[1] = 63;
770 sf->thresh_mult[THR_SPLITA ] = INT_MAX;
771 sf->thresh_mult[THR_SPLITG ] = INT_MAX;
772 sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
774 cpi->mode_check_freq[THR_V_PRED] = 0;
775 cpi->mode_check_freq[THR_H_PRED] = 0;
776 cpi->mode_check_freq[THR_B_PRED] = 0;
777 cpi->mode_check_freq[THR_NEARG] = 0;
778 cpi->mode_check_freq[THR_NEWG] = 0;
779 cpi->mode_check_freq[THR_NEARA] = 0;
780 cpi->mode_check_freq[THR_NEWA] = 0;
783 sf->recode_loop = 0; // recode loop off
784 sf->RD = 0; // Turn rd off
786 sf->full_freq[0] = 63;
787 sf->full_freq[1] = 127;
792 sf->auto_filter = 0; // Faster selection of loop filter
793 sf->full_freq[0] = INT_MAX;
794 sf->full_freq[1] = INT_MAX;
796 cpi->mode_check_freq[THR_V_PRED] = 2;
797 cpi->mode_check_freq[THR_H_PRED] = 2;
798 cpi->mode_check_freq[THR_B_PRED] = 2;
800 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
802 cpi->mode_check_freq[THR_NEARG] = 2;
803 cpi->mode_check_freq[THR_NEWG] = 4;
806 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
808 cpi->mode_check_freq[THR_NEARA] = 2;
809 cpi->mode_check_freq[THR_NEWA] = 4;
812 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
814 sf->thresh_mult[THR_NEARESTG ] = 2000;
815 sf->thresh_mult[THR_ZEROG ] = 2000;
816 sf->thresh_mult[THR_NEARG ] = 2000;
817 sf->thresh_mult[THR_NEWG ] = 4000;
820 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
822 sf->thresh_mult[THR_NEARESTA ] = 2000;
823 sf->thresh_mult[THR_ZEROA ] = 2000;
824 sf->thresh_mult[THR_NEARA ] = 2000;
825 sf->thresh_mult[THR_NEWA ] = 4000;
832 sf->optimize_coefficients = 0;
835 sf->iterative_sub_pixel = 1;
836 sf->thresh_mult[THR_NEARESTMV] = 0;
837 sf->thresh_mult[THR_ZEROMV ] = 0;
838 sf->thresh_mult[THR_DC ] = 0;
839 sf->thresh_mult[THR_TM ] = 0;
840 sf->thresh_mult[THR_NEARMV ] = 0;
841 sf->thresh_mult[THR_V_PRED ] = 1000;
842 sf->thresh_mult[THR_H_PRED ] = 1000;
843 sf->thresh_mult[THR_B_PRED ] = 2500;
844 sf->thresh_mult[THR_NEARESTG ] = 1000;
845 sf->thresh_mult[THR_ZEROG ] = 1000;
846 sf->thresh_mult[THR_NEARG ] = 1000;
847 sf->thresh_mult[THR_NEARESTA ] = 1000;
848 sf->thresh_mult[THR_ZEROA ] = 1000;
849 sf->thresh_mult[THR_NEARA ] = 1000;
850 sf->thresh_mult[THR_NEWMV ] = 2000;
851 sf->thresh_mult[THR_NEWG ] = 2000;
852 sf->thresh_mult[THR_NEWA ] = 2000;
853 sf->thresh_mult[THR_SPLITMV ] = 5000;
854 sf->thresh_mult[THR_SPLITG ] = 10000;
855 sf->thresh_mult[THR_SPLITA ] = 10000;
856 sf->full_freq[0] = 15;
857 sf->full_freq[1] = 31;
858 sf->search_method = NSTEP;
862 cpi->mode_check_freq[THR_SPLITG] = 4;
863 cpi->mode_check_freq[THR_SPLITA] = 4;
864 cpi->mode_check_freq[THR_SPLITMV] = 2;
866 sf->thresh_mult[THR_DC ] = 0;
867 sf->thresh_mult[THR_TM ] = 1000;
868 sf->thresh_mult[THR_V_PRED ] = 2000;
869 sf->thresh_mult[THR_H_PRED ] = 2000;
870 sf->thresh_mult[THR_B_PRED ] = 5000;
872 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
874 sf->thresh_mult[THR_NEARESTMV] = 0;
875 sf->thresh_mult[THR_ZEROMV ] = 0;
876 sf->thresh_mult[THR_NEARMV ] = 0;
877 sf->thresh_mult[THR_NEWMV ] = 2000;
878 sf->thresh_mult[THR_SPLITMV ] = 10000;
881 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
883 sf->thresh_mult[THR_NEARESTG ] = 1000;
884 sf->thresh_mult[THR_ZEROG ] = 1000;
885 sf->thresh_mult[THR_NEARG ] = 1000;
886 sf->thresh_mult[THR_NEWG ] = 2000;
887 sf->thresh_mult[THR_SPLITG ] = 20000;
890 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
892 sf->thresh_mult[THR_NEARESTA ] = 1000;
893 sf->thresh_mult[THR_ZEROA ] = 1000;
894 sf->thresh_mult[THR_NEARA ] = 1000;
895 sf->thresh_mult[THR_NEWA ] = 2000;
896 sf->thresh_mult[THR_SPLITA ] = 20000;
899 sf->improved_quant = 0;
900 sf->improved_dct = 0;
905 cpi->mode_check_freq[THR_SPLITMV] = 7;
906 cpi->mode_check_freq[THR_SPLITG] = 15;
907 cpi->mode_check_freq[THR_SPLITA] = 15;
909 sf->thresh_mult[THR_TM ] = 2000;
910 sf->thresh_mult[THR_V_PRED ] = 2000;
911 sf->thresh_mult[THR_H_PRED ] = 2000;
912 sf->thresh_mult[THR_B_PRED ] = 5000;
914 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
916 sf->thresh_mult[THR_NEWMV ] = 2000;
917 sf->thresh_mult[THR_SPLITMV ] = 25000;
920 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
922 sf->thresh_mult[THR_NEARESTG ] = 2000;
923 sf->thresh_mult[THR_ZEROG ] = 2000;
924 sf->thresh_mult[THR_NEARG ] = 2000;
925 sf->thresh_mult[THR_NEWG ] = 2500;
926 sf->thresh_mult[THR_SPLITG ] = 50000;
929 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
931 sf->thresh_mult[THR_NEARESTA ] = 2000;
932 sf->thresh_mult[THR_ZEROA ] = 2000;
933 sf->thresh_mult[THR_NEARA ] = 2000;
934 sf->thresh_mult[THR_NEWA ] = 2500;
935 sf->thresh_mult[THR_SPLITA ] = 50000;
938 sf->full_freq[0] = 31;
939 sf->full_freq[1] = 63;
944 sf->auto_filter = 0; // Faster selection of loop filter
946 cpi->mode_check_freq[THR_V_PRED] = 2;
947 cpi->mode_check_freq[THR_H_PRED] = 2;
948 cpi->mode_check_freq[THR_B_PRED] = 2;
950 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
952 cpi->mode_check_freq[THR_NEARG] = 2;
953 cpi->mode_check_freq[THR_NEWG] = 4;
956 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
958 cpi->mode_check_freq[THR_NEARA] = 2;
959 cpi->mode_check_freq[THR_NEWA] = 4;
962 sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
963 sf->thresh_mult[THR_SPLITG ] = INT_MAX;
964 sf->thresh_mult[THR_SPLITA ] = INT_MAX;
966 sf->full_freq[0] = 63;
967 sf->full_freq[1] = 127;
973 sf->full_freq[0] = INT_MAX;
974 sf->full_freq[1] = INT_MAX;
981 sf->auto_filter = 0; // Faster selection of loop filter
983 sf->search_method = HEX;
984 //sf->search_method = DIAMOND;
986 sf->iterative_sub_pixel = 0;
988 cpi->mode_check_freq[THR_V_PRED] = 4;
989 cpi->mode_check_freq[THR_H_PRED] = 4;
990 cpi->mode_check_freq[THR_B_PRED] = 4;
992 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
994 cpi->mode_check_freq[THR_NEARG] = 2;
995 cpi->mode_check_freq[THR_NEWG] = 4;
998 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1000 cpi->mode_check_freq[THR_NEARA] = 2;
1001 cpi->mode_check_freq[THR_NEWA] = 4;
1004 sf->thresh_mult[THR_TM ] = 2000;
1005 sf->thresh_mult[THR_B_PRED ] = 5000;
1007 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1009 sf->thresh_mult[THR_NEARESTG ] = 2000;
1010 sf->thresh_mult[THR_ZEROG ] = 2000;
1011 sf->thresh_mult[THR_NEARG ] = 2000;
1012 sf->thresh_mult[THR_NEWG ] = 4000;
1015 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1017 sf->thresh_mult[THR_NEARESTA ] = 2000;
1018 sf->thresh_mult[THR_ZEROA ] = 2000;
1019 sf->thresh_mult[THR_NEARA ] = 2000;
1020 sf->thresh_mult[THR_NEWA ] = 4000;
1026 // Disable split MB intra prediction mode
1027 sf->thresh_mult[THR_B_PRED] = INT_MAX;
1032 unsigned int i, sum = 0;
1033 unsigned int total_mbs = cm->MBs;
1039 if (cpi->oxcf.encode_breakout > 2000)
1040 min = cpi->oxcf.encode_breakout;
1044 for (i = 0; i < min; i++)
1046 sum += cpi->error_bins[i];
1052 // i starts from 2 to make sure thresh started from 2048
1053 for (; i < 1024; i++)
1055 sum += cpi->error_bins[i];
1057 if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
1067 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
1069 sf->thresh_mult[THR_NEWMV] = thresh;
1070 sf->thresh_mult[THR_NEARESTMV ] = thresh >> 1;
1071 sf->thresh_mult[THR_NEARMV ] = thresh >> 1;
1074 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1076 sf->thresh_mult[THR_NEWG] = thresh << 1;
1077 sf->thresh_mult[THR_NEARESTG ] = thresh;
1078 sf->thresh_mult[THR_NEARG ] = thresh;
1081 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1083 sf->thresh_mult[THR_NEWA] = thresh << 1;
1084 sf->thresh_mult[THR_NEARESTA ] = thresh;
1085 sf->thresh_mult[THR_NEARA ] = thresh;
1088 // Disable other intra prediction modes
1089 sf->thresh_mult[THR_TM] = INT_MAX;
1090 sf->thresh_mult[THR_V_PRED] = INT_MAX;
1091 sf->thresh_mult[THR_H_PRED] = INT_MAX;
1093 sf->improved_mv_pred = 0;
1098 sf->quarter_pixel_search = 0;
1103 int Tmp = cpi->Speed - 8;
1108 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1110 cpi->mode_check_freq[THR_ZEROG] = 1 << (Tmp - 1);
1111 cpi->mode_check_freq[THR_NEARESTG] = 1 << (Tmp - 1);
1112 cpi->mode_check_freq[THR_NEARG] = 1 << Tmp;
1113 cpi->mode_check_freq[THR_NEWG] = 1 << (Tmp + 1);
1116 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1118 cpi->mode_check_freq[THR_ZEROA] = 1 << (Tmp - 1);
1119 cpi->mode_check_freq[THR_NEARESTA] = 1 << (Tmp - 1);
1120 cpi->mode_check_freq[THR_NEARA] = 1 << Tmp;
1121 cpi->mode_check_freq[THR_NEWA] = 1 << (Tmp + 1);
1124 cpi->mode_check_freq[THR_NEWMV] = 1 << (Tmp - 1);
1127 cm->filter_type = NORMAL_LOOPFILTER;
1130 cm->filter_type = SIMPLE_LOOPFILTER;
1134 sf->half_pixel_search = 0; // This has a big hit on quality. Last resort
1137 vpx_memset(cpi->error_bins, 0, sizeof(cpi->error_bins));
1141 /* disable frame modes if flags not set */
1142 if (!(cpi->ref_frame_flags & VP8_LAST_FLAG))
1144 sf->thresh_mult[THR_NEWMV ] = INT_MAX;
1145 sf->thresh_mult[THR_NEARESTMV] = INT_MAX;
1146 sf->thresh_mult[THR_ZEROMV ] = INT_MAX;
1147 sf->thresh_mult[THR_NEARMV ] = INT_MAX;
1148 sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
1151 if (!(cpi->ref_frame_flags & VP8_GOLD_FLAG))
1153 sf->thresh_mult[THR_NEARESTG ] = INT_MAX;
1154 sf->thresh_mult[THR_ZEROG ] = INT_MAX;
1155 sf->thresh_mult[THR_NEARG ] = INT_MAX;
1156 sf->thresh_mult[THR_NEWG ] = INT_MAX;
1157 sf->thresh_mult[THR_SPLITG ] = INT_MAX;
1160 if (!(cpi->ref_frame_flags & VP8_ALT_FLAG))
1162 sf->thresh_mult[THR_NEARESTA ] = INT_MAX;
1163 sf->thresh_mult[THR_ZEROA ] = INT_MAX;
1164 sf->thresh_mult[THR_NEARA ] = INT_MAX;
1165 sf->thresh_mult[THR_NEWA ] = INT_MAX;
1166 sf->thresh_mult[THR_SPLITA ] = INT_MAX;
1170 // Slow quant, dct and trellis not worthwhile for first pass
1171 // so make sure they are always turned off.
1172 if ( cpi->pass == 1 )
1174 sf->improved_quant = 0;
1175 sf->optimize_coefficients = 0;
1176 sf->improved_dct = 0;
1179 if (cpi->sf.search_method == NSTEP)
1181 vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1183 else if (cpi->sf.search_method == DIAMOND)
1185 vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1188 if (cpi->sf.improved_dct)
1190 cpi->mb.vp8_short_fdct8x4 = FDCT_INVOKE(&cpi->rtcd.fdct, short8x4);
1191 cpi->mb.vp8_short_fdct4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, short4x4);
1195 cpi->mb.vp8_short_fdct8x4 = FDCT_INVOKE(&cpi->rtcd.fdct, fast8x4);
1196 cpi->mb.vp8_short_fdct4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, fast4x4);
1199 cpi->mb.short_walsh4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, walsh_short4x4);
1201 if (cpi->sf.improved_quant)
1203 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize,
1205 cpi->mb.quantize_b_pair = QUANTIZE_INVOKE(&cpi->rtcd.quantize,
1210 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize,
1212 cpi->mb.quantize_b_pair = QUANTIZE_INVOKE(&cpi->rtcd.quantize,
1215 if (cpi->sf.improved_quant != last_improved_quant)
1216 vp8cx_init_quantizer(cpi);
1218 #if CONFIG_RUNTIME_CPU_DETECT
1219 cpi->mb.e_mbd.rtcd = &cpi->common.rtcd;
1222 if (cpi->sf.iterative_sub_pixel == 1)
1224 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
1226 else if (cpi->sf.quarter_pixel_search)
1228 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
1230 else if (cpi->sf.half_pixel_search)
1232 cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1236 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1239 if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
1240 cpi->mb.optimize = 1;
1242 cpi->mb.optimize = 0;
1244 if (cpi->common.full_pixel)
1245 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1248 frames_at_speed[cpi->Speed]++;
1251 static void alloc_raw_frame_buffers(VP8_COMP *cpi)
1253 int width = (cpi->oxcf.Width + 15) & ~15;
1254 int height = (cpi->oxcf.Height + 15) & ~15;
1256 cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
1257 cpi->oxcf.lag_in_frames);
1259 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1260 "Failed to allocate lag buffers");
1262 #if VP8_TEMPORAL_ALT_REF
1264 if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
1266 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1267 "Failed to allocate altref buffer");
1272 static int vp8_alloc_partition_data(VP8_COMP *cpi)
1274 vpx_free(cpi->mb.pip);
1276 cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
1277 (cpi->common.mb_rows + 1),
1278 sizeof(PARTITION_INFO));
1282 cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1287 void vp8_alloc_compressor_data(VP8_COMP *cpi)
1289 VP8_COMMON *cm = & cpi->common;
1291 int width = cm->Width;
1292 int height = cm->Height;
1294 if (vp8_alloc_frame_buffers(cm, width, height))
1295 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1296 "Failed to allocate frame buffers");
1298 if (vp8_alloc_partition_data(cpi))
1299 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1300 "Failed to allocate partition data");
1303 if ((width & 0xf) != 0)
1304 width += 16 - (width & 0xf);
1306 if ((height & 0xf) != 0)
1307 height += 16 - (height & 0xf);
1310 if (vp8_yv12_alloc_frame_buffer(&cpi->last_frame_uf,
1311 width, height, VP8BORDERINPIXELS))
1312 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1313 "Failed to allocate last frame buffer");
1315 if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source, width, height, 16))
1316 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1317 "Failed to allocate scaled source buffer");
1323 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1325 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1328 // Data used for real time vc mode to see if gf needs refreshing
1329 cpi->inter_zz_count = 0;
1330 cpi->gf_bad_count = 0;
1331 cpi->gf_update_recommended = 0;
1334 // Structures used to minitor GF usage
1335 vpx_free(cpi->gf_active_flags);
1336 CHECK_MEM_ERROR(cpi->gf_active_flags,
1337 vpx_calloc(1, cm->mb_rows * cm->mb_cols));
1338 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1340 vpx_free(cpi->mb_activity_map);
1341 CHECK_MEM_ERROR(cpi->mb_activity_map,
1342 vpx_calloc(sizeof(unsigned int),
1343 cm->mb_rows * cm->mb_cols));
1345 vpx_free(cpi->mb_norm_activity_map);
1346 CHECK_MEM_ERROR(cpi->mb_norm_activity_map,
1347 vpx_calloc(sizeof(unsigned int),
1348 cm->mb_rows * cm->mb_cols));
1350 #if !(CONFIG_REALTIME_ONLY)
1351 vpx_free(cpi->twopass.total_stats);
1353 cpi->twopass.total_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
1355 vpx_free(cpi->twopass.this_frame_stats);
1357 cpi->twopass.this_frame_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
1359 if(!cpi->twopass.total_stats || !cpi->twopass.this_frame_stats)
1360 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1361 "Failed to allocate firstpass stats");
1364 #if CONFIG_MULTITHREAD
1366 cpi->mt_sync_range = 1;
1367 else if (width <= 1280)
1368 cpi->mt_sync_range = 4;
1369 else if (width <= 2560)
1370 cpi->mt_sync_range = 8;
1372 cpi->mt_sync_range = 16;
1375 vpx_free(cpi->tplist);
1377 CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cpi->common.mb_rows));
1382 static const int q_trans[] =
1384 0, 1, 2, 3, 4, 5, 7, 8,
1385 9, 10, 12, 13, 15, 17, 18, 19,
1386 20, 21, 23, 24, 25, 26, 27, 28,
1387 29, 30, 31, 33, 35, 37, 39, 41,
1388 43, 45, 47, 49, 51, 53, 55, 57,
1389 59, 61, 64, 67, 70, 73, 76, 79,
1390 82, 85, 88, 91, 94, 97, 100, 103,
1391 106, 109, 112, 115, 118, 121, 124, 127,
1394 int vp8_reverse_trans(int x)
1398 for (i = 0; i < 64; i++)
1399 if (q_trans[i] >= x)
1404 void vp8_new_frame_rate(VP8_COMP *cpi, double framerate)
1409 cpi->oxcf.frame_rate = framerate;
1410 cpi->output_frame_rate = cpi->oxcf.frame_rate;
1411 cpi->per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
1412 cpi->av_per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
1413 cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
1415 // Set Maximum gf/arf interval
1416 cpi->max_gf_interval = ((int)(cpi->output_frame_rate / 2.0) + 2);
1418 if(cpi->max_gf_interval < 12)
1419 cpi->max_gf_interval = 12;
1421 // Extended interval for genuinely static scenes
1422 cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1424 // Special conditions when altr ref frame enabled in lagged compress mode
1425 if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
1427 if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1428 cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1430 if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1431 cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1434 if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
1435 cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1440 rescale(int val, int num, int denom)
1442 int64_t llnum = num;
1443 int64_t llden = denom;
1444 int64_t llval = val;
1446 return llval * llnum / llden;
1450 static void init_config(VP8_PTR ptr, VP8_CONFIG *oxcf)
1452 VP8_COMP *cpi = (VP8_COMP *)(ptr);
1453 VP8_COMMON *cm = &cpi->common;
1458 cpi->auto_adjust_gold_quantizer = 1;
1461 cm->version = oxcf->Version;
1462 vp8_setup_version(cm);
1464 // change includes all joint functionality
1465 vp8_change_config(ptr, oxcf);
1467 // Initialize active best and worst q and average q values.
1468 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1469 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1470 cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
1472 // Initialise the starting buffer levels
1473 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
1474 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
1476 cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
1477 cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
1478 cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
1479 cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
1481 cpi->total_actual_bits = 0;
1482 cpi->total_target_vs_actual = 0;
1484 #if VP8_TEMPORAL_ALT_REF
1488 cpi->fixed_divide[0] = 0;
1490 for (i = 1; i < 512; i++)
1491 cpi->fixed_divide[i] = 0x80000 / i;
1497 void vp8_change_config(VP8_PTR ptr, VP8_CONFIG *oxcf)
1499 VP8_COMP *cpi = (VP8_COMP *)(ptr);
1500 VP8_COMMON *cm = &cpi->common;
1508 if (cm->version != oxcf->Version)
1510 cm->version = oxcf->Version;
1511 vp8_setup_version(cm);
1516 switch (cpi->oxcf.Mode)
1521 cpi->compressor_speed = 2;
1523 if (cpi->oxcf.cpu_used < -16)
1525 cpi->oxcf.cpu_used = -16;
1528 if (cpi->oxcf.cpu_used > 16)
1529 cpi->oxcf.cpu_used = 16;
1533 case MODE_GOODQUALITY:
1535 cpi->compressor_speed = 1;
1537 if (cpi->oxcf.cpu_used < -5)
1539 cpi->oxcf.cpu_used = -5;
1542 if (cpi->oxcf.cpu_used > 5)
1543 cpi->oxcf.cpu_used = 5;
1547 case MODE_BESTQUALITY:
1549 cpi->compressor_speed = 0;
1552 case MODE_FIRSTPASS:
1554 cpi->compressor_speed = 1;
1556 case MODE_SECONDPASS:
1558 cpi->compressor_speed = 1;
1560 if (cpi->oxcf.cpu_used < -5)
1562 cpi->oxcf.cpu_used = -5;
1565 if (cpi->oxcf.cpu_used > 5)
1566 cpi->oxcf.cpu_used = 5;
1569 case MODE_SECONDPASS_BEST:
1571 cpi->compressor_speed = 0;
1576 cpi->auto_worst_q = 1;
1578 cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1579 cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1580 cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1582 if (oxcf->fixed_q >= 0)
1584 if (oxcf->worst_allowed_q < 0)
1585 cpi->oxcf.fixed_q = q_trans[0];
1587 cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1589 if (oxcf->alt_q < 0)
1590 cpi->oxcf.alt_q = q_trans[0];
1592 cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1594 if (oxcf->key_q < 0)
1595 cpi->oxcf.key_q = q_trans[0];
1597 cpi->oxcf.key_q = q_trans[oxcf->key_q];
1599 if (oxcf->gold_q < 0)
1600 cpi->oxcf.gold_q = q_trans[0];
1602 cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1606 cpi->baseline_gf_interval =
1607 cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1609 cpi->ref_frame_flags = VP8_ALT_FLAG | VP8_GOLD_FLAG | VP8_LAST_FLAG;
1611 //cpi->use_golden_frame_only = 0;
1612 //cpi->use_last_frame_only = 0;
1613 cm->refresh_golden_frame = 0;
1614 cm->refresh_last_frame = 1;
1615 cm->refresh_entropy_probs = 1;
1617 if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
1618 cm->multi_token_partition =
1619 (TOKEN_PARTITION) cpi->oxcf.token_partitions;
1621 setup_features(cpi);
1626 for (i = 0; i < MAX_MB_SEGMENTS; i++)
1627 cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1630 // At the moment the first order values may not be > MAXQ
1631 if (cpi->oxcf.fixed_q > MAXQ)
1632 cpi->oxcf.fixed_q = MAXQ;
1634 // local file playback mode == really big buffer
1635 if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
1637 cpi->oxcf.starting_buffer_level = 60000;
1638 cpi->oxcf.optimal_buffer_level = 60000;
1639 cpi->oxcf.maximum_buffer_size = 240000;
1642 // Convert target bandwidth from Kbit/s to Bit/s
1643 cpi->oxcf.target_bandwidth *= 1000;
1645 cpi->oxcf.starting_buffer_level =
1646 rescale(cpi->oxcf.starting_buffer_level,
1647 cpi->oxcf.target_bandwidth, 1000);
1649 // Set or reset optimal and maximum buffer levels.
1650 if (cpi->oxcf.optimal_buffer_level == 0)
1651 cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1653 cpi->oxcf.optimal_buffer_level =
1654 rescale(cpi->oxcf.optimal_buffer_level,
1655 cpi->oxcf.target_bandwidth, 1000);
1657 if (cpi->oxcf.maximum_buffer_size == 0)
1658 cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1660 cpi->oxcf.maximum_buffer_size =
1661 rescale(cpi->oxcf.maximum_buffer_size,
1662 cpi->oxcf.target_bandwidth, 1000);
1664 // Set up frame rate and related parameters rate control values.
1665 vp8_new_frame_rate(cpi, cpi->oxcf.frame_rate);
1667 // Set absolute upper and lower quality limits
1668 cpi->worst_quality = cpi->oxcf.worst_allowed_q;
1669 cpi->best_quality = cpi->oxcf.best_allowed_q;
1671 // active values should only be modified if out of new range
1672 if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
1674 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1677 else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
1679 cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1681 if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
1683 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1686 else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
1688 cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1691 cpi->buffered_mode = (cpi->oxcf.optimal_buffer_level > 0) ? TRUE : FALSE;
1693 cpi->cq_target_quality = cpi->oxcf.cq_level;
1695 // Only allow dropped frames in buffered mode
1696 cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1698 if (!cm->use_bilinear_mc_filter)
1699 cm->mcomp_filter_type = SIXTAP;
1701 cm->mcomp_filter_type = BILINEAR;
1703 cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1705 cm->Width = cpi->oxcf.Width ;
1706 cm->Height = cpi->oxcf.Height ;
1708 cm->horiz_scale = cpi->horiz_scale;
1709 cm->vert_scale = cpi->vert_scale ;
1711 // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
1712 if (cpi->oxcf.Sharpness > 7)
1713 cpi->oxcf.Sharpness = 7;
1715 cm->sharpness_level = cpi->oxcf.Sharpness;
1717 if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
1719 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
1720 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
1722 Scale2Ratio(cm->horiz_scale, &hr, &hs);
1723 Scale2Ratio(cm->vert_scale, &vr, &vs);
1725 // always go to the next whole number
1726 cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1727 cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1730 if (((cm->Width + 15) & 0xfffffff0) !=
1731 cm->yv12_fb[cm->lst_fb_idx].y_width ||
1732 ((cm->Height + 15) & 0xfffffff0) !=
1733 cm->yv12_fb[cm->lst_fb_idx].y_height ||
1734 cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
1736 alloc_raw_frame_buffers(cpi);
1737 vp8_alloc_compressor_data(cpi);
1740 if (cpi->oxcf.fixed_q >= 0)
1742 cpi->last_q[0] = cpi->oxcf.fixed_q;
1743 cpi->last_q[1] = cpi->oxcf.fixed_q;
1746 cpi->Speed = cpi->oxcf.cpu_used;
1748 // force to allowlag to 0 if lag_in_frames is 0;
1749 if (cpi->oxcf.lag_in_frames == 0)
1751 cpi->oxcf.allow_lag = 0;
1753 // Limit on lag buffers as these are not currently dynamically allocated
1754 else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
1755 cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1758 cpi->alt_ref_source = NULL;
1759 cpi->is_src_frame_alt_ref = 0;
1763 // Experimental RD Code
1764 cpi->frame_distortion = 0;
1765 cpi->last_frame_distortion = 0;
1770 #define M_LOG2_E 0.693147180559945309417
1771 #define log2f(x) (log (x) / (float) M_LOG2_E)
1772 static void cal_mvsadcosts(int *mvsadcost[2])
1776 mvsadcost [0] [0] = 300;
1777 mvsadcost [1] [0] = 300;
1781 double z = 256 * (2 * (log2f(8 * i) + .6));
1782 mvsadcost [0][i] = (int) z;
1783 mvsadcost [1][i] = (int) z;
1784 mvsadcost [0][-i] = (int) z;
1785 mvsadcost [1][-i] = (int) z;
1787 while (++i <= mvfp_max);
1790 VP8_PTR vp8_create_compressor(VP8_CONFIG *oxcf)
1802 cpi = ctx.cpi = vpx_memalign(32, sizeof(VP8_COMP));
1803 // Check that the CPI instance is valid
1809 vpx_memset(cpi, 0, sizeof(VP8_COMP));
1811 if (setjmp(cm->error.jmp))
1813 VP8_PTR ptr = ctx.ptr;
1815 ctx.cpi->common.error.setjmp = 0;
1816 vp8_remove_compressor(&ptr);
1820 cpi->common.error.setjmp = 1;
1822 CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));
1824 vp8_create_common(&cpi->common);
1825 vp8_cmachine_specific_config(cpi);
1827 init_config((VP8_PTR)cpi, oxcf);
1829 memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
1830 cpi->common.current_video_frame = 0;
1831 cpi->kf_overspend_bits = 0;
1832 cpi->kf_bitrate_adjustment = 0;
1833 cpi->frames_till_gf_update_due = 0;
1834 cpi->gf_overspend_bits = 0;
1835 cpi->non_gf_bitrate_adjustment = 0;
1836 cpi->prob_last_coded = 128;
1837 cpi->prob_gf_coded = 128;
1838 cpi->prob_intra_coded = 63;
1840 // Prime the recent reference frame useage counters.
1841 // Hereafter they will be maintained as a sort of moving average
1842 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
1843 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
1844 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1845 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1847 // Set reference frame sign bias for ALTREF frame to 1 (for now)
1848 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1850 cpi->twopass.gf_decay_rate = 0;
1851 cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1853 cpi->gold_is_last = 0 ;
1854 cpi->alt_is_last = 0 ;
1855 cpi->gold_is_alt = 0 ;
1857 // allocate memory for storing last frame's MVs for MV prediction.
1858 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int_mv)));
1859 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int)));
1860 CHECK_MEM_ERROR(cpi->lf_ref_frame, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int)));
1862 // Create the encoder segmentation map and set all entries to 0
1863 CHECK_MEM_ERROR(cpi->segmentation_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
1864 CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
1865 vpx_memset(cpi->active_map , 1, (cpi->common.mb_rows * cpi->common.mb_cols));
1866 cpi->active_map_enabled = 0;
1869 // Experimental code for lagged and one pass
1870 // Initialise one_pass GF frames stats
1871 // Update stats used for GF selection
1874 cpi->one_pass_frame_index = 0;
1876 for (i = 0; i < MAX_LAG_BUFFERS; i++)
1878 cpi->one_pass_frame_stats[i].frames_so_far = 0;
1879 cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1880 cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1881 cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1882 cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1883 cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1884 cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1885 cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1886 cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1891 // Should we use the cyclic refresh method.
1892 // Currently this is tied to error resilliant mode
1893 cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
1894 cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 40;
1895 cpi->cyclic_refresh_mode_index = 0;
1896 cpi->cyclic_refresh_q = 32;
1898 if (cpi->cyclic_refresh_mode_enabled)
1900 CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1903 cpi->cyclic_refresh_map = (signed char *) NULL;
1905 // Test function for segmentation
1906 //segmentation_test_function((VP8_PTR) cpi);
1908 #ifdef ENTROPY_STATS
1909 init_context_counters();
1912 /*Initialize the feed-forward activity masking.*/
1913 cpi->activity_avg = 90<<12;
1915 cpi->frames_since_key = 8; // Give a sensible default for the first frame.
1916 cpi->key_frame_frequency = cpi->oxcf.key_freq;
1917 cpi->this_key_frame_forced = FALSE;
1918 cpi->next_key_frame_forced = FALSE;
1920 cpi->source_alt_ref_pending = FALSE;
1921 cpi->source_alt_ref_active = FALSE;
1922 cpi->common.refresh_alt_ref_frame = 0;
1924 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1925 #if CONFIG_INTERNAL_STATS
1926 cpi->b_calculate_ssimg = 0;
1931 if (cpi->b_calculate_psnr)
1933 cpi->total_sq_error = 0.0;
1934 cpi->total_sq_error2 = 0.0;
1939 cpi->totalp_y = 0.0;
1940 cpi->totalp_u = 0.0;
1941 cpi->totalp_v = 0.0;
1943 cpi->tot_recode_hits = 0;
1944 cpi->summed_quality = 0;
1945 cpi->summed_weights = 0;
1948 if (cpi->b_calculate_ssimg)
1950 cpi->total_ssimg_y = 0;
1951 cpi->total_ssimg_u = 0;
1952 cpi->total_ssimg_v = 0;
1953 cpi->total_ssimg_all = 0;
1959 #define LLONG_MAX 9223372036854775807LL
1961 cpi->first_time_stamp_ever = LLONG_MAX;
1963 cpi->frames_till_gf_update_due = 0;
1964 cpi->key_frame_count = 1;
1966 cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
1969 cpi->total_byte_count = 0;
1971 cpi->drop_frame = 0;
1972 cpi->drop_count = 0;
1973 cpi->max_drop_count = 0;
1974 cpi->max_consec_dropped_frames = 4;
1976 cpi->rate_correction_factor = 1.0;
1977 cpi->key_frame_rate_correction_factor = 1.0;
1978 cpi->gf_rate_correction_factor = 1.0;
1979 cpi->twopass.est_max_qcorrection_factor = 1.0;
1981 cpi->mb.mvcost[0] = &cpi->mb.mvcosts[0][mv_max+1];
1982 cpi->mb.mvcost[1] = &cpi->mb.mvcosts[1][mv_max+1];
1983 cpi->mb.mvsadcost[0] = &cpi->mb.mvsadcosts[0][mvfp_max+1];
1984 cpi->mb.mvsadcost[1] = &cpi->mb.mvsadcosts[1][mvfp_max+1];
1986 cal_mvsadcosts(cpi->mb.mvsadcost);
1988 for (i = 0; i < KEY_FRAME_CONTEXT; i++)
1990 cpi->prior_key_frame_distance[i] = (int)cpi->output_frame_rate;
1993 #ifdef OUTPUT_YUV_SRC
1994 yuv_file = fopen("bd.yuv", "ab");
1998 framepsnr = fopen("framepsnr.stt", "a");
1999 kf_list = fopen("kf_list.stt", "w");
2002 cpi->output_pkt_list = oxcf->output_pkt_list;
2004 #if !(CONFIG_REALTIME_ONLY)
2008 vp8_init_first_pass(cpi);
2010 else if (cpi->pass == 2)
2012 size_t packet_sz = sizeof(FIRSTPASS_STATS);
2013 int packets = oxcf->two_pass_stats_in.sz / packet_sz;
2015 cpi->twopass.stats_in = oxcf->two_pass_stats_in.buf;
2016 cpi->twopass.stats_in_end = (void*)((char *)cpi->twopass.stats_in
2017 + (packets - 1) * packet_sz);
2018 vp8_init_second_pass(cpi);
2023 if (cpi->compressor_speed == 2)
2025 cpi->cpu_freq = 0; //vp8_get_processor_freq();
2026 cpi->avg_encode_time = 0;
2027 cpi->avg_pick_mode_time = 0;
2030 vp8_set_speed_features(cpi);
2032 // Set starting values of RD threshold multipliers (128 = *1)
2033 for (i = 0; i < MAX_MODES; i++)
2035 cpi->rd_thresh_mult[i] = 128;
2038 #ifdef ENTROPY_STATS
2039 init_mv_ref_counts();
2042 #if CONFIG_MULTITHREAD
2043 vp8cx_create_encoder_threads(cpi);
2046 cpi->fn_ptr[BLOCK_16X16].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16);
2047 cpi->fn_ptr[BLOCK_16X16].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16);
2048 cpi->fn_ptr[BLOCK_16X16].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar16x16);
2049 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_h);
2050 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_v);
2051 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_hv);
2052 cpi->fn_ptr[BLOCK_16X16].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x3);
2053 cpi->fn_ptr[BLOCK_16X16].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x8);
2054 cpi->fn_ptr[BLOCK_16X16].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x4d);
2056 cpi->fn_ptr[BLOCK_16X8].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8);
2057 cpi->fn_ptr[BLOCK_16X8].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x8);
2058 cpi->fn_ptr[BLOCK_16X8].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar16x8);
2059 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h = NULL;
2060 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v = NULL;
2061 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
2062 cpi->fn_ptr[BLOCK_16X8].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x3);
2063 cpi->fn_ptr[BLOCK_16X8].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x8);
2064 cpi->fn_ptr[BLOCK_16X8].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x4d);
2066 cpi->fn_ptr[BLOCK_8X16].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16);
2067 cpi->fn_ptr[BLOCK_8X16].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var8x16);
2068 cpi->fn_ptr[BLOCK_8X16].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar8x16);
2069 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h = NULL;
2070 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v = NULL;
2071 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
2072 cpi->fn_ptr[BLOCK_8X16].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x3);
2073 cpi->fn_ptr[BLOCK_8X16].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x8);
2074 cpi->fn_ptr[BLOCK_8X16].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x4d);
2076 cpi->fn_ptr[BLOCK_8X8].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8);
2077 cpi->fn_ptr[BLOCK_8X8].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var8x8);
2078 cpi->fn_ptr[BLOCK_8X8].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar8x8);
2079 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h = NULL;
2080 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v = NULL;
2081 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
2082 cpi->fn_ptr[BLOCK_8X8].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x3);
2083 cpi->fn_ptr[BLOCK_8X8].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x8);
2084 cpi->fn_ptr[BLOCK_8X8].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x4d);
2086 cpi->fn_ptr[BLOCK_4X4].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4);
2087 cpi->fn_ptr[BLOCK_4X4].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var4x4);
2088 cpi->fn_ptr[BLOCK_4X4].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar4x4);
2089 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h = NULL;
2090 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v = NULL;
2091 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
2092 cpi->fn_ptr[BLOCK_4X4].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x3);
2093 cpi->fn_ptr[BLOCK_4X4].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x8);
2094 cpi->fn_ptr[BLOCK_4X4].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x4d);
2096 cpi->full_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, full_search);
2097 cpi->diamond_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, diamond_search);
2098 cpi->refining_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, refining_search);
2100 // make sure frame 1 is okay
2101 cpi->error_bins[0] = cpi->common.MBs;
2103 //vp8cx_init_quantizer() is first called here. Add check in vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only called later
2104 //when needed. This will avoid unnecessary calls of vp8cx_init_quantizer() for every frame.
2105 vp8cx_init_quantizer(cpi);
2107 vp8_init_loop_filter(cm);
2108 cm->last_frame_type = KEY_FRAME;
2109 cm->last_filter_type = cm->filter_type;
2110 cm->last_sharpness_level = cm->sharpness_level;
2112 cpi->common.error.setjmp = 0;
2113 return (VP8_PTR) cpi;
2118 void vp8_remove_compressor(VP8_PTR *ptr)
2120 VP8_COMP *cpi = (VP8_COMP *)(*ptr);
2125 if (cpi && (cpi->common.current_video_frame > 0))
2127 #if !(CONFIG_REALTIME_ONLY)
2131 vp8_end_second_pass(cpi);
2136 #ifdef ENTROPY_STATS
2137 print_context_counters();
2138 print_tree_update_probs();
2139 print_mode_context();
2142 #if CONFIG_INTERNAL_STATS
2146 FILE *f = fopen("opsnr.stt", "a");
2147 double time_encoded = (cpi->last_end_time_stamp_seen
2148 - cpi->first_time_stamp_ever) / 10000000.000;
2149 double total_encode_time = (cpi->time_receive_data + cpi->time_compress_data) / 1000.000;
2150 double dr = (double)cpi->bytes * (double) 8 / (double)1000 / time_encoded;
2152 if (cpi->b_calculate_psnr)
2154 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
2155 double samples = 3.0 / 2 * cpi->count * lst_yv12->y_width * lst_yv12->y_height;
2156 double total_psnr = vp8_mse2psnr(samples, 255.0, cpi->total_sq_error);
2157 double total_psnr2 = vp8_mse2psnr(samples, 255.0, cpi->total_sq_error2);
2158 double total_ssim = 100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
2160 fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\tVPXSSIM\t Time(us)\n");
2161 fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n",
2162 dr, cpi->total / cpi->count, total_psnr, cpi->totalp / cpi->count, total_psnr2, total_ssim,
2166 if (cpi->b_calculate_ssimg)
2168 fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t Time(us)\n");
2169 fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
2170 cpi->total_ssimg_y / cpi->count, cpi->total_ssimg_u / cpi->count,
2171 cpi->total_ssimg_v / cpi->count, cpi->total_ssimg_all / cpi->count, total_encode_time);
2176 f = fopen("qskip.stt", "a");
2177 fprintf(f, "minq:%d -maxq:%d skipture:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2188 if (cpi->compressor_speed == 2)
2191 FILE *f = fopen("cxspeed.stt", "a");
2192 cnt_pm /= cpi->common.MBs;
2194 for (i = 0; i < 16; i++)
2195 fprintf(f, "%5d", frames_at_speed[i]);
2198 //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);
2207 extern int count_mb_seg[4];
2208 FILE *f = fopen("modes.stt", "a");
2209 double dr = (double)cpi->oxcf.frame_rate * (double)bytes * (double)8 / (double)count / (double)1000 ;
2210 fprintf(f, "intra_mode in Intra Frames:\n");
2211 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
2212 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
2217 for (i = 0; i < 10; i++)
2218 fprintf(f, "%8d, ", b_modes[i]);
2224 fprintf(f, "Modes in Inter Frames:\n");
2225 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2226 inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
2227 inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
2228 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2233 for (i = 0; i < 15; i++)
2234 fprintf(f, "%8d, ", inter_b_modes[i]);
2239 fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
2240 fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);
2248 #ifdef ENTROPY_STATS
2251 FILE *fmode = fopen("modecontext.c", "w");
2253 fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
2254 fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
2255 fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
2257 for (i = 0; i < 10; i++)
2260 fprintf(fmode, " { //Above Mode : %d\n", i);
2262 for (j = 0; j < 10; j++)
2265 fprintf(fmode, " {");
2267 for (k = 0; k < 10; k++)
2269 if (!intra_mode_stats[i][j][k])
2270 fprintf(fmode, " %5d, ", 1);
2272 fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2275 fprintf(fmode, "}, // left_mode %d\n", j);
2279 fprintf(fmode, " },\n");
2283 fprintf(fmode, "};\n");
2289 #if defined(SECTIONBITS_OUTPUT)
2294 FILE *f = fopen("tokenbits.stt", "a");
2296 for (i = 0; i < 28; i++)
2297 fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2307 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2308 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
2309 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);
2315 #if CONFIG_MULTITHREAD
2316 vp8cx_remove_encoder_threads(cpi);
2319 dealloc_compressor_data(cpi);
2320 vpx_free(cpi->mb.ss);
2322 vpx_free(cpi->cyclic_refresh_map);
2324 vp8_remove_common(&cpi->common);
2328 #ifdef OUTPUT_YUV_SRC
2348 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2349 unsigned char *recon, int recon_stride,
2350 unsigned int cols, unsigned int rows,
2351 vp8_variance_rtcd_vtable_t *rtcd)
2353 unsigned int row, col;
2354 uint64_t total_sse = 0;
2357 for (row = 0; row + 16 <= rows; row += 16)
2359 for (col = 0; col + 16 <= cols; col += 16)
2363 VARIANCE_INVOKE(rtcd, mse16x16)(orig + col, orig_stride,
2364 recon + col, recon_stride,
2369 /* Handle odd-sized width */
2372 unsigned int border_row, border_col;
2373 unsigned char *border_orig = orig;
2374 unsigned char *border_recon = recon;
2376 for (border_row = 0; border_row < 16; border_row++)
2378 for (border_col = col; border_col < cols; border_col++)
2380 diff = border_orig[border_col] - border_recon[border_col];
2381 total_sse += diff * diff;
2384 border_orig += orig_stride;
2385 border_recon += recon_stride;
2389 orig += orig_stride * 16;
2390 recon += recon_stride * 16;
2393 /* Handle odd-sized height */
2394 for (; row < rows; row++)
2396 for (col = 0; col < cols; col++)
2398 diff = orig[col] - recon[col];
2399 total_sse += diff * diff;
2402 orig += orig_stride;
2403 recon += recon_stride;
2410 static void generate_psnr_packet(VP8_COMP *cpi)
2412 YV12_BUFFER_CONFIG *orig = cpi->Source;
2413 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
2414 struct vpx_codec_cx_pkt pkt;
2417 unsigned int width = cpi->common.Width;
2418 unsigned int height = cpi->common.Height;
2420 pkt.kind = VPX_CODEC_PSNR_PKT;
2421 sse = calc_plane_error(orig->y_buffer, orig->y_stride,
2422 recon->y_buffer, recon->y_stride,
2424 IF_RTCD(&cpi->rtcd.variance));
2425 pkt.data.psnr.sse[0] = sse;
2426 pkt.data.psnr.sse[1] = sse;
2427 pkt.data.psnr.samples[0] = width * height;
2428 pkt.data.psnr.samples[1] = width * height;
2430 width = (width + 1) / 2;
2431 height = (height + 1) / 2;
2433 sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
2434 recon->u_buffer, recon->uv_stride,
2436 IF_RTCD(&cpi->rtcd.variance));
2437 pkt.data.psnr.sse[0] += sse;
2438 pkt.data.psnr.sse[2] = sse;
2439 pkt.data.psnr.samples[0] += width * height;
2440 pkt.data.psnr.samples[2] = width * height;
2442 sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
2443 recon->v_buffer, recon->uv_stride,
2445 IF_RTCD(&cpi->rtcd.variance));
2446 pkt.data.psnr.sse[0] += sse;
2447 pkt.data.psnr.sse[3] = sse;
2448 pkt.data.psnr.samples[0] += width * height;
2449 pkt.data.psnr.samples[3] = width * height;
2451 for (i = 0; i < 4; i++)
2452 pkt.data.psnr.psnr[i] = vp8_mse2psnr(pkt.data.psnr.samples[i], 255.0,
2453 pkt.data.psnr.sse[i]);
2455 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2459 int vp8_use_as_reference(VP8_PTR ptr, int ref_frame_flags)
2461 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2463 if (ref_frame_flags > 7)
2466 cpi->ref_frame_flags = ref_frame_flags;
2469 int vp8_update_reference(VP8_PTR ptr, int ref_frame_flags)
2471 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2473 if (ref_frame_flags > 7)
2476 cpi->common.refresh_golden_frame = 0;
2477 cpi->common.refresh_alt_ref_frame = 0;
2478 cpi->common.refresh_last_frame = 0;
2480 if (ref_frame_flags & VP8_LAST_FLAG)
2481 cpi->common.refresh_last_frame = 1;
2483 if (ref_frame_flags & VP8_GOLD_FLAG)
2484 cpi->common.refresh_golden_frame = 1;
2486 if (ref_frame_flags & VP8_ALT_FLAG)
2487 cpi->common.refresh_alt_ref_frame = 1;
2492 int vp8_get_reference(VP8_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2494 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2495 VP8_COMMON *cm = &cpi->common;
2498 if (ref_frame_flag == VP8_LAST_FLAG)
2499 ref_fb_idx = cm->lst_fb_idx;
2500 else if (ref_frame_flag == VP8_GOLD_FLAG)
2501 ref_fb_idx = cm->gld_fb_idx;
2502 else if (ref_frame_flag == VP8_ALT_FLAG)
2503 ref_fb_idx = cm->alt_fb_idx;
2507 vp8_yv12_copy_frame_ptr(&cm->yv12_fb[ref_fb_idx], sd);
2511 int vp8_set_reference(VP8_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2513 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2514 VP8_COMMON *cm = &cpi->common;
2518 if (ref_frame_flag == VP8_LAST_FLAG)
2519 ref_fb_idx = cm->lst_fb_idx;
2520 else if (ref_frame_flag == VP8_GOLD_FLAG)
2521 ref_fb_idx = cm->gld_fb_idx;
2522 else if (ref_frame_flag == VP8_ALT_FLAG)
2523 ref_fb_idx = cm->alt_fb_idx;
2527 vp8_yv12_copy_frame_ptr(sd, &cm->yv12_fb[ref_fb_idx]);
2531 int vp8_update_entropy(VP8_PTR comp, int update)
2533 VP8_COMP *cpi = (VP8_COMP *) comp;
2534 VP8_COMMON *cm = &cpi->common;
2535 cm->refresh_entropy_probs = update;
2542 void vp8_write_yuv_frame(const char *name, YV12_BUFFER_CONFIG *s)
2544 FILE *yuv_file = fopen(name, "ab");
2545 unsigned char *src = s->y_buffer;
2546 int h = s->y_height;
2550 fwrite(src, s->y_width, 1, yuv_file);
2560 fwrite(src, s->uv_width, 1, yuv_file);
2561 src += s->uv_stride;
2570 fwrite(src, s->uv_width, 1, yuv_file);
2571 src += s->uv_stride;
2580 static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
2582 VP8_COMMON *cm = &cpi->common;
2584 // are we resizing the image
2585 if (cm->horiz_scale != 0 || cm->vert_scale != 0)
2587 #if CONFIG_SPATIAL_RESAMPLING
2588 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2589 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2592 if (cm->vert_scale == 3)
2597 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2598 Scale2Ratio(cm->vert_scale, &vr, &vs);
2600 vp8_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2601 tmp_height, hs, hr, vs, vr, 0);
2603 vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2604 cpi->Source = &cpi->scaled_source;
2610 static void resize_key_frame(VP8_COMP *cpi)
2612 #if CONFIG_SPATIAL_RESAMPLING
2613 VP8_COMMON *cm = &cpi->common;
2615 // Do we need to apply resampling for one pass cbr.
2616 // In one pass this is more limited than in two pass cbr
2617 // The test and any change is only made one per key frame sequence
2618 if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
2620 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2621 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2622 int new_width, new_height;
2624 // If we are below the resample DOWN watermark then scale down a notch.
2625 if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2627 cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2628 cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2630 // Should we now start scaling back up
2631 else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2633 cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2634 cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2637 // Get the new hieght and width
2638 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2639 Scale2Ratio(cm->vert_scale, &vr, &vs);
2640 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2641 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2643 // If the image size has changed we need to reallocate the buffers
2644 // and resample the source image
2645 if ((cm->Width != new_width) || (cm->Height != new_height))
2647 cm->Width = new_width;
2648 cm->Height = new_height;
2649 vp8_alloc_compressor_data(cpi);
2650 scale_and_extend_source(cpi->un_scaled_source, cpi);
2658 static void update_alt_ref_frame_stats(VP8_COMP *cpi)
2660 VP8_COMMON *cm = &cpi->common;
2662 // Select an interval before next GF or altref
2663 if (!cpi->auto_gold)
2664 cpi->frames_till_gf_update_due = cpi->goldfreq;
2666 if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
2668 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2670 // Set the bits per frame that we should try and recover in subsequent inter frames
2671 // to account for the extra GF spend... note that his does not apply for GF updates
2672 // that occur coincident with a key frame as the extra cost of key frames is dealt
2675 cpi->gf_overspend_bits += cpi->projected_frame_size;
2676 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2679 // Update data structure that monitors level of reference to last GF
2680 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2681 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2683 // this frame refreshes means next frames don't unless specified by user
2684 cpi->common.frames_since_golden = 0;
2686 // Clear the alternate reference update pending flag.
2687 cpi->source_alt_ref_pending = FALSE;
2689 // Set the alternate refernce frame active flag
2690 cpi->source_alt_ref_active = TRUE;
2694 static void update_golden_frame_stats(VP8_COMP *cpi)
2696 VP8_COMMON *cm = &cpi->common;
2698 // Update the Golden frame usage counts.
2699 if (cm->refresh_golden_frame)
2701 // Select an interval before next GF
2702 if (!cpi->auto_gold)
2703 cpi->frames_till_gf_update_due = cpi->goldfreq;
2705 if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
2707 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2709 // Set the bits per frame that we should try and recover in subsequent inter frames
2710 // to account for the extra GF spend... note that his does not apply for GF updates
2711 // that occur coincident with a key frame as the extra cost of key frames is dealt
2713 if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
2715 // Calcluate GF bits to be recovered
2716 // Projected size - av frame bits available for inter frames for clip as a whole
2717 cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
2720 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2724 // Update data structure that monitors level of reference to last GF
2725 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2726 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2728 // this frame refreshes means next frames don't unless specified by user
2729 cm->refresh_golden_frame = 0;
2730 cpi->common.frames_since_golden = 0;
2732 //if ( cm->frame_type == KEY_FRAME )
2734 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2735 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2736 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2737 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2741 // // Carry a potrtion of count over to begining of next gf sequence
2742 // cpi->recent_ref_frame_usage[INTRA_FRAME] >>= 5;
2743 // cpi->recent_ref_frame_usage[LAST_FRAME] >>= 5;
2744 // cpi->recent_ref_frame_usage[GOLDEN_FRAME] >>= 5;
2745 // cpi->recent_ref_frame_usage[ALTREF_FRAME] >>= 5;
2748 // ******** Fixed Q test code only ************
2749 // If we are going to use the ALT reference for the next group of frames set a flag to say so.
2750 if (cpi->oxcf.fixed_q >= 0 &&
2751 cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
2753 cpi->source_alt_ref_pending = TRUE;
2754 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2757 if (!cpi->source_alt_ref_pending)
2758 cpi->source_alt_ref_active = FALSE;
2760 // Decrement count down till next gf
2761 if (cpi->frames_till_gf_update_due > 0)
2762 cpi->frames_till_gf_update_due--;
2765 else if (!cpi->common.refresh_alt_ref_frame)
2767 // Decrement count down till next gf
2768 if (cpi->frames_till_gf_update_due > 0)
2769 cpi->frames_till_gf_update_due--;
2771 if (cpi->common.frames_till_alt_ref_frame)
2772 cpi->common.frames_till_alt_ref_frame --;
2774 cpi->common.frames_since_golden ++;
2776 if (cpi->common.frames_since_golden > 1)
2778 cpi->recent_ref_frame_usage[INTRA_FRAME] += cpi->count_mb_ref_frame_usage[INTRA_FRAME];
2779 cpi->recent_ref_frame_usage[LAST_FRAME] += cpi->count_mb_ref_frame_usage[LAST_FRAME];
2780 cpi->recent_ref_frame_usage[GOLDEN_FRAME] += cpi->count_mb_ref_frame_usage[GOLDEN_FRAME];
2781 cpi->recent_ref_frame_usage[ALTREF_FRAME] += cpi->count_mb_ref_frame_usage[ALTREF_FRAME];
2786 // This function updates the reference frame probability estimates that
2787 // will be used during mode selection
2788 static void update_rd_ref_frame_probs(VP8_COMP *cpi)
2790 VP8_COMMON *cm = &cpi->common;
2793 const int *const rfct = cpi->recent_ref_frame_usage;
2794 const int rf_intra = rfct[INTRA_FRAME];
2795 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2797 if (cm->frame_type == KEY_FRAME)
2799 cpi->prob_intra_coded = 255;
2800 cpi->prob_last_coded = 128;
2801 cpi->prob_gf_coded = 128;
2803 else if (!(rf_intra + rf_inter))
2805 // This is a trap in case this function is called with cpi->recent_ref_frame_usage[] blank.
2806 cpi->prob_intra_coded = 63;
2807 cpi->prob_last_coded = 128;
2808 cpi->prob_gf_coded = 128;
2812 cpi->prob_intra_coded = (rf_intra * 255) / (rf_intra + rf_inter);
2814 if (cpi->prob_intra_coded < 1)
2815 cpi->prob_intra_coded = 1;
2817 if ((cm->frames_since_golden > 0) || cpi->source_alt_ref_active)
2819 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
2821 if (cpi->prob_last_coded < 1)
2822 cpi->prob_last_coded = 1;
2824 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
2825 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
2827 if (cpi->prob_gf_coded < 1)
2828 cpi->prob_gf_coded = 1;
2833 const int *const rfct = cpi->count_mb_ref_frame_usage;
2834 const int rf_intra = rfct[INTRA_FRAME];
2835 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2837 if (cm->frame_type == KEY_FRAME)
2839 cpi->prob_intra_coded = 255;
2840 cpi->prob_last_coded = 128;
2841 cpi->prob_gf_coded = 128;
2843 else if (!(rf_intra + rf_inter))
2845 // This is a trap in case this function is called with cpi->recent_ref_frame_usage[] blank.
2846 cpi->prob_intra_coded = 63;
2847 cpi->prob_last_coded = 128;
2848 cpi->prob_gf_coded = 128;
2852 cpi->prob_intra_coded = (rf_intra * 255) / (rf_intra + rf_inter);
2854 if (cpi->prob_intra_coded < 1)
2855 cpi->prob_intra_coded = 1;
2857 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
2859 if (cpi->prob_last_coded < 1)
2860 cpi->prob_last_coded = 1;
2862 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
2863 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
2865 if (cpi->prob_gf_coded < 1)
2866 cpi->prob_gf_coded = 1;
2869 // update reference frame costs since we can do better than what we got last frame.
2871 if (cpi->common.refresh_alt_ref_frame)
2873 cpi->prob_intra_coded += 40;
2874 cpi->prob_last_coded = 200;
2875 cpi->prob_gf_coded = 1;
2877 else if (cpi->common.frames_since_golden == 0)
2879 cpi->prob_last_coded = 214;
2880 cpi->prob_gf_coded = 1;
2882 else if (cpi->common.frames_since_golden == 1)
2884 cpi->prob_last_coded = 192;
2885 cpi->prob_gf_coded = 220;
2887 else if (cpi->source_alt_ref_active)
2889 //int dist = cpi->common.frames_till_alt_ref_frame + cpi->common.frames_since_golden;
2890 cpi->prob_gf_coded -= 20;
2892 if (cpi->prob_gf_coded < 10)
2893 cpi->prob_gf_coded = 10;
2900 // 1 = key, 0 = inter
2901 static int decide_key_frame(VP8_COMP *cpi)
2903 VP8_COMMON *cm = &cpi->common;
2905 int code_key_frame = FALSE;
2909 if (cpi->Speed > 11)
2912 // Clear down mmx registers
2913 vp8_clear_system_state(); //__asm emms;
2915 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
2917 double change = 1.0 * abs((int)(cpi->intra_error - cpi->last_intra_error)) / (1 + cpi->last_intra_error);
2918 double change2 = 1.0 * abs((int)(cpi->prediction_error - cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
2919 double minerror = cm->MBs * 256;
2923 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
2924 && cpi->prediction_error > minerror
2925 && (change > .25 || change2 > .25))
2927 FILE *f = fopen("intra_inter.stt", "a");
2929 if (cpi->prediction_error <= 0)
2930 cpi->prediction_error = 1;
2932 fprintf(f, "%d %d %d %d %14.4f\n",
2933 cm->current_video_frame,
2934 (int) cpi->prediction_error,
2935 (int) cpi->intra_error,
2936 (int)((10 * cpi->intra_error) / cpi->prediction_error),
2944 cpi->last_intra_error = cpi->intra_error;
2945 cpi->last_prediction_error = cpi->prediction_error;
2947 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
2948 && cpi->prediction_error > minerror
2949 && (change > .25 || change2 > .25))
2951 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
2959 // If the following are true we might as well code a key frame
2960 if (((cpi->this_frame_percent_intra == 100) &&
2961 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
2962 ((cpi->this_frame_percent_intra > 95) &&
2963 (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
2965 code_key_frame = TRUE;
2967 // in addition if the following are true and this is not a golden frame then code a key frame
2968 // Note that on golden frames there often seems to be a pop in intra useage anyway hence this
2969 // restriction is designed to prevent spurious key frames. The Intra pop needs to be investigated.
2970 else if (((cpi->this_frame_percent_intra > 60) &&
2971 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
2972 ((cpi->this_frame_percent_intra > 75) &&
2973 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
2974 ((cpi->this_frame_percent_intra > 90) &&
2975 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
2977 if (!cm->refresh_golden_frame)
2978 code_key_frame = TRUE;
2981 return code_key_frame;
2985 #if !(CONFIG_REALTIME_ONLY)
2986 static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
2991 vp8_set_quantizer(cpi, 26);
2993 scale_and_extend_source(cpi->un_scaled_source, cpi);
2994 vp8_first_pass(cpi);
2999 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
3007 sprintf(filename, "cx\\y%04d.raw", this_frame);
3008 yframe = fopen(filename, "wb");
3010 for (i = 0; i < frame->y_height; i++)
3011 fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
3014 sprintf(filename, "cx\\u%04d.raw", this_frame);
3015 yframe = fopen(filename, "wb");
3017 for (i = 0; i < frame->uv_height; i++)
3018 fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3021 sprintf(filename, "cx\\v%04d.raw", this_frame);
3022 yframe = fopen(filename, "wb");
3024 for (i = 0; i < frame->uv_height; i++)
3025 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3030 // return of 0 means drop frame
3032 // Function to test for conditions that indeicate we should loop
3033 // back and recode a frame.
3034 static BOOL recode_loop_test( VP8_COMP *cpi,
3035 int high_limit, int low_limit,
3036 int q, int maxq, int minq )
3038 BOOL force_recode = FALSE;
3039 VP8_COMMON *cm = &cpi->common;
3041 // Is frame recode allowed at all
3042 // Yes if either recode mode 1 is selected or mode two is selcted
3043 // and the frame is a key frame. golden frame or alt_ref_frame
3044 if ( (cpi->sf.recode_loop == 1) ||
3045 ( (cpi->sf.recode_loop == 2) &&
3046 ( (cm->frame_type == KEY_FRAME) ||
3047 cm->refresh_golden_frame ||
3048 cm->refresh_alt_ref_frame ) ) )
3050 // General over and under shoot tests
3051 if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
3052 ((cpi->projected_frame_size < low_limit) && (q > minq)) )
3054 force_recode = TRUE;
3056 // Special Constrained quality tests
3057 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3059 // Undershoot and below auto cq level
3060 if ( (q > cpi->cq_target_quality) &&
3061 (cpi->projected_frame_size <
3062 ((cpi->this_frame_target * 7) >> 3)))
3064 force_recode = TRUE;
3066 // Severe undershoot and between auto and user cq level
3067 else if ( (q > cpi->oxcf.cq_level) &&
3068 (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
3069 (cpi->active_best_quality > cpi->oxcf.cq_level))
3071 force_recode = TRUE;
3072 cpi->active_best_quality = cpi->oxcf.cq_level;
3077 return force_recode;
3080 void update_reference_frames(VP8_COMMON *cm)
3082 YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
3084 // At this point the new frame has been encoded.
3085 // If any buffer copy / swapping is signaled it should be done here.
3087 if (cm->frame_type == KEY_FRAME)
3089 yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FLAG | VP8_ALT_FLAG ;
3091 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3092 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3094 cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
3096 else /* For non key frames */
3098 if (cm->refresh_alt_ref_frame)
3100 assert(!cm->copy_buffer_to_arf);
3102 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALT_FLAG;
3103 cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3104 cm->alt_fb_idx = cm->new_fb_idx;
3106 else if (cm->copy_buffer_to_arf)
3108 assert(!(cm->copy_buffer_to_arf & ~0x3));
3110 if (cm->copy_buffer_to_arf == 1)
3112 if(cm->alt_fb_idx != cm->lst_fb_idx)
3114 yv12_fb[cm->lst_fb_idx].flags |= VP8_ALT_FLAG;
3115 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3116 cm->alt_fb_idx = cm->lst_fb_idx;
3119 else /* if (cm->copy_buffer_to_arf == 2) */
3121 if(cm->alt_fb_idx != cm->gld_fb_idx)
3123 yv12_fb[cm->gld_fb_idx].flags |= VP8_ALT_FLAG;
3124 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3125 cm->alt_fb_idx = cm->gld_fb_idx;
3130 if (cm->refresh_golden_frame)
3132 assert(!cm->copy_buffer_to_gf);
3134 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FLAG;
3135 cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3136 cm->gld_fb_idx = cm->new_fb_idx;
3138 else if (cm->copy_buffer_to_gf)
3140 assert(!(cm->copy_buffer_to_arf & ~0x3));
3142 if (cm->copy_buffer_to_gf == 1)
3144 if(cm->gld_fb_idx != cm->lst_fb_idx)
3146 yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FLAG;
3147 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3148 cm->gld_fb_idx = cm->lst_fb_idx;
3151 else /* if (cm->copy_buffer_to_gf == 2) */
3153 if(cm->alt_fb_idx != cm->gld_fb_idx)
3155 yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FLAG;
3156 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3157 cm->gld_fb_idx = cm->alt_fb_idx;
3163 if (cm->refresh_last_frame)
3165 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FLAG;
3166 cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FLAG;
3167 cm->lst_fb_idx = cm->new_fb_idx;
3171 void loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
3175 cm->filter_level = 0;
3179 struct vpx_usec_timer timer;
3181 vp8_clear_system_state();
3183 vpx_usec_timer_start(&timer);
3184 if (cpi->sf.auto_filter == 0)
3185 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3188 vp8cx_pick_filter_level(cpi->Source, cpi);
3190 vpx_usec_timer_mark(&timer);
3191 cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3194 #if CONFIG_MULTITHREAD
3195 if (cpi->b_multi_threaded)
3196 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3199 if (cm->filter_level > 0)
3201 vp8cx_set_alt_lf_level(cpi, cm->filter_level);
3202 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, cm->filter_level);
3203 cm->last_filter_type = cm->filter_type;
3204 cm->last_sharpness_level = cm->sharpness_level;
3207 vp8_yv12_extend_frame_borders_ptr(cm->frame_to_show);
3211 static void encode_frame_to_data_rate
3214 unsigned long *size,
3215 unsigned char *dest,
3216 unsigned int *frame_flags
3220 int frame_over_shoot_limit;
3221 int frame_under_shoot_limit;
3231 int zbin_oq_low = 0;
3234 VP8_COMMON *cm = &cpi->common;
3235 int active_worst_qchanged = FALSE;
3237 int overshoot_seen = FALSE;
3238 int undershoot_seen = FALSE;
3239 int drop_mark = cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100;
3240 int drop_mark75 = drop_mark * 2 / 3;
3241 int drop_mark50 = drop_mark / 4;
3242 int drop_mark25 = drop_mark / 8;
3245 // Clear down mmx registers to allow floating point in what follows
3246 vp8_clear_system_state();
3248 // Test code for segmentation of gf/arf (0,0)
3249 //segmentation_test_function((VP8_PTR) cpi);
3251 #if CONFIG_REALTIME_ONLY
3252 if(cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
3254 if(cpi->force_next_frame_intra)
3256 cm->frame_type = KEY_FRAME; /* delayed intra frame */
3259 cpi->force_next_frame_intra = 0;
3262 // For an alt ref frame in 2 pass we skip the call to the second pass function that sets the target bandwidth
3263 #if !(CONFIG_REALTIME_ONLY)
3267 if (cpi->common.refresh_alt_ref_frame)
3269 cpi->per_frame_bandwidth = cpi->twopass.gf_bits; // Per frame bit target for the alt ref frame
3270 cpi->target_bandwidth = cpi->twopass.gf_bits * cpi->output_frame_rate; // per second target bitrate
3275 cpi->per_frame_bandwidth = (int)(cpi->target_bandwidth / cpi->output_frame_rate);
3277 // Default turn off buffer to buffer copying
3278 cm->copy_buffer_to_gf = 0;
3279 cm->copy_buffer_to_arf = 0;
3281 // Clear zbin over-quant value and mode boost values.
3282 cpi->zbin_over_quant = 0;
3283 cpi->zbin_mode_boost = 0;
3285 // Enable or disable mode based tweaking of the zbin
3286 // For 2 Pass Only used where GF/ARF prediction quality
3287 // is above a threshold
3288 cpi->zbin_mode_boost = 0;
3289 cpi->zbin_mode_boost_enabled = TRUE;
3292 if ( cpi->gfu_boost <= 400 )
3294 cpi->zbin_mode_boost_enabled = FALSE;
3298 // Current default encoder behaviour for the altref sign bias
3299 if (cpi->source_alt_ref_active)
3300 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3302 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3304 // Check to see if a key frame is signalled
3305 // For two pass with auto key frame enabled cm->frame_type may already be set, but not for one pass.
3306 if ((cm->current_video_frame == 0) ||
3307 (cm->frame_flags & FRAMEFLAGS_KEY) ||
3308 (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
3310 // Key frame from VFW/auto-keyframe/first frame
3311 cm->frame_type = KEY_FRAME;
3314 // Set default state for segment and mode based loop filter update flags
3315 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
3316 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
3317 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
3319 // Set various flags etc to special state if it is a key frame
3320 if (cm->frame_type == KEY_FRAME)
3324 // Reset the loop filter deltas and segmentation map
3325 setup_features(cpi);
3327 // If segmentation is enabled force a map update for key frames
3328 if (cpi->mb.e_mbd.segmentation_enabled)
3330 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3331 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3334 // The alternate reference frame cannot be active for a key frame
3335 cpi->source_alt_ref_active = FALSE;
3337 // Reset the RD threshold multipliers to default of * 1 (128)
3338 for (i = 0; i < MAX_MODES; i++)
3340 cpi->rd_thresh_mult[i] = 128;
3344 // Test code for segmentation
3345 //if ( (cm->frame_type == KEY_FRAME) || ((cm->current_video_frame % 2) == 0))
3346 //if ( (cm->current_video_frame % 2) == 0 )
3347 // enable_segmentation((VP8_PTR)cpi);
3349 // disable_segmentation((VP8_PTR)cpi);
3352 // Experimental code for lagged compress and one pass
3353 // Initialise one_pass GF frames stats
3354 // Update stats used for GF selection
3355 //if ( cpi->pass == 0 )
3357 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3359 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3360 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3361 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3362 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3363 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3364 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3365 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3366 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3367 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3371 update_rd_ref_frame_probs(cpi);
3373 if (cpi->drop_frames_allowed)
3375 // The reset to decimation 0 is only done here for one pass.
3376 // Once it is set two pass leaves decimation on till the next kf.
3377 if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
3378 cpi->decimation_factor --;
3380 if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
3381 cpi->decimation_factor = 1;
3383 else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
3385 cpi->decimation_factor = 3;
3387 else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
3389 cpi->decimation_factor = 2;
3391 else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
3393 cpi->decimation_factor = 1;
3396 //vpx_log("Encoder: Decimation Factor: %d \n",cpi->decimation_factor);
3399 // The following decimates the frame rate according to a regular pattern (i.e. to 1/2 or 2/3 frame rate)
3400 // This can be used to help prevent buffer under-run in CBR mode. Alternatively it might be desirable in
3401 // some situations to drop frame rate but throw more bits at each frame.
3403 // Note that dropping a key frame can be problematic if spatial resampling is also active
3404 if (cpi->decimation_factor > 0)
3406 switch (cpi->decimation_factor)
3409 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
3412 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3415 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3419 // Note that we should not throw out a key frame (especially when spatial resampling is enabled).
3420 if ((cm->frame_type == KEY_FRAME)) // && cpi->oxcf.allow_spatial_resampling )
3422 cpi->decimation_count = cpi->decimation_factor;
3424 else if (cpi->decimation_count > 0)
3426 cpi->decimation_count --;
3427 cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3428 cm->current_video_frame++;
3429 cpi->frames_since_key++;
3431 #if CONFIG_INTERNAL_STATS
3435 cpi->buffer_level = cpi->bits_off_target;
3440 cpi->decimation_count = cpi->decimation_factor;
3443 // Decide how big to make the frame
3444 if (!vp8_pick_frame_size(cpi))
3446 cm->current_video_frame++;
3447 cpi->frames_since_key++;
3451 // Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
3452 // This has a knock on effect on active best quality as well.
3453 // For CBR if the buffer reaches its maximum level then we can no longer
3454 // save up bits for later frames so we might as well use them up
3455 // on the current frame.
3456 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
3457 (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
3459 int Adjustment = cpi->active_worst_quality / 4; // Max adjustment is 1/4
3465 if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
3467 buff_lvl_step = (cpi->oxcf.maximum_buffer_size - cpi->oxcf.optimal_buffer_level) / Adjustment;
3470 Adjustment = (cpi->buffer_level - cpi->oxcf.optimal_buffer_level) / buff_lvl_step;
3475 cpi->active_worst_quality -= Adjustment;
3477 if(cpi->active_worst_quality < cpi->active_best_quality)
3478 cpi->active_worst_quality = cpi->active_best_quality;
3482 // Set an active best quality and if necessary active worst quality
3483 // There is some odd behaviour for one pass here that needs attention.
3484 if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
3486 vp8_clear_system_state();
3488 Q = cpi->active_worst_quality;
3490 if ( cm->frame_type == KEY_FRAME )
3492 if ( cpi->pass == 2 )
3494 if (cpi->gfu_boost > 600)
3495 cpi->active_best_quality = kf_low_motion_minq[Q];
3497 cpi->active_best_quality = kf_high_motion_minq[Q];
3499 // Special case for key frames forced because we have reached
3500 // the maximum key frame interval. Here force the Q to a range
3501 // based on the ambient Q to reduce the risk of popping
3502 if ( cpi->this_key_frame_forced )
3504 if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
3505 cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
3506 else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
3507 cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3510 // One pass more conservative
3512 cpi->active_best_quality = kf_high_motion_minq[Q];
3515 else if (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame)
3517 // Use the lower of cpi->active_worst_quality and recent
3518 // average Q as basis for GF/ARF Q limit unless last frame was
3520 if ( (cpi->frames_since_key > 1) &&
3521 (cpi->avg_frame_qindex < cpi->active_worst_quality) )
3523 Q = cpi->avg_frame_qindex;
3525 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3526 (Q < cpi->oxcf.cq_level) )
3528 Q = cpi->oxcf.cq_level;
3532 if ( cpi->pass == 2 )
3534 if ( cpi->gfu_boost > 1000 )
3535 cpi->active_best_quality = gf_low_motion_minq[Q];
3536 else if ( cpi->gfu_boost < 400 )
3537 cpi->active_best_quality = gf_high_motion_minq[Q];
3539 cpi->active_best_quality = gf_mid_motion_minq[Q];
3541 // One pass more conservative
3543 cpi->active_best_quality = gf_high_motion_minq[Q];
3547 cpi->active_best_quality = inter_minq[Q];
3549 // For the constant/constrained quality mode we dont want
3550 // the quality to rise above the cq level.
3551 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3552 (cpi->active_best_quality < cpi->cq_target_quality) )
3554 // If we are strongly undershooting the target rate in the last
3555 // frames then use the user passed in cq value not the auto
3557 if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
3558 cpi->active_best_quality = cpi->oxcf.cq_level;
3560 cpi->active_best_quality = cpi->cq_target_quality;
3564 // If CBR and the buffer is as full then it is reasonable to allow
3565 // higher quality on the frames to prevent bits just going to waste.
3566 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3568 // Note that the use of >= here elliminates the risk of a devide
3569 // by 0 error in the else if clause
3570 if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
3571 cpi->active_best_quality = cpi->best_quality;
3573 else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
3575 int Fraction = ((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128) / (cpi->oxcf.maximum_buffer_size - cpi->oxcf.optimal_buffer_level);
3576 int min_qadjustment = ((cpi->active_best_quality - cpi->best_quality) * Fraction) / 128;
3578 cpi->active_best_quality -= min_qadjustment;
3582 // Make sure constrained quality mode limits are adhered to for the first
3583 // few frames of one pass encodes
3584 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3586 if ( (cm->frame_type == KEY_FRAME) ||
3587 cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
3589 cpi->active_best_quality = cpi->best_quality;
3591 else if (cpi->active_best_quality < cpi->cq_target_quality)
3593 cpi->active_best_quality = cpi->cq_target_quality;
3597 // Clip the active best and worst quality values to limits
3598 if (cpi->active_worst_quality > cpi->worst_quality)
3599 cpi->active_worst_quality = cpi->worst_quality;
3601 if (cpi->active_best_quality < cpi->best_quality)
3602 cpi->active_best_quality = cpi->best_quality;
3603 else if (cpi->active_best_quality > cpi->active_worst_quality)
3604 cpi->active_best_quality = cpi->active_worst_quality;
3606 // Determine initial Q to try
3607 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3608 last_zbin_oq = cpi->zbin_over_quant;
3610 // Set highest allowed value for Zbin over quant
3611 if (cm->frame_type == KEY_FRAME)
3612 zbin_oq_high = 0; //ZBIN_OQ_MAX/16
3613 else if (cm->refresh_alt_ref_frame || (cm->refresh_golden_frame && !cpi->source_alt_ref_active))
3616 zbin_oq_high = ZBIN_OQ_MAX;
3618 // Setup background Q adjustment for error resilliant mode
3619 if (cpi->cyclic_refresh_mode_enabled)
3620 cyclic_background_refresh(cpi, Q, 0);
3622 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3624 // Limit Q range for the adaptive loop.
3625 bottom_index = cpi->active_best_quality;
3626 top_index = cpi->active_worst_quality;
3627 q_low = cpi->active_best_quality;
3628 q_high = cpi->active_worst_quality;
3630 vp8_save_coding_context(cpi);
3635 scale_and_extend_source(cpi->un_scaled_source, cpi);
3636 #if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC
3638 if (cpi->oxcf.noise_sensitivity > 0)
3643 switch (cpi->oxcf.noise_sensitivity)
3666 if (cm->frame_type == KEY_FRAME)
3668 vp8_de_noise(cpi->Source, cpi->Source, l , 1, 0, RTCD(postproc));
3672 vp8_de_noise(cpi->Source, cpi->Source, l , 1, 0, RTCD(postproc));
3674 src = cpi->Source->y_buffer;
3676 if (cpi->Source->y_stride < 0)
3678 src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
3685 #ifdef OUTPUT_YUV_SRC
3686 vp8_write_yuv_frame(cpi->Source);
3691 vp8_clear_system_state(); //__asm emms;
3694 if(cpi->is_src_frame_alt_ref)
3698 vp8_set_quantizer(cpi, Q);
3701 // setup skip prob for costing in mode/mv decision
3702 if (cpi->common.mb_no_coeff_skip)
3704 cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
3706 if (cm->frame_type != KEY_FRAME)
3708 if (cpi->common.refresh_alt_ref_frame)
3710 if (cpi->last_skip_false_probs[2] != 0)
3711 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3714 if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
3715 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3716 else if (cpi->last_skip_false_probs[2]!=0)
3717 cpi->prob_skip_false = (cpi->last_skip_false_probs[2] + cpi->prob_skip_false ) / 2;
3720 else if (cpi->common.refresh_golden_frame)
3722 if (cpi->last_skip_false_probs[1] != 0)
3723 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3726 if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
3727 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3728 else if (cpi->last_skip_false_probs[1]!=0)
3729 cpi->prob_skip_false = (cpi->last_skip_false_probs[1] + cpi->prob_skip_false ) / 2;
3734 if (cpi->last_skip_false_probs[0] != 0)
3735 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3738 if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
3739 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3740 else if(cpi->last_skip_false_probs[0]!=0)
3741 cpi->prob_skip_false = (cpi->last_skip_false_probs[0] + cpi->prob_skip_false ) / 2;
3745 //as this is for cost estimate, let's make sure it does not go extreme eitehr way
3746 if (cpi->prob_skip_false < 5)
3747 cpi->prob_skip_false = 5;
3749 if (cpi->prob_skip_false > 250)
3750 cpi->prob_skip_false = 250;
3752 if (cpi->is_src_frame_alt_ref)
3753 cpi->prob_skip_false = 1;
3762 FILE *f = fopen("skip.stt", "a");
3763 fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
3771 if (cm->frame_type == KEY_FRAME)
3773 resize_key_frame(cpi);
3774 vp8_setup_key_frame(cpi);
3777 // transform / motion compensation build reconstruction frame
3778 vp8_encode_frame(cpi);
3780 cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
3781 cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
3783 vp8_clear_system_state(); //__asm emms;
3785 // Test to see if the stats generated for this frame indicate that we should have coded a key frame
3786 // (assuming that we didn't)!
3787 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
3790 #if CONFIG_REALTIME_ONLY
3792 /* we don't do re-encoding in realtime mode
3793 * if key frame is decided than we force it on next frame */
3794 cpi->force_next_frame_intra = decide_key_frame(cpi);
3797 if (decide_key_frame(cpi))
3799 // Reset all our sizing numbers and recode
3800 cm->frame_type = KEY_FRAME;
3802 vp8_pick_frame_size(cpi);
3804 // Clear the Alt reference frame active flag when we have a key frame
3805 cpi->source_alt_ref_active = FALSE;
3807 // Reset the loop filter deltas and segmentation map
3808 setup_features(cpi);
3810 // If segmentation is enabled force a map update for key frames
3811 if (cpi->mb.e_mbd.segmentation_enabled)
3813 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3814 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3817 vp8_restore_coding_context(cpi);
3819 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3821 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3823 // Limit Q range for the adaptive loop.
3824 bottom_index = cpi->active_best_quality;
3825 top_index = cpi->active_worst_quality;
3826 q_low = cpi->active_best_quality;
3827 q_high = cpi->active_worst_quality;
3837 vp8_clear_system_state();
3839 if (frame_over_shoot_limit == 0)
3840 frame_over_shoot_limit = 1;
3842 // Are we are overshooting and up against the limit of active max Q.
3843 if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
3844 (Q == cpi->active_worst_quality) &&
3845 (cpi->active_worst_quality < cpi->worst_quality) &&
3846 (cpi->projected_frame_size > frame_over_shoot_limit))
3848 int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;
3850 // If so is there any scope for relaxing it
3851 while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
3853 cpi->active_worst_quality++;
3854 top_index = cpi->active_worst_quality;
3855 over_size_percent = (int)(over_size_percent * 0.96); // Assume 1 qstep = about 4% on frame size.
3858 // If we have updated the active max Q do not call vp8_update_rate_correction_factors() this loop.
3859 active_worst_qchanged = TRUE;
3862 active_worst_qchanged = FALSE;
3864 #if !(CONFIG_REALTIME_ONLY)
3865 // Special case handling for forced key frames
3866 if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
3869 int kf_err = vp8_calc_ss_err(cpi->Source,
3870 &cm->yv12_fb[cm->new_fb_idx],
3871 IF_RTCD(&cpi->rtcd.variance));
3873 // The key frame is not good enough
3874 if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
3877 q_high = (Q > q_low) ? (Q - 1) : q_low;
3880 Q = (q_high + q_low) >> 1;
3882 // The key frame is much better than the previous frame
3883 else if ( kf_err < (cpi->ambient_err >> 1) )
3886 q_low = (Q < q_high) ? (Q + 1) : q_high;
3889 Q = (q_high + q_low + 1) >> 1;
3892 // Clamp Q to upper and lower limits:
3898 Loop = ((Q != last_q)) ? TRUE : FALSE;
3901 // Is the projected frame size out of range and are we allowed to attempt to recode.
3902 else if ( recode_loop_test( cpi,
3903 frame_over_shoot_limit, frame_under_shoot_limit,
3904 Q, top_index, bottom_index ) )
3909 // Frame size out of permitted range:
3910 // Update correction factor & compute new Q to try...
3912 // Frame is too large
3913 if (cpi->projected_frame_size > cpi->this_frame_target)
3915 //if ( cpi->zbin_over_quant == 0 )
3916 q_low = (Q < q_high) ? (Q + 1) : q_high; // Raise Qlow as to at least the current value
3918 if (cpi->zbin_over_quant > 0) // If we are using over quant do the same for zbin_oq_low
3919 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi->zbin_over_quant + 1) : zbin_oq_high;
3921 //if ( undershoot_seen || (Q == MAXQ) )
3922 if (undershoot_seen)
3924 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3925 if (!active_worst_qchanged)
3926 vp8_update_rate_correction_factors(cpi, 1);
3928 Q = (q_high + q_low + 1) / 2;
3930 // Adjust cpi->zbin_over_quant (only allowed when Q is max)
3932 cpi->zbin_over_quant = 0;
3935 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi->zbin_over_quant + 1) : zbin_oq_high;
3936 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
3941 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3942 if (!active_worst_qchanged)
3943 vp8_update_rate_correction_factors(cpi, 0);
3945 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3947 while (((Q < q_low) || (cpi->zbin_over_quant < zbin_oq_low)) && (Retries < 10))
3949 vp8_update_rate_correction_factors(cpi, 0);
3950 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3955 overshoot_seen = TRUE;
3957 // Frame is too small
3960 if (cpi->zbin_over_quant == 0)
3961 q_high = (Q > q_low) ? (Q - 1) : q_low; // Lower q_high if not using over quant
3962 else // else lower zbin_oq_high
3963 zbin_oq_high = (cpi->zbin_over_quant > zbin_oq_low) ? (cpi->zbin_over_quant - 1) : zbin_oq_low;
3967 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3968 if (!active_worst_qchanged)
3969 vp8_update_rate_correction_factors(cpi, 1);
3971 Q = (q_high + q_low) / 2;
3973 // Adjust cpi->zbin_over_quant (only allowed when Q is max)
3975 cpi->zbin_over_quant = 0;
3977 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
3981 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3982 if (!active_worst_qchanged)
3983 vp8_update_rate_correction_factors(cpi, 0);
3985 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3987 // Special case reset for qlow for constrained quality.
3988 // This should only trigger where there is very substantial
3989 // undershoot on a frame and the auto cq level is above
3990 // the user passsed in value.
3991 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3997 while (((Q > q_high) || (cpi->zbin_over_quant > zbin_oq_high)) && (Retries < 10))
3999 vp8_update_rate_correction_factors(cpi, 0);
4000 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4005 undershoot_seen = TRUE;
4008 // Clamp Q to upper and lower limits:
4014 // Clamp cpi->zbin_over_quant
4015 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;
4017 //Loop = ((Q != last_q) || (last_zbin_oq != cpi->zbin_over_quant)) ? TRUE : FALSE;
4018 Loop = ((Q != last_q)) ? TRUE : FALSE;
4019 last_zbin_oq = cpi->zbin_over_quant;
4025 if (cpi->is_src_frame_alt_ref)
4030 vp8_restore_coding_context(cpi);
4032 #if CONFIG_INTERNAL_STATS
4033 cpi->tot_recode_hits++;
4037 while (Loop == TRUE);
4040 // Experimental code for lagged and one pass
4041 // Update stats used for one pass GF selection
4045 double frame_intra_error;
4046 double frame_coded_error;
4047 double frame_pcnt_inter;
4048 double frame_pcnt_motion;
4050 double frame_mvr_abs;
4052 double frame_mvc_abs;
4055 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4056 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4057 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4061 // Special case code to reduce pulsing when key frames are forced at a
4062 // fixed interval. Note the reconstruction error if it is the frame before
4063 // the force key frame
4064 if ( cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0) )
4066 cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
4067 &cm->yv12_fb[cm->new_fb_idx],
4068 IF_RTCD(&cpi->rtcd.variance));
4071 // This frame's MVs are saved and will be used in next frame's MV prediction.
4072 // Last frame has one more line(add to bottom) and one more column(add to right) than cm->mip. The edge elements are initialized to 0.
4073 if(cm->show_frame) //do not save for altref frame
4077 MODE_INFO *tmp = cm->mip; //point to beginning of allocated MODE_INFO arrays.
4079 if(cm->frame_type != KEY_FRAME)
4081 for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
4083 for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
4085 if(tmp->mbmi.ref_frame != INTRA_FRAME)
4086 cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;
4088 cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4089 cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
4096 // Update the GF useage maps.
4097 // This is done after completing the compression of a frame when all modes etc. are finalized but before loop filter
4098 // This is done after completing the compression of a frame when all modes etc. are finalized but before loop filter
4099 vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4101 if (cm->frame_type == KEY_FRAME)
4102 cm->refresh_last_frame = 1;
4106 FILE *f = fopen("gfactive.stt", "a");
4107 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);
4112 // For inter frames the current default behavior is that when
4113 // cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4114 // This is purely an encoder decision at present.
4115 if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
4116 cm->copy_buffer_to_arf = 2;
4118 cm->copy_buffer_to_arf = 0;
4120 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4122 #if CONFIG_MULTITHREAD
4123 if (cpi->b_multi_threaded)
4125 sem_post(&cpi->h_event_start_lpf); /* start loopfilter in separate thread */
4130 loopfilter_frame(cpi, cm);
4133 update_reference_frames(cm);
4135 if (cpi->oxcf.error_resilient_mode)
4137 cm->refresh_entropy_probs = 0;
4140 #if CONFIG_MULTITHREAD
4141 /* wait that filter_level is picked so that we can continue with stream packing */
4142 if (cpi->b_multi_threaded)
4143 sem_wait(&cpi->h_event_end_lpf);
4146 // build the bitstream
4147 vp8_pack_bitstream(cpi, dest, size);
4149 #if CONFIG_MULTITHREAD
4150 /* wait for loopfilter thread done */
4151 if (cpi->b_multi_threaded)
4153 sem_wait(&cpi->h_event_end_lpf);
4157 /* Move storing frame_type out of the above loop since it is also
4158 * needed in motion search besides loopfilter */
4159 cm->last_frame_type = cm->frame_type;
4161 // Update rate control heuristics
4162 cpi->total_byte_count += (*size);
4163 cpi->projected_frame_size = (*size) << 3;
4165 if (!active_worst_qchanged)
4166 vp8_update_rate_correction_factors(cpi, 2);
4168 cpi->last_q[cm->frame_type] = cm->base_qindex;
4170 if (cm->frame_type == KEY_FRAME)
4172 vp8_adjust_key_frame_context(cpi);
4175 // Keep a record of ambient average Q.
4176 if (cm->frame_type != KEY_FRAME)
4177 cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4179 // Keep a record from which we can calculate the average Q excluding GF updates and key frames
4180 if ((cm->frame_type != KEY_FRAME) && !cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)
4184 // Calculate the average Q for normal inter frames (not key or GFU
4186 if ( cpi->pass == 2 )
4188 cpi->ni_tot_qi += Q;
4189 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4193 // Damp value for first few frames
4194 if (cpi->ni_frames > 150 )
4196 cpi->ni_tot_qi += Q;
4197 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4199 // For one pass, early in the clip ... average the current frame Q
4200 // value with the worstq entered by the user as a dampening measure
4203 cpi->ni_tot_qi += Q;
4204 cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4207 // If the average Q is higher than what was used in the last frame
4208 // (after going through the recode loop to keep the frame size within range)
4209 // then use the last frame value - 1.
4210 // The -1 is designed to stop Q and hence the data rate, from progressively
4211 // falling away during difficult sections, but at the same time reduce the number of
4212 // itterations around the recode loop.
4213 if (Q > cpi->ni_av_qi)
4214 cpi->ni_av_qi = Q - 1;
4220 // If the frame was massively oversize and we are below optimal buffer level drop next frame
4221 if ((cpi->drop_frames_allowed) &&
4222 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
4223 (cpi->buffer_level < cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100) &&
4224 (cpi->projected_frame_size > (4 * cpi->this_frame_target)))
4226 cpi->drop_frame = TRUE;
4231 // Set the count for maximum consequative dropped frames based upon the ratio of
4232 // this frame size to the target average per frame bandwidth.
4233 // (cpi->av_per_frame_bandwidth > 0) is just a sanity check to prevent / 0.
4234 if (cpi->drop_frames_allowed && (cpi->av_per_frame_bandwidth > 0))
4236 cpi->max_drop_count = cpi->projected_frame_size / cpi->av_per_frame_bandwidth;
4238 if (cpi->max_drop_count > cpi->max_consec_dropped_frames)
4239 cpi->max_drop_count = cpi->max_consec_dropped_frames;
4242 // Update the buffer level variable.
4243 // Non-viewable frames are a special case and are treated as pure overhead.
4244 if ( !cm->show_frame )
4245 cpi->bits_off_target -= cpi->projected_frame_size;
4247 cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4249 // Rolling monitors of whether we are over or underspending used to help regulate min and Max Q in two pass.
4250 cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
4251 cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
4252 cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
4253 cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;
4255 // Actual bits spent
4256 cpi->total_actual_bits += cpi->projected_frame_size;
4259 cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);
4261 cpi->buffer_level = cpi->bits_off_target;
4263 // Update bits left to the kf and gf groups to account for overshoot or undershoot on these frames
4264 if (cm->frame_type == KEY_FRAME)
4266 cpi->twopass.kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4268 if (cpi->twopass.kf_group_bits < 0)
4269 cpi->twopass.kf_group_bits = 0 ;
4271 else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4273 cpi->twopass.gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4275 if (cpi->twopass.gf_group_bits < 0)
4276 cpi->twopass.gf_group_bits = 0 ;
4279 if (cm->frame_type != KEY_FRAME)
4281 if (cpi->common.refresh_alt_ref_frame)
4283 cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4284 cpi->last_skip_probs_q[2] = cm->base_qindex;
4286 else if (cpi->common.refresh_golden_frame)
4288 cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4289 cpi->last_skip_probs_q[1] = cm->base_qindex;
4293 cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4294 cpi->last_skip_probs_q[0] = cm->base_qindex;
4296 //update the baseline
4297 cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4302 #if 0 && CONFIG_INTERNAL_STATS
4304 FILE *f = fopen("tmp.stt", "a");
4306 vp8_clear_system_state(); //__asm emms;
4308 if (cpi->twopass.total_coded_error_left != 0.0)
4309 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %6d %6d"
4310 "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f"
4312 cpi->common.current_video_frame, cpi->this_frame_target,
4313 cpi->projected_frame_size,
4314 (cpi->projected_frame_size - cpi->this_frame_target),
4315 (int)cpi->total_target_vs_actual,
4316 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4317 (int)cpi->total_actual_bits, cm->base_qindex,
4318 cpi->active_best_quality, cpi->active_worst_quality,
4319 cpi->ni_av_qi, cpi->cq_target_quality, cpi->zbin_over_quant,
4320 //cpi->avg_frame_qindex, cpi->zbin_over_quant,
4321 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4322 cm->frame_type, cpi->gfu_boost,
4323 cpi->twopass.est_max_qcorrection_factor, (int)cpi->twopass.bits_left,
4324 cpi->twopass.total_coded_error_left,
4325 (double)cpi->twopass.bits_left / cpi->twopass.total_coded_error_left,
4326 cpi->tot_recode_hits);
4328 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %6d %6d"
4329 "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f"
4331 cpi->common.current_video_frame,
4332 cpi->this_frame_target, cpi->projected_frame_size,
4333 (cpi->projected_frame_size - cpi->this_frame_target),
4334 (int)cpi->total_target_vs_actual,
4335 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4336 (int)cpi->total_actual_bits, cm->base_qindex,
4337 cpi->active_best_quality, cpi->active_worst_quality,
4338 cpi->ni_av_qi, cpi->cq_target_quality, cpi->zbin_over_quant,
4339 //cpi->avg_frame_qindex, cpi->zbin_over_quant,
4340 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4341 cm->frame_type, cpi->gfu_boost,
4342 cpi->twopass.est_max_qcorrection_factor, (int)cpi->twopass.bits_left,
4343 cpi->twopass.total_coded_error_left, cpi->tot_recode_hits);
4348 FILE *fmodes = fopen("Modes.stt", "a");
4351 fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4352 cpi->common.current_video_frame,
4353 cm->frame_type, cm->refresh_golden_frame,
4354 cm->refresh_alt_ref_frame);
4356 for (i = 0; i < MAX_MODES; i++)
4357 fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
4359 fprintf(fmodes, "\n");
4367 // If this was a kf or Gf note the Q
4368 if ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4369 cm->last_kf_gf_q = cm->base_qindex;
4371 if (cm->refresh_golden_frame == 1)
4372 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4374 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
4376 if (cm->refresh_alt_ref_frame == 1)
4377 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4379 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
4382 if (cm->refresh_last_frame & cm->refresh_golden_frame) // both refreshed
4383 cpi->gold_is_last = 1;
4384 else if (cm->refresh_last_frame ^ cm->refresh_golden_frame) // 1 refreshed but not the other
4385 cpi->gold_is_last = 0;
4387 if (cm->refresh_last_frame & cm->refresh_alt_ref_frame) // both refreshed
4388 cpi->alt_is_last = 1;
4389 else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame) // 1 refreshed but not the other
4390 cpi->alt_is_last = 0;
4392 if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame) // both refreshed
4393 cpi->gold_is_alt = 1;
4394 else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame) // 1 refreshed but not the other
4395 cpi->gold_is_alt = 0;
4397 cpi->ref_frame_flags = VP8_ALT_FLAG | VP8_GOLD_FLAG | VP8_LAST_FLAG;
4399 if (cpi->gold_is_last)
4400 cpi->ref_frame_flags &= ~VP8_GOLD_FLAG;
4402 if (cpi->alt_is_last)
4403 cpi->ref_frame_flags &= ~VP8_ALT_FLAG;
4405 if (cpi->gold_is_alt)
4406 cpi->ref_frame_flags &= ~VP8_ALT_FLAG;
4409 if (!cpi->oxcf.error_resilient_mode)
4411 if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
4412 // Update the alternate reference frame stats as appropriate.
4413 update_alt_ref_frame_stats(cpi);
4415 // Update the Golden frame stats as appropriate.
4416 update_golden_frame_stats(cpi);
4419 if (cm->frame_type == KEY_FRAME)
4421 // Tell the caller that the frame was coded as a key frame
4422 *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4424 // As this frame is a key frame the next defaults to an inter frame.
4425 cm->frame_type = INTER_FRAME;
4427 cpi->last_frame_percent_intra = 100;
4431 *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
4433 cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4436 // Clear the one shot update flags for segmentation map and mode/ref loop filter deltas.
4437 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4438 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4439 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4442 // Dont increment frame counters if this was an altref buffer update not a real frame
4445 cm->current_video_frame++;
4446 cpi->frames_since_key++;
4449 // reset to normal state now that we are done.
4457 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
4458 recon_file = fopen(filename, "wb");
4459 fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4460 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4466 //vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show);
4472 static void check_gf_quality(VP8_COMP *cpi)
4474 VP8_COMMON *cm = &cpi->common;
4475 int gf_active_pct = (100 * cpi->gf_active_count) / (cm->mb_rows * cm->mb_cols);
4476 int gf_ref_usage_pct = (cpi->count_mb_ref_frame_usage[GOLDEN_FRAME] * 100) / (cm->mb_rows * cm->mb_cols);
4477 int last_ref_zz_useage = (cpi->inter_zz_count * 100) / (cm->mb_rows * cm->mb_cols);
4479 // Gf refresh is not currently being signalled
4480 if (cpi->gf_update_recommended == 0)
4482 if (cpi->common.frames_since_golden > 7)
4485 if ((gf_active_pct < 10) || ((gf_active_pct + gf_ref_usage_pct) < 15))
4487 // ...but last frame zero zero usage is reasonbable so a new gf might be appropriate
4488 if (last_ref_zz_useage >= 25)
4490 cpi->gf_bad_count ++;
4492 if (cpi->gf_bad_count >= 8) // Check that the condition is stable
4494 cpi->gf_update_recommended = 1;
4495 cpi->gf_bad_count = 0;
4499 cpi->gf_bad_count = 0; // Restart count as the background is not stable enough
4502 cpi->gf_bad_count = 0; // Gf useage has picked up so reset count
4505 // If the signal is set but has not been read should we cancel it.
4506 else if (last_ref_zz_useage < 15)
4508 cpi->gf_update_recommended = 0;
4509 cpi->gf_bad_count = 0;
4514 FILE *f = fopen("gfneeded.stt", "a");
4515 fprintf(f, "%10d %10d %10d %10d %10ld \n",
4516 cm->current_video_frame,
4517 cpi->common.frames_since_golden,
4518 gf_active_pct, gf_ref_usage_pct,
4519 cpi->gf_update_recommended);
4526 #if !(CONFIG_REALTIME_ONLY)
4527 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
4530 if (!cpi->common.refresh_alt_ref_frame)
4531 vp8_second_pass(cpi);
4533 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
4534 cpi->twopass.bits_left -= 8 * *size;
4536 if (!cpi->common.refresh_alt_ref_frame)
4538 double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
4539 *cpi->oxcf.two_pass_vbrmin_section / 100);
4540 cpi->twopass.bits_left += (long long)(two_pass_min_rate / cpi->oxcf.frame_rate);
4545 //For ARM NEON, d8-d15 are callee-saved registers, and need to be saved by us.
4547 extern void vp8_push_neon(INT64 *store);
4548 extern void vp8_pop_neon(INT64 *store);
4552 int vp8_receive_raw_frame(VP8_PTR ptr, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, INT64 time_stamp, INT64 end_time)
4557 VP8_COMP *cpi = (VP8_COMP *) ptr;
4558 VP8_COMMON *cm = &cpi->common;
4559 struct vpx_usec_timer timer;
4563 #if CONFIG_RUNTIME_CPU_DETECT
4564 if (cm->rtcd.flags & HAS_NEON)
4567 vp8_push_neon(store_reg);
4571 vpx_usec_timer_start(&timer);
4572 if(vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
4575 cm->clr_type = sd->clrtype;
4576 vpx_usec_timer_mark(&timer);
4577 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
4580 #if CONFIG_RUNTIME_CPU_DETECT
4581 if (cm->rtcd.flags & HAS_NEON)
4584 vp8_pop_neon(store_reg);
4592 int vp8_get_compressed_data(VP8_PTR ptr, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, INT64 *time_stamp, INT64 *time_end, int flush)
4597 VP8_COMP *cpi = (VP8_COMP *) ptr;
4598 VP8_COMMON *cm = &cpi->common;
4599 struct vpx_usec_timer tsctimer;
4600 struct vpx_usec_timer ticktimer;
4601 struct vpx_usec_timer cmptimer;
4602 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
4608 #if CONFIG_RUNTIME_CPU_DETECT
4609 if (cm->rtcd.flags & HAS_NEON)
4612 vp8_push_neon(store_reg);
4616 vpx_usec_timer_start(&cmptimer);
4620 #if !(CONFIG_REALTIME_ONLY)
4621 // Should we code an alternate reference frame
4622 if (cpi->oxcf.error_resilient_mode == 0 &&
4623 cpi->oxcf.play_alternate &&
4624 cpi->source_alt_ref_pending)
4626 if ((cpi->source = vp8_lookahead_peek(cpi->lookahead,
4627 cpi->frames_till_gf_update_due)))
4629 cpi->alt_ref_source = cpi->source;
4630 if (cpi->oxcf.arnr_max_frames > 0)
4632 vp8_temporal_filter_prepare_c(cpi,
4633 cpi->frames_till_gf_update_due);
4634 force_src_buffer = &cpi->alt_ref_buffer;
4636 cm->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
4637 cm->refresh_alt_ref_frame = 1;
4638 cm->refresh_golden_frame = 0;
4639 cm->refresh_last_frame = 0;
4641 cpi->source_alt_ref_pending = FALSE; // Clear Pending altf Ref flag.
4642 cpi->is_src_frame_alt_ref = 0;
4649 if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush)))
4653 cpi->is_src_frame_alt_ref = cpi->alt_ref_source
4654 && (cpi->source == cpi->alt_ref_source);
4656 if(cpi->is_src_frame_alt_ref)
4657 cpi->alt_ref_source = NULL;
4663 cpi->un_scaled_source =
4664 cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
4665 *time_stamp = cpi->source->ts_start;
4666 *time_end = cpi->source->ts_end;
4667 *frame_flags = cpi->source->flags;
4672 #if !(CONFIG_REALTIME_ONLY)
4674 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done)
4676 vp8_end_first_pass(cpi); /* get last stats packet */
4677 cpi->twopass.first_pass_done = 1;
4683 #if CONFIG_RUNTIME_CPU_DETECT
4684 if (cm->rtcd.flags & HAS_NEON)
4687 vp8_pop_neon(store_reg);
4693 if (cpi->source->ts_start < cpi->first_time_stamp_ever)
4695 cpi->first_time_stamp_ever = cpi->source->ts_start;
4696 cpi->last_end_time_stamp_seen = cpi->source->ts_start;
4699 // adjust frame rates based on timestamps given
4700 if (!cm->refresh_alt_ref_frame)
4702 long long this_duration;
4705 if (cpi->source->ts_start == cpi->first_time_stamp_ever)
4707 this_duration = cpi->source->ts_end - cpi->source->ts_start;
4712 long long last_duration;
4714 this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
4715 last_duration = cpi->last_end_time_stamp_seen
4716 - cpi->last_time_stamp_seen;
4717 // do a step update if the duration changes by 10%
4719 step = ((this_duration - last_duration) * 10 / last_duration);
4725 vp8_new_frame_rate(cpi, 10000000.0 / this_duration);
4728 double avg_duration, interval;
4730 /* Average this frame's rate into the last second's average
4731 * frame rate. If we haven't seen 1 second yet, then average
4732 * over the whole interval seen.
4734 interval = cpi->source->ts_end - cpi->first_time_stamp_ever;
4735 if(interval > 10000000.0)
4736 interval = 10000000;
4738 avg_duration = 10000000.0 / cpi->oxcf.frame_rate;
4739 avg_duration *= (interval - avg_duration + this_duration);
4740 avg_duration /= interval;
4742 vp8_new_frame_rate(cpi, 10000000.0 / avg_duration);
4746 cpi->last_time_stamp_seen = cpi->source->ts_start;
4747 cpi->last_end_time_stamp_seen = cpi->source->ts_end;
4750 if (cpi->compressor_speed == 2)
4752 check_gf_quality(cpi);
4753 vpx_usec_timer_start(&tsctimer);
4754 vpx_usec_timer_start(&ticktimer);
4757 // start with a 0 size frame
4760 // Clear down mmx registers
4761 vp8_clear_system_state(); //__asm emms;
4763 cm->frame_type = INTER_FRAME;
4764 cm->frame_flags = *frame_flags;
4768 if (cm->refresh_alt_ref_frame)
4770 //cm->refresh_golden_frame = 1;
4771 cm->refresh_golden_frame = 0;
4772 cm->refresh_last_frame = 0;
4776 cm->refresh_golden_frame = 0;
4777 cm->refresh_last_frame = 1;
4781 /* find a free buffer for the new frame */
4784 for(; i < NUM_YV12_BUFFERS; i++)
4786 if(!cm->yv12_fb[i].flags)
4793 assert(i < NUM_YV12_BUFFERS );
4795 #if !(CONFIG_REALTIME_ONLY)
4799 Pass1Encode(cpi, size, dest, frame_flags);
4801 else if (cpi->pass == 2)
4803 Pass2Encode(cpi, size, dest, frame_flags);
4807 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
4809 if (cpi->compressor_speed == 2)
4811 unsigned int duration, duration2;
4812 vpx_usec_timer_mark(&tsctimer);
4813 vpx_usec_timer_mark(&ticktimer);
4815 duration = vpx_usec_timer_elapsed(&ticktimer);
4816 duration2 = (unsigned int)((double)duration / 2);
4818 if (cm->frame_type != KEY_FRAME)
4820 if (cpi->avg_encode_time == 0)
4821 cpi->avg_encode_time = duration;
4823 cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
4828 //if(*frame_flags!=1)
4831 if (cpi->avg_pick_mode_time == 0)
4832 cpi->avg_pick_mode_time = duration2;
4834 cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
4840 if (cm->refresh_entropy_probs == 0)
4842 vpx_memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
4845 // if its a dropped frame honor the requests on subsequent frames
4849 // return to normal state
4850 cm->refresh_entropy_probs = 1;
4851 cm->refresh_alt_ref_frame = 0;
4852 cm->refresh_golden_frame = 0;
4853 cm->refresh_last_frame = 1;
4854 cm->frame_type = INTER_FRAME;
4858 vpx_usec_timer_mark(&cmptimer);
4859 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
4861 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
4863 generate_psnr_packet(cpi);
4866 #if CONFIG_INTERNAL_STATS
4870 cpi->bytes += *size;
4877 if (cpi->b_calculate_psnr)
4881 YV12_BUFFER_CONFIG *orig = cpi->Source;
4882 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
4883 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
4884 int y_samples = orig->y_height * orig->y_width ;
4885 int uv_samples = orig->uv_height * orig->uv_width ;
4886 int t_samples = y_samples + 2 * uv_samples;
4889 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
4890 recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height,
4891 IF_RTCD(&cpi->rtcd.variance));
4893 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
4894 recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height,
4895 IF_RTCD(&cpi->rtcd.variance));
4897 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
4898 recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height,
4899 IF_RTCD(&cpi->rtcd.variance));
4901 sq_error = ye + ue + ve;
4903 frame_psnr = vp8_mse2psnr(t_samples, 255.0, sq_error);
4905 cpi->total_y += vp8_mse2psnr(y_samples, 255.0, ye);
4906 cpi->total_u += vp8_mse2psnr(uv_samples, 255.0, ue);
4907 cpi->total_v += vp8_mse2psnr(uv_samples, 255.0, ve);
4908 cpi->total_sq_error += sq_error;
4909 cpi->total += frame_psnr;
4911 double frame_psnr2, frame_ssim2 = 0;
4914 vp8_deblock(cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0, IF_RTCD(&cm->rtcd.postproc));
4915 vp8_clear_system_state();
4917 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
4918 pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height,
4919 IF_RTCD(&cpi->rtcd.variance));
4921 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
4922 pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height,
4923 IF_RTCD(&cpi->rtcd.variance));
4925 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
4926 pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height,
4927 IF_RTCD(&cpi->rtcd.variance));
4929 sq_error = ye + ue + ve;
4931 frame_psnr2 = vp8_mse2psnr(t_samples, 255.0, sq_error);
4933 cpi->totalp_y += vp8_mse2psnr(y_samples, 255.0, ye);
4934 cpi->totalp_u += vp8_mse2psnr(uv_samples, 255.0, ue);
4935 cpi->totalp_v += vp8_mse2psnr(uv_samples, 255.0, ve);
4936 cpi->total_sq_error2 += sq_error;
4937 cpi->totalp += frame_psnr2;
4939 frame_ssim2 = vp8_calc_ssim(cpi->Source,
4940 &cm->post_proc_buffer, 1, &weight,
4941 IF_RTCD(&cpi->rtcd.variance));
4943 cpi->summed_quality += frame_ssim2 * weight;
4944 cpi->summed_weights += weight;
4949 if (cpi->b_calculate_ssimg)
4951 double y, u, v, frame_all;
4952 frame_all = vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
4953 &y, &u, &v, IF_RTCD(&cpi->rtcd.variance));
4954 cpi->total_ssimg_y += y;
4955 cpi->total_ssimg_u += u;
4956 cpi->total_ssimg_v += v;
4957 cpi->total_ssimg_all += frame_all;
4965 if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
4967 skiptruecount += cpi->skip_true_count;
4968 skipfalsecount += cpi->skip_false_count;
4976 FILE *f = fopen("skip.stt", "a");
4977 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);
4979 if (cpi->is_src_frame_alt_ref == 1)
4980 fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
4989 #if CONFIG_RUNTIME_CPU_DETECT
4990 if (cm->rtcd.flags & HAS_NEON)
4993 vp8_pop_neon(store_reg);
5000 int vp8_get_preview_raw_frame(VP8_PTR comp, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
5002 VP8_COMP *cpi = (VP8_COMP *) comp;
5004 if (cpi->common.refresh_alt_ref_frame)
5010 ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5013 if (cpi->common.frame_to_show)
5015 *dest = *cpi->common.frame_to_show;
5016 dest->y_width = cpi->common.Width;
5017 dest->y_height = cpi->common.Height;
5018 dest->uv_height = cpi->common.Height / 2;
5026 #endif //!CONFIG_POSTPROC
5027 vp8_clear_system_state();
5032 int vp8_set_roimap(VP8_PTR comp, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4])
5034 VP8_COMP *cpi = (VP8_COMP *) comp;
5035 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5037 if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
5042 disable_segmentation((VP8_PTR)cpi);
5046 // Set the segmentation Map
5047 set_segmentation_map((VP8_PTR)cpi, map);
5049 // Activate segmentation.
5050 enable_segmentation((VP8_PTR)cpi);
5052 // Set up the quant segment data
5053 feature_data[MB_LVL_ALT_Q][0] = delta_q[0];
5054 feature_data[MB_LVL_ALT_Q][1] = delta_q[1];
5055 feature_data[MB_LVL_ALT_Q][2] = delta_q[2];
5056 feature_data[MB_LVL_ALT_Q][3] = delta_q[3];
5058 // Set up the loop segment data s
5059 feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5060 feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5061 feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5062 feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5064 cpi->segment_encode_breakout[0] = threshold[0];
5065 cpi->segment_encode_breakout[1] = threshold[1];
5066 cpi->segment_encode_breakout[2] = threshold[2];
5067 cpi->segment_encode_breakout[3] = threshold[3];
5069 // Initialise the feature data structure
5070 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
5071 set_segment_data((VP8_PTR)cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5076 int vp8_set_active_map(VP8_PTR comp, unsigned char *map, unsigned int rows, unsigned int cols)
5078 VP8_COMP *cpi = (VP8_COMP *) comp;
5080 if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols)
5084 vpx_memcpy(cpi->active_map, map, rows * cols);
5085 cpi->active_map_enabled = 1;
5088 cpi->active_map_enabled = 0;
5094 //cpi->active_map_enabled = 0;
5099 int vp8_set_internal_size(VP8_PTR comp, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
5101 VP8_COMP *cpi = (VP8_COMP *) comp;
5103 if (horiz_mode <= ONETWO)
5104 cpi->common.horiz_scale = horiz_mode;
5108 if (vert_mode <= ONETWO)
5109 cpi->common.vert_scale = vert_mode;
5118 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd)
5123 unsigned char *src = source->y_buffer;
5124 unsigned char *dst = dest->y_buffer;
5127 // Loop through the Y plane raw and reconstruction data summing (square differences)
5128 for (i = 0; i < source->y_height; i += 16)
5130 for (j = 0; j < source->y_width; j += 16)
5133 Total += VARIANCE_INVOKE(rtcd, mse16x16)(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
5136 src += 16 * source->y_stride;
5137 dst += 16 * dest->y_stride;
5144 int vp8_get_quantizer(VP8_PTR c)
5146 VP8_COMP *cpi = (VP8_COMP *) c;
5147 return cpi->common.base_qindex;