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;
902 sf->use_fastquant_for_pick = 1;
903 sf->no_skip_block4x4_search = 0;
909 cpi->mode_check_freq[THR_SPLITMV] = 7;
910 cpi->mode_check_freq[THR_SPLITG] = 15;
911 cpi->mode_check_freq[THR_SPLITA] = 15;
913 sf->thresh_mult[THR_TM ] = 2000;
914 sf->thresh_mult[THR_V_PRED ] = 2000;
915 sf->thresh_mult[THR_H_PRED ] = 2000;
916 sf->thresh_mult[THR_B_PRED ] = 5000;
918 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
920 sf->thresh_mult[THR_NEWMV ] = 2000;
921 sf->thresh_mult[THR_SPLITMV ] = 25000;
924 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
926 sf->thresh_mult[THR_NEARESTG ] = 2000;
927 sf->thresh_mult[THR_ZEROG ] = 2000;
928 sf->thresh_mult[THR_NEARG ] = 2000;
929 sf->thresh_mult[THR_NEWG ] = 2500;
930 sf->thresh_mult[THR_SPLITG ] = 50000;
933 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
935 sf->thresh_mult[THR_NEARESTA ] = 2000;
936 sf->thresh_mult[THR_ZEROA ] = 2000;
937 sf->thresh_mult[THR_NEARA ] = 2000;
938 sf->thresh_mult[THR_NEWA ] = 2500;
939 sf->thresh_mult[THR_SPLITA ] = 50000;
942 sf->full_freq[0] = 31;
943 sf->full_freq[1] = 63;
948 sf->auto_filter = 0; // Faster selection of loop filter
950 cpi->mode_check_freq[THR_V_PRED] = 2;
951 cpi->mode_check_freq[THR_H_PRED] = 2;
952 cpi->mode_check_freq[THR_B_PRED] = 2;
954 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
956 cpi->mode_check_freq[THR_NEARG] = 2;
957 cpi->mode_check_freq[THR_NEWG] = 4;
960 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
962 cpi->mode_check_freq[THR_NEARA] = 2;
963 cpi->mode_check_freq[THR_NEWA] = 4;
966 sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
967 sf->thresh_mult[THR_SPLITG ] = INT_MAX;
968 sf->thresh_mult[THR_SPLITA ] = INT_MAX;
970 sf->full_freq[0] = 63;
971 sf->full_freq[1] = 127;
977 sf->full_freq[0] = INT_MAX;
978 sf->full_freq[1] = INT_MAX;
985 sf->auto_filter = 0; // Faster selection of loop filter
987 sf->search_method = HEX;
988 //sf->search_method = DIAMOND;
990 sf->iterative_sub_pixel = 0;
992 cpi->mode_check_freq[THR_V_PRED] = 4;
993 cpi->mode_check_freq[THR_H_PRED] = 4;
994 cpi->mode_check_freq[THR_B_PRED] = 4;
996 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
998 cpi->mode_check_freq[THR_NEARG] = 2;
999 cpi->mode_check_freq[THR_NEWG] = 4;
1002 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1004 cpi->mode_check_freq[THR_NEARA] = 2;
1005 cpi->mode_check_freq[THR_NEWA] = 4;
1008 sf->thresh_mult[THR_TM ] = 2000;
1009 sf->thresh_mult[THR_B_PRED ] = 5000;
1011 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1013 sf->thresh_mult[THR_NEARESTG ] = 2000;
1014 sf->thresh_mult[THR_ZEROG ] = 2000;
1015 sf->thresh_mult[THR_NEARG ] = 2000;
1016 sf->thresh_mult[THR_NEWG ] = 4000;
1019 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1021 sf->thresh_mult[THR_NEARESTA ] = 2000;
1022 sf->thresh_mult[THR_ZEROA ] = 2000;
1023 sf->thresh_mult[THR_NEARA ] = 2000;
1024 sf->thresh_mult[THR_NEWA ] = 4000;
1030 // Disable split MB intra prediction mode
1031 sf->thresh_mult[THR_B_PRED] = INT_MAX;
1036 unsigned int i, sum = 0;
1037 unsigned int total_mbs = cm->MBs;
1043 if (cpi->oxcf.encode_breakout > 2000)
1044 min = cpi->oxcf.encode_breakout;
1048 for (i = 0; i < min; i++)
1050 sum += cpi->error_bins[i];
1056 // i starts from 2 to make sure thresh started from 2048
1057 for (; i < 1024; i++)
1059 sum += cpi->error_bins[i];
1061 if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
1071 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
1073 sf->thresh_mult[THR_NEWMV] = thresh;
1074 sf->thresh_mult[THR_NEARESTMV ] = thresh >> 1;
1075 sf->thresh_mult[THR_NEARMV ] = thresh >> 1;
1078 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1080 sf->thresh_mult[THR_NEWG] = thresh << 1;
1081 sf->thresh_mult[THR_NEARESTG ] = thresh;
1082 sf->thresh_mult[THR_NEARG ] = thresh;
1085 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1087 sf->thresh_mult[THR_NEWA] = thresh << 1;
1088 sf->thresh_mult[THR_NEARESTA ] = thresh;
1089 sf->thresh_mult[THR_NEARA ] = thresh;
1092 // Disable other intra prediction modes
1093 sf->thresh_mult[THR_TM] = INT_MAX;
1094 sf->thresh_mult[THR_V_PRED] = INT_MAX;
1095 sf->thresh_mult[THR_H_PRED] = INT_MAX;
1097 sf->improved_mv_pred = 0;
1102 sf->quarter_pixel_search = 0;
1107 int Tmp = cpi->Speed - 8;
1112 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1114 cpi->mode_check_freq[THR_ZEROG] = 1 << (Tmp - 1);
1115 cpi->mode_check_freq[THR_NEARESTG] = 1 << (Tmp - 1);
1116 cpi->mode_check_freq[THR_NEARG] = 1 << Tmp;
1117 cpi->mode_check_freq[THR_NEWG] = 1 << (Tmp + 1);
1120 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1122 cpi->mode_check_freq[THR_ZEROA] = 1 << (Tmp - 1);
1123 cpi->mode_check_freq[THR_NEARESTA] = 1 << (Tmp - 1);
1124 cpi->mode_check_freq[THR_NEARA] = 1 << Tmp;
1125 cpi->mode_check_freq[THR_NEWA] = 1 << (Tmp + 1);
1128 cpi->mode_check_freq[THR_NEWMV] = 1 << (Tmp - 1);
1131 cm->filter_type = NORMAL_LOOPFILTER;
1134 cm->filter_type = SIMPLE_LOOPFILTER;
1138 sf->half_pixel_search = 0; // This has a big hit on quality. Last resort
1141 vpx_memset(cpi->error_bins, 0, sizeof(cpi->error_bins));
1145 /* disable frame modes if flags not set */
1146 if (!(cpi->ref_frame_flags & VP8_LAST_FLAG))
1148 sf->thresh_mult[THR_NEWMV ] = INT_MAX;
1149 sf->thresh_mult[THR_NEARESTMV] = INT_MAX;
1150 sf->thresh_mult[THR_ZEROMV ] = INT_MAX;
1151 sf->thresh_mult[THR_NEARMV ] = INT_MAX;
1152 sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
1155 if (!(cpi->ref_frame_flags & VP8_GOLD_FLAG))
1157 sf->thresh_mult[THR_NEARESTG ] = INT_MAX;
1158 sf->thresh_mult[THR_ZEROG ] = INT_MAX;
1159 sf->thresh_mult[THR_NEARG ] = INT_MAX;
1160 sf->thresh_mult[THR_NEWG ] = INT_MAX;
1161 sf->thresh_mult[THR_SPLITG ] = INT_MAX;
1164 if (!(cpi->ref_frame_flags & VP8_ALT_FLAG))
1166 sf->thresh_mult[THR_NEARESTA ] = INT_MAX;
1167 sf->thresh_mult[THR_ZEROA ] = INT_MAX;
1168 sf->thresh_mult[THR_NEARA ] = INT_MAX;
1169 sf->thresh_mult[THR_NEWA ] = INT_MAX;
1170 sf->thresh_mult[THR_SPLITA ] = INT_MAX;
1174 // Slow quant, dct and trellis not worthwhile for first pass
1175 // so make sure they are always turned off.
1176 if ( cpi->pass == 1 )
1178 sf->improved_quant = 0;
1179 sf->optimize_coefficients = 0;
1180 sf->improved_dct = 0;
1183 if (cpi->sf.search_method == NSTEP)
1185 vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1187 else if (cpi->sf.search_method == DIAMOND)
1189 vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1192 if (cpi->sf.improved_dct)
1194 cpi->mb.vp8_short_fdct8x4 = FDCT_INVOKE(&cpi->rtcd.fdct, short8x4);
1195 cpi->mb.vp8_short_fdct4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, short4x4);
1199 cpi->mb.vp8_short_fdct8x4 = FDCT_INVOKE(&cpi->rtcd.fdct, fast8x4);
1200 cpi->mb.vp8_short_fdct4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, fast4x4);
1203 cpi->mb.short_walsh4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, walsh_short4x4);
1205 if (cpi->sf.improved_quant)
1207 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize,
1209 cpi->mb.quantize_b_pair = QUANTIZE_INVOKE(&cpi->rtcd.quantize,
1214 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize,
1216 cpi->mb.quantize_b_pair = QUANTIZE_INVOKE(&cpi->rtcd.quantize,
1219 if (cpi->sf.improved_quant != last_improved_quant)
1220 vp8cx_init_quantizer(cpi);
1222 #if CONFIG_RUNTIME_CPU_DETECT
1223 cpi->mb.e_mbd.rtcd = &cpi->common.rtcd;
1226 if (cpi->sf.iterative_sub_pixel == 1)
1228 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
1230 else if (cpi->sf.quarter_pixel_search)
1232 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
1234 else if (cpi->sf.half_pixel_search)
1236 cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1240 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1243 if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
1244 cpi->mb.optimize = 1;
1246 cpi->mb.optimize = 0;
1248 if (cpi->common.full_pixel)
1249 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1252 frames_at_speed[cpi->Speed]++;
1255 static void alloc_raw_frame_buffers(VP8_COMP *cpi)
1257 int width = (cpi->oxcf.Width + 15) & ~15;
1258 int height = (cpi->oxcf.Height + 15) & ~15;
1260 cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
1261 cpi->oxcf.lag_in_frames);
1263 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1264 "Failed to allocate lag buffers");
1266 #if VP8_TEMPORAL_ALT_REF
1268 if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
1270 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1271 "Failed to allocate altref buffer");
1276 static int vp8_alloc_partition_data(VP8_COMP *cpi)
1278 vpx_free(cpi->mb.pip);
1280 cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
1281 (cpi->common.mb_rows + 1),
1282 sizeof(PARTITION_INFO));
1286 cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1291 void vp8_alloc_compressor_data(VP8_COMP *cpi)
1293 VP8_COMMON *cm = & cpi->common;
1295 int width = cm->Width;
1296 int height = cm->Height;
1298 if (vp8_alloc_frame_buffers(cm, width, height))
1299 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1300 "Failed to allocate frame buffers");
1302 if (vp8_alloc_partition_data(cpi))
1303 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1304 "Failed to allocate partition data");
1307 if ((width & 0xf) != 0)
1308 width += 16 - (width & 0xf);
1310 if ((height & 0xf) != 0)
1311 height += 16 - (height & 0xf);
1314 if (vp8_yv12_alloc_frame_buffer(&cpi->last_frame_uf,
1315 width, height, VP8BORDERINPIXELS))
1316 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1317 "Failed to allocate last frame buffer");
1319 if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source, width, height, 16))
1320 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1321 "Failed to allocate scaled source buffer");
1327 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1329 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1332 // Data used for real time vc mode to see if gf needs refreshing
1333 cpi->inter_zz_count = 0;
1334 cpi->gf_bad_count = 0;
1335 cpi->gf_update_recommended = 0;
1338 // Structures used to minitor GF usage
1339 vpx_free(cpi->gf_active_flags);
1340 CHECK_MEM_ERROR(cpi->gf_active_flags,
1341 vpx_calloc(1, cm->mb_rows * cm->mb_cols));
1342 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1344 vpx_free(cpi->mb_activity_map);
1345 CHECK_MEM_ERROR(cpi->mb_activity_map,
1346 vpx_calloc(sizeof(unsigned int),
1347 cm->mb_rows * cm->mb_cols));
1349 vpx_free(cpi->mb_norm_activity_map);
1350 CHECK_MEM_ERROR(cpi->mb_norm_activity_map,
1351 vpx_calloc(sizeof(unsigned int),
1352 cm->mb_rows * cm->mb_cols));
1354 #if !(CONFIG_REALTIME_ONLY)
1355 vpx_free(cpi->twopass.total_stats);
1357 cpi->twopass.total_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
1359 vpx_free(cpi->twopass.this_frame_stats);
1361 cpi->twopass.this_frame_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
1363 if(!cpi->twopass.total_stats || !cpi->twopass.this_frame_stats)
1364 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1365 "Failed to allocate firstpass stats");
1368 #if CONFIG_MULTITHREAD
1370 cpi->mt_sync_range = 1;
1371 else if (width <= 1280)
1372 cpi->mt_sync_range = 4;
1373 else if (width <= 2560)
1374 cpi->mt_sync_range = 8;
1376 cpi->mt_sync_range = 16;
1379 vpx_free(cpi->tplist);
1381 CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cpi->common.mb_rows));
1386 static const int q_trans[] =
1388 0, 1, 2, 3, 4, 5, 7, 8,
1389 9, 10, 12, 13, 15, 17, 18, 19,
1390 20, 21, 23, 24, 25, 26, 27, 28,
1391 29, 30, 31, 33, 35, 37, 39, 41,
1392 43, 45, 47, 49, 51, 53, 55, 57,
1393 59, 61, 64, 67, 70, 73, 76, 79,
1394 82, 85, 88, 91, 94, 97, 100, 103,
1395 106, 109, 112, 115, 118, 121, 124, 127,
1398 int vp8_reverse_trans(int x)
1402 for (i = 0; i < 64; i++)
1403 if (q_trans[i] >= x)
1408 void vp8_new_frame_rate(VP8_COMP *cpi, double framerate)
1413 cpi->oxcf.frame_rate = framerate;
1414 cpi->output_frame_rate = cpi->oxcf.frame_rate;
1415 cpi->per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
1416 cpi->av_per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
1417 cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
1419 // Set Maximum gf/arf interval
1420 cpi->max_gf_interval = ((int)(cpi->output_frame_rate / 2.0) + 2);
1422 if(cpi->max_gf_interval < 12)
1423 cpi->max_gf_interval = 12;
1425 // Extended interval for genuinely static scenes
1426 cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1428 // Special conditions when altr ref frame enabled in lagged compress mode
1429 if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
1431 if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1432 cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1434 if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1435 cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1438 if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
1439 cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1444 rescale(int val, int num, int denom)
1446 int64_t llnum = num;
1447 int64_t llden = denom;
1448 int64_t llval = val;
1450 return llval * llnum / llden;
1454 static void init_config(VP8_PTR ptr, VP8_CONFIG *oxcf)
1456 VP8_COMP *cpi = (VP8_COMP *)(ptr);
1457 VP8_COMMON *cm = &cpi->common;
1462 cpi->auto_adjust_gold_quantizer = 1;
1465 cm->version = oxcf->Version;
1466 vp8_setup_version(cm);
1468 // change includes all joint functionality
1469 vp8_change_config(ptr, oxcf);
1471 // Initialize active best and worst q and average q values.
1472 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1473 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1474 cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
1476 // Initialise the starting buffer levels
1477 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
1478 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
1480 cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
1481 cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
1482 cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
1483 cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
1485 cpi->total_actual_bits = 0;
1486 cpi->total_target_vs_actual = 0;
1488 #if VP8_TEMPORAL_ALT_REF
1492 cpi->fixed_divide[0] = 0;
1494 for (i = 1; i < 512; i++)
1495 cpi->fixed_divide[i] = 0x80000 / i;
1501 void vp8_change_config(VP8_PTR ptr, VP8_CONFIG *oxcf)
1503 VP8_COMP *cpi = (VP8_COMP *)(ptr);
1504 VP8_COMMON *cm = &cpi->common;
1512 if (cm->version != oxcf->Version)
1514 cm->version = oxcf->Version;
1515 vp8_setup_version(cm);
1520 switch (cpi->oxcf.Mode)
1525 cpi->compressor_speed = 2;
1527 if (cpi->oxcf.cpu_used < -16)
1529 cpi->oxcf.cpu_used = -16;
1532 if (cpi->oxcf.cpu_used > 16)
1533 cpi->oxcf.cpu_used = 16;
1537 case MODE_GOODQUALITY:
1539 cpi->compressor_speed = 1;
1541 if (cpi->oxcf.cpu_used < -5)
1543 cpi->oxcf.cpu_used = -5;
1546 if (cpi->oxcf.cpu_used > 5)
1547 cpi->oxcf.cpu_used = 5;
1551 case MODE_BESTQUALITY:
1553 cpi->compressor_speed = 0;
1556 case MODE_FIRSTPASS:
1558 cpi->compressor_speed = 1;
1560 case MODE_SECONDPASS:
1562 cpi->compressor_speed = 1;
1564 if (cpi->oxcf.cpu_used < -5)
1566 cpi->oxcf.cpu_used = -5;
1569 if (cpi->oxcf.cpu_used > 5)
1570 cpi->oxcf.cpu_used = 5;
1573 case MODE_SECONDPASS_BEST:
1575 cpi->compressor_speed = 0;
1580 cpi->auto_worst_q = 1;
1582 cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1583 cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1584 cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1586 if (oxcf->fixed_q >= 0)
1588 if (oxcf->worst_allowed_q < 0)
1589 cpi->oxcf.fixed_q = q_trans[0];
1591 cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1593 if (oxcf->alt_q < 0)
1594 cpi->oxcf.alt_q = q_trans[0];
1596 cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1598 if (oxcf->key_q < 0)
1599 cpi->oxcf.key_q = q_trans[0];
1601 cpi->oxcf.key_q = q_trans[oxcf->key_q];
1603 if (oxcf->gold_q < 0)
1604 cpi->oxcf.gold_q = q_trans[0];
1606 cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1610 cpi->baseline_gf_interval =
1611 cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1613 cpi->ref_frame_flags = VP8_ALT_FLAG | VP8_GOLD_FLAG | VP8_LAST_FLAG;
1615 //cpi->use_golden_frame_only = 0;
1616 //cpi->use_last_frame_only = 0;
1617 cm->refresh_golden_frame = 0;
1618 cm->refresh_last_frame = 1;
1619 cm->refresh_entropy_probs = 1;
1621 if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
1622 cm->multi_token_partition =
1623 (TOKEN_PARTITION) cpi->oxcf.token_partitions;
1625 setup_features(cpi);
1630 for (i = 0; i < MAX_MB_SEGMENTS; i++)
1631 cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1634 // At the moment the first order values may not be > MAXQ
1635 if (cpi->oxcf.fixed_q > MAXQ)
1636 cpi->oxcf.fixed_q = MAXQ;
1638 // local file playback mode == really big buffer
1639 if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
1641 cpi->oxcf.starting_buffer_level = 60000;
1642 cpi->oxcf.optimal_buffer_level = 60000;
1643 cpi->oxcf.maximum_buffer_size = 240000;
1646 // Convert target bandwidth from Kbit/s to Bit/s
1647 cpi->oxcf.target_bandwidth *= 1000;
1649 cpi->oxcf.starting_buffer_level =
1650 rescale(cpi->oxcf.starting_buffer_level,
1651 cpi->oxcf.target_bandwidth, 1000);
1653 // Set or reset optimal and maximum buffer levels.
1654 if (cpi->oxcf.optimal_buffer_level == 0)
1655 cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1657 cpi->oxcf.optimal_buffer_level =
1658 rescale(cpi->oxcf.optimal_buffer_level,
1659 cpi->oxcf.target_bandwidth, 1000);
1661 if (cpi->oxcf.maximum_buffer_size == 0)
1662 cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1664 cpi->oxcf.maximum_buffer_size =
1665 rescale(cpi->oxcf.maximum_buffer_size,
1666 cpi->oxcf.target_bandwidth, 1000);
1668 // Set up frame rate and related parameters rate control values.
1669 vp8_new_frame_rate(cpi, cpi->oxcf.frame_rate);
1671 // Set absolute upper and lower quality limits
1672 cpi->worst_quality = cpi->oxcf.worst_allowed_q;
1673 cpi->best_quality = cpi->oxcf.best_allowed_q;
1675 // active values should only be modified if out of new range
1676 if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
1678 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1681 else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
1683 cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1685 if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
1687 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1690 else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
1692 cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1695 cpi->buffered_mode = (cpi->oxcf.optimal_buffer_level > 0) ? TRUE : FALSE;
1697 cpi->cq_target_quality = cpi->oxcf.cq_level;
1699 // Only allow dropped frames in buffered mode
1700 cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1702 if (!cm->use_bilinear_mc_filter)
1703 cm->mcomp_filter_type = SIXTAP;
1705 cm->mcomp_filter_type = BILINEAR;
1707 cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1709 cm->Width = cpi->oxcf.Width ;
1710 cm->Height = cpi->oxcf.Height ;
1712 cm->horiz_scale = cpi->horiz_scale;
1713 cm->vert_scale = cpi->vert_scale ;
1715 // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
1716 if (cpi->oxcf.Sharpness > 7)
1717 cpi->oxcf.Sharpness = 7;
1719 cm->sharpness_level = cpi->oxcf.Sharpness;
1721 if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
1723 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
1724 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
1726 Scale2Ratio(cm->horiz_scale, &hr, &hs);
1727 Scale2Ratio(cm->vert_scale, &vr, &vs);
1729 // always go to the next whole number
1730 cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1731 cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1734 if (((cm->Width + 15) & 0xfffffff0) !=
1735 cm->yv12_fb[cm->lst_fb_idx].y_width ||
1736 ((cm->Height + 15) & 0xfffffff0) !=
1737 cm->yv12_fb[cm->lst_fb_idx].y_height ||
1738 cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
1740 alloc_raw_frame_buffers(cpi);
1741 vp8_alloc_compressor_data(cpi);
1744 if (cpi->oxcf.fixed_q >= 0)
1746 cpi->last_q[0] = cpi->oxcf.fixed_q;
1747 cpi->last_q[1] = cpi->oxcf.fixed_q;
1750 cpi->Speed = cpi->oxcf.cpu_used;
1752 // force to allowlag to 0 if lag_in_frames is 0;
1753 if (cpi->oxcf.lag_in_frames == 0)
1755 cpi->oxcf.allow_lag = 0;
1757 // Limit on lag buffers as these are not currently dynamically allocated
1758 else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
1759 cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1762 cpi->alt_ref_source = NULL;
1763 cpi->is_src_frame_alt_ref = 0;
1767 // Experimental RD Code
1768 cpi->frame_distortion = 0;
1769 cpi->last_frame_distortion = 0;
1774 #define M_LOG2_E 0.693147180559945309417
1775 #define log2f(x) (log (x) / (float) M_LOG2_E)
1776 static void cal_mvsadcosts(int *mvsadcost[2])
1780 mvsadcost [0] [0] = 300;
1781 mvsadcost [1] [0] = 300;
1785 double z = 256 * (2 * (log2f(8 * i) + .6));
1786 mvsadcost [0][i] = (int) z;
1787 mvsadcost [1][i] = (int) z;
1788 mvsadcost [0][-i] = (int) z;
1789 mvsadcost [1][-i] = (int) z;
1791 while (++i <= mvfp_max);
1794 VP8_PTR vp8_create_compressor(VP8_CONFIG *oxcf)
1806 cpi = ctx.cpi = vpx_memalign(32, sizeof(VP8_COMP));
1807 // Check that the CPI instance is valid
1813 vpx_memset(cpi, 0, sizeof(VP8_COMP));
1815 if (setjmp(cm->error.jmp))
1817 VP8_PTR ptr = ctx.ptr;
1819 ctx.cpi->common.error.setjmp = 0;
1820 vp8_remove_compressor(&ptr);
1824 cpi->common.error.setjmp = 1;
1826 CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));
1828 vp8_create_common(&cpi->common);
1829 vp8_cmachine_specific_config(cpi);
1831 init_config((VP8_PTR)cpi, oxcf);
1833 memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
1834 cpi->common.current_video_frame = 0;
1835 cpi->kf_overspend_bits = 0;
1836 cpi->kf_bitrate_adjustment = 0;
1837 cpi->frames_till_gf_update_due = 0;
1838 cpi->gf_overspend_bits = 0;
1839 cpi->non_gf_bitrate_adjustment = 0;
1840 cpi->prob_last_coded = 128;
1841 cpi->prob_gf_coded = 128;
1842 cpi->prob_intra_coded = 63;
1844 // Prime the recent reference frame useage counters.
1845 // Hereafter they will be maintained as a sort of moving average
1846 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
1847 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
1848 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1849 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1851 // Set reference frame sign bias for ALTREF frame to 1 (for now)
1852 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1854 cpi->twopass.gf_decay_rate = 0;
1855 cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1857 cpi->gold_is_last = 0 ;
1858 cpi->alt_is_last = 0 ;
1859 cpi->gold_is_alt = 0 ;
1861 // allocate memory for storing last frame's MVs for MV prediction.
1862 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int_mv)));
1863 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int)));
1864 CHECK_MEM_ERROR(cpi->lf_ref_frame, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int)));
1866 // Create the encoder segmentation map and set all entries to 0
1867 CHECK_MEM_ERROR(cpi->segmentation_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
1868 CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
1869 vpx_memset(cpi->active_map , 1, (cpi->common.mb_rows * cpi->common.mb_cols));
1870 cpi->active_map_enabled = 0;
1873 // Experimental code for lagged and one pass
1874 // Initialise one_pass GF frames stats
1875 // Update stats used for GF selection
1878 cpi->one_pass_frame_index = 0;
1880 for (i = 0; i < MAX_LAG_BUFFERS; i++)
1882 cpi->one_pass_frame_stats[i].frames_so_far = 0;
1883 cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1884 cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1885 cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1886 cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1887 cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1888 cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1889 cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1890 cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1895 // Should we use the cyclic refresh method.
1896 // Currently this is tied to error resilliant mode
1897 cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
1898 cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 40;
1899 cpi->cyclic_refresh_mode_index = 0;
1900 cpi->cyclic_refresh_q = 32;
1902 if (cpi->cyclic_refresh_mode_enabled)
1904 CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1907 cpi->cyclic_refresh_map = (signed char *) NULL;
1909 // Test function for segmentation
1910 //segmentation_test_function((VP8_PTR) cpi);
1912 #ifdef ENTROPY_STATS
1913 init_context_counters();
1916 /*Initialize the feed-forward activity masking.*/
1917 cpi->activity_avg = 90<<12;
1919 cpi->frames_since_key = 8; // Give a sensible default for the first frame.
1920 cpi->key_frame_frequency = cpi->oxcf.key_freq;
1921 cpi->this_key_frame_forced = FALSE;
1922 cpi->next_key_frame_forced = FALSE;
1924 cpi->source_alt_ref_pending = FALSE;
1925 cpi->source_alt_ref_active = FALSE;
1926 cpi->common.refresh_alt_ref_frame = 0;
1928 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1929 #if CONFIG_INTERNAL_STATS
1930 cpi->b_calculate_ssimg = 0;
1935 if (cpi->b_calculate_psnr)
1937 cpi->total_sq_error = 0.0;
1938 cpi->total_sq_error2 = 0.0;
1943 cpi->totalp_y = 0.0;
1944 cpi->totalp_u = 0.0;
1945 cpi->totalp_v = 0.0;
1947 cpi->tot_recode_hits = 0;
1948 cpi->summed_quality = 0;
1949 cpi->summed_weights = 0;
1952 if (cpi->b_calculate_ssimg)
1954 cpi->total_ssimg_y = 0;
1955 cpi->total_ssimg_u = 0;
1956 cpi->total_ssimg_v = 0;
1957 cpi->total_ssimg_all = 0;
1963 #define LLONG_MAX 9223372036854775807LL
1965 cpi->first_time_stamp_ever = LLONG_MAX;
1967 cpi->frames_till_gf_update_due = 0;
1968 cpi->key_frame_count = 1;
1970 cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
1973 cpi->total_byte_count = 0;
1975 cpi->drop_frame = 0;
1976 cpi->drop_count = 0;
1977 cpi->max_drop_count = 0;
1978 cpi->max_consec_dropped_frames = 4;
1980 cpi->rate_correction_factor = 1.0;
1981 cpi->key_frame_rate_correction_factor = 1.0;
1982 cpi->gf_rate_correction_factor = 1.0;
1983 cpi->twopass.est_max_qcorrection_factor = 1.0;
1985 cpi->mb.mvcost[0] = &cpi->mb.mvcosts[0][mv_max+1];
1986 cpi->mb.mvcost[1] = &cpi->mb.mvcosts[1][mv_max+1];
1987 cpi->mb.mvsadcost[0] = &cpi->mb.mvsadcosts[0][mvfp_max+1];
1988 cpi->mb.mvsadcost[1] = &cpi->mb.mvsadcosts[1][mvfp_max+1];
1990 cal_mvsadcosts(cpi->mb.mvsadcost);
1992 for (i = 0; i < KEY_FRAME_CONTEXT; i++)
1994 cpi->prior_key_frame_distance[i] = (int)cpi->output_frame_rate;
1997 #ifdef OUTPUT_YUV_SRC
1998 yuv_file = fopen("bd.yuv", "ab");
2002 framepsnr = fopen("framepsnr.stt", "a");
2003 kf_list = fopen("kf_list.stt", "w");
2006 cpi->output_pkt_list = oxcf->output_pkt_list;
2008 #if !(CONFIG_REALTIME_ONLY)
2012 vp8_init_first_pass(cpi);
2014 else if (cpi->pass == 2)
2016 size_t packet_sz = sizeof(FIRSTPASS_STATS);
2017 int packets = oxcf->two_pass_stats_in.sz / packet_sz;
2019 cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
2020 cpi->twopass.stats_in = cpi->twopass.stats_in_start;
2021 cpi->twopass.stats_in_end = (void*)((char *)cpi->twopass.stats_in
2022 + (packets - 1) * packet_sz);
2023 vp8_init_second_pass(cpi);
2028 if (cpi->compressor_speed == 2)
2030 cpi->cpu_freq = 0; //vp8_get_processor_freq();
2031 cpi->avg_encode_time = 0;
2032 cpi->avg_pick_mode_time = 0;
2035 vp8_set_speed_features(cpi);
2037 // Set starting values of RD threshold multipliers (128 = *1)
2038 for (i = 0; i < MAX_MODES; i++)
2040 cpi->rd_thresh_mult[i] = 128;
2043 #ifdef ENTROPY_STATS
2044 init_mv_ref_counts();
2047 #if CONFIG_MULTITHREAD
2048 vp8cx_create_encoder_threads(cpi);
2051 cpi->fn_ptr[BLOCK_16X16].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16);
2052 cpi->fn_ptr[BLOCK_16X16].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16);
2053 cpi->fn_ptr[BLOCK_16X16].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar16x16);
2054 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_h);
2055 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_v);
2056 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_hv);
2057 cpi->fn_ptr[BLOCK_16X16].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x3);
2058 cpi->fn_ptr[BLOCK_16X16].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x8);
2059 cpi->fn_ptr[BLOCK_16X16].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x4d);
2061 cpi->fn_ptr[BLOCK_16X8].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8);
2062 cpi->fn_ptr[BLOCK_16X8].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x8);
2063 cpi->fn_ptr[BLOCK_16X8].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar16x8);
2064 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h = NULL;
2065 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v = NULL;
2066 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
2067 cpi->fn_ptr[BLOCK_16X8].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x3);
2068 cpi->fn_ptr[BLOCK_16X8].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x8);
2069 cpi->fn_ptr[BLOCK_16X8].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x4d);
2071 cpi->fn_ptr[BLOCK_8X16].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16);
2072 cpi->fn_ptr[BLOCK_8X16].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var8x16);
2073 cpi->fn_ptr[BLOCK_8X16].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar8x16);
2074 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h = NULL;
2075 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v = NULL;
2076 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
2077 cpi->fn_ptr[BLOCK_8X16].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x3);
2078 cpi->fn_ptr[BLOCK_8X16].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x8);
2079 cpi->fn_ptr[BLOCK_8X16].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x4d);
2081 cpi->fn_ptr[BLOCK_8X8].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8);
2082 cpi->fn_ptr[BLOCK_8X8].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var8x8);
2083 cpi->fn_ptr[BLOCK_8X8].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar8x8);
2084 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h = NULL;
2085 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v = NULL;
2086 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
2087 cpi->fn_ptr[BLOCK_8X8].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x3);
2088 cpi->fn_ptr[BLOCK_8X8].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x8);
2089 cpi->fn_ptr[BLOCK_8X8].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x4d);
2091 cpi->fn_ptr[BLOCK_4X4].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4);
2092 cpi->fn_ptr[BLOCK_4X4].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var4x4);
2093 cpi->fn_ptr[BLOCK_4X4].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar4x4);
2094 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h = NULL;
2095 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v = NULL;
2096 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
2097 cpi->fn_ptr[BLOCK_4X4].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x3);
2098 cpi->fn_ptr[BLOCK_4X4].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x8);
2099 cpi->fn_ptr[BLOCK_4X4].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x4d);
2101 cpi->full_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, full_search);
2102 cpi->diamond_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, diamond_search);
2103 cpi->refining_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, refining_search);
2105 // make sure frame 1 is okay
2106 cpi->error_bins[0] = cpi->common.MBs;
2108 //vp8cx_init_quantizer() is first called here. Add check in vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only called later
2109 //when needed. This will avoid unnecessary calls of vp8cx_init_quantizer() for every frame.
2110 vp8cx_init_quantizer(cpi);
2112 vp8_loop_filter_init(cm);
2113 cm->last_frame_type = KEY_FRAME;
2114 cm->last_filter_type = cm->filter_type;
2115 cm->last_sharpness_level = cm->sharpness_level;
2117 cpi->common.error.setjmp = 0;
2118 return (VP8_PTR) cpi;
2123 void vp8_remove_compressor(VP8_PTR *ptr)
2125 VP8_COMP *cpi = (VP8_COMP *)(*ptr);
2130 if (cpi && (cpi->common.current_video_frame > 0))
2132 #if !(CONFIG_REALTIME_ONLY)
2136 vp8_end_second_pass(cpi);
2141 #ifdef ENTROPY_STATS
2142 print_context_counters();
2143 print_tree_update_probs();
2144 print_mode_context();
2147 #if CONFIG_INTERNAL_STATS
2151 FILE *f = fopen("opsnr.stt", "a");
2152 double time_encoded = (cpi->last_end_time_stamp_seen
2153 - cpi->first_time_stamp_ever) / 10000000.000;
2154 double total_encode_time = (cpi->time_receive_data + cpi->time_compress_data) / 1000.000;
2155 double dr = (double)cpi->bytes * (double) 8 / (double)1000 / time_encoded;
2157 if (cpi->b_calculate_psnr)
2159 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
2160 double samples = 3.0 / 2 * cpi->count * lst_yv12->y_width * lst_yv12->y_height;
2161 double total_psnr = vp8_mse2psnr(samples, 255.0, cpi->total_sq_error);
2162 double total_psnr2 = vp8_mse2psnr(samples, 255.0, cpi->total_sq_error2);
2163 double total_ssim = 100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
2165 fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\tVPXSSIM\t Time(us)\n");
2166 fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n",
2167 dr, cpi->total / cpi->count, total_psnr, cpi->totalp / cpi->count, total_psnr2, total_ssim,
2171 if (cpi->b_calculate_ssimg)
2173 fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t Time(us)\n");
2174 fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
2175 cpi->total_ssimg_y / cpi->count, cpi->total_ssimg_u / cpi->count,
2176 cpi->total_ssimg_v / cpi->count, cpi->total_ssimg_all / cpi->count, total_encode_time);
2181 f = fopen("qskip.stt", "a");
2182 fprintf(f, "minq:%d -maxq:%d skipture:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2193 if (cpi->compressor_speed == 2)
2196 FILE *f = fopen("cxspeed.stt", "a");
2197 cnt_pm /= cpi->common.MBs;
2199 for (i = 0; i < 16; i++)
2200 fprintf(f, "%5d", frames_at_speed[i]);
2203 //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);
2212 extern int count_mb_seg[4];
2213 FILE *f = fopen("modes.stt", "a");
2214 double dr = (double)cpi->oxcf.frame_rate * (double)bytes * (double)8 / (double)count / (double)1000 ;
2215 fprintf(f, "intra_mode in Intra Frames:\n");
2216 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
2217 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
2222 for (i = 0; i < 10; i++)
2223 fprintf(f, "%8d, ", b_modes[i]);
2229 fprintf(f, "Modes in Inter Frames:\n");
2230 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2231 inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
2232 inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
2233 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2238 for (i = 0; i < 15; i++)
2239 fprintf(f, "%8d, ", inter_b_modes[i]);
2244 fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
2245 fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);
2253 #ifdef ENTROPY_STATS
2256 FILE *fmode = fopen("modecontext.c", "w");
2258 fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
2259 fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
2260 fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
2262 for (i = 0; i < 10; i++)
2265 fprintf(fmode, " { //Above Mode : %d\n", i);
2267 for (j = 0; j < 10; j++)
2270 fprintf(fmode, " {");
2272 for (k = 0; k < 10; k++)
2274 if (!intra_mode_stats[i][j][k])
2275 fprintf(fmode, " %5d, ", 1);
2277 fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2280 fprintf(fmode, "}, // left_mode %d\n", j);
2284 fprintf(fmode, " },\n");
2288 fprintf(fmode, "};\n");
2294 #if defined(SECTIONBITS_OUTPUT)
2299 FILE *f = fopen("tokenbits.stt", "a");
2301 for (i = 0; i < 28; i++)
2302 fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2312 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2313 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
2314 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);
2320 #if CONFIG_MULTITHREAD
2321 vp8cx_remove_encoder_threads(cpi);
2324 dealloc_compressor_data(cpi);
2325 vpx_free(cpi->mb.ss);
2327 vpx_free(cpi->cyclic_refresh_map);
2329 vp8_remove_common(&cpi->common);
2333 #ifdef OUTPUT_YUV_SRC
2353 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2354 unsigned char *recon, int recon_stride,
2355 unsigned int cols, unsigned int rows,
2356 vp8_variance_rtcd_vtable_t *rtcd)
2358 unsigned int row, col;
2359 uint64_t total_sse = 0;
2362 for (row = 0; row + 16 <= rows; row += 16)
2364 for (col = 0; col + 16 <= cols; col += 16)
2368 VARIANCE_INVOKE(rtcd, mse16x16)(orig + col, orig_stride,
2369 recon + col, recon_stride,
2374 /* Handle odd-sized width */
2377 unsigned int border_row, border_col;
2378 unsigned char *border_orig = orig;
2379 unsigned char *border_recon = recon;
2381 for (border_row = 0; border_row < 16; border_row++)
2383 for (border_col = col; border_col < cols; border_col++)
2385 diff = border_orig[border_col] - border_recon[border_col];
2386 total_sse += diff * diff;
2389 border_orig += orig_stride;
2390 border_recon += recon_stride;
2394 orig += orig_stride * 16;
2395 recon += recon_stride * 16;
2398 /* Handle odd-sized height */
2399 for (; row < rows; row++)
2401 for (col = 0; col < cols; col++)
2403 diff = orig[col] - recon[col];
2404 total_sse += diff * diff;
2407 orig += orig_stride;
2408 recon += recon_stride;
2415 static void generate_psnr_packet(VP8_COMP *cpi)
2417 YV12_BUFFER_CONFIG *orig = cpi->Source;
2418 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
2419 struct vpx_codec_cx_pkt pkt;
2422 unsigned int width = cpi->common.Width;
2423 unsigned int height = cpi->common.Height;
2425 pkt.kind = VPX_CODEC_PSNR_PKT;
2426 sse = calc_plane_error(orig->y_buffer, orig->y_stride,
2427 recon->y_buffer, recon->y_stride,
2429 IF_RTCD(&cpi->rtcd.variance));
2430 pkt.data.psnr.sse[0] = sse;
2431 pkt.data.psnr.sse[1] = sse;
2432 pkt.data.psnr.samples[0] = width * height;
2433 pkt.data.psnr.samples[1] = width * height;
2435 width = (width + 1) / 2;
2436 height = (height + 1) / 2;
2438 sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
2439 recon->u_buffer, recon->uv_stride,
2441 IF_RTCD(&cpi->rtcd.variance));
2442 pkt.data.psnr.sse[0] += sse;
2443 pkt.data.psnr.sse[2] = sse;
2444 pkt.data.psnr.samples[0] += width * height;
2445 pkt.data.psnr.samples[2] = width * height;
2447 sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
2448 recon->v_buffer, recon->uv_stride,
2450 IF_RTCD(&cpi->rtcd.variance));
2451 pkt.data.psnr.sse[0] += sse;
2452 pkt.data.psnr.sse[3] = sse;
2453 pkt.data.psnr.samples[0] += width * height;
2454 pkt.data.psnr.samples[3] = width * height;
2456 for (i = 0; i < 4; i++)
2457 pkt.data.psnr.psnr[i] = vp8_mse2psnr(pkt.data.psnr.samples[i], 255.0,
2458 pkt.data.psnr.sse[i]);
2460 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2464 int vp8_use_as_reference(VP8_PTR ptr, int ref_frame_flags)
2466 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2468 if (ref_frame_flags > 7)
2471 cpi->ref_frame_flags = ref_frame_flags;
2474 int vp8_update_reference(VP8_PTR ptr, int ref_frame_flags)
2476 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2478 if (ref_frame_flags > 7)
2481 cpi->common.refresh_golden_frame = 0;
2482 cpi->common.refresh_alt_ref_frame = 0;
2483 cpi->common.refresh_last_frame = 0;
2485 if (ref_frame_flags & VP8_LAST_FLAG)
2486 cpi->common.refresh_last_frame = 1;
2488 if (ref_frame_flags & VP8_GOLD_FLAG)
2489 cpi->common.refresh_golden_frame = 1;
2491 if (ref_frame_flags & VP8_ALT_FLAG)
2492 cpi->common.refresh_alt_ref_frame = 1;
2497 int vp8_get_reference(VP8_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2499 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2500 VP8_COMMON *cm = &cpi->common;
2503 if (ref_frame_flag == VP8_LAST_FLAG)
2504 ref_fb_idx = cm->lst_fb_idx;
2505 else if (ref_frame_flag == VP8_GOLD_FLAG)
2506 ref_fb_idx = cm->gld_fb_idx;
2507 else if (ref_frame_flag == VP8_ALT_FLAG)
2508 ref_fb_idx = cm->alt_fb_idx;
2512 vp8_yv12_copy_frame_ptr(&cm->yv12_fb[ref_fb_idx], sd);
2516 int vp8_set_reference(VP8_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2518 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2519 VP8_COMMON *cm = &cpi->common;
2523 if (ref_frame_flag == VP8_LAST_FLAG)
2524 ref_fb_idx = cm->lst_fb_idx;
2525 else if (ref_frame_flag == VP8_GOLD_FLAG)
2526 ref_fb_idx = cm->gld_fb_idx;
2527 else if (ref_frame_flag == VP8_ALT_FLAG)
2528 ref_fb_idx = cm->alt_fb_idx;
2532 vp8_yv12_copy_frame_ptr(sd, &cm->yv12_fb[ref_fb_idx]);
2536 int vp8_update_entropy(VP8_PTR comp, int update)
2538 VP8_COMP *cpi = (VP8_COMP *) comp;
2539 VP8_COMMON *cm = &cpi->common;
2540 cm->refresh_entropy_probs = update;
2547 void vp8_write_yuv_frame(const char *name, YV12_BUFFER_CONFIG *s)
2549 FILE *yuv_file = fopen(name, "ab");
2550 unsigned char *src = s->y_buffer;
2551 int h = s->y_height;
2555 fwrite(src, s->y_width, 1, yuv_file);
2565 fwrite(src, s->uv_width, 1, yuv_file);
2566 src += s->uv_stride;
2575 fwrite(src, s->uv_width, 1, yuv_file);
2576 src += s->uv_stride;
2585 static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
2587 VP8_COMMON *cm = &cpi->common;
2589 // are we resizing the image
2590 if (cm->horiz_scale != 0 || cm->vert_scale != 0)
2592 #if CONFIG_SPATIAL_RESAMPLING
2593 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2594 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2597 if (cm->vert_scale == 3)
2602 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2603 Scale2Ratio(cm->vert_scale, &vr, &vs);
2605 vp8_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2606 tmp_height, hs, hr, vs, vr, 0);
2608 vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2609 cpi->Source = &cpi->scaled_source;
2615 static void resize_key_frame(VP8_COMP *cpi)
2617 #if CONFIG_SPATIAL_RESAMPLING
2618 VP8_COMMON *cm = &cpi->common;
2620 // Do we need to apply resampling for one pass cbr.
2621 // In one pass this is more limited than in two pass cbr
2622 // The test and any change is only made one per key frame sequence
2623 if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
2625 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2626 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2627 int new_width, new_height;
2629 // If we are below the resample DOWN watermark then scale down a notch.
2630 if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2632 cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2633 cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2635 // Should we now start scaling back up
2636 else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2638 cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2639 cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2642 // Get the new hieght and width
2643 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2644 Scale2Ratio(cm->vert_scale, &vr, &vs);
2645 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2646 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2648 // If the image size has changed we need to reallocate the buffers
2649 // and resample the source image
2650 if ((cm->Width != new_width) || (cm->Height != new_height))
2652 cm->Width = new_width;
2653 cm->Height = new_height;
2654 vp8_alloc_compressor_data(cpi);
2655 scale_and_extend_source(cpi->un_scaled_source, cpi);
2663 static void update_alt_ref_frame_stats(VP8_COMP *cpi)
2665 VP8_COMMON *cm = &cpi->common;
2667 // Select an interval before next GF or altref
2668 if (!cpi->auto_gold)
2669 cpi->frames_till_gf_update_due = cpi->goldfreq;
2671 if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
2673 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2675 // Set the bits per frame that we should try and recover in subsequent inter frames
2676 // to account for the extra GF spend... note that his does not apply for GF updates
2677 // that occur coincident with a key frame as the extra cost of key frames is dealt
2680 cpi->gf_overspend_bits += cpi->projected_frame_size;
2681 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2684 // Update data structure that monitors level of reference to last GF
2685 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2686 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2688 // this frame refreshes means next frames don't unless specified by user
2689 cpi->common.frames_since_golden = 0;
2691 // Clear the alternate reference update pending flag.
2692 cpi->source_alt_ref_pending = FALSE;
2694 // Set the alternate refernce frame active flag
2695 cpi->source_alt_ref_active = TRUE;
2699 static void update_golden_frame_stats(VP8_COMP *cpi)
2701 VP8_COMMON *cm = &cpi->common;
2703 // Update the Golden frame usage counts.
2704 if (cm->refresh_golden_frame)
2706 // Select an interval before next GF
2707 if (!cpi->auto_gold)
2708 cpi->frames_till_gf_update_due = cpi->goldfreq;
2710 if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
2712 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2714 // Set the bits per frame that we should try and recover in subsequent inter frames
2715 // to account for the extra GF spend... note that his does not apply for GF updates
2716 // that occur coincident with a key frame as the extra cost of key frames is dealt
2718 if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
2720 // Calcluate GF bits to be recovered
2721 // Projected size - av frame bits available for inter frames for clip as a whole
2722 cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
2725 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2729 // Update data structure that monitors level of reference to last GF
2730 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2731 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2733 // this frame refreshes means next frames don't unless specified by user
2734 cm->refresh_golden_frame = 0;
2735 cpi->common.frames_since_golden = 0;
2737 //if ( cm->frame_type == KEY_FRAME )
2739 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2740 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2741 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2742 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2746 // // Carry a potrtion of count over to begining of next gf sequence
2747 // cpi->recent_ref_frame_usage[INTRA_FRAME] >>= 5;
2748 // cpi->recent_ref_frame_usage[LAST_FRAME] >>= 5;
2749 // cpi->recent_ref_frame_usage[GOLDEN_FRAME] >>= 5;
2750 // cpi->recent_ref_frame_usage[ALTREF_FRAME] >>= 5;
2753 // ******** Fixed Q test code only ************
2754 // If we are going to use the ALT reference for the next group of frames set a flag to say so.
2755 if (cpi->oxcf.fixed_q >= 0 &&
2756 cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
2758 cpi->source_alt_ref_pending = TRUE;
2759 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2762 if (!cpi->source_alt_ref_pending)
2763 cpi->source_alt_ref_active = FALSE;
2765 // Decrement count down till next gf
2766 if (cpi->frames_till_gf_update_due > 0)
2767 cpi->frames_till_gf_update_due--;
2770 else if (!cpi->common.refresh_alt_ref_frame)
2772 // Decrement count down till next gf
2773 if (cpi->frames_till_gf_update_due > 0)
2774 cpi->frames_till_gf_update_due--;
2776 if (cpi->common.frames_till_alt_ref_frame)
2777 cpi->common.frames_till_alt_ref_frame --;
2779 cpi->common.frames_since_golden ++;
2781 if (cpi->common.frames_since_golden > 1)
2783 cpi->recent_ref_frame_usage[INTRA_FRAME] += cpi->count_mb_ref_frame_usage[INTRA_FRAME];
2784 cpi->recent_ref_frame_usage[LAST_FRAME] += cpi->count_mb_ref_frame_usage[LAST_FRAME];
2785 cpi->recent_ref_frame_usage[GOLDEN_FRAME] += cpi->count_mb_ref_frame_usage[GOLDEN_FRAME];
2786 cpi->recent_ref_frame_usage[ALTREF_FRAME] += cpi->count_mb_ref_frame_usage[ALTREF_FRAME];
2791 // This function updates the reference frame probability estimates that
2792 // will be used during mode selection
2793 static void update_rd_ref_frame_probs(VP8_COMP *cpi)
2795 VP8_COMMON *cm = &cpi->common;
2798 const int *const rfct = cpi->recent_ref_frame_usage;
2799 const int rf_intra = rfct[INTRA_FRAME];
2800 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2802 if (cm->frame_type == KEY_FRAME)
2804 cpi->prob_intra_coded = 255;
2805 cpi->prob_last_coded = 128;
2806 cpi->prob_gf_coded = 128;
2808 else if (!(rf_intra + rf_inter))
2810 // This is a trap in case this function is called with cpi->recent_ref_frame_usage[] blank.
2811 cpi->prob_intra_coded = 63;
2812 cpi->prob_last_coded = 128;
2813 cpi->prob_gf_coded = 128;
2817 cpi->prob_intra_coded = (rf_intra * 255) / (rf_intra + rf_inter);
2819 if (cpi->prob_intra_coded < 1)
2820 cpi->prob_intra_coded = 1;
2822 if ((cm->frames_since_golden > 0) || cpi->source_alt_ref_active)
2824 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
2826 if (cpi->prob_last_coded < 1)
2827 cpi->prob_last_coded = 1;
2829 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
2830 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
2832 if (cpi->prob_gf_coded < 1)
2833 cpi->prob_gf_coded = 1;
2838 const int *const rfct = cpi->count_mb_ref_frame_usage;
2839 const int rf_intra = rfct[INTRA_FRAME];
2840 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2842 if (cm->frame_type == KEY_FRAME)
2844 cpi->prob_intra_coded = 255;
2845 cpi->prob_last_coded = 128;
2846 cpi->prob_gf_coded = 128;
2848 else if (!(rf_intra + rf_inter))
2850 // This is a trap in case this function is called with cpi->recent_ref_frame_usage[] blank.
2851 cpi->prob_intra_coded = 63;
2852 cpi->prob_last_coded = 128;
2853 cpi->prob_gf_coded = 128;
2857 cpi->prob_intra_coded = (rf_intra * 255) / (rf_intra + rf_inter);
2859 if (cpi->prob_intra_coded < 1)
2860 cpi->prob_intra_coded = 1;
2862 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
2864 if (cpi->prob_last_coded < 1)
2865 cpi->prob_last_coded = 1;
2867 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
2868 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
2870 if (cpi->prob_gf_coded < 1)
2871 cpi->prob_gf_coded = 1;
2874 // update reference frame costs since we can do better than what we got last frame.
2876 if (cpi->common.refresh_alt_ref_frame)
2878 cpi->prob_intra_coded += 40;
2879 cpi->prob_last_coded = 200;
2880 cpi->prob_gf_coded = 1;
2882 else if (cpi->common.frames_since_golden == 0)
2884 cpi->prob_last_coded = 214;
2885 cpi->prob_gf_coded = 1;
2887 else if (cpi->common.frames_since_golden == 1)
2889 cpi->prob_last_coded = 192;
2890 cpi->prob_gf_coded = 220;
2892 else if (cpi->source_alt_ref_active)
2894 //int dist = cpi->common.frames_till_alt_ref_frame + cpi->common.frames_since_golden;
2895 cpi->prob_gf_coded -= 20;
2897 if (cpi->prob_gf_coded < 10)
2898 cpi->prob_gf_coded = 10;
2905 // 1 = key, 0 = inter
2906 static int decide_key_frame(VP8_COMP *cpi)
2908 VP8_COMMON *cm = &cpi->common;
2910 int code_key_frame = FALSE;
2914 if (cpi->Speed > 11)
2917 // Clear down mmx registers
2918 vp8_clear_system_state(); //__asm emms;
2920 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
2922 double change = 1.0 * abs((int)(cpi->intra_error - cpi->last_intra_error)) / (1 + cpi->last_intra_error);
2923 double change2 = 1.0 * abs((int)(cpi->prediction_error - cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
2924 double minerror = cm->MBs * 256;
2928 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
2929 && cpi->prediction_error > minerror
2930 && (change > .25 || change2 > .25))
2932 FILE *f = fopen("intra_inter.stt", "a");
2934 if (cpi->prediction_error <= 0)
2935 cpi->prediction_error = 1;
2937 fprintf(f, "%d %d %d %d %14.4f\n",
2938 cm->current_video_frame,
2939 (int) cpi->prediction_error,
2940 (int) cpi->intra_error,
2941 (int)((10 * cpi->intra_error) / cpi->prediction_error),
2949 cpi->last_intra_error = cpi->intra_error;
2950 cpi->last_prediction_error = cpi->prediction_error;
2952 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
2953 && cpi->prediction_error > minerror
2954 && (change > .25 || change2 > .25))
2956 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
2964 // If the following are true we might as well code a key frame
2965 if (((cpi->this_frame_percent_intra == 100) &&
2966 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
2967 ((cpi->this_frame_percent_intra > 95) &&
2968 (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
2970 code_key_frame = TRUE;
2972 // in addition if the following are true and this is not a golden frame then code a key frame
2973 // Note that on golden frames there often seems to be a pop in intra useage anyway hence this
2974 // restriction is designed to prevent spurious key frames. The Intra pop needs to be investigated.
2975 else if (((cpi->this_frame_percent_intra > 60) &&
2976 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
2977 ((cpi->this_frame_percent_intra > 75) &&
2978 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
2979 ((cpi->this_frame_percent_intra > 90) &&
2980 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
2982 if (!cm->refresh_golden_frame)
2983 code_key_frame = TRUE;
2986 return code_key_frame;
2990 #if !(CONFIG_REALTIME_ONLY)
2991 static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
2996 vp8_set_quantizer(cpi, 26);
2998 scale_and_extend_source(cpi->un_scaled_source, cpi);
2999 vp8_first_pass(cpi);
3004 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
3012 sprintf(filename, "cx\\y%04d.raw", this_frame);
3013 yframe = fopen(filename, "wb");
3015 for (i = 0; i < frame->y_height; i++)
3016 fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
3019 sprintf(filename, "cx\\u%04d.raw", this_frame);
3020 yframe = fopen(filename, "wb");
3022 for (i = 0; i < frame->uv_height; i++)
3023 fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3026 sprintf(filename, "cx\\v%04d.raw", this_frame);
3027 yframe = fopen(filename, "wb");
3029 for (i = 0; i < frame->uv_height; i++)
3030 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3035 // return of 0 means drop frame
3037 // Function to test for conditions that indeicate we should loop
3038 // back and recode a frame.
3039 static BOOL recode_loop_test( VP8_COMP *cpi,
3040 int high_limit, int low_limit,
3041 int q, int maxq, int minq )
3043 BOOL force_recode = FALSE;
3044 VP8_COMMON *cm = &cpi->common;
3046 // Is frame recode allowed at all
3047 // Yes if either recode mode 1 is selected or mode two is selcted
3048 // and the frame is a key frame. golden frame or alt_ref_frame
3049 if ( (cpi->sf.recode_loop == 1) ||
3050 ( (cpi->sf.recode_loop == 2) &&
3051 ( (cm->frame_type == KEY_FRAME) ||
3052 cm->refresh_golden_frame ||
3053 cm->refresh_alt_ref_frame ) ) )
3055 // General over and under shoot tests
3056 if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
3057 ((cpi->projected_frame_size < low_limit) && (q > minq)) )
3059 force_recode = TRUE;
3061 // Special Constrained quality tests
3062 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3064 // Undershoot and below auto cq level
3065 if ( (q > cpi->cq_target_quality) &&
3066 (cpi->projected_frame_size <
3067 ((cpi->this_frame_target * 7) >> 3)))
3069 force_recode = TRUE;
3071 // Severe undershoot and between auto and user cq level
3072 else if ( (q > cpi->oxcf.cq_level) &&
3073 (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
3074 (cpi->active_best_quality > cpi->oxcf.cq_level))
3076 force_recode = TRUE;
3077 cpi->active_best_quality = cpi->oxcf.cq_level;
3082 return force_recode;
3085 void update_reference_frames(VP8_COMMON *cm)
3087 YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
3089 // At this point the new frame has been encoded.
3090 // If any buffer copy / swapping is signaled it should be done here.
3092 if (cm->frame_type == KEY_FRAME)
3094 yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FLAG | VP8_ALT_FLAG ;
3096 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3097 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3099 cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
3101 else /* For non key frames */
3103 if (cm->refresh_alt_ref_frame)
3105 assert(!cm->copy_buffer_to_arf);
3107 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALT_FLAG;
3108 cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3109 cm->alt_fb_idx = cm->new_fb_idx;
3111 else if (cm->copy_buffer_to_arf)
3113 assert(!(cm->copy_buffer_to_arf & ~0x3));
3115 if (cm->copy_buffer_to_arf == 1)
3117 if(cm->alt_fb_idx != cm->lst_fb_idx)
3119 yv12_fb[cm->lst_fb_idx].flags |= VP8_ALT_FLAG;
3120 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3121 cm->alt_fb_idx = cm->lst_fb_idx;
3124 else /* if (cm->copy_buffer_to_arf == 2) */
3126 if(cm->alt_fb_idx != cm->gld_fb_idx)
3128 yv12_fb[cm->gld_fb_idx].flags |= VP8_ALT_FLAG;
3129 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALT_FLAG;
3130 cm->alt_fb_idx = cm->gld_fb_idx;
3135 if (cm->refresh_golden_frame)
3137 assert(!cm->copy_buffer_to_gf);
3139 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FLAG;
3140 cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3141 cm->gld_fb_idx = cm->new_fb_idx;
3143 else if (cm->copy_buffer_to_gf)
3145 assert(!(cm->copy_buffer_to_arf & ~0x3));
3147 if (cm->copy_buffer_to_gf == 1)
3149 if(cm->gld_fb_idx != cm->lst_fb_idx)
3151 yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FLAG;
3152 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3153 cm->gld_fb_idx = cm->lst_fb_idx;
3156 else /* if (cm->copy_buffer_to_gf == 2) */
3158 if(cm->alt_fb_idx != cm->gld_fb_idx)
3160 yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FLAG;
3161 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FLAG;
3162 cm->gld_fb_idx = cm->alt_fb_idx;
3168 if (cm->refresh_last_frame)
3170 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FLAG;
3171 cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FLAG;
3172 cm->lst_fb_idx = cm->new_fb_idx;
3176 void loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
3180 cm->filter_level = 0;
3184 struct vpx_usec_timer timer;
3186 vp8_clear_system_state();
3188 vpx_usec_timer_start(&timer);
3189 if (cpi->sf.auto_filter == 0)
3190 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3193 vp8cx_pick_filter_level(cpi->Source, cpi);
3195 vpx_usec_timer_mark(&timer);
3196 cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3199 #if CONFIG_MULTITHREAD
3200 if (cpi->b_multi_threaded)
3201 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3204 if (cm->filter_level > 0)
3206 vp8cx_set_alt_lf_level(cpi, cm->filter_level);
3207 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, cm->filter_level);
3208 cm->last_filter_type = cm->filter_type;
3209 cm->last_sharpness_level = cm->sharpness_level;
3212 vp8_yv12_extend_frame_borders_ptr(cm->frame_to_show);
3216 static void encode_frame_to_data_rate
3219 unsigned long *size,
3220 unsigned char *dest,
3221 unsigned int *frame_flags
3225 int frame_over_shoot_limit;
3226 int frame_under_shoot_limit;
3236 int zbin_oq_low = 0;
3239 VP8_COMMON *cm = &cpi->common;
3240 int active_worst_qchanged = FALSE;
3242 int overshoot_seen = FALSE;
3243 int undershoot_seen = FALSE;
3244 int drop_mark = cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100;
3245 int drop_mark75 = drop_mark * 2 / 3;
3246 int drop_mark50 = drop_mark / 4;
3247 int drop_mark25 = drop_mark / 8;
3250 // Clear down mmx registers to allow floating point in what follows
3251 vp8_clear_system_state();
3253 // Test code for segmentation of gf/arf (0,0)
3254 //segmentation_test_function((VP8_PTR) cpi);
3256 #if CONFIG_REALTIME_ONLY
3257 if(cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
3259 if(cpi->force_next_frame_intra)
3261 cm->frame_type = KEY_FRAME; /* delayed intra frame */
3264 cpi->force_next_frame_intra = 0;
3267 // For an alt ref frame in 2 pass we skip the call to the second pass function that sets the target bandwidth
3268 #if !(CONFIG_REALTIME_ONLY)
3272 if (cpi->common.refresh_alt_ref_frame)
3274 cpi->per_frame_bandwidth = cpi->twopass.gf_bits; // Per frame bit target for the alt ref frame
3275 cpi->target_bandwidth = cpi->twopass.gf_bits * cpi->output_frame_rate; // per second target bitrate
3280 cpi->per_frame_bandwidth = (int)(cpi->target_bandwidth / cpi->output_frame_rate);
3282 // Default turn off buffer to buffer copying
3283 cm->copy_buffer_to_gf = 0;
3284 cm->copy_buffer_to_arf = 0;
3286 // Clear zbin over-quant value and mode boost values.
3287 cpi->zbin_over_quant = 0;
3288 cpi->zbin_mode_boost = 0;
3290 // Enable or disable mode based tweaking of the zbin
3291 // For 2 Pass Only used where GF/ARF prediction quality
3292 // is above a threshold
3293 cpi->zbin_mode_boost = 0;
3294 cpi->zbin_mode_boost_enabled = TRUE;
3297 if ( cpi->gfu_boost <= 400 )
3299 cpi->zbin_mode_boost_enabled = FALSE;
3303 // Current default encoder behaviour for the altref sign bias
3304 if (cpi->source_alt_ref_active)
3305 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3307 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3309 // Check to see if a key frame is signalled
3310 // For two pass with auto key frame enabled cm->frame_type may already be set, but not for one pass.
3311 if ((cm->current_video_frame == 0) ||
3312 (cm->frame_flags & FRAMEFLAGS_KEY) ||
3313 (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
3315 // Key frame from VFW/auto-keyframe/first frame
3316 cm->frame_type = KEY_FRAME;
3319 // Set default state for segment and mode based loop filter update flags
3320 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
3321 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
3322 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
3324 // Set various flags etc to special state if it is a key frame
3325 if (cm->frame_type == KEY_FRAME)
3329 // Reset the loop filter deltas and segmentation map
3330 setup_features(cpi);
3332 // If segmentation is enabled force a map update for key frames
3333 if (cpi->mb.e_mbd.segmentation_enabled)
3335 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3336 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3339 // The alternate reference frame cannot be active for a key frame
3340 cpi->source_alt_ref_active = FALSE;
3342 // Reset the RD threshold multipliers to default of * 1 (128)
3343 for (i = 0; i < MAX_MODES; i++)
3345 cpi->rd_thresh_mult[i] = 128;
3349 // Test code for segmentation
3350 //if ( (cm->frame_type == KEY_FRAME) || ((cm->current_video_frame % 2) == 0))
3351 //if ( (cm->current_video_frame % 2) == 0 )
3352 // enable_segmentation((VP8_PTR)cpi);
3354 // disable_segmentation((VP8_PTR)cpi);
3357 // Experimental code for lagged compress and one pass
3358 // Initialise one_pass GF frames stats
3359 // Update stats used for GF selection
3360 //if ( cpi->pass == 0 )
3362 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3364 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3365 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3366 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3367 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3368 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3369 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3370 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3371 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3372 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3376 update_rd_ref_frame_probs(cpi);
3378 if (cpi->drop_frames_allowed)
3380 // The reset to decimation 0 is only done here for one pass.
3381 // Once it is set two pass leaves decimation on till the next kf.
3382 if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
3383 cpi->decimation_factor --;
3385 if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
3386 cpi->decimation_factor = 1;
3388 else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
3390 cpi->decimation_factor = 3;
3392 else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
3394 cpi->decimation_factor = 2;
3396 else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
3398 cpi->decimation_factor = 1;
3401 //vpx_log("Encoder: Decimation Factor: %d \n",cpi->decimation_factor);
3404 // The following decimates the frame rate according to a regular pattern (i.e. to 1/2 or 2/3 frame rate)
3405 // This can be used to help prevent buffer under-run in CBR mode. Alternatively it might be desirable in
3406 // some situations to drop frame rate but throw more bits at each frame.
3408 // Note that dropping a key frame can be problematic if spatial resampling is also active
3409 if (cpi->decimation_factor > 0)
3411 switch (cpi->decimation_factor)
3414 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
3417 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3420 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3424 // Note that we should not throw out a key frame (especially when spatial resampling is enabled).
3425 if ((cm->frame_type == KEY_FRAME)) // && cpi->oxcf.allow_spatial_resampling )
3427 cpi->decimation_count = cpi->decimation_factor;
3429 else if (cpi->decimation_count > 0)
3431 cpi->decimation_count --;
3432 cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3433 cm->current_video_frame++;
3434 cpi->frames_since_key++;
3436 #if CONFIG_INTERNAL_STATS
3440 cpi->buffer_level = cpi->bits_off_target;
3445 cpi->decimation_count = cpi->decimation_factor;
3448 // Decide how big to make the frame
3449 if (!vp8_pick_frame_size(cpi))
3451 cm->current_video_frame++;
3452 cpi->frames_since_key++;
3456 // Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
3457 // This has a knock on effect on active best quality as well.
3458 // For CBR if the buffer reaches its maximum level then we can no longer
3459 // save up bits for later frames so we might as well use them up
3460 // on the current frame.
3461 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
3462 (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
3464 int Adjustment = cpi->active_worst_quality / 4; // Max adjustment is 1/4
3470 if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
3472 buff_lvl_step = (cpi->oxcf.maximum_buffer_size - cpi->oxcf.optimal_buffer_level) / Adjustment;
3475 Adjustment = (cpi->buffer_level - cpi->oxcf.optimal_buffer_level) / buff_lvl_step;
3480 cpi->active_worst_quality -= Adjustment;
3482 if(cpi->active_worst_quality < cpi->active_best_quality)
3483 cpi->active_worst_quality = cpi->active_best_quality;
3487 // Set an active best quality and if necessary active worst quality
3488 // There is some odd behaviour for one pass here that needs attention.
3489 if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
3491 vp8_clear_system_state();
3493 Q = cpi->active_worst_quality;
3495 if ( cm->frame_type == KEY_FRAME )
3497 if ( cpi->pass == 2 )
3499 if (cpi->gfu_boost > 600)
3500 cpi->active_best_quality = kf_low_motion_minq[Q];
3502 cpi->active_best_quality = kf_high_motion_minq[Q];
3504 // Special case for key frames forced because we have reached
3505 // the maximum key frame interval. Here force the Q to a range
3506 // based on the ambient Q to reduce the risk of popping
3507 if ( cpi->this_key_frame_forced )
3509 if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
3510 cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
3511 else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
3512 cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3515 // One pass more conservative
3517 cpi->active_best_quality = kf_high_motion_minq[Q];
3520 else if (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame)
3522 // Use the lower of cpi->active_worst_quality and recent
3523 // average Q as basis for GF/ARF Q limit unless last frame was
3525 if ( (cpi->frames_since_key > 1) &&
3526 (cpi->avg_frame_qindex < cpi->active_worst_quality) )
3528 Q = cpi->avg_frame_qindex;
3530 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3531 (Q < cpi->oxcf.cq_level) )
3533 Q = cpi->oxcf.cq_level;
3537 if ( cpi->pass == 2 )
3539 if ( cpi->gfu_boost > 1000 )
3540 cpi->active_best_quality = gf_low_motion_minq[Q];
3541 else if ( cpi->gfu_boost < 400 )
3542 cpi->active_best_quality = gf_high_motion_minq[Q];
3544 cpi->active_best_quality = gf_mid_motion_minq[Q];
3546 // One pass more conservative
3548 cpi->active_best_quality = gf_high_motion_minq[Q];
3552 cpi->active_best_quality = inter_minq[Q];
3554 // For the constant/constrained quality mode we dont want
3555 // the quality to rise above the cq level.
3556 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3557 (cpi->active_best_quality < cpi->cq_target_quality) )
3559 // If we are strongly undershooting the target rate in the last
3560 // frames then use the user passed in cq value not the auto
3562 if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
3563 cpi->active_best_quality = cpi->oxcf.cq_level;
3565 cpi->active_best_quality = cpi->cq_target_quality;
3569 // If CBR and the buffer is as full then it is reasonable to allow
3570 // higher quality on the frames to prevent bits just going to waste.
3571 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3573 // Note that the use of >= here elliminates the risk of a devide
3574 // by 0 error in the else if clause
3575 if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
3576 cpi->active_best_quality = cpi->best_quality;
3578 else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
3580 int Fraction = ((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128) / (cpi->oxcf.maximum_buffer_size - cpi->oxcf.optimal_buffer_level);
3581 int min_qadjustment = ((cpi->active_best_quality - cpi->best_quality) * Fraction) / 128;
3583 cpi->active_best_quality -= min_qadjustment;
3587 // Make sure constrained quality mode limits are adhered to for the first
3588 // few frames of one pass encodes
3589 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3591 if ( (cm->frame_type == KEY_FRAME) ||
3592 cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
3594 cpi->active_best_quality = cpi->best_quality;
3596 else if (cpi->active_best_quality < cpi->cq_target_quality)
3598 cpi->active_best_quality = cpi->cq_target_quality;
3602 // Clip the active best and worst quality values to limits
3603 if (cpi->active_worst_quality > cpi->worst_quality)
3604 cpi->active_worst_quality = cpi->worst_quality;
3606 if (cpi->active_best_quality < cpi->best_quality)
3607 cpi->active_best_quality = cpi->best_quality;
3608 else if (cpi->active_best_quality > cpi->active_worst_quality)
3609 cpi->active_best_quality = cpi->active_worst_quality;
3611 // Determine initial Q to try
3612 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3613 last_zbin_oq = cpi->zbin_over_quant;
3615 // Set highest allowed value for Zbin over quant
3616 if (cm->frame_type == KEY_FRAME)
3617 zbin_oq_high = 0; //ZBIN_OQ_MAX/16
3618 else if (cm->refresh_alt_ref_frame || (cm->refresh_golden_frame && !cpi->source_alt_ref_active))
3621 zbin_oq_high = ZBIN_OQ_MAX;
3623 // Setup background Q adjustment for error resilliant mode
3624 if (cpi->cyclic_refresh_mode_enabled)
3625 cyclic_background_refresh(cpi, Q, 0);
3627 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3629 // Limit Q range for the adaptive loop.
3630 bottom_index = cpi->active_best_quality;
3631 top_index = cpi->active_worst_quality;
3632 q_low = cpi->active_best_quality;
3633 q_high = cpi->active_worst_quality;
3635 vp8_save_coding_context(cpi);
3640 scale_and_extend_source(cpi->un_scaled_source, cpi);
3641 #if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC
3643 if (cpi->oxcf.noise_sensitivity > 0)
3648 switch (cpi->oxcf.noise_sensitivity)
3671 if (cm->frame_type == KEY_FRAME)
3673 vp8_de_noise(cpi->Source, cpi->Source, l , 1, 0, RTCD(postproc));
3677 vp8_de_noise(cpi->Source, cpi->Source, l , 1, 0, RTCD(postproc));
3679 src = cpi->Source->y_buffer;
3681 if (cpi->Source->y_stride < 0)
3683 src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
3690 #ifdef OUTPUT_YUV_SRC
3691 vp8_write_yuv_frame(cpi->Source);
3696 vp8_clear_system_state(); //__asm emms;
3699 if(cpi->is_src_frame_alt_ref)
3703 vp8_set_quantizer(cpi, Q);
3706 // setup skip prob for costing in mode/mv decision
3707 if (cpi->common.mb_no_coeff_skip)
3709 cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
3711 if (cm->frame_type != KEY_FRAME)
3713 if (cpi->common.refresh_alt_ref_frame)
3715 if (cpi->last_skip_false_probs[2] != 0)
3716 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3719 if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
3720 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3721 else if (cpi->last_skip_false_probs[2]!=0)
3722 cpi->prob_skip_false = (cpi->last_skip_false_probs[2] + cpi->prob_skip_false ) / 2;
3725 else if (cpi->common.refresh_golden_frame)
3727 if (cpi->last_skip_false_probs[1] != 0)
3728 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3731 if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
3732 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3733 else if (cpi->last_skip_false_probs[1]!=0)
3734 cpi->prob_skip_false = (cpi->last_skip_false_probs[1] + cpi->prob_skip_false ) / 2;
3739 if (cpi->last_skip_false_probs[0] != 0)
3740 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3743 if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
3744 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3745 else if(cpi->last_skip_false_probs[0]!=0)
3746 cpi->prob_skip_false = (cpi->last_skip_false_probs[0] + cpi->prob_skip_false ) / 2;
3750 //as this is for cost estimate, let's make sure it does not go extreme eitehr way
3751 if (cpi->prob_skip_false < 5)
3752 cpi->prob_skip_false = 5;
3754 if (cpi->prob_skip_false > 250)
3755 cpi->prob_skip_false = 250;
3757 if (cpi->is_src_frame_alt_ref)
3758 cpi->prob_skip_false = 1;
3767 FILE *f = fopen("skip.stt", "a");
3768 fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
3776 if (cm->frame_type == KEY_FRAME)
3778 resize_key_frame(cpi);
3779 vp8_setup_key_frame(cpi);
3782 // transform / motion compensation build reconstruction frame
3783 vp8_encode_frame(cpi);
3785 cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
3786 cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
3788 vp8_clear_system_state(); //__asm emms;
3790 // Test to see if the stats generated for this frame indicate that we should have coded a key frame
3791 // (assuming that we didn't)!
3792 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
3795 #if CONFIG_REALTIME_ONLY
3797 /* we don't do re-encoding in realtime mode
3798 * if key frame is decided than we force it on next frame */
3799 cpi->force_next_frame_intra = decide_key_frame(cpi);
3802 if (decide_key_frame(cpi))
3804 // Reset all our sizing numbers and recode
3805 cm->frame_type = KEY_FRAME;
3807 vp8_pick_frame_size(cpi);
3809 // Clear the Alt reference frame active flag when we have a key frame
3810 cpi->source_alt_ref_active = FALSE;
3812 // Reset the loop filter deltas and segmentation map
3813 setup_features(cpi);
3815 // If segmentation is enabled force a map update for key frames
3816 if (cpi->mb.e_mbd.segmentation_enabled)
3818 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3819 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3822 vp8_restore_coding_context(cpi);
3824 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3826 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3828 // Limit Q range for the adaptive loop.
3829 bottom_index = cpi->active_best_quality;
3830 top_index = cpi->active_worst_quality;
3831 q_low = cpi->active_best_quality;
3832 q_high = cpi->active_worst_quality;
3842 vp8_clear_system_state();
3844 if (frame_over_shoot_limit == 0)
3845 frame_over_shoot_limit = 1;
3847 // Are we are overshooting and up against the limit of active max Q.
3848 if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
3849 (Q == cpi->active_worst_quality) &&
3850 (cpi->active_worst_quality < cpi->worst_quality) &&
3851 (cpi->projected_frame_size > frame_over_shoot_limit))
3853 int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;
3855 // If so is there any scope for relaxing it
3856 while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
3858 cpi->active_worst_quality++;
3859 top_index = cpi->active_worst_quality;
3860 over_size_percent = (int)(over_size_percent * 0.96); // Assume 1 qstep = about 4% on frame size.
3863 // If we have updated the active max Q do not call vp8_update_rate_correction_factors() this loop.
3864 active_worst_qchanged = TRUE;
3867 active_worst_qchanged = FALSE;
3869 #if !(CONFIG_REALTIME_ONLY)
3870 // Special case handling for forced key frames
3871 if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
3874 int kf_err = vp8_calc_ss_err(cpi->Source,
3875 &cm->yv12_fb[cm->new_fb_idx],
3876 IF_RTCD(&cpi->rtcd.variance));
3878 // The key frame is not good enough
3879 if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
3882 q_high = (Q > q_low) ? (Q - 1) : q_low;
3885 Q = (q_high + q_low) >> 1;
3887 // The key frame is much better than the previous frame
3888 else if ( kf_err < (cpi->ambient_err >> 1) )
3891 q_low = (Q < q_high) ? (Q + 1) : q_high;
3894 Q = (q_high + q_low + 1) >> 1;
3897 // Clamp Q to upper and lower limits:
3903 Loop = ((Q != last_q)) ? TRUE : FALSE;
3906 // Is the projected frame size out of range and are we allowed to attempt to recode.
3907 else if ( recode_loop_test( cpi,
3908 frame_over_shoot_limit, frame_under_shoot_limit,
3909 Q, top_index, bottom_index ) )
3914 // Frame size out of permitted range:
3915 // Update correction factor & compute new Q to try...
3917 // Frame is too large
3918 if (cpi->projected_frame_size > cpi->this_frame_target)
3920 //if ( cpi->zbin_over_quant == 0 )
3921 q_low = (Q < q_high) ? (Q + 1) : q_high; // Raise Qlow as to at least the current value
3923 if (cpi->zbin_over_quant > 0) // If we are using over quant do the same for zbin_oq_low
3924 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi->zbin_over_quant + 1) : zbin_oq_high;
3926 //if ( undershoot_seen || (Q == MAXQ) )
3927 if (undershoot_seen)
3929 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3930 if (!active_worst_qchanged)
3931 vp8_update_rate_correction_factors(cpi, 1);
3933 Q = (q_high + q_low + 1) / 2;
3935 // Adjust cpi->zbin_over_quant (only allowed when Q is max)
3937 cpi->zbin_over_quant = 0;
3940 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi->zbin_over_quant + 1) : zbin_oq_high;
3941 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
3946 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3947 if (!active_worst_qchanged)
3948 vp8_update_rate_correction_factors(cpi, 0);
3950 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3952 while (((Q < q_low) || (cpi->zbin_over_quant < zbin_oq_low)) && (Retries < 10))
3954 vp8_update_rate_correction_factors(cpi, 0);
3955 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3960 overshoot_seen = TRUE;
3962 // Frame is too small
3965 if (cpi->zbin_over_quant == 0)
3966 q_high = (Q > q_low) ? (Q - 1) : q_low; // Lower q_high if not using over quant
3967 else // else lower zbin_oq_high
3968 zbin_oq_high = (cpi->zbin_over_quant > zbin_oq_low) ? (cpi->zbin_over_quant - 1) : zbin_oq_low;
3972 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3973 if (!active_worst_qchanged)
3974 vp8_update_rate_correction_factors(cpi, 1);
3976 Q = (q_high + q_low) / 2;
3978 // Adjust cpi->zbin_over_quant (only allowed when Q is max)
3980 cpi->zbin_over_quant = 0;
3982 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
3986 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
3987 if (!active_worst_qchanged)
3988 vp8_update_rate_correction_factors(cpi, 0);
3990 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3992 // Special case reset for qlow for constrained quality.
3993 // This should only trigger where there is very substantial
3994 // undershoot on a frame and the auto cq level is above
3995 // the user passsed in value.
3996 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4002 while (((Q > q_high) || (cpi->zbin_over_quant > zbin_oq_high)) && (Retries < 10))
4004 vp8_update_rate_correction_factors(cpi, 0);
4005 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4010 undershoot_seen = TRUE;
4013 // Clamp Q to upper and lower limits:
4019 // Clamp cpi->zbin_over_quant
4020 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;
4022 //Loop = ((Q != last_q) || (last_zbin_oq != cpi->zbin_over_quant)) ? TRUE : FALSE;
4023 Loop = ((Q != last_q)) ? TRUE : FALSE;
4024 last_zbin_oq = cpi->zbin_over_quant;
4030 if (cpi->is_src_frame_alt_ref)
4035 vp8_restore_coding_context(cpi);
4037 #if CONFIG_INTERNAL_STATS
4038 cpi->tot_recode_hits++;
4042 while (Loop == TRUE);
4045 // Experimental code for lagged and one pass
4046 // Update stats used for one pass GF selection
4050 double frame_intra_error;
4051 double frame_coded_error;
4052 double frame_pcnt_inter;
4053 double frame_pcnt_motion;
4055 double frame_mvr_abs;
4057 double frame_mvc_abs;
4060 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4061 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4062 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4066 // Special case code to reduce pulsing when key frames are forced at a
4067 // fixed interval. Note the reconstruction error if it is the frame before
4068 // the force key frame
4069 if ( cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0) )
4071 cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
4072 &cm->yv12_fb[cm->new_fb_idx],
4073 IF_RTCD(&cpi->rtcd.variance));
4076 // This frame's MVs are saved and will be used in next frame's MV prediction.
4077 // 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.
4078 if(cm->show_frame) //do not save for altref frame
4082 MODE_INFO *tmp = cm->mip; //point to beginning of allocated MODE_INFO arrays.
4084 if(cm->frame_type != KEY_FRAME)
4086 for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
4088 for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
4090 if(tmp->mbmi.ref_frame != INTRA_FRAME)
4091 cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;
4093 cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4094 cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
4101 // Update the GF useage maps.
4102 // This is done after completing the compression of a frame when all modes etc. are finalized but before loop filter
4103 // This is done after completing the compression of a frame when all modes etc. are finalized but before loop filter
4104 vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4106 if (cm->frame_type == KEY_FRAME)
4107 cm->refresh_last_frame = 1;
4111 FILE *f = fopen("gfactive.stt", "a");
4112 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);
4117 // For inter frames the current default behavior is that when
4118 // cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4119 // This is purely an encoder decision at present.
4120 if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
4121 cm->copy_buffer_to_arf = 2;
4123 cm->copy_buffer_to_arf = 0;
4125 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4127 #if CONFIG_MULTITHREAD
4128 if (cpi->b_multi_threaded)
4130 sem_post(&cpi->h_event_start_lpf); /* start loopfilter in separate thread */
4135 loopfilter_frame(cpi, cm);
4138 update_reference_frames(cm);
4140 if (cpi->oxcf.error_resilient_mode)
4142 cm->refresh_entropy_probs = 0;
4145 #if CONFIG_MULTITHREAD
4146 /* wait that filter_level is picked so that we can continue with stream packing */
4147 if (cpi->b_multi_threaded)
4148 sem_wait(&cpi->h_event_end_lpf);
4151 // build the bitstream
4152 vp8_pack_bitstream(cpi, dest, size);
4154 #if CONFIG_MULTITHREAD
4155 /* wait for loopfilter thread done */
4156 if (cpi->b_multi_threaded)
4158 sem_wait(&cpi->h_event_end_lpf);
4162 /* Move storing frame_type out of the above loop since it is also
4163 * needed in motion search besides loopfilter */
4164 cm->last_frame_type = cm->frame_type;
4166 // Update rate control heuristics
4167 cpi->total_byte_count += (*size);
4168 cpi->projected_frame_size = (*size) << 3;
4170 if (!active_worst_qchanged)
4171 vp8_update_rate_correction_factors(cpi, 2);
4173 cpi->last_q[cm->frame_type] = cm->base_qindex;
4175 if (cm->frame_type == KEY_FRAME)
4177 vp8_adjust_key_frame_context(cpi);
4180 // Keep a record of ambient average Q.
4181 if (cm->frame_type != KEY_FRAME)
4182 cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4184 // Keep a record from which we can calculate the average Q excluding GF updates and key frames
4185 if ((cm->frame_type != KEY_FRAME) && !cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)
4189 // Calculate the average Q for normal inter frames (not key or GFU
4191 if ( cpi->pass == 2 )
4193 cpi->ni_tot_qi += Q;
4194 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4198 // Damp value for first few frames
4199 if (cpi->ni_frames > 150 )
4201 cpi->ni_tot_qi += Q;
4202 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4204 // For one pass, early in the clip ... average the current frame Q
4205 // value with the worstq entered by the user as a dampening measure
4208 cpi->ni_tot_qi += Q;
4209 cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4212 // If the average Q is higher than what was used in the last frame
4213 // (after going through the recode loop to keep the frame size within range)
4214 // then use the last frame value - 1.
4215 // The -1 is designed to stop Q and hence the data rate, from progressively
4216 // falling away during difficult sections, but at the same time reduce the number of
4217 // itterations around the recode loop.
4218 if (Q > cpi->ni_av_qi)
4219 cpi->ni_av_qi = Q - 1;
4225 // If the frame was massively oversize and we are below optimal buffer level drop next frame
4226 if ((cpi->drop_frames_allowed) &&
4227 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
4228 (cpi->buffer_level < cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100) &&
4229 (cpi->projected_frame_size > (4 * cpi->this_frame_target)))
4231 cpi->drop_frame = TRUE;
4236 // Set the count for maximum consequative dropped frames based upon the ratio of
4237 // this frame size to the target average per frame bandwidth.
4238 // (cpi->av_per_frame_bandwidth > 0) is just a sanity check to prevent / 0.
4239 if (cpi->drop_frames_allowed && (cpi->av_per_frame_bandwidth > 0))
4241 cpi->max_drop_count = cpi->projected_frame_size / cpi->av_per_frame_bandwidth;
4243 if (cpi->max_drop_count > cpi->max_consec_dropped_frames)
4244 cpi->max_drop_count = cpi->max_consec_dropped_frames;
4247 // Update the buffer level variable.
4248 // Non-viewable frames are a special case and are treated as pure overhead.
4249 if ( !cm->show_frame )
4250 cpi->bits_off_target -= cpi->projected_frame_size;
4252 cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4254 // Rolling monitors of whether we are over or underspending used to help regulate min and Max Q in two pass.
4255 cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
4256 cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
4257 cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
4258 cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;
4260 // Actual bits spent
4261 cpi->total_actual_bits += cpi->projected_frame_size;
4264 cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);
4266 cpi->buffer_level = cpi->bits_off_target;
4268 // Update bits left to the kf and gf groups to account for overshoot or undershoot on these frames
4269 if (cm->frame_type == KEY_FRAME)
4271 cpi->twopass.kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4273 if (cpi->twopass.kf_group_bits < 0)
4274 cpi->twopass.kf_group_bits = 0 ;
4276 else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4278 cpi->twopass.gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4280 if (cpi->twopass.gf_group_bits < 0)
4281 cpi->twopass.gf_group_bits = 0 ;
4284 if (cm->frame_type != KEY_FRAME)
4286 if (cpi->common.refresh_alt_ref_frame)
4288 cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4289 cpi->last_skip_probs_q[2] = cm->base_qindex;
4291 else if (cpi->common.refresh_golden_frame)
4293 cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4294 cpi->last_skip_probs_q[1] = cm->base_qindex;
4298 cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4299 cpi->last_skip_probs_q[0] = cm->base_qindex;
4301 //update the baseline
4302 cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4307 #if 0 && CONFIG_INTERNAL_STATS
4309 FILE *f = fopen("tmp.stt", "a");
4311 vp8_clear_system_state(); //__asm emms;
4313 if (cpi->twopass.total_coded_error_left != 0.0)
4314 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %6d %6d"
4315 "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f"
4317 cpi->common.current_video_frame, cpi->this_frame_target,
4318 cpi->projected_frame_size,
4319 (cpi->projected_frame_size - cpi->this_frame_target),
4320 (int)cpi->total_target_vs_actual,
4321 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4322 (int)cpi->total_actual_bits, cm->base_qindex,
4323 cpi->active_best_quality, cpi->active_worst_quality,
4324 cpi->ni_av_qi, cpi->cq_target_quality, cpi->zbin_over_quant,
4325 //cpi->avg_frame_qindex, cpi->zbin_over_quant,
4326 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4327 cm->frame_type, cpi->gfu_boost,
4328 cpi->twopass.est_max_qcorrection_factor, (int)cpi->twopass.bits_left,
4329 cpi->twopass.total_coded_error_left,
4330 (double)cpi->twopass.bits_left / cpi->twopass.total_coded_error_left,
4331 cpi->tot_recode_hits);
4333 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %6d %6d"
4334 "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f"
4336 cpi->common.current_video_frame,
4337 cpi->this_frame_target, cpi->projected_frame_size,
4338 (cpi->projected_frame_size - cpi->this_frame_target),
4339 (int)cpi->total_target_vs_actual,
4340 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4341 (int)cpi->total_actual_bits, cm->base_qindex,
4342 cpi->active_best_quality, cpi->active_worst_quality,
4343 cpi->ni_av_qi, cpi->cq_target_quality, cpi->zbin_over_quant,
4344 //cpi->avg_frame_qindex, cpi->zbin_over_quant,
4345 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4346 cm->frame_type, cpi->gfu_boost,
4347 cpi->twopass.est_max_qcorrection_factor, (int)cpi->twopass.bits_left,
4348 cpi->twopass.total_coded_error_left, cpi->tot_recode_hits);
4353 FILE *fmodes = fopen("Modes.stt", "a");
4356 fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4357 cpi->common.current_video_frame,
4358 cm->frame_type, cm->refresh_golden_frame,
4359 cm->refresh_alt_ref_frame);
4361 for (i = 0; i < MAX_MODES; i++)
4362 fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
4364 fprintf(fmodes, "\n");
4372 // If this was a kf or Gf note the Q
4373 if ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4374 cm->last_kf_gf_q = cm->base_qindex;
4376 if (cm->refresh_golden_frame == 1)
4377 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4379 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
4381 if (cm->refresh_alt_ref_frame == 1)
4382 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4384 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
4387 if (cm->refresh_last_frame & cm->refresh_golden_frame) // both refreshed
4388 cpi->gold_is_last = 1;
4389 else if (cm->refresh_last_frame ^ cm->refresh_golden_frame) // 1 refreshed but not the other
4390 cpi->gold_is_last = 0;
4392 if (cm->refresh_last_frame & cm->refresh_alt_ref_frame) // both refreshed
4393 cpi->alt_is_last = 1;
4394 else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame) // 1 refreshed but not the other
4395 cpi->alt_is_last = 0;
4397 if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame) // both refreshed
4398 cpi->gold_is_alt = 1;
4399 else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame) // 1 refreshed but not the other
4400 cpi->gold_is_alt = 0;
4402 cpi->ref_frame_flags = VP8_ALT_FLAG | VP8_GOLD_FLAG | VP8_LAST_FLAG;
4404 if (cpi->gold_is_last)
4405 cpi->ref_frame_flags &= ~VP8_GOLD_FLAG;
4407 if (cpi->alt_is_last)
4408 cpi->ref_frame_flags &= ~VP8_ALT_FLAG;
4410 if (cpi->gold_is_alt)
4411 cpi->ref_frame_flags &= ~VP8_ALT_FLAG;
4414 if (!cpi->oxcf.error_resilient_mode)
4416 if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
4417 // Update the alternate reference frame stats as appropriate.
4418 update_alt_ref_frame_stats(cpi);
4420 // Update the Golden frame stats as appropriate.
4421 update_golden_frame_stats(cpi);
4424 if (cm->frame_type == KEY_FRAME)
4426 // Tell the caller that the frame was coded as a key frame
4427 *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4429 // As this frame is a key frame the next defaults to an inter frame.
4430 cm->frame_type = INTER_FRAME;
4432 cpi->last_frame_percent_intra = 100;
4436 *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
4438 cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4441 // Clear the one shot update flags for segmentation map and mode/ref loop filter deltas.
4442 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4443 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4444 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4447 // Dont increment frame counters if this was an altref buffer update not a real frame
4450 cm->current_video_frame++;
4451 cpi->frames_since_key++;
4454 // reset to normal state now that we are done.
4462 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
4463 recon_file = fopen(filename, "wb");
4464 fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4465 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4471 //vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show);
4477 static void check_gf_quality(VP8_COMP *cpi)
4479 VP8_COMMON *cm = &cpi->common;
4480 int gf_active_pct = (100 * cpi->gf_active_count) / (cm->mb_rows * cm->mb_cols);
4481 int gf_ref_usage_pct = (cpi->count_mb_ref_frame_usage[GOLDEN_FRAME] * 100) / (cm->mb_rows * cm->mb_cols);
4482 int last_ref_zz_useage = (cpi->inter_zz_count * 100) / (cm->mb_rows * cm->mb_cols);
4484 // Gf refresh is not currently being signalled
4485 if (cpi->gf_update_recommended == 0)
4487 if (cpi->common.frames_since_golden > 7)
4490 if ((gf_active_pct < 10) || ((gf_active_pct + gf_ref_usage_pct) < 15))
4492 // ...but last frame zero zero usage is reasonbable so a new gf might be appropriate
4493 if (last_ref_zz_useage >= 25)
4495 cpi->gf_bad_count ++;
4497 if (cpi->gf_bad_count >= 8) // Check that the condition is stable
4499 cpi->gf_update_recommended = 1;
4500 cpi->gf_bad_count = 0;
4504 cpi->gf_bad_count = 0; // Restart count as the background is not stable enough
4507 cpi->gf_bad_count = 0; // Gf useage has picked up so reset count
4510 // If the signal is set but has not been read should we cancel it.
4511 else if (last_ref_zz_useage < 15)
4513 cpi->gf_update_recommended = 0;
4514 cpi->gf_bad_count = 0;
4519 FILE *f = fopen("gfneeded.stt", "a");
4520 fprintf(f, "%10d %10d %10d %10d %10ld \n",
4521 cm->current_video_frame,
4522 cpi->common.frames_since_golden,
4523 gf_active_pct, gf_ref_usage_pct,
4524 cpi->gf_update_recommended);
4531 #if !(CONFIG_REALTIME_ONLY)
4532 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
4535 if (!cpi->common.refresh_alt_ref_frame)
4536 vp8_second_pass(cpi);
4538 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
4539 cpi->twopass.bits_left -= 8 * *size;
4541 if (!cpi->common.refresh_alt_ref_frame)
4543 double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
4544 *cpi->oxcf.two_pass_vbrmin_section / 100);
4545 cpi->twopass.bits_left += (long long)(two_pass_min_rate / cpi->oxcf.frame_rate);
4550 //For ARM NEON, d8-d15 are callee-saved registers, and need to be saved by us.
4552 extern void vp8_push_neon(INT64 *store);
4553 extern void vp8_pop_neon(INT64 *store);
4557 int vp8_receive_raw_frame(VP8_PTR ptr, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, INT64 time_stamp, INT64 end_time)
4562 VP8_COMP *cpi = (VP8_COMP *) ptr;
4563 VP8_COMMON *cm = &cpi->common;
4564 struct vpx_usec_timer timer;
4568 #if CONFIG_RUNTIME_CPU_DETECT
4569 if (cm->rtcd.flags & HAS_NEON)
4572 vp8_push_neon(store_reg);
4576 vpx_usec_timer_start(&timer);
4577 if(vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
4580 cm->clr_type = sd->clrtype;
4581 vpx_usec_timer_mark(&timer);
4582 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
4585 #if CONFIG_RUNTIME_CPU_DETECT
4586 if (cm->rtcd.flags & HAS_NEON)
4589 vp8_pop_neon(store_reg);
4597 static int frame_is_reference(const VP8_COMP *cpi)
4599 const VP8_COMMON *cm = &cpi->common;
4600 const MACROBLOCKD *xd = &cpi->mb.e_mbd;
4602 return cm->frame_type == KEY_FRAME || cm->refresh_last_frame
4603 || cm->refresh_golden_frame || cm->refresh_alt_ref_frame
4604 || cm->copy_buffer_to_gf || cm->copy_buffer_to_arf
4605 || cm->refresh_entropy_probs
4606 || xd->mode_ref_lf_delta_update
4607 || xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
4611 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)
4616 VP8_COMP *cpi = (VP8_COMP *) ptr;
4617 VP8_COMMON *cm = &cpi->common;
4618 struct vpx_usec_timer tsctimer;
4619 struct vpx_usec_timer ticktimer;
4620 struct vpx_usec_timer cmptimer;
4621 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
4627 #if CONFIG_RUNTIME_CPU_DETECT
4628 if (cm->rtcd.flags & HAS_NEON)
4631 vp8_push_neon(store_reg);
4635 vpx_usec_timer_start(&cmptimer);
4639 #if !(CONFIG_REALTIME_ONLY)
4640 // Should we code an alternate reference frame
4641 if (cpi->oxcf.error_resilient_mode == 0 &&
4642 cpi->oxcf.play_alternate &&
4643 cpi->source_alt_ref_pending)
4645 if ((cpi->source = vp8_lookahead_peek(cpi->lookahead,
4646 cpi->frames_till_gf_update_due)))
4648 cpi->alt_ref_source = cpi->source;
4649 if (cpi->oxcf.arnr_max_frames > 0)
4651 vp8_temporal_filter_prepare_c(cpi,
4652 cpi->frames_till_gf_update_due);
4653 force_src_buffer = &cpi->alt_ref_buffer;
4655 cm->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
4656 cm->refresh_alt_ref_frame = 1;
4657 cm->refresh_golden_frame = 0;
4658 cm->refresh_last_frame = 0;
4660 cpi->source_alt_ref_pending = FALSE; // Clear Pending altf Ref flag.
4661 cpi->is_src_frame_alt_ref = 0;
4668 if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush)))
4672 cpi->is_src_frame_alt_ref = cpi->alt_ref_source
4673 && (cpi->source == cpi->alt_ref_source);
4675 if(cpi->is_src_frame_alt_ref)
4676 cpi->alt_ref_source = NULL;
4682 cpi->un_scaled_source =
4683 cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
4684 *time_stamp = cpi->source->ts_start;
4685 *time_end = cpi->source->ts_end;
4686 *frame_flags = cpi->source->flags;
4691 #if !(CONFIG_REALTIME_ONLY)
4693 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done)
4695 vp8_end_first_pass(cpi); /* get last stats packet */
4696 cpi->twopass.first_pass_done = 1;
4702 #if CONFIG_RUNTIME_CPU_DETECT
4703 if (cm->rtcd.flags & HAS_NEON)
4706 vp8_pop_neon(store_reg);
4712 if (cpi->source->ts_start < cpi->first_time_stamp_ever)
4714 cpi->first_time_stamp_ever = cpi->source->ts_start;
4715 cpi->last_end_time_stamp_seen = cpi->source->ts_start;
4718 // adjust frame rates based on timestamps given
4719 if (!cm->refresh_alt_ref_frame)
4721 long long this_duration;
4724 if (cpi->source->ts_start == cpi->first_time_stamp_ever)
4726 this_duration = cpi->source->ts_end - cpi->source->ts_start;
4731 long long last_duration;
4733 this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
4734 last_duration = cpi->last_end_time_stamp_seen
4735 - cpi->last_time_stamp_seen;
4736 // do a step update if the duration changes by 10%
4738 step = ((this_duration - last_duration) * 10 / last_duration);
4744 vp8_new_frame_rate(cpi, 10000000.0 / this_duration);
4747 double avg_duration, interval;
4749 /* Average this frame's rate into the last second's average
4750 * frame rate. If we haven't seen 1 second yet, then average
4751 * over the whole interval seen.
4753 interval = cpi->source->ts_end - cpi->first_time_stamp_ever;
4754 if(interval > 10000000.0)
4755 interval = 10000000;
4757 avg_duration = 10000000.0 / cpi->oxcf.frame_rate;
4758 avg_duration *= (interval - avg_duration + this_duration);
4759 avg_duration /= interval;
4761 vp8_new_frame_rate(cpi, 10000000.0 / avg_duration);
4765 cpi->last_time_stamp_seen = cpi->source->ts_start;
4766 cpi->last_end_time_stamp_seen = cpi->source->ts_end;
4769 if (cpi->compressor_speed == 2)
4771 check_gf_quality(cpi);
4772 vpx_usec_timer_start(&tsctimer);
4773 vpx_usec_timer_start(&ticktimer);
4776 // start with a 0 size frame
4779 // Clear down mmx registers
4780 vp8_clear_system_state(); //__asm emms;
4782 cm->frame_type = INTER_FRAME;
4783 cm->frame_flags = *frame_flags;
4787 if (cm->refresh_alt_ref_frame)
4789 //cm->refresh_golden_frame = 1;
4790 cm->refresh_golden_frame = 0;
4791 cm->refresh_last_frame = 0;
4795 cm->refresh_golden_frame = 0;
4796 cm->refresh_last_frame = 1;
4800 /* find a free buffer for the new frame */
4803 for(; i < NUM_YV12_BUFFERS; i++)
4805 if(!cm->yv12_fb[i].flags)
4812 assert(i < NUM_YV12_BUFFERS );
4814 #if !(CONFIG_REALTIME_ONLY)
4818 Pass1Encode(cpi, size, dest, frame_flags);
4820 else if (cpi->pass == 2)
4822 Pass2Encode(cpi, size, dest, frame_flags);
4826 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
4828 if (cpi->compressor_speed == 2)
4830 unsigned int duration, duration2;
4831 vpx_usec_timer_mark(&tsctimer);
4832 vpx_usec_timer_mark(&ticktimer);
4834 duration = vpx_usec_timer_elapsed(&ticktimer);
4835 duration2 = (unsigned int)((double)duration / 2);
4837 if (cm->frame_type != KEY_FRAME)
4839 if (cpi->avg_encode_time == 0)
4840 cpi->avg_encode_time = duration;
4842 cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
4847 //if(*frame_flags!=1)
4850 if (cpi->avg_pick_mode_time == 0)
4851 cpi->avg_pick_mode_time = duration2;
4853 cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
4859 if (cm->refresh_entropy_probs == 0)
4861 vpx_memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
4864 // if its a dropped frame honor the requests on subsequent frames
4867 cpi->droppable = !frame_is_reference(cpi);
4869 // return to normal state
4870 cm->refresh_entropy_probs = 1;
4871 cm->refresh_alt_ref_frame = 0;
4872 cm->refresh_golden_frame = 0;
4873 cm->refresh_last_frame = 1;
4874 cm->frame_type = INTER_FRAME;
4878 vpx_usec_timer_mark(&cmptimer);
4879 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
4881 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
4883 generate_psnr_packet(cpi);
4886 #if CONFIG_INTERNAL_STATS
4890 cpi->bytes += *size;
4897 if (cpi->b_calculate_psnr)
4901 YV12_BUFFER_CONFIG *orig = cpi->Source;
4902 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
4903 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
4904 int y_samples = orig->y_height * orig->y_width ;
4905 int uv_samples = orig->uv_height * orig->uv_width ;
4906 int t_samples = y_samples + 2 * uv_samples;
4909 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
4910 recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height,
4911 IF_RTCD(&cpi->rtcd.variance));
4913 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
4914 recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height,
4915 IF_RTCD(&cpi->rtcd.variance));
4917 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
4918 recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height,
4919 IF_RTCD(&cpi->rtcd.variance));
4921 sq_error = ye + ue + ve;
4923 frame_psnr = vp8_mse2psnr(t_samples, 255.0, sq_error);
4925 cpi->total_y += vp8_mse2psnr(y_samples, 255.0, ye);
4926 cpi->total_u += vp8_mse2psnr(uv_samples, 255.0, ue);
4927 cpi->total_v += vp8_mse2psnr(uv_samples, 255.0, ve);
4928 cpi->total_sq_error += sq_error;
4929 cpi->total += frame_psnr;
4931 double frame_psnr2, frame_ssim2 = 0;
4934 vp8_deblock(cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0, IF_RTCD(&cm->rtcd.postproc));
4935 vp8_clear_system_state();
4937 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
4938 pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height,
4939 IF_RTCD(&cpi->rtcd.variance));
4941 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
4942 pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height,
4943 IF_RTCD(&cpi->rtcd.variance));
4945 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
4946 pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height,
4947 IF_RTCD(&cpi->rtcd.variance));
4949 sq_error = ye + ue + ve;
4951 frame_psnr2 = vp8_mse2psnr(t_samples, 255.0, sq_error);
4953 cpi->totalp_y += vp8_mse2psnr(y_samples, 255.0, ye);
4954 cpi->totalp_u += vp8_mse2psnr(uv_samples, 255.0, ue);
4955 cpi->totalp_v += vp8_mse2psnr(uv_samples, 255.0, ve);
4956 cpi->total_sq_error2 += sq_error;
4957 cpi->totalp += frame_psnr2;
4959 frame_ssim2 = vp8_calc_ssim(cpi->Source,
4960 &cm->post_proc_buffer, 1, &weight,
4961 IF_RTCD(&cpi->rtcd.variance));
4963 cpi->summed_quality += frame_ssim2 * weight;
4964 cpi->summed_weights += weight;
4969 if (cpi->b_calculate_ssimg)
4971 double y, u, v, frame_all;
4972 frame_all = vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
4973 &y, &u, &v, IF_RTCD(&cpi->rtcd.variance));
4974 cpi->total_ssimg_y += y;
4975 cpi->total_ssimg_u += u;
4976 cpi->total_ssimg_v += v;
4977 cpi->total_ssimg_all += frame_all;
4985 if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
4987 skiptruecount += cpi->skip_true_count;
4988 skipfalsecount += cpi->skip_false_count;
4996 FILE *f = fopen("skip.stt", "a");
4997 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);
4999 if (cpi->is_src_frame_alt_ref == 1)
5000 fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
5009 #if CONFIG_RUNTIME_CPU_DETECT
5010 if (cm->rtcd.flags & HAS_NEON)
5013 vp8_pop_neon(store_reg);
5020 int vp8_get_preview_raw_frame(VP8_PTR comp, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
5022 VP8_COMP *cpi = (VP8_COMP *) comp;
5024 if (cpi->common.refresh_alt_ref_frame)
5030 ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5033 if (cpi->common.frame_to_show)
5035 *dest = *cpi->common.frame_to_show;
5036 dest->y_width = cpi->common.Width;
5037 dest->y_height = cpi->common.Height;
5038 dest->uv_height = cpi->common.Height / 2;
5046 #endif //!CONFIG_POSTPROC
5047 vp8_clear_system_state();
5052 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])
5054 VP8_COMP *cpi = (VP8_COMP *) comp;
5055 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5057 if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
5062 disable_segmentation((VP8_PTR)cpi);
5066 // Set the segmentation Map
5067 set_segmentation_map((VP8_PTR)cpi, map);
5069 // Activate segmentation.
5070 enable_segmentation((VP8_PTR)cpi);
5072 // Set up the quant segment data
5073 feature_data[MB_LVL_ALT_Q][0] = delta_q[0];
5074 feature_data[MB_LVL_ALT_Q][1] = delta_q[1];
5075 feature_data[MB_LVL_ALT_Q][2] = delta_q[2];
5076 feature_data[MB_LVL_ALT_Q][3] = delta_q[3];
5078 // Set up the loop segment data s
5079 feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5080 feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5081 feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5082 feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5084 cpi->segment_encode_breakout[0] = threshold[0];
5085 cpi->segment_encode_breakout[1] = threshold[1];
5086 cpi->segment_encode_breakout[2] = threshold[2];
5087 cpi->segment_encode_breakout[3] = threshold[3];
5089 // Initialise the feature data structure
5090 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
5091 set_segment_data((VP8_PTR)cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5096 int vp8_set_active_map(VP8_PTR comp, unsigned char *map, unsigned int rows, unsigned int cols)
5098 VP8_COMP *cpi = (VP8_COMP *) comp;
5100 if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols)
5104 vpx_memcpy(cpi->active_map, map, rows * cols);
5105 cpi->active_map_enabled = 1;
5108 cpi->active_map_enabled = 0;
5114 //cpi->active_map_enabled = 0;
5119 int vp8_set_internal_size(VP8_PTR comp, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
5121 VP8_COMP *cpi = (VP8_COMP *) comp;
5123 if (horiz_mode <= ONETWO)
5124 cpi->common.horiz_scale = horiz_mode;
5128 if (vert_mode <= ONETWO)
5129 cpi->common.vert_scale = vert_mode;
5138 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd)
5143 unsigned char *src = source->y_buffer;
5144 unsigned char *dst = dest->y_buffer;
5147 // Loop through the Y plane raw and reconstruction data summing (square differences)
5148 for (i = 0; i < source->y_height; i += 16)
5150 for (j = 0; j < source->y_width; j += 16)
5153 Total += VARIANCE_INVOKE(rtcd, mse16x16)(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
5156 src += 16 * source->y_stride;
5157 dst += 16 * dest->y_stride;
5164 int vp8_get_quantizer(VP8_PTR c)
5166 VP8_COMP *cpi = (VP8_COMP *) c;
5167 return cpi->common.base_qindex;