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_init_mv_bits_sadcost();
50 extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
51 extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
52 extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
54 extern void vp8_init_loop_filter(VP8_COMMON *cm);
55 extern void vp8_loop_filter_frame(VP8_COMMON *cm, MACROBLOCKD *mbd, int filt_val);
56 extern void vp8_loop_filter_frame_yonly(VP8_COMMON *cm, MACROBLOCKD *mbd, int filt_val, int sharpness_lvl);
57 extern void vp8_dmachine_specific_config(VP8_COMP *cpi);
58 extern void vp8_cmachine_specific_config(VP8_COMP *cpi);
59 extern void vp8_calc_auto_iframe_target_size(VP8_COMP *cpi);
60 extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
61 extern void print_parms(VP8_CONFIG *ocf, char *filenam);
62 extern unsigned int vp8_get_processor_freq();
63 extern void print_tree_update_probs();
64 extern void vp8cx_create_encoder_threads(VP8_COMP *cpi);
65 extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
67 extern void vp8_yv12_copy_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
68 extern void vp8_yv12_copy_src_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
71 int vp8_estimate_entropy_savings(VP8_COMP *cpi);
72 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd);
74 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi);
76 static void set_default_lf_deltas(VP8_COMP *cpi);
78 extern const int vp8_gf_interval_table[101];
83 extern double vp8_calc_ssim
85 YV12_BUFFER_CONFIG *source,
86 YV12_BUFFER_CONFIG *dest,
89 const vp8_variance_rtcd_vtable_t *rtcd
93 extern double vp8_calc_ssimg
95 YV12_BUFFER_CONFIG *source,
96 YV12_BUFFER_CONFIG *dest,
106 #ifdef OUTPUT_YUV_SRC
117 extern int skip_true_count;
118 extern int skip_false_count;
123 extern int intra_mode_stats[10][10][10];
127 unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
128 unsigned int tot_pm = 0;
129 unsigned int cnt_pm = 0;
130 unsigned int tot_ef = 0;
131 unsigned int cnt_ef = 0;
135 extern unsigned __int64 Sectionbits[50];
136 extern int y_modes[5] ;
137 extern int uv_modes[4] ;
138 extern int b_modes[10] ;
140 extern int inter_y_modes[10] ;
141 extern int inter_uv_modes[4] ;
142 extern unsigned int inter_b_modes[15];
145 extern void (*vp8_short_fdct4x4)(short *input, short *output, int pitch);
146 extern void (*vp8_short_fdct8x4)(short *input, short *output, int pitch);
148 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
150 extern const int qrounding_factors[129];
151 extern const int qzbin_factors[129];
152 extern void vp8cx_init_quantizer(VP8_COMP *cpi);
153 extern const int vp8cx_base_skip_false_prob[128];
155 // Tables relating active max Q to active min Q
156 static const int kf_low_motion_minq[QINDEX_RANGE] =
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,0,0,0,0,0,0,0,0,0,0,0,0,
161 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
162 3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,
163 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
164 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
165 16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23
167 static const int kf_high_motion_minq[QINDEX_RANGE] =
169 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
170 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
171 1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,
172 3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6,
173 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
174 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
175 16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21,
176 21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30
178 static const int gf_low_motion_minq[QINDEX_RANGE] =
180 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
181 3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,
182 7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,
183 11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,
184 19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,
185 27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,
186 35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,
187 43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
189 static const int gf_mid_motion_minq[QINDEX_RANGE] =
191 0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4,
192 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
193 9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,
194 14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,
195 22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,
196 30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,
197 38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48,
198 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
200 static const int gf_high_motion_minq[QINDEX_RANGE] =
202 0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4,
203 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
204 9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
205 17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,
206 25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,
207 33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,
208 41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54,
209 55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
211 static const int inter_minq[QINDEX_RANGE] =
213 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
214 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
215 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
216 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
217 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
218 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
219 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
220 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
223 void vp8_initialize()
225 static int init_done = 0;
229 vp8_scale_machine_specific_config();
230 vp8_initialize_common();
231 //vp8_dmachine_specific_config();
232 vp8_tokenize_initialize();
234 vp8cx_init_mv_bits_sadcost();
238 #ifdef PACKET_TESTING
239 extern FILE *vpxlogc;
242 static void setup_features(VP8_COMP *cpi)
244 // Set up default state for MB feature flags
245 cpi->mb.e_mbd.segmentation_enabled = 0;
246 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
247 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
248 vpx_memset(cpi->mb.e_mbd.mb_segment_tree_probs, 255, sizeof(cpi->mb.e_mbd.mb_segment_tree_probs));
249 vpx_memset(cpi->mb.e_mbd.segment_feature_data, 0, sizeof(cpi->mb.e_mbd.segment_feature_data));
251 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
252 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
253 vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
254 vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
255 vpx_memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
256 vpx_memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
258 set_default_lf_deltas(cpi);
263 static void dealloc_compressor_data(VP8_COMP *cpi)
265 vpx_free(cpi->tplist);
268 // Delete last frame MV storage buffers
272 vpx_free(cpi->lf_ref_frame_sign_bias);
273 cpi->lf_ref_frame_sign_bias = 0;
275 vpx_free(cpi->lf_ref_frame);
276 cpi->lf_ref_frame = 0;
278 // Delete sementation map
279 vpx_free(cpi->segmentation_map);
280 cpi->segmentation_map = 0;
282 vpx_free(cpi->active_map);
285 vp8_de_alloc_frame_buffers(&cpi->common);
287 vp8_yv12_de_alloc_frame_buffer(&cpi->last_frame_uf);
288 vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
289 #if VP8_TEMPORAL_ALT_REF
290 vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer.source_buffer);
295 for (i = 0; i < MAX_LAG_BUFFERS; i++)
296 vp8_yv12_de_alloc_frame_buffer(&cpi->src_buffer[i].source_buffer);
298 cpi->source_buffer_count = 0;
304 // Structure used to monitor GF usage
305 vpx_free(cpi->gf_active_flags);
306 cpi->gf_active_flags = 0;
308 vpx_free(cpi->mb.pip);
311 #if !(CONFIG_REALTIME_ONLY)
312 vpx_free(cpi->total_stats);
313 cpi->total_stats = 0;
315 vpx_free(cpi->this_frame_stats);
316 cpi->this_frame_stats = 0;
320 static void enable_segmentation(VP8_PTR ptr)
322 VP8_COMP *cpi = (VP8_COMP *)(ptr);
324 // Set the appropriate feature bit
325 cpi->mb.e_mbd.segmentation_enabled = 1;
326 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
327 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
329 static void disable_segmentation(VP8_PTR ptr)
331 VP8_COMP *cpi = (VP8_COMP *)(ptr);
333 // Clear the appropriate feature bit
334 cpi->mb.e_mbd.segmentation_enabled = 0;
337 // Valid values for a segment are 0 to 3
338 // Segmentation map is arrange as [Rows][Columns]
339 static void set_segmentation_map(VP8_PTR ptr, unsigned char *segmentation_map)
341 VP8_COMP *cpi = (VP8_COMP *)(ptr);
343 // Copy in the new segmentation map
344 vpx_memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));
346 // Signal that the map should be updated.
347 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
348 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
351 // The values given for each segment can be either deltas (from the default value chosen for the frame) or absolute values.
353 // Valid range for abs values is (0-127 for MB_LVL_ALT_Q) , (0-63 for SEGMENT_ALT_LF)
354 // Valid range for delta values are (+/-127 for MB_LVL_ALT_Q) , (+/-63 for SEGMENT_ALT_LF)
356 // abs_delta = SEGMENT_DELTADATA (deltas) abs_delta = SEGMENT_ABSDATA (use the absolute values given).
359 static void set_segment_data(VP8_PTR ptr, signed char *feature_data, unsigned char abs_delta)
361 VP8_COMP *cpi = (VP8_COMP *)(ptr);
363 cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
364 vpx_memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
368 static void segmentation_test_function(VP8_PTR ptr)
370 VP8_COMP *cpi = (VP8_COMP *)(ptr);
372 unsigned char *seg_map;
373 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
375 // Create a temporary map for segmentation data.
376 CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
378 // MB loop to set local segmentation map
379 /*for ( i = 0; i < cpi->common.mb_rows; i++ )
381 for ( j = 0; j < cpi->common.mb_cols; j++ )
383 //seg_map[(i*cpi->common.mb_cols) + j] = (j % 2) + ((i%2)* 2);
384 //if ( j < cpi->common.mb_cols/2 )
386 // Segment 1 around the edge else 0
387 if ( (i == 0) || (j == 0) || (i == (cpi->common.mb_rows-1)) || (j == (cpi->common.mb_cols-1)) )
388 seg_map[(i*cpi->common.mb_cols) + j] = 1;
389 //else if ( (i < 2) || (j < 2) || (i > (cpi->common.mb_rows-3)) || (j > (cpi->common.mb_cols-3)) )
390 // seg_map[(i*cpi->common.mb_cols) + j] = 2;
391 //else if ( (i < 5) || (j < 5) || (i > (cpi->common.mb_rows-6)) || (j > (cpi->common.mb_cols-6)) )
392 // seg_map[(i*cpi->common.mb_cols) + j] = 3;
394 seg_map[(i*cpi->common.mb_cols) + j] = 0;
398 // Set the segmentation Map
399 set_segmentation_map(ptr, seg_map);
401 // Activate segmentation.
402 enable_segmentation(ptr);
404 // Set up the quant segment data
405 feature_data[MB_LVL_ALT_Q][0] = 0;
406 feature_data[MB_LVL_ALT_Q][1] = 4;
407 feature_data[MB_LVL_ALT_Q][2] = 0;
408 feature_data[MB_LVL_ALT_Q][3] = 0;
409 // Set up the loop segment data
410 feature_data[MB_LVL_ALT_LF][0] = 0;
411 feature_data[MB_LVL_ALT_LF][1] = 0;
412 feature_data[MB_LVL_ALT_LF][2] = 0;
413 feature_data[MB_LVL_ALT_LF][3] = 0;
415 // Initialise the feature data structure
416 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
417 set_segment_data(ptr, &feature_data[0][0], SEGMENT_DELTADATA);
419 // Delete sementation map
426 // A simple function to cyclically refresh the background at a lower Q
427 static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
429 unsigned char *seg_map;
430 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
432 int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
433 int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
435 // Create a temporary map for segmentation data.
436 CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
438 cpi->cyclic_refresh_q = Q;
440 for (i = Q; i > 0; i--)
442 if (vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*(Q + 128)) / 64))
443 //if ( vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*((2*Q)+96))/64) )
449 cpi->cyclic_refresh_q = i;
451 // Only update for inter frames
452 if (cpi->common.frame_type != KEY_FRAME)
454 // Cycle through the macro_block rows
455 // MB loop to set local segmentation map
456 for (i = cpi->cyclic_refresh_mode_index; i < mbs_in_frame; i++)
458 // If the MB is as a candidate for clean up then mark it for possible boost/refresh (segment 1)
459 // The segment id may get reset to 0 later if the MB gets coded anything other than last frame 0,0
460 // as only (last frame 0,0) MBs are eligable for refresh : that is to say Mbs likely to be background blocks.
461 if (cpi->cyclic_refresh_map[i] == 0)
469 // Skip blocks that have been refreshed recently anyway.
470 if (cpi->cyclic_refresh_map[i] < 0)
471 //cpi->cyclic_refresh_map[i] = cpi->cyclic_refresh_map[i] / 16;
472 cpi->cyclic_refresh_map[i]++;
483 // If we have gone through the frame reset to the start
484 cpi->cyclic_refresh_mode_index = i;
486 if (cpi->cyclic_refresh_mode_index >= mbs_in_frame)
487 cpi->cyclic_refresh_mode_index = 0;
490 // Set the segmentation Map
491 set_segmentation_map((VP8_PTR)cpi, seg_map);
493 // Activate segmentation.
494 enable_segmentation((VP8_PTR)cpi);
496 // Set up the quant segment data
497 feature_data[MB_LVL_ALT_Q][0] = 0;
498 feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
499 feature_data[MB_LVL_ALT_Q][2] = 0;
500 feature_data[MB_LVL_ALT_Q][3] = 0;
502 // Set up the loop segment data
503 feature_data[MB_LVL_ALT_LF][0] = 0;
504 feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
505 feature_data[MB_LVL_ALT_LF][2] = 0;
506 feature_data[MB_LVL_ALT_LF][3] = 0;
508 // Initialise the feature data structure
509 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
510 set_segment_data((VP8_PTR)cpi, &feature_data[0][0], SEGMENT_DELTADATA);
512 // Delete sementation map
519 static void set_default_lf_deltas(VP8_COMP *cpi)
521 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
522 cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
524 vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
525 vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
527 // Test of ref frame deltas
528 cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
529 cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
530 cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
531 cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
533 cpi->mb.e_mbd.mode_lf_deltas[0] = 4; // BPRED
534 cpi->mb.e_mbd.mode_lf_deltas[1] = -2; // Zero
535 cpi->mb.e_mbd.mode_lf_deltas[2] = 2; // New mv
536 cpi->mb.e_mbd.mode_lf_deltas[3] = 4; // Split mv
539 void vp8_set_speed_features(VP8_COMP *cpi)
541 SPEED_FEATURES *sf = &cpi->sf;
542 int Mode = cpi->compressor_speed;
543 int Speed = cpi->Speed;
545 VP8_COMMON *cm = &cpi->common;
546 int last_improved_quant = sf->improved_quant;
548 // Initialise default mode frequency sampling variables
549 for (i = 0; i < MAX_MODES; i ++)
551 cpi->mode_check_freq[i] = 0;
552 cpi->mode_test_hit_counts[i] = 0;
553 cpi->mode_chosen_counts[i] = 0;
556 cpi->mbs_tested_so_far = 0;
558 // best quality defaults
560 sf->search_method = NSTEP;
561 sf->improved_quant = 1;
562 sf->improved_dct = 1;
565 sf->quarter_pixel_search = 1;
566 sf->half_pixel_search = 1;
567 sf->full_freq[0] = 7;
568 sf->full_freq[1] = 7;
569 sf->min_fs_radius = 8;
570 sf->max_fs_radius = 32;
571 sf->iterative_sub_pixel = 1;
572 sf->optimize_coefficients = 1;
573 sf->use_fastquant_for_pick = 0;
574 sf->no_skip_block4x4_search = 1;
577 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
578 sf->improved_mv_pred = 1;
583 // default thresholds to 0
584 for (i = 0; i < MAX_MODES; i++)
585 sf->thresh_mult[i] = 0;
589 #if !(CONFIG_REALTIME_ONLY)
590 case 0: // best quality mode
591 sf->thresh_mult[THR_ZEROMV ] = 0;
592 sf->thresh_mult[THR_ZEROG ] = 0;
593 sf->thresh_mult[THR_ZEROA ] = 0;
594 sf->thresh_mult[THR_NEARESTMV] = 0;
595 sf->thresh_mult[THR_NEARESTG ] = 0;
596 sf->thresh_mult[THR_NEARESTA ] = 0;
597 sf->thresh_mult[THR_NEARMV ] = 0;
598 sf->thresh_mult[THR_NEARG ] = 0;
599 sf->thresh_mult[THR_NEARA ] = 0;
601 sf->thresh_mult[THR_DC ] = 0;
603 sf->thresh_mult[THR_V_PRED ] = 1000;
604 sf->thresh_mult[THR_H_PRED ] = 1000;
605 sf->thresh_mult[THR_B_PRED ] = 2000;
606 sf->thresh_mult[THR_TM ] = 1000;
608 sf->thresh_mult[THR_NEWMV ] = 1000;
609 sf->thresh_mult[THR_NEWG ] = 1000;
610 sf->thresh_mult[THR_NEWA ] = 1000;
612 sf->thresh_mult[THR_SPLITMV ] = 2500;
613 sf->thresh_mult[THR_SPLITG ] = 5000;
614 sf->thresh_mult[THR_SPLITA ] = 5000;
616 sf->full_freq[0] = 7;
617 sf->full_freq[1] = 15;
620 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
624 sf->thresh_mult[THR_NEARESTMV] = 0;
625 sf->thresh_mult[THR_ZEROMV ] = 0;
626 sf->thresh_mult[THR_DC ] = 0;
627 sf->thresh_mult[THR_NEARMV ] = 0;
628 sf->thresh_mult[THR_V_PRED ] = 1000;
629 sf->thresh_mult[THR_H_PRED ] = 1000;
630 sf->thresh_mult[THR_B_PRED ] = 2500;
631 sf->thresh_mult[THR_TM ] = 1000;
633 sf->thresh_mult[THR_NEARESTG ] = 1000;
634 sf->thresh_mult[THR_NEARESTA ] = 1000;
636 sf->thresh_mult[THR_ZEROG ] = 1000;
637 sf->thresh_mult[THR_ZEROA ] = 1000;
638 sf->thresh_mult[THR_NEARG ] = 1000;
639 sf->thresh_mult[THR_NEARA ] = 1000;
642 sf->thresh_mult[THR_ZEROMV ] = 0;
643 sf->thresh_mult[THR_ZEROG ] = 0;
644 sf->thresh_mult[THR_ZEROA ] = 0;
645 sf->thresh_mult[THR_NEARESTMV] = 0;
646 sf->thresh_mult[THR_NEARESTG ] = 0;
647 sf->thresh_mult[THR_NEARESTA ] = 0;
648 sf->thresh_mult[THR_NEARMV ] = 0;
649 sf->thresh_mult[THR_NEARG ] = 0;
650 sf->thresh_mult[THR_NEARA ] = 0;
652 // sf->thresh_mult[THR_DC ] = 0;
654 // sf->thresh_mult[THR_V_PRED ] = 1000;
655 // sf->thresh_mult[THR_H_PRED ] = 1000;
656 // sf->thresh_mult[THR_B_PRED ] = 2000;
657 // sf->thresh_mult[THR_TM ] = 1000;
659 sf->thresh_mult[THR_NEWMV ] = 1000;
660 sf->thresh_mult[THR_NEWG ] = 1000;
661 sf->thresh_mult[THR_NEWA ] = 1000;
663 sf->thresh_mult[THR_SPLITMV ] = 1700;
664 sf->thresh_mult[THR_SPLITG ] = 4500;
665 sf->thresh_mult[THR_SPLITA ] = 4500;
667 sf->thresh_mult[THR_NEWMV ] = 1500;
668 sf->thresh_mult[THR_NEWG ] = 1500;
669 sf->thresh_mult[THR_NEWA ] = 1500;
671 sf->thresh_mult[THR_SPLITMV ] = 5000;
672 sf->thresh_mult[THR_SPLITG ] = 10000;
673 sf->thresh_mult[THR_SPLITA ] = 10000;
675 sf->full_freq[0] = 15;
676 sf->full_freq[1] = 31;
680 /* Disable coefficient optimization above speed 0 */
681 sf->optimize_coefficients = 0;
682 sf->use_fastquant_for_pick = 1;
683 sf->no_skip_block4x4_search = 0;
687 cpi->mode_check_freq[THR_SPLITG] = 2;
688 cpi->mode_check_freq[THR_SPLITA] = 2;
689 cpi->mode_check_freq[THR_SPLITMV] = 0;
694 cpi->mode_check_freq[THR_SPLITG] = 4;
695 cpi->mode_check_freq[THR_SPLITA] = 4;
696 cpi->mode_check_freq[THR_SPLITMV] = 2;
698 sf->thresh_mult[THR_TM ] = 1500;
699 sf->thresh_mult[THR_V_PRED ] = 1500;
700 sf->thresh_mult[THR_H_PRED ] = 1500;
701 sf->thresh_mult[THR_B_PRED ] = 5000;
703 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
705 sf->thresh_mult[THR_NEWMV ] = 2000;
706 sf->thresh_mult[THR_SPLITMV ] = 10000;
709 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
711 sf->thresh_mult[THR_NEARESTG ] = 1500;
712 sf->thresh_mult[THR_ZEROG ] = 1500;
713 sf->thresh_mult[THR_NEARG ] = 1500;
714 sf->thresh_mult[THR_NEWG ] = 2000;
715 sf->thresh_mult[THR_SPLITG ] = 20000;
718 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
720 sf->thresh_mult[THR_NEARESTA ] = 1500;
721 sf->thresh_mult[THR_ZEROA ] = 1500;
722 sf->thresh_mult[THR_NEARA ] = 1500;
723 sf->thresh_mult[THR_NEWA ] = 2000;
724 sf->thresh_mult[THR_SPLITA ] = 20000;
730 cpi->mode_check_freq[THR_SPLITG] = 15;
731 cpi->mode_check_freq[THR_SPLITA] = 15;
732 cpi->mode_check_freq[THR_SPLITMV] = 7;
734 sf->thresh_mult[THR_TM ] = 2000;
735 sf->thresh_mult[THR_V_PRED ] = 2000;
736 sf->thresh_mult[THR_H_PRED ] = 2000;
737 sf->thresh_mult[THR_B_PRED ] = 7500;
739 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
741 sf->thresh_mult[THR_NEWMV ] = 2000;
742 sf->thresh_mult[THR_SPLITMV ] = 25000;
745 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
747 sf->thresh_mult[THR_NEARESTG ] = 2000;
748 sf->thresh_mult[THR_ZEROG ] = 2000;
749 sf->thresh_mult[THR_NEARG ] = 2000;
750 sf->thresh_mult[THR_NEWG ] = 2500;
751 sf->thresh_mult[THR_SPLITG ] = 50000;
754 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
756 sf->thresh_mult[THR_NEARESTA ] = 2000;
757 sf->thresh_mult[THR_ZEROA ] = 2000;
758 sf->thresh_mult[THR_NEARA ] = 2000;
759 sf->thresh_mult[THR_NEWA ] = 2500;
760 sf->thresh_mult[THR_SPLITA ] = 50000;
763 sf->improved_quant = 0;
764 sf->improved_dct = 0;
766 // Only do recode loop on key frames, golden frames and
770 sf->full_freq[0] = 31;
771 sf->full_freq[1] = 63;
776 sf->thresh_mult[THR_SPLITA ] = INT_MAX;
777 sf->thresh_mult[THR_SPLITG ] = INT_MAX;
778 sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
780 cpi->mode_check_freq[THR_V_PRED] = 0;
781 cpi->mode_check_freq[THR_H_PRED] = 0;
782 cpi->mode_check_freq[THR_B_PRED] = 0;
783 cpi->mode_check_freq[THR_NEARG] = 0;
784 cpi->mode_check_freq[THR_NEWG] = 0;
785 cpi->mode_check_freq[THR_NEARA] = 0;
786 cpi->mode_check_freq[THR_NEWA] = 0;
789 sf->recode_loop = 0; // recode loop off
790 sf->RD = 0; // Turn rd off
792 sf->full_freq[0] = 63;
793 sf->full_freq[1] = 127;
798 sf->auto_filter = 0; // Faster selection of loop filter
799 sf->full_freq[0] = INT_MAX;
800 sf->full_freq[1] = INT_MAX;
802 cpi->mode_check_freq[THR_V_PRED] = 2;
803 cpi->mode_check_freq[THR_H_PRED] = 2;
804 cpi->mode_check_freq[THR_B_PRED] = 2;
806 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
808 cpi->mode_check_freq[THR_NEARG] = 2;
809 cpi->mode_check_freq[THR_NEWG] = 4;
812 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
814 cpi->mode_check_freq[THR_NEARA] = 2;
815 cpi->mode_check_freq[THR_NEWA] = 4;
818 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
820 sf->thresh_mult[THR_NEARESTG ] = 2000;
821 sf->thresh_mult[THR_ZEROG ] = 2000;
822 sf->thresh_mult[THR_NEARG ] = 2000;
823 sf->thresh_mult[THR_NEWG ] = 4000;
826 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
828 sf->thresh_mult[THR_NEARESTA ] = 2000;
829 sf->thresh_mult[THR_ZEROA ] = 2000;
830 sf->thresh_mult[THR_NEARA ] = 2000;
831 sf->thresh_mult[THR_NEWA ] = 4000;
838 sf->optimize_coefficients = 0;
841 sf->iterative_sub_pixel = 1;
842 sf->thresh_mult[THR_NEARESTMV] = 0;
843 sf->thresh_mult[THR_ZEROMV ] = 0;
844 sf->thresh_mult[THR_DC ] = 0;
845 sf->thresh_mult[THR_TM ] = 0;
846 sf->thresh_mult[THR_NEARMV ] = 0;
847 sf->thresh_mult[THR_V_PRED ] = 1000;
848 sf->thresh_mult[THR_H_PRED ] = 1000;
849 sf->thresh_mult[THR_B_PRED ] = 2500;
850 sf->thresh_mult[THR_NEARESTG ] = 1000;
851 sf->thresh_mult[THR_ZEROG ] = 1000;
852 sf->thresh_mult[THR_NEARG ] = 1000;
853 sf->thresh_mult[THR_NEARESTA ] = 1000;
854 sf->thresh_mult[THR_ZEROA ] = 1000;
855 sf->thresh_mult[THR_NEARA ] = 1000;
856 sf->thresh_mult[THR_NEWMV ] = 2000;
857 sf->thresh_mult[THR_NEWG ] = 2000;
858 sf->thresh_mult[THR_NEWA ] = 2000;
859 sf->thresh_mult[THR_SPLITMV ] = 5000;
860 sf->thresh_mult[THR_SPLITG ] = 10000;
861 sf->thresh_mult[THR_SPLITA ] = 10000;
862 sf->full_freq[0] = 15;
863 sf->full_freq[1] = 31;
864 sf->search_method = NSTEP;
868 cpi->mode_check_freq[THR_SPLITG] = 4;
869 cpi->mode_check_freq[THR_SPLITA] = 4;
870 cpi->mode_check_freq[THR_SPLITMV] = 2;
872 sf->thresh_mult[THR_DC ] = 0;
873 sf->thresh_mult[THR_TM ] = 1000;
874 sf->thresh_mult[THR_V_PRED ] = 2000;
875 sf->thresh_mult[THR_H_PRED ] = 2000;
876 sf->thresh_mult[THR_B_PRED ] = 5000;
878 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
880 sf->thresh_mult[THR_NEARESTMV] = 0;
881 sf->thresh_mult[THR_ZEROMV ] = 0;
882 sf->thresh_mult[THR_NEARMV ] = 0;
883 sf->thresh_mult[THR_NEWMV ] = 2000;
884 sf->thresh_mult[THR_SPLITMV ] = 10000;
887 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
889 sf->thresh_mult[THR_NEARESTG ] = 1000;
890 sf->thresh_mult[THR_ZEROG ] = 1000;
891 sf->thresh_mult[THR_NEARG ] = 1000;
892 sf->thresh_mult[THR_NEWG ] = 2000;
893 sf->thresh_mult[THR_SPLITG ] = 20000;
896 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
898 sf->thresh_mult[THR_NEARESTA ] = 1000;
899 sf->thresh_mult[THR_ZEROA ] = 1000;
900 sf->thresh_mult[THR_NEARA ] = 1000;
901 sf->thresh_mult[THR_NEWA ] = 2000;
902 sf->thresh_mult[THR_SPLITA ] = 20000;
905 sf->improved_quant = 0;
906 sf->improved_dct = 0;
911 cpi->mode_check_freq[THR_SPLITMV] = 7;
912 cpi->mode_check_freq[THR_SPLITG] = 15;
913 cpi->mode_check_freq[THR_SPLITA] = 15;
915 sf->thresh_mult[THR_TM ] = 2000;
916 sf->thresh_mult[THR_V_PRED ] = 2000;
917 sf->thresh_mult[THR_H_PRED ] = 2000;
918 sf->thresh_mult[THR_B_PRED ] = 5000;
920 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
922 sf->thresh_mult[THR_NEWMV ] = 2000;
923 sf->thresh_mult[THR_SPLITMV ] = 25000;
926 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
928 sf->thresh_mult[THR_NEARESTG ] = 2000;
929 sf->thresh_mult[THR_ZEROG ] = 2000;
930 sf->thresh_mult[THR_NEARG ] = 2000;
931 sf->thresh_mult[THR_NEWG ] = 2500;
932 sf->thresh_mult[THR_SPLITG ] = 50000;
935 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
937 sf->thresh_mult[THR_NEARESTA ] = 2000;
938 sf->thresh_mult[THR_ZEROA ] = 2000;
939 sf->thresh_mult[THR_NEARA ] = 2000;
940 sf->thresh_mult[THR_NEWA ] = 2500;
941 sf->thresh_mult[THR_SPLITA ] = 50000;
944 sf->full_freq[0] = 31;
945 sf->full_freq[1] = 63;
950 sf->auto_filter = 0; // Faster selection of loop filter
952 cpi->mode_check_freq[THR_V_PRED] = 2;
953 cpi->mode_check_freq[THR_H_PRED] = 2;
954 cpi->mode_check_freq[THR_B_PRED] = 2;
956 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
958 cpi->mode_check_freq[THR_NEARG] = 2;
959 cpi->mode_check_freq[THR_NEWG] = 4;
962 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
964 cpi->mode_check_freq[THR_NEARA] = 2;
965 cpi->mode_check_freq[THR_NEWA] = 4;
968 sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
969 sf->thresh_mult[THR_SPLITG ] = INT_MAX;
970 sf->thresh_mult[THR_SPLITA ] = INT_MAX;
972 sf->full_freq[0] = 63;
973 sf->full_freq[1] = 127;
979 sf->full_freq[0] = INT_MAX;
980 sf->full_freq[1] = INT_MAX;
987 sf->auto_filter = 0; // Faster selection of loop filter
989 #if CONFIG_REALTIME_ONLY
990 sf->search_method = HEX;
992 sf->search_method = DIAMOND;
994 sf->iterative_sub_pixel = 0;
996 cpi->mode_check_freq[THR_V_PRED] = 4;
997 cpi->mode_check_freq[THR_H_PRED] = 4;
998 cpi->mode_check_freq[THR_B_PRED] = 4;
1000 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1002 cpi->mode_check_freq[THR_NEARG] = 2;
1003 cpi->mode_check_freq[THR_NEWG] = 4;
1006 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1008 cpi->mode_check_freq[THR_NEARA] = 2;
1009 cpi->mode_check_freq[THR_NEWA] = 4;
1012 sf->thresh_mult[THR_TM ] = 2000;
1013 sf->thresh_mult[THR_B_PRED ] = 5000;
1015 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1017 sf->thresh_mult[THR_NEARESTG ] = 2000;
1018 sf->thresh_mult[THR_ZEROG ] = 2000;
1019 sf->thresh_mult[THR_NEARG ] = 2000;
1020 sf->thresh_mult[THR_NEWG ] = 4000;
1023 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1025 sf->thresh_mult[THR_NEARESTA ] = 2000;
1026 sf->thresh_mult[THR_ZEROA ] = 2000;
1027 sf->thresh_mult[THR_NEARA ] = 2000;
1028 sf->thresh_mult[THR_NEWA ] = 4000;
1034 // Disable split MB intra prediction mode
1035 sf->thresh_mult[THR_B_PRED] = INT_MAX;
1040 unsigned int i, sum = 0;
1041 unsigned int total_mbs = cm->MBs;
1047 if (cpi->oxcf.encode_breakout > 2000)
1048 min = cpi->oxcf.encode_breakout;
1052 for (i = 0; i < min; i++)
1054 sum += cpi->error_bins[i];
1060 // i starts from 2 to make sure thresh started from 2048
1061 for (; i < 1024; i++)
1063 sum += cpi->error_bins[i];
1065 if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
1075 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
1077 sf->thresh_mult[THR_NEWMV] = thresh;
1078 sf->thresh_mult[THR_NEARESTMV ] = thresh >> 1;
1079 sf->thresh_mult[THR_NEARMV ] = thresh >> 1;
1082 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1084 sf->thresh_mult[THR_NEWG] = thresh << 1;
1085 sf->thresh_mult[THR_NEARESTG ] = thresh;
1086 sf->thresh_mult[THR_NEARG ] = thresh;
1089 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1091 sf->thresh_mult[THR_NEWA] = thresh << 1;
1092 sf->thresh_mult[THR_NEARESTA ] = thresh;
1093 sf->thresh_mult[THR_NEARA ] = thresh;
1096 // Disable other intra prediction modes
1097 sf->thresh_mult[THR_TM] = INT_MAX;
1098 sf->thresh_mult[THR_V_PRED] = INT_MAX;
1099 sf->thresh_mult[THR_H_PRED] = INT_MAX;
1101 sf->improved_mv_pred = 0;
1106 sf->quarter_pixel_search = 0;
1111 int Tmp = cpi->Speed - 8;
1116 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1118 cpi->mode_check_freq[THR_ZEROG] = 1 << (Tmp - 1);
1119 cpi->mode_check_freq[THR_NEARESTG] = 1 << (Tmp - 1);
1120 cpi->mode_check_freq[THR_NEARG] = 1 << Tmp;
1121 cpi->mode_check_freq[THR_NEWG] = 1 << (Tmp + 1);
1124 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1126 cpi->mode_check_freq[THR_ZEROA] = 1 << (Tmp - 1);
1127 cpi->mode_check_freq[THR_NEARESTA] = 1 << (Tmp - 1);
1128 cpi->mode_check_freq[THR_NEARA] = 1 << Tmp;
1129 cpi->mode_check_freq[THR_NEWA] = 1 << (Tmp + 1);
1132 cpi->mode_check_freq[THR_NEWMV] = 1 << (Tmp - 1);
1135 cm->filter_type = NORMAL_LOOPFILTER;
1138 cm->filter_type = SIMPLE_LOOPFILTER;
1142 sf->half_pixel_search = 0; // This has a big hit on quality. Last resort
1145 vpx_memset(cpi->error_bins, 0, sizeof(cpi->error_bins));
1149 /* disable frame modes if flags not set */
1150 if (!(cpi->ref_frame_flags & VP8_LAST_FLAG))
1152 sf->thresh_mult[THR_NEWMV ] = INT_MAX;
1153 sf->thresh_mult[THR_NEARESTMV] = INT_MAX;
1154 sf->thresh_mult[THR_ZEROMV ] = INT_MAX;
1155 sf->thresh_mult[THR_NEARMV ] = INT_MAX;
1156 sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
1159 if (!(cpi->ref_frame_flags & VP8_GOLD_FLAG))
1161 sf->thresh_mult[THR_NEARESTG ] = INT_MAX;
1162 sf->thresh_mult[THR_ZEROG ] = INT_MAX;
1163 sf->thresh_mult[THR_NEARG ] = INT_MAX;
1164 sf->thresh_mult[THR_NEWG ] = INT_MAX;
1165 sf->thresh_mult[THR_SPLITG ] = INT_MAX;
1168 if (!(cpi->ref_frame_flags & VP8_ALT_FLAG))
1170 sf->thresh_mult[THR_NEARESTA ] = INT_MAX;
1171 sf->thresh_mult[THR_ZEROA ] = INT_MAX;
1172 sf->thresh_mult[THR_NEARA ] = INT_MAX;
1173 sf->thresh_mult[THR_NEWA ] = INT_MAX;
1174 sf->thresh_mult[THR_SPLITA ] = INT_MAX;
1178 // Slow quant, dct and trellis not worthwhile for first pass
1179 // so make sure they are always turned off.
1180 if ( cpi->pass == 1 )
1182 sf->improved_quant = 0;
1183 sf->optimize_coefficients = 0;
1184 sf->improved_dct = 0;
1187 if (cpi->sf.search_method == NSTEP)
1189 vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1191 else if (cpi->sf.search_method == DIAMOND)
1193 vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1196 if (cpi->sf.improved_dct)
1198 cpi->mb.vp8_short_fdct8x4 = FDCT_INVOKE(&cpi->rtcd.fdct, short8x4);
1199 cpi->mb.vp8_short_fdct4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, short4x4);
1203 cpi->mb.vp8_short_fdct8x4 = FDCT_INVOKE(&cpi->rtcd.fdct, fast8x4);
1204 cpi->mb.vp8_short_fdct4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, fast4x4);
1207 cpi->mb.short_walsh4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, walsh_short4x4);
1209 if (cpi->sf.improved_quant)
1211 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, quantb);
1215 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, fastquantb);
1217 if (cpi->sf.improved_quant != last_improved_quant)
1218 vp8cx_init_quantizer(cpi);
1220 #if CONFIG_RUNTIME_CPU_DETECT
1221 cpi->mb.e_mbd.rtcd = &cpi->common.rtcd;
1224 if (cpi->sf.iterative_sub_pixel == 1)
1226 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
1228 else if (cpi->sf.quarter_pixel_search)
1230 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
1232 else if (cpi->sf.half_pixel_search)
1234 cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1238 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1241 if (cpi->sf.optimize_coefficients == 1)
1242 cpi->mb.optimize = 1 + cpi->is_next_src_alt_ref;
1244 cpi->mb.optimize = 0;
1246 if (cpi->common.full_pixel)
1247 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1250 frames_at_speed[cpi->Speed]++;
1253 static void alloc_raw_frame_buffers(VP8_COMP *cpi)
1256 /* allocate source_buffer to be multiples of 16 */
1257 int width = (cpi->oxcf.Width + 15) & ~15;
1259 buffers = cpi->oxcf.lag_in_frames;
1261 if (buffers > MAX_LAG_BUFFERS)
1262 buffers = MAX_LAG_BUFFERS;
1267 for (i = 0; i < buffers; i++)
1268 if (vp8_yv12_alloc_frame_buffer(&cpi->src_buffer[i].source_buffer,
1269 width, cpi->oxcf.Height,
1271 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1272 "Failed to allocate lag buffer");
1274 #if VP8_TEMPORAL_ALT_REF
1276 if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer.source_buffer,
1277 width, cpi->oxcf.Height, 16))
1278 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1279 "Failed to allocate altref buffer");
1283 cpi->source_buffer_count = 0;
1286 static int vp8_alloc_partition_data(VP8_COMP *cpi)
1288 vpx_free(cpi->mb.pip);
1290 cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
1291 (cpi->common.mb_rows + 1),
1292 sizeof(PARTITION_INFO));
1296 cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1301 void vp8_alloc_compressor_data(VP8_COMP *cpi)
1303 VP8_COMMON *cm = & cpi->common;
1305 int width = cm->Width;
1306 int height = cm->Height;
1308 if (vp8_alloc_frame_buffers(cm, width, height))
1309 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1310 "Failed to allocate frame buffers");
1312 if (vp8_alloc_partition_data(cpi))
1313 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1314 "Failed to allocate partition data");
1317 if ((width & 0xf) != 0)
1318 width += 16 - (width & 0xf);
1320 if ((height & 0xf) != 0)
1321 height += 16 - (height & 0xf);
1324 if (vp8_yv12_alloc_frame_buffer(&cpi->last_frame_uf,
1325 width, height, VP8BORDERINPIXELS))
1326 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1327 "Failed to allocate last frame buffer");
1329 if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source, width, height, 16))
1330 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1331 "Failed to allocate scaled source buffer");
1337 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1339 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1342 // Data used for real time vc mode to see if gf needs refreshing
1343 cpi->inter_zz_count = 0;
1344 cpi->gf_bad_count = 0;
1345 cpi->gf_update_recommended = 0;
1348 // Structures used to minitor GF usage
1349 vpx_free(cpi->gf_active_flags);
1351 CHECK_MEM_ERROR(cpi->gf_active_flags, vpx_calloc(1, cm->mb_rows * cm->mb_cols));
1353 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1355 #if !(CONFIG_REALTIME_ONLY)
1356 vpx_free(cpi->total_stats);
1358 cpi->total_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
1360 vpx_free(cpi->this_frame_stats);
1362 cpi->this_frame_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
1364 if(!cpi->total_stats || !cpi->this_frame_stats)
1365 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1366 "Failed to allocate firstpass stats");
1369 #if CONFIG_MULTITHREAD
1371 cpi->mt_sync_range = 1;
1372 else if (width <= 1280)
1373 cpi->mt_sync_range = 4;
1374 else if (width <= 2560)
1375 cpi->mt_sync_range = 8;
1377 cpi->mt_sync_range = 16;
1380 vpx_free(cpi->tplist);
1382 CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cpi->common.mb_rows));
1387 static const int q_trans[] =
1389 0, 1, 2, 3, 4, 5, 7, 8,
1390 9, 10, 12, 13, 15, 17, 18, 19,
1391 20, 21, 23, 24, 25, 26, 27, 28,
1392 29, 30, 31, 33, 35, 37, 39, 41,
1393 43, 45, 47, 49, 51, 53, 55, 57,
1394 59, 61, 64, 67, 70, 73, 76, 79,
1395 82, 85, 88, 91, 94, 97, 100, 103,
1396 106, 109, 112, 115, 118, 121, 124, 127,
1399 int vp8_reverse_trans(int x)
1403 for (i = 0; i < 64; i++)
1404 if (q_trans[i] >= x)
1409 void vp8_new_frame_rate(VP8_COMP *cpi, double framerate)
1414 cpi->oxcf.frame_rate = framerate;
1415 cpi->output_frame_rate = cpi->oxcf.frame_rate;
1416 cpi->per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
1417 cpi->av_per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
1418 cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
1420 // Set Maximum gf/arf interval
1421 cpi->max_gf_interval = ((int)(cpi->output_frame_rate / 2.0) + 2);
1423 if(cpi->max_gf_interval < 12)
1424 cpi->max_gf_interval = 12;
1426 // Extended interval for genuinely static scenes
1427 cpi->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1429 // Special conditions when altr ref frame enabled in lagged compress mode
1430 if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
1432 if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1433 cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1435 if (cpi->static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1436 cpi->static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1439 if ( cpi->max_gf_interval > cpi->static_scene_max_gf_interval )
1440 cpi->max_gf_interval = cpi->static_scene_max_gf_interval;
1445 rescale(int val, int num, int denom)
1447 int64_t llnum = num;
1448 int64_t llden = denom;
1449 int64_t llval = val;
1451 return llval * llnum / llden;
1455 static void init_config(VP8_PTR ptr, VP8_CONFIG *oxcf)
1457 VP8_COMP *cpi = (VP8_COMP *)(ptr);
1458 VP8_COMMON *cm = &cpi->common;
1463 cpi->auto_adjust_gold_quantizer = 1;
1464 cpi->goldquantizer = 1;
1466 cpi->auto_adjust_key_quantizer = 1;
1467 cpi->keyquantizer = 1;
1469 cm->version = oxcf->Version;
1470 vp8_setup_version(cm);
1472 // change includes all joint functionality
1473 vp8_change_config(ptr, oxcf);
1475 // Initialize active best and worst q and average q values.
1476 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1477 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1478 cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
1480 // Initialise the starting buffer levels
1481 cpi->oxcf.starting_buffer_level =
1482 rescale(cpi->oxcf.starting_buffer_level,
1483 cpi->oxcf.target_bandwidth, 1000);
1485 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
1486 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
1488 cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
1489 cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
1490 cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
1491 cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
1493 cpi->total_actual_bits = 0;
1494 cpi->total_target_vs_actual = 0;
1496 #if VP8_TEMPORAL_ALT_REF
1500 cpi->fixed_divide[0] = 0;
1502 for (i = 1; i < 512; i++)
1503 cpi->fixed_divide[i] = 0x80000 / i;
1509 void vp8_change_config(VP8_PTR ptr, VP8_CONFIG *oxcf)
1511 VP8_COMP *cpi = (VP8_COMP *)(ptr);
1512 VP8_COMMON *cm = &cpi->common;
1520 if (cm->version != oxcf->Version)
1522 cm->version = oxcf->Version;
1523 vp8_setup_version(cm);
1528 switch (cpi->oxcf.Mode)
1533 cpi->compressor_speed = 2;
1535 if (cpi->oxcf.cpu_used < -16)
1537 cpi->oxcf.cpu_used = -16;
1540 if (cpi->oxcf.cpu_used > 16)
1541 cpi->oxcf.cpu_used = 16;
1545 #if !(CONFIG_REALTIME_ONLY)
1546 case MODE_GOODQUALITY:
1548 cpi->compressor_speed = 1;
1550 if (cpi->oxcf.cpu_used < -5)
1552 cpi->oxcf.cpu_used = -5;
1555 if (cpi->oxcf.cpu_used > 5)
1556 cpi->oxcf.cpu_used = 5;
1560 case MODE_BESTQUALITY:
1562 cpi->compressor_speed = 0;
1565 case MODE_FIRSTPASS:
1567 cpi->compressor_speed = 1;
1569 case MODE_SECONDPASS:
1571 cpi->compressor_speed = 1;
1573 if (cpi->oxcf.cpu_used < -5)
1575 cpi->oxcf.cpu_used = -5;
1578 if (cpi->oxcf.cpu_used > 5)
1579 cpi->oxcf.cpu_used = 5;
1582 case MODE_SECONDPASS_BEST:
1584 cpi->compressor_speed = 0;
1590 cpi->auto_worst_q = 1;
1592 cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1593 cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1594 cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1596 if (oxcf->fixed_q >= 0)
1598 if (oxcf->worst_allowed_q < 0)
1599 cpi->oxcf.fixed_q = q_trans[0];
1601 cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1603 if (oxcf->alt_q < 0)
1604 cpi->oxcf.alt_q = q_trans[0];
1606 cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1608 if (oxcf->key_q < 0)
1609 cpi->oxcf.key_q = q_trans[0];
1611 cpi->oxcf.key_q = q_trans[oxcf->key_q];
1613 if (oxcf->gold_q < 0)
1614 cpi->oxcf.gold_q = q_trans[0];
1616 cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1620 cpi->baseline_gf_interval =
1621 cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1623 cpi->ref_frame_flags = VP8_ALT_FLAG | VP8_GOLD_FLAG | VP8_LAST_FLAG;
1625 //cpi->use_golden_frame_only = 0;
1626 //cpi->use_last_frame_only = 0;
1627 cm->refresh_golden_frame = 0;
1628 cm->refresh_last_frame = 1;
1629 cm->refresh_entropy_probs = 1;
1631 if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
1632 cm->multi_token_partition =
1633 (TOKEN_PARTITION) cpi->oxcf.token_partitions;
1635 setup_features(cpi);
1640 for (i = 0; i < MAX_MB_SEGMENTS; i++)
1641 cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1644 // At the moment the first order values may not be > MAXQ
1645 if (cpi->oxcf.fixed_q > MAXQ)
1646 cpi->oxcf.fixed_q = MAXQ;
1648 // local file playback mode == really big buffer
1649 if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
1651 cpi->oxcf.starting_buffer_level = 60000;
1652 cpi->oxcf.optimal_buffer_level = 60000;
1653 cpi->oxcf.maximum_buffer_size = 240000;
1656 // Convert target bandwidth from Kbit/s to Bit/s
1657 cpi->oxcf.target_bandwidth *= 1000;
1659 // Set or reset optimal and maximum buffer levels.
1660 if (cpi->oxcf.optimal_buffer_level == 0)
1661 cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1663 cpi->oxcf.optimal_buffer_level =
1664 rescale(cpi->oxcf.optimal_buffer_level,
1665 cpi->oxcf.target_bandwidth, 1000);
1667 if (cpi->oxcf.maximum_buffer_size == 0)
1668 cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1670 cpi->oxcf.maximum_buffer_size =
1671 rescale(cpi->oxcf.maximum_buffer_size,
1672 cpi->oxcf.target_bandwidth, 1000);
1674 // Set up frame rate and related parameters rate control values.
1675 vp8_new_frame_rate(cpi, cpi->oxcf.frame_rate);
1677 // Set absolute upper and lower quality limits
1678 cpi->worst_quality = cpi->oxcf.worst_allowed_q;
1679 cpi->best_quality = cpi->oxcf.best_allowed_q;
1681 // active values should only be modified if out of new range
1682 if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
1684 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1687 else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
1689 cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1691 if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
1693 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1696 else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
1698 cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1701 cpi->buffered_mode = (cpi->oxcf.optimal_buffer_level > 0) ? TRUE : FALSE;
1703 cpi->cq_target_quality = cpi->oxcf.cq_level;
1705 // Only allow dropped frames in buffered mode
1706 cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1708 cm->filter_type = (LOOPFILTERTYPE) cpi->filter_type;
1710 if (!cm->use_bilinear_mc_filter)
1711 cm->mcomp_filter_type = SIXTAP;
1713 cm->mcomp_filter_type = BILINEAR;
1715 cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1717 cm->Width = cpi->oxcf.Width ;
1718 cm->Height = cpi->oxcf.Height ;
1720 cm->horiz_scale = cpi->horiz_scale;
1721 cm->vert_scale = cpi->vert_scale ;
1724 cpi->intra_frame_target = (4 * (cm->Width + cm->Height) / 15) * 1000;
1726 // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
1727 if (cpi->oxcf.Sharpness > 7)
1728 cpi->oxcf.Sharpness = 7;
1730 cm->sharpness_level = cpi->oxcf.Sharpness;
1732 if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
1734 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
1735 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
1737 Scale2Ratio(cm->horiz_scale, &hr, &hs);
1738 Scale2Ratio(cm->vert_scale, &vr, &vs);
1740 // always go to the next whole number
1741 cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1742 cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1745 if (((cm->Width + 15) & 0xfffffff0) !=
1746 cm->yv12_fb[cm->lst_fb_idx].y_width ||
1747 ((cm->Height + 15) & 0xfffffff0) !=
1748 cm->yv12_fb[cm->lst_fb_idx].y_height ||
1749 cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
1751 alloc_raw_frame_buffers(cpi);
1752 vp8_alloc_compressor_data(cpi);
1755 // Clamp KF frame size to quarter of data rate
1756 if (cpi->intra_frame_target > cpi->target_bandwidth >> 2)
1757 cpi->intra_frame_target = cpi->target_bandwidth >> 2;
1759 if (cpi->oxcf.fixed_q >= 0)
1761 cpi->last_q[0] = cpi->oxcf.fixed_q;
1762 cpi->last_q[1] = cpi->oxcf.fixed_q;
1765 cpi->Speed = cpi->oxcf.cpu_used;
1767 // force to allowlag to 0 if lag_in_frames is 0;
1768 if (cpi->oxcf.lag_in_frames == 0)
1770 cpi->oxcf.allow_lag = 0;
1772 // Limit on lag buffers as these are not currently dynamically allocated
1773 else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
1774 cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1777 cpi->last_alt_ref_sei = -1;
1778 cpi->is_src_frame_alt_ref = 0;
1779 cpi->is_next_src_alt_ref = 0;
1782 // Experimental RD Code
1783 cpi->frame_distortion = 0;
1784 cpi->last_frame_distortion = 0;
1789 #define M_LOG2_E 0.693147180559945309417
1790 #define log2f(x) (log (x) / (float) M_LOG2_E)
1791 static void cal_mvsadcosts(int *mvsadcost[2])
1795 mvsadcost [0] [0] = 300;
1796 mvsadcost [1] [0] = 300;
1800 double z = 256 * (2 * (log2f(8 * i) + .6));
1801 mvsadcost [0][i] = (int) z;
1802 mvsadcost [1][i] = (int) z;
1803 mvsadcost [0][-i] = (int) z;
1804 mvsadcost [1][-i] = (int) z;
1806 while (++i <= mvfp_max);
1809 VP8_PTR vp8_create_compressor(VP8_CONFIG *oxcf)
1821 cpi = ctx.cpi = vpx_memalign(32, sizeof(VP8_COMP));
1822 // Check that the CPI instance is valid
1828 vpx_memset(cpi, 0, sizeof(VP8_COMP));
1830 if (setjmp(cm->error.jmp))
1832 VP8_PTR ptr = ctx.ptr;
1834 ctx.cpi->common.error.setjmp = 0;
1835 vp8_remove_compressor(&ptr);
1839 cpi->common.error.setjmp = 1;
1841 CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));
1843 vp8_create_common(&cpi->common);
1844 vp8_cmachine_specific_config(cpi);
1846 init_config((VP8_PTR)cpi, oxcf);
1848 memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
1849 cpi->common.current_video_frame = 0;
1850 cpi->kf_overspend_bits = 0;
1851 cpi->kf_bitrate_adjustment = 0;
1852 cpi->frames_till_gf_update_due = 0;
1853 cpi->gf_overspend_bits = 0;
1854 cpi->non_gf_bitrate_adjustment = 0;
1855 cpi->prob_last_coded = 128;
1856 cpi->prob_gf_coded = 128;
1857 cpi->prob_intra_coded = 63;
1859 // Prime the recent reference frame useage counters.
1860 // Hereafter they will be maintained as a sort of moving average
1861 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
1862 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
1863 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1864 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1866 // Set reference frame sign bias for ALTREF frame to 1 (for now)
1867 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1869 cpi->gf_decay_rate = 0;
1870 cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1872 cpi->gold_is_last = 0 ;
1873 cpi->alt_is_last = 0 ;
1874 cpi->gold_is_alt = 0 ;
1876 // allocate memory for storing last frame's MVs for MV prediction.
1877 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int_mv)));
1878 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int)));
1879 CHECK_MEM_ERROR(cpi->lf_ref_frame, vpx_calloc((cpi->common.mb_rows+2) * (cpi->common.mb_cols+2), sizeof(int)));
1881 // Create the encoder segmentation map and set all entries to 0
1882 CHECK_MEM_ERROR(cpi->segmentation_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
1883 CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
1884 vpx_memset(cpi->active_map , 1, (cpi->common.mb_rows * cpi->common.mb_cols));
1885 cpi->active_map_enabled = 0;
1888 // Experimental code for lagged and one pass
1889 // Initialise one_pass GF frames stats
1890 // Update stats used for GF selection
1893 cpi->one_pass_frame_index = 0;
1895 for (i = 0; i < MAX_LAG_BUFFERS; i++)
1897 cpi->one_pass_frame_stats[i].frames_so_far = 0;
1898 cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1899 cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1900 cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1901 cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1902 cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1903 cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1904 cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1905 cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1910 // Should we use the cyclic refresh method.
1911 // Currently this is tied to error resilliant mode
1912 cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
1913 cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 40;
1914 cpi->cyclic_refresh_mode_index = 0;
1915 cpi->cyclic_refresh_q = 32;
1917 if (cpi->cyclic_refresh_mode_enabled)
1919 CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1922 cpi->cyclic_refresh_map = (signed char *) NULL;
1924 // Test function for segmentation
1925 //segmentation_test_function((VP8_PTR) cpi);
1927 #ifdef ENTROPY_STATS
1928 init_context_counters();
1931 /*Initialize the feed-forward activity masking.*/
1932 cpi->activity_avg = 90<<12;
1934 cpi->frames_since_key = 8; // Give a sensible default for the first frame.
1935 cpi->key_frame_frequency = cpi->oxcf.key_freq;
1936 cpi->this_key_frame_forced = FALSE;
1937 cpi->next_key_frame_forced = FALSE;
1939 cpi->source_alt_ref_pending = FALSE;
1940 cpi->source_alt_ref_active = FALSE;
1941 cpi->common.refresh_alt_ref_frame = 0;
1943 cpi->b_calculate_psnr = CONFIG_PSNR;
1945 cpi->b_calculate_ssimg = 0;
1950 if (cpi->b_calculate_psnr)
1952 cpi->total_sq_error = 0.0;
1953 cpi->total_sq_error2 = 0.0;
1958 cpi->totalp_y = 0.0;
1959 cpi->totalp_u = 0.0;
1960 cpi->totalp_v = 0.0;
1962 cpi->tot_recode_hits = 0;
1963 cpi->summed_quality = 0;
1964 cpi->summed_weights = 0;
1967 if (cpi->b_calculate_ssimg)
1969 cpi->total_ssimg_y = 0;
1970 cpi->total_ssimg_u = 0;
1971 cpi->total_ssimg_v = 0;
1972 cpi->total_ssimg_all = 0;
1976 #define LLONG_MAX 9223372036854775807LL
1978 cpi->first_time_stamp_ever = LLONG_MAX;
1982 cpi->frames_till_gf_update_due = 0;
1983 cpi->key_frame_count = 1;
1984 cpi->tot_key_frame_bits = 0;
1986 cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
1989 cpi->total_byte_count = 0;
1991 cpi->drop_frame = 0;
1992 cpi->drop_count = 0;
1993 cpi->max_drop_count = 0;
1994 cpi->max_consec_dropped_frames = 4;
1996 cpi->rate_correction_factor = 1.0;
1997 cpi->key_frame_rate_correction_factor = 1.0;
1998 cpi->gf_rate_correction_factor = 1.0;
1999 cpi->est_max_qcorrection_factor = 1.0;
2001 cpi->mb.mvcost[0] = &cpi->mb.mvcosts[0][mv_max+1];
2002 cpi->mb.mvcost[1] = &cpi->mb.mvcosts[1][mv_max+1];
2003 cpi->mb.mvsadcost[0] = &cpi->mb.mvsadcosts[0][mvfp_max+1];
2004 cpi->mb.mvsadcost[1] = &cpi->mb.mvsadcosts[1][mvfp_max+1];
2006 cal_mvsadcosts(cpi->mb.mvsadcost);
2008 for (i = 0; i < KEY_FRAME_CONTEXT; i++)
2010 cpi->prior_key_frame_size[i] = cpi->intra_frame_target;
2011 cpi->prior_key_frame_distance[i] = (int)cpi->output_frame_rate;
2014 cpi->check_freq[0] = 15;
2015 cpi->check_freq[1] = 15;
2017 #ifdef OUTPUT_YUV_SRC
2018 yuv_file = fopen("bd.yuv", "ab");
2022 framepsnr = fopen("framepsnr.stt", "a");
2023 kf_list = fopen("kf_list.stt", "w");
2026 cpi->output_pkt_list = oxcf->output_pkt_list;
2028 #if !(CONFIG_REALTIME_ONLY)
2032 vp8_init_first_pass(cpi);
2034 else if (cpi->pass == 2)
2036 size_t packet_sz = sizeof(FIRSTPASS_STATS);
2037 int packets = oxcf->two_pass_stats_in.sz / packet_sz;
2039 cpi->stats_in = oxcf->two_pass_stats_in.buf;
2040 cpi->stats_in_end = (void*)((char *)cpi->stats_in
2041 + (packets - 1) * packet_sz);
2042 vp8_init_second_pass(cpi);
2047 if (cpi->compressor_speed == 2)
2049 cpi->cpu_freq = 0; //vp8_get_processor_freq();
2050 cpi->avg_encode_time = 0;
2051 cpi->avg_pick_mode_time = 0;
2054 vp8_set_speed_features(cpi);
2056 // Set starting values of RD threshold multipliers (128 = *1)
2057 for (i = 0; i < MAX_MODES; i++)
2059 cpi->rd_thresh_mult[i] = 128;
2062 #ifdef ENTROPY_STATS
2063 init_mv_ref_counts();
2066 #if CONFIG_MULTITHREAD
2067 vp8cx_create_encoder_threads(cpi);
2070 cpi->fn_ptr[BLOCK_16X16].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16);
2071 cpi->fn_ptr[BLOCK_16X16].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16);
2072 cpi->fn_ptr[BLOCK_16X16].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar16x16);
2073 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_h);
2074 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_v);
2075 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_hv);
2076 cpi->fn_ptr[BLOCK_16X16].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x3);
2077 cpi->fn_ptr[BLOCK_16X16].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x8);
2078 cpi->fn_ptr[BLOCK_16X16].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x4d);
2080 cpi->fn_ptr[BLOCK_16X8].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8);
2081 cpi->fn_ptr[BLOCK_16X8].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x8);
2082 cpi->fn_ptr[BLOCK_16X8].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar16x8);
2083 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h = NULL;
2084 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v = NULL;
2085 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
2086 cpi->fn_ptr[BLOCK_16X8].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x3);
2087 cpi->fn_ptr[BLOCK_16X8].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x8);
2088 cpi->fn_ptr[BLOCK_16X8].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x4d);
2090 cpi->fn_ptr[BLOCK_8X16].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16);
2091 cpi->fn_ptr[BLOCK_8X16].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var8x16);
2092 cpi->fn_ptr[BLOCK_8X16].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar8x16);
2093 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h = NULL;
2094 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v = NULL;
2095 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
2096 cpi->fn_ptr[BLOCK_8X16].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x3);
2097 cpi->fn_ptr[BLOCK_8X16].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x8);
2098 cpi->fn_ptr[BLOCK_8X16].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x4d);
2100 cpi->fn_ptr[BLOCK_8X8].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8);
2101 cpi->fn_ptr[BLOCK_8X8].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var8x8);
2102 cpi->fn_ptr[BLOCK_8X8].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar8x8);
2103 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h = NULL;
2104 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v = NULL;
2105 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
2106 cpi->fn_ptr[BLOCK_8X8].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x3);
2107 cpi->fn_ptr[BLOCK_8X8].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x8);
2108 cpi->fn_ptr[BLOCK_8X8].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x4d);
2110 cpi->fn_ptr[BLOCK_4X4].sdf = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4);
2111 cpi->fn_ptr[BLOCK_4X4].vf = VARIANCE_INVOKE(&cpi->rtcd.variance, var4x4);
2112 cpi->fn_ptr[BLOCK_4X4].svf = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar4x4);
2113 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h = NULL;
2114 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v = NULL;
2115 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
2116 cpi->fn_ptr[BLOCK_4X4].sdx3f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x3);
2117 cpi->fn_ptr[BLOCK_4X4].sdx8f = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x8);
2118 cpi->fn_ptr[BLOCK_4X4].sdx4df = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x4d);
2120 #if !(CONFIG_REALTIME_ONLY)
2121 cpi->full_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, full_search);
2123 cpi->diamond_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, diamond_search);
2125 cpi->ready_for_new_frame = 1;
2127 cpi->source_encode_index = 0;
2129 // make sure frame 1 is okay
2130 cpi->error_bins[0] = cpi->common.MBs;
2132 //vp8cx_init_quantizer() is first called here. Add check in vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only called later
2133 //when needed. This will avoid unnecessary calls of vp8cx_init_quantizer() for every frame.
2134 vp8cx_init_quantizer(cpi);
2136 vp8_init_loop_filter(cm);
2137 cm->last_frame_type = KEY_FRAME;
2138 cm->last_filter_type = cm->filter_type;
2139 cm->last_sharpness_level = cm->sharpness_level;
2141 cpi->common.error.setjmp = 0;
2142 return (VP8_PTR) cpi;
2147 void vp8_remove_compressor(VP8_PTR *ptr)
2149 VP8_COMP *cpi = (VP8_COMP *)(*ptr);
2154 if (cpi && (cpi->common.current_video_frame > 0))
2156 #if !(CONFIG_REALTIME_ONLY)
2160 vp8_end_second_pass(cpi);
2165 #ifdef ENTROPY_STATS
2166 print_context_counters();
2167 print_tree_update_probs();
2168 print_mode_context();
2175 FILE *f = fopen("opsnr.stt", "a");
2176 double time_encoded = (cpi->source_end_time_stamp - cpi->first_time_stamp_ever) / 10000000.000;
2177 double total_encode_time = (cpi->time_receive_data + cpi->time_compress_data) / 1000.000;
2178 double dr = (double)cpi->bytes * (double) 8 / (double)1000 / time_encoded;
2180 if (cpi->b_calculate_psnr)
2182 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
2183 double samples = 3.0 / 2 * cpi->count * lst_yv12->y_width * lst_yv12->y_height;
2184 double total_psnr = vp8_mse2psnr(samples, 255.0, cpi->total_sq_error);
2185 double total_psnr2 = vp8_mse2psnr(samples, 255.0, cpi->total_sq_error2);
2186 double total_ssim = 100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
2188 fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\tVPXSSIM\t Time(us)\n");
2189 fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f %8.0f\n",
2190 dr, cpi->total / cpi->count, total_psnr, cpi->totalp / cpi->count, total_psnr2, total_ssim,
2194 if (cpi->b_calculate_ssimg)
2196 fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t Time(us)\n");
2197 fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
2198 cpi->total_ssimg_y / cpi->count, cpi->total_ssimg_u / cpi->count,
2199 cpi->total_ssimg_v / cpi->count, cpi->total_ssimg_all / cpi->count, total_encode_time);
2204 f = fopen("qskip.stt", "a");
2205 fprintf(f, "minq:%d -maxq:%d skipture:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2216 if (cpi->compressor_speed == 2)
2219 FILE *f = fopen("cxspeed.stt", "a");
2220 cnt_pm /= cpi->common.MBs;
2222 for (i = 0; i < 16; i++)
2223 fprintf(f, "%5d", frames_at_speed[i]);
2226 //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);
2235 extern int count_mb_seg[4];
2236 FILE *f = fopen("modes.stt", "a");
2237 double dr = (double)cpi->oxcf.frame_rate * (double)bytes * (double)8 / (double)count / (double)1000 ;
2238 fprintf(f, "intra_mode in Intra Frames:\n");
2239 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
2240 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
2245 for (i = 0; i < 10; i++)
2246 fprintf(f, "%8d, ", b_modes[i]);
2252 fprintf(f, "Modes in Inter Frames:\n");
2253 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2254 inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
2255 inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
2256 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2261 for (i = 0; i < 15; i++)
2262 fprintf(f, "%8d, ", inter_b_modes[i]);
2267 fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
2268 fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);
2276 #ifdef ENTROPY_STATS
2279 FILE *fmode = fopen("modecontext.c", "w");
2281 fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
2282 fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
2283 fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
2285 for (i = 0; i < 10; i++)
2288 fprintf(fmode, " { //Above Mode : %d\n", i);
2290 for (j = 0; j < 10; j++)
2293 fprintf(fmode, " {");
2295 for (k = 0; k < 10; k++)
2297 if (!intra_mode_stats[i][j][k])
2298 fprintf(fmode, " %5d, ", 1);
2300 fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2303 fprintf(fmode, "}, // left_mode %d\n", j);
2307 fprintf(fmode, " },\n");
2311 fprintf(fmode, "};\n");
2317 #if defined(SECTIONBITS_OUTPUT)
2322 FILE *f = fopen("tokenbits.stt", "a");
2324 for (i = 0; i < 28; i++)
2325 fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2335 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2336 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
2337 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);
2343 #if CONFIG_MULTITHREAD
2344 vp8cx_remove_encoder_threads(cpi);
2347 dealloc_compressor_data(cpi);
2348 vpx_free(cpi->mb.ss);
2350 vpx_free(cpi->cyclic_refresh_map);
2352 vp8_remove_common(&cpi->common);
2356 #ifdef OUTPUT_YUV_SRC
2376 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2377 unsigned char *recon, int recon_stride,
2378 unsigned int cols, unsigned int rows,
2379 vp8_variance_rtcd_vtable_t *rtcd)
2381 unsigned int row, col;
2382 uint64_t total_sse = 0;
2385 for (row = 0; row + 16 <= rows; row += 16)
2387 for (col = 0; col + 16 <= cols; col += 16)
2391 VARIANCE_INVOKE(rtcd, mse16x16)(orig + col, orig_stride,
2392 recon + col, recon_stride,
2397 /* Handle odd-sized width */
2400 unsigned int border_row, border_col;
2401 unsigned char *border_orig = orig;
2402 unsigned char *border_recon = recon;
2404 for (border_row = 0; border_row < 16; border_row++)
2406 for (border_col = col; border_col < cols; border_col++)
2408 diff = border_orig[border_col] - border_recon[border_col];
2409 total_sse += diff * diff;
2412 border_orig += orig_stride;
2413 border_recon += recon_stride;
2417 orig += orig_stride * 16;
2418 recon += recon_stride * 16;
2421 /* Handle odd-sized height */
2422 for (; row < rows; row++)
2424 for (col = 0; col < cols; col++)
2426 diff = orig[col] - recon[col];
2427 total_sse += diff * diff;
2430 orig += orig_stride;
2431 recon += recon_stride;
2438 static void generate_psnr_packet(VP8_COMP *cpi)
2440 YV12_BUFFER_CONFIG *orig = cpi->Source;
2441 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
2442 struct vpx_codec_cx_pkt pkt;
2445 unsigned int width = cpi->common.Width;
2446 unsigned int height = cpi->common.Height;
2448 pkt.kind = VPX_CODEC_PSNR_PKT;
2449 sse = calc_plane_error(orig->y_buffer, orig->y_stride,
2450 recon->y_buffer, recon->y_stride,
2452 IF_RTCD(&cpi->rtcd.variance));
2453 pkt.data.psnr.sse[0] = sse;
2454 pkt.data.psnr.sse[1] = sse;
2455 pkt.data.psnr.samples[0] = width * height;
2456 pkt.data.psnr.samples[1] = width * height;
2458 width = (width + 1) / 2;
2459 height = (height + 1) / 2;
2461 sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
2462 recon->u_buffer, recon->uv_stride,
2464 IF_RTCD(&cpi->rtcd.variance));
2465 pkt.data.psnr.sse[0] += sse;
2466 pkt.data.psnr.sse[2] = sse;
2467 pkt.data.psnr.samples[0] += width * height;
2468 pkt.data.psnr.samples[2] = width * height;
2470 sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
2471 recon->v_buffer, recon->uv_stride,
2473 IF_RTCD(&cpi->rtcd.variance));
2474 pkt.data.psnr.sse[0] += sse;
2475 pkt.data.psnr.sse[3] = sse;
2476 pkt.data.psnr.samples[0] += width * height;
2477 pkt.data.psnr.samples[3] = width * height;
2479 for (i = 0; i < 4; i++)
2480 pkt.data.psnr.psnr[i] = vp8_mse2psnr(pkt.data.psnr.samples[i], 255.0,
2481 pkt.data.psnr.sse[i]);
2483 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2487 int vp8_use_as_reference(VP8_PTR ptr, int ref_frame_flags)
2489 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2491 if (ref_frame_flags > 7)
2494 cpi->ref_frame_flags = ref_frame_flags;
2497 int vp8_update_reference(VP8_PTR ptr, int ref_frame_flags)
2499 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2501 if (ref_frame_flags > 7)
2504 cpi->common.refresh_golden_frame = 0;
2505 cpi->common.refresh_alt_ref_frame = 0;
2506 cpi->common.refresh_last_frame = 0;
2508 if (ref_frame_flags & VP8_LAST_FLAG)
2509 cpi->common.refresh_last_frame = 1;
2511 if (ref_frame_flags & VP8_GOLD_FLAG)
2512 cpi->common.refresh_golden_frame = 1;
2514 if (ref_frame_flags & VP8_ALT_FLAG)
2515 cpi->common.refresh_alt_ref_frame = 1;
2520 int vp8_get_reference(VP8_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2522 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2523 VP8_COMMON *cm = &cpi->common;
2526 if (ref_frame_flag == VP8_LAST_FLAG)
2527 ref_fb_idx = cm->lst_fb_idx;
2528 else if (ref_frame_flag == VP8_GOLD_FLAG)
2529 ref_fb_idx = cm->gld_fb_idx;
2530 else if (ref_frame_flag == VP8_ALT_FLAG)
2531 ref_fb_idx = cm->alt_fb_idx;
2535 vp8_yv12_copy_frame_ptr(&cm->yv12_fb[ref_fb_idx], sd);
2539 int vp8_set_reference(VP8_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2541 VP8_COMP *cpi = (VP8_COMP *)(ptr);
2542 VP8_COMMON *cm = &cpi->common;
2546 if (ref_frame_flag == VP8_LAST_FLAG)
2547 ref_fb_idx = cm->lst_fb_idx;
2548 else if (ref_frame_flag == VP8_GOLD_FLAG)
2549 ref_fb_idx = cm->gld_fb_idx;
2550 else if (ref_frame_flag == VP8_ALT_FLAG)
2551 ref_fb_idx = cm->alt_fb_idx;
2555 vp8_yv12_copy_frame_ptr(sd, &cm->yv12_fb[ref_fb_idx]);
2559 int vp8_update_entropy(VP8_PTR comp, int update)
2561 VP8_COMP *cpi = (VP8_COMP *) comp;
2562 VP8_COMMON *cm = &cpi->common;
2563 cm->refresh_entropy_probs = update;
2570 void vp8_write_yuv_frame(const char *name, YV12_BUFFER_CONFIG *s)
2572 FILE *yuv_file = fopen(name, "ab");
2573 unsigned char *src = s->y_buffer;
2574 int h = s->y_height;
2578 fwrite(src, s->y_width, 1, yuv_file);
2588 fwrite(src, s->uv_width, 1, yuv_file);
2589 src += s->uv_stride;
2598 fwrite(src, s->uv_width, 1, yuv_file);
2599 src += s->uv_stride;
2608 static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
2610 VP8_COMMON *cm = &cpi->common;
2612 // are we resizing the image
2613 if (cm->horiz_scale != 0 || cm->vert_scale != 0)
2615 #if CONFIG_SPATIAL_RESAMPLING
2616 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2617 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2620 if (cm->vert_scale == 3)
2625 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2626 Scale2Ratio(cm->vert_scale, &vr, &vs);
2628 vp8_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2629 tmp_height, hs, hr, vs, vr, 0);
2631 cpi->Source = &cpi->scaled_source;
2634 // we may need to copy to a buffer so we can extend the image...
2635 else if (cm->Width != cm->yv12_fb[cm->lst_fb_idx].y_width ||
2636 cm->Height != cm->yv12_fb[cm->lst_fb_idx].y_height)
2638 //vp8_yv12_copy_frame_ptr(sd, &cpi->scaled_source);
2640 #if CONFIG_RUNTIME_CPU_DETECT
2641 if (cm->rtcd.flags & HAS_NEON)
2644 vp8_yv12_copy_src_frame_func_neon(sd, &cpi->scaled_source);
2646 #if CONFIG_RUNTIME_CPU_DETECT
2650 #if !HAVE_ARMV7 || CONFIG_RUNTIME_CPU_DETECT
2652 vp8_yv12_copy_frame_ptr(sd, &cpi->scaled_source);
2656 cpi->Source = &cpi->scaled_source;
2659 vp8_extend_to_multiple_of16(cpi->Source, cm->Width, cm->Height);
2662 static void resize_key_frame(VP8_COMP *cpi)
2664 #if CONFIG_SPATIAL_RESAMPLING
2665 VP8_COMMON *cm = &cpi->common;
2667 // Do we need to apply resampling for one pass cbr.
2668 // In one pass this is more limited than in two pass cbr
2669 // The test and any change is only made one per key frame sequence
2670 if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
2672 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2673 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2674 int new_width, new_height;
2676 // If we are below the resample DOWN watermark then scale down a notch.
2677 if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2679 cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2680 cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2682 // Should we now start scaling back up
2683 else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2685 cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2686 cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2689 // Get the new hieght and width
2690 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2691 Scale2Ratio(cm->vert_scale, &vr, &vs);
2692 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2693 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2695 // If the image size has changed we need to reallocate the buffers
2696 // and resample the source image
2697 if ((cm->Width != new_width) || (cm->Height != new_height))
2699 cm->Width = new_width;
2700 cm->Height = new_height;
2701 vp8_alloc_compressor_data(cpi);
2702 scale_and_extend_source(cpi->un_scaled_source, cpi);
2708 // return of 0 means drop frame
2709 static int pick_frame_size(VP8_COMP *cpi)
2711 VP8_COMMON *cm = &cpi->common;
2713 // First Frame is a special case
2714 if (cm->current_video_frame == 0)
2716 #if !(CONFIG_REALTIME_ONLY)
2719 vp8_calc_auto_iframe_target_size(cpi);
2721 // 1 Pass there is no information on which to base size so use bandwidth per second * fixed fraction
2724 cpi->this_frame_target = cpi->oxcf.target_bandwidth / 2;
2726 // in error resilient mode the first frame is bigger since it likely contains
2727 // all the static background
2728 if (cpi->oxcf.error_resilient_mode == 1 || (cpi->compressor_speed == 2))
2730 cpi->this_frame_target *= 3; // 5;
2733 // Key frame from VFW/auto-keyframe/first frame
2734 cm->frame_type = KEY_FRAME;
2737 // Special case for forced key frames
2738 // The frame sizing here is still far from ideal for 2 pass.
2739 else if (cm->frame_flags & FRAMEFLAGS_KEY)
2741 cm->frame_type = KEY_FRAME;
2742 resize_key_frame(cpi);
2743 vp8_calc_iframe_target_size(cpi);
2745 else if (cm->frame_type == KEY_FRAME)
2747 vp8_calc_auto_iframe_target_size(cpi);
2751 // INTER frame: compute target frame size
2752 cm->frame_type = INTER_FRAME;
2753 vp8_calc_pframe_target_size(cpi);
2755 // Check if we're dropping the frame:
2756 if (cpi->drop_frame)
2758 cpi->drop_frame = FALSE;
2767 static void set_quantizer(VP8_COMP *cpi, int Q)
2769 VP8_COMMON *cm = &cpi->common;
2770 MACROBLOCKD *mbd = &cpi->mb.e_mbd;
2773 cm->base_qindex = Q;
2775 /* if any of the delta_q values are changing update flag has to be set */
2776 /* currently only y2dc_delta_q may change */
2778 cm->y1dc_delta_q = 0;
2779 cm->y2ac_delta_q = 0;
2780 cm->uvdc_delta_q = 0;
2781 cm->uvac_delta_q = 0;
2790 update |= cm->y2dc_delta_q != new_delta_q;
2791 cm->y2dc_delta_q = new_delta_q;
2794 // Set Segment specific quatizers
2795 mbd->segment_feature_data[MB_LVL_ALT_Q][0] = cpi->segment_feature_data[MB_LVL_ALT_Q][0];
2796 mbd->segment_feature_data[MB_LVL_ALT_Q][1] = cpi->segment_feature_data[MB_LVL_ALT_Q][1];
2797 mbd->segment_feature_data[MB_LVL_ALT_Q][2] = cpi->segment_feature_data[MB_LVL_ALT_Q][2];
2798 mbd->segment_feature_data[MB_LVL_ALT_Q][3] = cpi->segment_feature_data[MB_LVL_ALT_Q][3];
2800 /* quantizer has to be reinitialized for any delta_q changes */
2802 vp8cx_init_quantizer(cpi);
2806 static void update_alt_ref_frame_and_stats(VP8_COMP *cpi)
2808 VP8_COMMON *cm = &cpi->common;
2810 // Update the golden frame buffer
2811 vp8_yv12_copy_frame_ptr(cm->frame_to_show, &cm->yv12_fb[cm->alt_fb_idx]);
2813 // Select an interval before next GF or altref
2814 if (!cpi->auto_gold)
2815 cpi->frames_till_gf_update_due = cpi->goldfreq;
2817 if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
2819 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2821 // Set the bits per frame that we should try and recover in subsequent inter frames
2822 // to account for the extra GF spend... note that his does not apply for GF updates
2823 // that occur coincident with a key frame as the extra cost of key frames is dealt
2826 cpi->gf_overspend_bits += cpi->projected_frame_size;
2827 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2830 // Update data structure that monitors level of reference to last GF
2831 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2832 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2834 // this frame refreshes means next frames don't unless specified by user
2835 cpi->common.frames_since_golden = 0;
2837 // Clear the alternate reference update pending flag.
2838 cpi->source_alt_ref_pending = FALSE;
2840 // Set the alternate refernce frame active flag
2841 cpi->source_alt_ref_active = TRUE;
2845 static void update_golden_frame_and_stats(VP8_COMP *cpi)
2847 VP8_COMMON *cm = &cpi->common;
2849 // Update the Golden frame reconstruction buffer if signalled and the GF usage counts.
2850 if (cm->refresh_golden_frame)
2852 if (cm->frame_type != KEY_FRAME)
2854 // Update the golden frame buffer
2855 vp8_yv12_copy_frame_ptr(cm->frame_to_show, &cm->yv12_fb[cm->gld_fb_idx]);
2858 // Select an interval before next GF
2859 if (!cpi->auto_gold)
2860 cpi->frames_till_gf_update_due = cpi->goldfreq;
2862 if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
2864 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2866 // Set the bits per frame that we should try and recover in subsequent inter frames
2867 // to account for the extra GF spend... note that his does not apply for GF updates
2868 // that occur coincident with a key frame as the extra cost of key frames is dealt
2870 if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
2872 // Calcluate GF bits to be recovered
2873 // Projected size - av frame bits available for inter frames for clip as a whole
2874 cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
2877 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2881 // Update data structure that monitors level of reference to last GF
2882 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2883 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2885 // this frame refreshes means next frames don't unless specified by user
2886 cm->refresh_golden_frame = 0;
2887 cpi->common.frames_since_golden = 0;
2889 //if ( cm->frame_type == KEY_FRAME )
2891 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2892 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2893 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2894 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2898 // // Carry a potrtion of count over to begining of next gf sequence
2899 // cpi->recent_ref_frame_usage[INTRA_FRAME] >>= 5;
2900 // cpi->recent_ref_frame_usage[LAST_FRAME] >>= 5;
2901 // cpi->recent_ref_frame_usage[GOLDEN_FRAME] >>= 5;
2902 // cpi->recent_ref_frame_usage[ALTREF_FRAME] >>= 5;
2905 // ******** Fixed Q test code only ************
2906 // If we are going to use the ALT reference for the next group of frames set a flag to say so.
2907 if (cpi->oxcf.fixed_q >= 0 &&
2908 cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
2910 cpi->source_alt_ref_pending = TRUE;
2911 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2914 if (!cpi->source_alt_ref_pending)
2915 cpi->source_alt_ref_active = FALSE;
2917 // Decrement count down till next gf
2918 if (cpi->frames_till_gf_update_due > 0)
2919 cpi->frames_till_gf_update_due--;
2922 else if (!cpi->common.refresh_alt_ref_frame)
2924 // Decrement count down till next gf
2925 if (cpi->frames_till_gf_update_due > 0)
2926 cpi->frames_till_gf_update_due--;
2928 if (cpi->common.frames_till_alt_ref_frame)
2929 cpi->common.frames_till_alt_ref_frame --;
2931 cpi->common.frames_since_golden ++;
2933 if (cpi->common.frames_since_golden > 1)
2935 cpi->recent_ref_frame_usage[INTRA_FRAME] += cpi->count_mb_ref_frame_usage[INTRA_FRAME];
2936 cpi->recent_ref_frame_usage[LAST_FRAME] += cpi->count_mb_ref_frame_usage[LAST_FRAME];
2937 cpi->recent_ref_frame_usage[GOLDEN_FRAME] += cpi->count_mb_ref_frame_usage[GOLDEN_FRAME];
2938 cpi->recent_ref_frame_usage[ALTREF_FRAME] += cpi->count_mb_ref_frame_usage[ALTREF_FRAME];
2943 // This function updates the reference frame probability estimates that
2944 // will be used during mode selection
2945 static void update_rd_ref_frame_probs(VP8_COMP *cpi)
2947 VP8_COMMON *cm = &cpi->common;
2950 const int *const rfct = cpi->recent_ref_frame_usage;
2951 const int rf_intra = rfct[INTRA_FRAME];
2952 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2954 if (cm->frame_type == KEY_FRAME)
2956 cpi->prob_intra_coded = 255;
2957 cpi->prob_last_coded = 128;
2958 cpi->prob_gf_coded = 128;
2960 else if (!(rf_intra + rf_inter))
2962 // This is a trap in case this function is called with cpi->recent_ref_frame_usage[] blank.
2963 cpi->prob_intra_coded = 63;
2964 cpi->prob_last_coded = 128;
2965 cpi->prob_gf_coded = 128;
2969 cpi->prob_intra_coded = (rf_intra * 255) / (rf_intra + rf_inter);
2971 if (cpi->prob_intra_coded < 1)
2972 cpi->prob_intra_coded = 1;
2974 if ((cm->frames_since_golden > 0) || cpi->source_alt_ref_active)
2976 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
2978 if (cpi->prob_last_coded < 1)
2979 cpi->prob_last_coded = 1;
2981 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
2982 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
2984 if (cpi->prob_gf_coded < 1)
2985 cpi->prob_gf_coded = 1;
2990 const int *const rfct = cpi->count_mb_ref_frame_usage;
2991 const int rf_intra = rfct[INTRA_FRAME];
2992 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2994 if (cm->frame_type == KEY_FRAME)
2996 cpi->prob_intra_coded = 255;
2997 cpi->prob_last_coded = 128;
2998 cpi->prob_gf_coded = 128;
3000 else if (!(rf_intra + rf_inter))
3002 // This is a trap in case this function is called with cpi->recent_ref_frame_usage[] blank.
3003 cpi->prob_intra_coded = 63;
3004 cpi->prob_last_coded = 128;
3005 cpi->prob_gf_coded = 128;
3009 cpi->prob_intra_coded = (rf_intra * 255) / (rf_intra + rf_inter);
3011 if (cpi->prob_intra_coded < 1)
3012 cpi->prob_intra_coded = 1;
3014 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
3016 if (cpi->prob_last_coded < 1)
3017 cpi->prob_last_coded = 1;
3019 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
3020 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
3022 if (cpi->prob_gf_coded < 1)
3023 cpi->prob_gf_coded = 1;
3026 // update reference frame costs since we can do better than what we got last frame.
3028 if (cpi->common.refresh_alt_ref_frame)
3030 cpi->prob_intra_coded += 40;
3031 cpi->prob_last_coded = 200;
3032 cpi->prob_gf_coded = 1;
3034 else if (cpi->common.frames_since_golden == 0)
3036 cpi->prob_last_coded = 214;
3037 cpi->prob_gf_coded = 1;
3039 else if (cpi->common.frames_since_golden == 1)
3041 cpi->prob_last_coded = 192;
3042 cpi->prob_gf_coded = 220;
3044 else if (cpi->source_alt_ref_active)
3046 //int dist = cpi->common.frames_till_alt_ref_frame + cpi->common.frames_since_golden;
3047 cpi->prob_gf_coded -= 20;
3049 if (cpi->prob_gf_coded < 10)
3050 cpi->prob_gf_coded = 10;
3057 // 1 = key, 0 = inter
3058 static int decide_key_frame(VP8_COMP *cpi)
3060 VP8_COMMON *cm = &cpi->common;
3062 int code_key_frame = FALSE;
3066 if (cpi->Speed > 11)
3069 // Clear down mmx registers
3070 vp8_clear_system_state(); //__asm emms;
3072 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
3074 double change = 1.0 * abs((int)(cpi->intra_error - cpi->last_intra_error)) / (1 + cpi->last_intra_error);
3075 double change2 = 1.0 * abs((int)(cpi->prediction_error - cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
3076 double minerror = cm->MBs * 256;
3080 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
3081 && cpi->prediction_error > minerror
3082 && (change > .25 || change2 > .25))
3084 FILE *f = fopen("intra_inter.stt", "a");
3086 if (cpi->prediction_error <= 0)
3087 cpi->prediction_error = 1;
3089 fprintf(f, "%d %d %d %d %14.4f\n",
3090 cm->current_video_frame,
3091 (int) cpi->prediction_error,
3092 (int) cpi->intra_error,
3093 (int)((10 * cpi->intra_error) / cpi->prediction_error),
3101 cpi->last_intra_error = cpi->intra_error;
3102 cpi->last_prediction_error = cpi->prediction_error;
3104 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
3105 && cpi->prediction_error > minerror
3106 && (change > .25 || change2 > .25))
3108 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
3116 // If the following are true we might as well code a key frame
3117 if (((cpi->this_frame_percent_intra == 100) &&
3118 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
3119 ((cpi->this_frame_percent_intra > 95) &&
3120 (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
3122 code_key_frame = TRUE;
3124 // in addition if the following are true and this is not a golden frame then code a key frame
3125 // Note that on golden frames there often seems to be a pop in intra useage anyway hence this
3126 // restriction is designed to prevent spurious key frames. The Intra pop needs to be investigated.
3127 else if (((cpi->this_frame_percent_intra > 60) &&
3128 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
3129 ((cpi->this_frame_percent_intra > 75) &&
3130 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
3131 ((cpi->this_frame_percent_intra > 90) &&
3132 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
3134 if (!cm->refresh_golden_frame)
3135 code_key_frame = TRUE;
3138 return code_key_frame;
3142 #if !(CONFIG_REALTIME_ONLY)
3143 static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
3148 set_quantizer(cpi, 26);
3150 scale_and_extend_source(cpi->un_scaled_source, cpi);
3151 vp8_first_pass(cpi);
3156 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
3164 sprintf(filename, "cx\\y%04d.raw", this_frame);
3165 yframe = fopen(filename, "wb");
3167 for (i = 0; i < frame->y_height; i++)
3168 fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
3171 sprintf(filename, "cx\\u%04d.raw", this_frame);
3172 yframe = fopen(filename, "wb");
3174 for (i = 0; i < frame->uv_height; i++)
3175 fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3178 sprintf(filename, "cx\\v%04d.raw", this_frame);
3179 yframe = fopen(filename, "wb");
3181 for (i = 0; i < frame->uv_height; i++)
3182 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3187 // return of 0 means drop frame
3189 // Function to test for conditions that indeicate we should loop
3190 // back and recode a frame.
3191 static BOOL recode_loop_test( VP8_COMP *cpi,
3192 int high_limit, int low_limit,
3193 int q, int maxq, int minq )
3195 BOOL force_recode = FALSE;
3196 VP8_COMMON *cm = &cpi->common;
3198 // Is frame recode allowed at all
3199 // Yes if either recode mode 1 is selected or mode two is selcted
3200 // and the frame is a key frame. golden frame or alt_ref_frame
3201 if ( (cpi->sf.recode_loop == 1) ||
3202 ( (cpi->sf.recode_loop == 2) &&
3203 ( (cm->frame_type == KEY_FRAME) ||
3204 cm->refresh_golden_frame ||
3205 cm->refresh_alt_ref_frame ) ) )
3207 // General over and under shoot tests
3208 if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
3209 ((cpi->projected_frame_size < low_limit) && (q > minq)) )
3211 force_recode = TRUE;
3213 // Special Constrained quality tests
3214 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3216 // Undershoot and below auto cq level
3217 if ( (q > cpi->cq_target_quality) &&
3218 (cpi->projected_frame_size <
3219 ((cpi->this_frame_target * 7) >> 3)))
3221 force_recode = TRUE;
3223 // Severe undershoot and between auto and user cq level
3224 else if ( (q > cpi->oxcf.cq_level) &&
3225 (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
3226 (cpi->active_best_quality > cpi->oxcf.cq_level))
3228 force_recode = TRUE;
3229 cpi->active_best_quality = cpi->oxcf.cq_level;
3234 return force_recode;
3237 void loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
3241 cm->filter_level = 0;
3245 struct vpx_usec_timer timer;
3247 vp8_clear_system_state();
3249 vpx_usec_timer_start(&timer);
3250 if (cpi->sf.auto_filter == 0)
3251 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3254 vp8cx_pick_filter_level(cpi->Source, cpi);
3256 vpx_usec_timer_mark(&timer);
3257 cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3260 #if CONFIG_MULTITHREAD
3261 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3264 if (cm->filter_level > 0)
3266 vp8cx_set_alt_lf_level(cpi, cm->filter_level);
3267 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, cm->filter_level);
3268 cm->last_filter_type = cm->filter_type;
3269 cm->last_sharpness_level = cm->sharpness_level;
3272 vp8_yv12_extend_frame_borders_ptr(cm->frame_to_show);
3275 YV12_BUFFER_CONFIG *lst_yv12 = &cm->yv12_fb[cm->lst_fb_idx];
3276 YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx];
3277 YV12_BUFFER_CONFIG *gld_yv12 = &cm->yv12_fb[cm->gld_fb_idx];
3278 YV12_BUFFER_CONFIG *alt_yv12 = &cm->yv12_fb[cm->alt_fb_idx];
3279 // At this point the new frame has been encoded.
3280 // If any buffer copy / swapping is signaled it should be done here.
3281 if (cm->frame_type == KEY_FRAME)
3283 vp8_yv12_copy_frame_ptr(cm->frame_to_show, gld_yv12);
3284 vp8_yv12_copy_frame_ptr(cm->frame_to_show, alt_yv12);
3286 else // For non key frames
3288 // Code to copy between reference buffers
3289 if (cm->copy_buffer_to_arf)
3291 if (cm->copy_buffer_to_arf == 1)
3293 if (cm->refresh_last_frame)
3294 // We copy new_frame here because last and new buffers will already have been swapped if cm->refresh_last_frame is set.
3295 vp8_yv12_copy_frame_ptr(new_yv12, alt_yv12);
3297 vp8_yv12_copy_frame_ptr(lst_yv12, alt_yv12);
3299 else if (cm->copy_buffer_to_arf == 2)
3300 vp8_yv12_copy_frame_ptr(gld_yv12, alt_yv12);
3303 if (cm->copy_buffer_to_gf)
3305 if (cm->copy_buffer_to_gf == 1)
3307 if (cm->refresh_last_frame)
3308 // We copy new_frame here because last and new buffers will already have been swapped if cm->refresh_last_frame is set.
3309 vp8_yv12_copy_frame_ptr(new_yv12, gld_yv12);
3311 vp8_yv12_copy_frame_ptr(lst_yv12, gld_yv12);
3313 else if (cm->copy_buffer_to_gf == 2)
3314 vp8_yv12_copy_frame_ptr(alt_yv12, gld_yv12);
3320 static void encode_frame_to_data_rate
3323 unsigned long *size,
3324 unsigned char *dest,
3325 unsigned int *frame_flags
3329 int frame_over_shoot_limit;
3330 int frame_under_shoot_limit;
3340 int zbin_oq_low = 0;
3343 VP8_COMMON *cm = &cpi->common;
3344 int active_worst_qchanged = FALSE;
3346 int overshoot_seen = FALSE;
3347 int undershoot_seen = FALSE;
3348 int drop_mark = cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100;
3349 int drop_mark75 = drop_mark * 2 / 3;
3350 int drop_mark50 = drop_mark / 4;
3351 int drop_mark25 = drop_mark / 8;
3354 // Clear down mmx registers to allow floating point in what follows
3355 vp8_clear_system_state();
3357 // Test code for segmentation of gf/arf (0,0)
3358 //segmentation_test_function((VP8_PTR) cpi);
3360 #if CONFIG_REALTIME_ONLY
3361 if(cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
3363 if(cpi->force_next_frame_intra)
3365 cm->frame_type = KEY_FRAME; /* delayed intra frame */
3368 cpi->force_next_frame_intra = 0;
3371 // For an alt ref frame in 2 pass we skip the call to the second pass function that sets the target bandwidth
3372 #if !(CONFIG_REALTIME_ONLY)
3376 if (cpi->common.refresh_alt_ref_frame)
3378 cpi->per_frame_bandwidth = cpi->gf_bits; // Per frame bit target for the alt ref frame
3379 cpi->target_bandwidth = cpi->gf_bits * cpi->output_frame_rate; // per second target bitrate
3384 cpi->per_frame_bandwidth = (int)(cpi->target_bandwidth / cpi->output_frame_rate);
3386 // Default turn off buffer to buffer copying
3387 cm->copy_buffer_to_gf = 0;
3388 cm->copy_buffer_to_arf = 0;
3390 // Clear zbin over-quant value and mode boost values.
3391 cpi->zbin_over_quant = 0;
3392 cpi->zbin_mode_boost = 0;
3394 // Enable or disable mode based tweaking of the zbin
3395 // For 2 Pass Only used where GF/ARF prediction quality
3396 // is above a threshold
3397 cpi->zbin_mode_boost = 0;
3398 cpi->zbin_mode_boost_enabled = TRUE;
3401 if ( cpi->gfu_boost <= 400 )
3403 cpi->zbin_mode_boost_enabled = FALSE;
3407 // Current default encoder behaviour for the altref sign bias
3408 if (cpi->source_alt_ref_active)
3409 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3411 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3413 // Check to see if a key frame is signalled
3414 // For two pass with auto key frame enabled cm->frame_type may already be set, but not for one pass.
3415 if ((cm->current_video_frame == 0) ||
3416 (cm->frame_flags & FRAMEFLAGS_KEY) ||
3417 (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
3419 // Key frame from VFW/auto-keyframe/first frame
3420 cm->frame_type = KEY_FRAME;
3423 // Set default state for segment and mode based loop filter update flags
3424 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
3425 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
3426 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
3428 // Set various flags etc to special state if it is a key frame
3429 if (cm->frame_type == KEY_FRAME)
3433 // Reset the loop filter deltas and segmentation map
3434 setup_features(cpi);
3436 // If segmentation is enabled force a map update for key frames
3437 if (cpi->mb.e_mbd.segmentation_enabled)
3439 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3440 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3443 // The alternate reference frame cannot be active for a key frame
3444 cpi->source_alt_ref_active = FALSE;
3446 // Reset the RD threshold multipliers to default of * 1 (128)
3447 for (i = 0; i < MAX_MODES; i++)
3449 cpi->rd_thresh_mult[i] = 128;
3453 // Test code for segmentation
3454 //if ( (cm->frame_type == KEY_FRAME) || ((cm->current_video_frame % 2) == 0))
3455 //if ( (cm->current_video_frame % 2) == 0 )
3456 // enable_segmentation((VP8_PTR)cpi);
3458 // disable_segmentation((VP8_PTR)cpi);
3461 // Experimental code for lagged compress and one pass
3462 // Initialise one_pass GF frames stats
3463 // Update stats used for GF selection
3464 //if ( cpi->pass == 0 )
3466 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3468 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3469 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3470 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3471 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3472 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3473 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3474 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3475 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3476 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3480 update_rd_ref_frame_probs(cpi);
3482 if (cpi->drop_frames_allowed)
3484 // The reset to decimation 0 is only done here for one pass.
3485 // Once it is set two pass leaves decimation on till the next kf.
3486 if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
3487 cpi->decimation_factor --;
3489 if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
3490 cpi->decimation_factor = 1;
3492 else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
3494 cpi->decimation_factor = 3;
3496 else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
3498 cpi->decimation_factor = 2;
3500 else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
3502 cpi->decimation_factor = 1;
3505 //vpx_log("Encoder: Decimation Factor: %d \n",cpi->decimation_factor);
3508 // The following decimates the frame rate according to a regular pattern (i.e. to 1/2 or 2/3 frame rate)
3509 // This can be used to help prevent buffer under-run in CBR mode. Alternatively it might be desirable in
3510 // some situations to drop frame rate but throw more bits at each frame.
3512 // Note that dropping a key frame can be problematic if spatial resampling is also active
3513 if (cpi->decimation_factor > 0)
3515 switch (cpi->decimation_factor)
3518 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
3521 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3524 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3528 // Note that we should not throw out a key frame (especially when spatial resampling is enabled).
3529 if ((cm->frame_type == KEY_FRAME)) // && cpi->oxcf.allow_spatial_resampling )
3531 cpi->decimation_count = cpi->decimation_factor;
3533 else if (cpi->decimation_count > 0)
3535 cpi->decimation_count --;
3536 cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3537 cm->current_video_frame++;
3538 cpi->frames_since_key++;
3544 cpi->buffer_level = cpi->bits_off_target;
3549 cpi->decimation_count = cpi->decimation_factor;
3552 // Decide how big to make the frame
3553 if (!pick_frame_size(cpi))
3555 cm->current_video_frame++;
3556 cpi->frames_since_key++;
3560 // Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
3561 // This has a knock on effect on active best quality as well.
3562 // For CBR if the buffer reaches its maximum level then we can no longer
3563 // save up bits for later frames so we might as well use them up
3564 // on the current frame.
3565 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
3566 (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
3568 int Adjustment = cpi->active_worst_quality / 4; // Max adjustment is 1/4
3573 int tmp_lvl = cpi->buffer_level;
3575 if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
3577 buff_lvl_step = (cpi->oxcf.maximum_buffer_size - cpi->oxcf.optimal_buffer_level) / Adjustment;
3581 Adjustment = (cpi->buffer_level - cpi->oxcf.optimal_buffer_level) / buff_lvl_step;
3582 cpi->active_worst_quality -= Adjustment;
3587 cpi->active_worst_quality -= Adjustment;
3592 // Set an active best quality and if necessary active worst quality
3593 // There is some odd behaviour for one pass here that needs attention.
3594 if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
3596 vp8_clear_system_state();
3598 Q = cpi->active_worst_quality;
3600 if ( cm->frame_type == KEY_FRAME )
3602 if ( cpi->pass == 2 )
3604 if (cpi->gfu_boost > 600)
3605 cpi->active_best_quality = kf_low_motion_minq[Q];
3607 cpi->active_best_quality = kf_high_motion_minq[Q];
3609 // Special case for key frames forced because we have reached
3610 // the maximum key frame interval. Here force the Q to a range
3611 // based on the ambient Q to reduce the risk of popping
3612 if ( cpi->this_key_frame_forced )
3614 if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
3615 cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
3616 else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
3617 cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3620 // One pass more conservative
3622 cpi->active_best_quality = kf_high_motion_minq[Q];
3625 else if (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame)
3627 // Use the lower of cpi->active_worst_quality and recent
3628 // average Q as basis for GF/ARF Q limit unless last frame was
3630 if ( (cpi->frames_since_key > 1) &&
3631 (cpi->avg_frame_qindex < cpi->active_worst_quality) )
3633 Q = cpi->avg_frame_qindex;
3635 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3636 (Q < cpi->oxcf.cq_level) )
3638 Q = cpi->oxcf.cq_level;
3642 if ( cpi->pass == 2 )
3644 if ( cpi->gfu_boost > 1000 )
3645 cpi->active_best_quality = gf_low_motion_minq[Q];
3646 else if ( cpi->gfu_boost < 400 )
3647 cpi->active_best_quality = gf_high_motion_minq[Q];
3649 cpi->active_best_quality = gf_mid_motion_minq[Q];
3651 // One pass more conservative
3653 cpi->active_best_quality = gf_high_motion_minq[Q];
3657 cpi->active_best_quality = inter_minq[Q];
3659 // For the constant/constrained quality mode we dont want
3660 // the quality to rise above the cq level.
3661 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3662 (cpi->active_best_quality < cpi->cq_target_quality) )
3664 // If we are strongly undershooting the target rate in the last
3665 // frames then use the user passed in cq value not the auto
3667 if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
3668 cpi->active_best_quality = cpi->oxcf.cq_level;
3670 cpi->active_best_quality = cpi->cq_target_quality;
3674 // If CBR and the buffer is as full then it is reasonable to allow
3675 // higher quality on the frames to prevent bits just going to waste.
3676 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3678 // Note that the use of >= here elliminates the risk of a devide
3679 // by 0 error in the else if clause
3680 if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
3681 cpi->active_best_quality = cpi->best_quality;
3683 else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
3685 int Fraction = ((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128) / (cpi->oxcf.maximum_buffer_size - cpi->oxcf.optimal_buffer_level);
3686 int min_qadjustment = ((cpi->active_best_quality - cpi->best_quality) * Fraction) / 128;
3688 cpi->active_best_quality -= min_qadjustment;
3692 // Make sure constrained quality mode limits are adhered to for the first
3693 // few frames of one pass encodes
3694 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3696 if ( (cm->frame_type == KEY_FRAME) ||
3697 cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
3699 cpi->active_best_quality = cpi->best_quality;
3701 else if (cpi->active_best_quality < cpi->cq_target_quality)
3703 cpi->active_best_quality = cpi->cq_target_quality;
3707 // Clip the active best and worst quality values to limits
3708 if (cpi->active_worst_quality > cpi->worst_quality)
3709 cpi->active_worst_quality = cpi->worst_quality;
3711 if (cpi->active_best_quality < cpi->best_quality)
3712 cpi->active_best_quality = cpi->best_quality;
3713 else if (cpi->active_best_quality > cpi->active_worst_quality)
3714 cpi->active_best_quality = cpi->active_worst_quality;
3716 // Determine initial Q to try
3717 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3718 last_zbin_oq = cpi->zbin_over_quant;
3720 // Set highest allowed value for Zbin over quant
3721 if (cm->frame_type == KEY_FRAME)
3722 zbin_oq_high = 0; //ZBIN_OQ_MAX/16
3723 else if (cm->refresh_alt_ref_frame || (cm->refresh_golden_frame && !cpi->source_alt_ref_active))
3726 zbin_oq_high = ZBIN_OQ_MAX;
3728 // Setup background Q adjustment for error resilliant mode
3729 if (cpi->cyclic_refresh_mode_enabled)
3730 cyclic_background_refresh(cpi, Q, 0);
3732 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3734 // Limit Q range for the adaptive loop.
3735 bottom_index = cpi->active_best_quality;
3736 top_index = cpi->active_worst_quality;
3737 q_low = cpi->active_best_quality;
3738 q_high = cpi->active_worst_quality;
3740 vp8_save_coding_context(cpi);
3745 scale_and_extend_source(cpi->un_scaled_source, cpi);
3746 #if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC
3748 if (cpi->oxcf.noise_sensitivity > 0)
3753 switch (cpi->oxcf.noise_sensitivity)
3776 if (cm->frame_type == KEY_FRAME)
3778 vp8_de_noise(cpi->Source, cpi->Source, l , 1, 0, RTCD(postproc));
3782 vp8_de_noise(cpi->Source, cpi->Source, l , 1, 0, RTCD(postproc));
3784 src = cpi->Source->y_buffer;
3786 if (cpi->Source->y_stride < 0)
3788 src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
3795 #ifdef OUTPUT_YUV_SRC
3796 vp8_write_yuv_frame(cpi->Source);
3801 vp8_clear_system_state(); //__asm emms;
3804 if(cpi->is_src_frame_alt_ref)
3808 set_quantizer(cpi, Q);
3811 // setup skip prob for costing in mode/mv decision
3812 if (cpi->common.mb_no_coeff_skip)
3814 cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
3816 if (cm->frame_type != KEY_FRAME)
3818 if (cpi->common.refresh_alt_ref_frame)
3820 if (cpi->last_skip_false_probs[2] != 0)
3821 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3824 if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
3825 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3826 else if (cpi->last_skip_false_probs[2]!=0)
3827 cpi->prob_skip_false = (cpi->last_skip_false_probs[2] + cpi->prob_skip_false ) / 2;
3830 else if (cpi->common.refresh_golden_frame)
3832 if (cpi->last_skip_false_probs[1] != 0)
3833 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3836 if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
3837 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3838 else if (cpi->last_skip_false_probs[1]!=0)
3839 cpi->prob_skip_false = (cpi->last_skip_false_probs[1] + cpi->prob_skip_false ) / 2;
3844 if (cpi->last_skip_false_probs[0] != 0)
3845 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3848 if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
3849 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3850 else if(cpi->last_skip_false_probs[0]!=0)
3851 cpi->prob_skip_false = (cpi->last_skip_false_probs[0] + cpi->prob_skip_false ) / 2;
3855 //as this is for cost estimate, let's make sure it does not go extreme eitehr way
3856 if (cpi->prob_skip_false < 5)
3857 cpi->prob_skip_false = 5;
3859 if (cpi->prob_skip_false > 250)
3860 cpi->prob_skip_false = 250;
3862 if (cpi->is_src_frame_alt_ref)
3863 cpi->prob_skip_false = 1;
3872 FILE *f = fopen("skip.stt", "a");
3873 fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
3881 if (cm->frame_type == KEY_FRAME)
3882 vp8_setup_key_frame(cpi);
3884 // transform / motion compensation build reconstruction frame
3885 vp8_encode_frame(cpi);
3887 cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
3888 cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
3890 vp8_clear_system_state(); //__asm emms;
3892 // Test to see if the stats generated for this frame indicate that we should have coded a key frame
3893 // (assuming that we didn't)!
3894 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
3897 #if CONFIG_REALTIME_ONLY
3899 /* we don't do re-encoding in realtime mode
3900 * if key frame is decided than we force it on next frame */
3901 cpi->force_next_frame_intra = decide_key_frame(cpi);
3904 if (decide_key_frame(cpi))
3906 vp8_calc_auto_iframe_target_size(cpi);
3908 // Reset all our sizing numbers and recode
3909 cm->frame_type = KEY_FRAME;
3911 // Clear the Alt reference frame active flag when we have a key frame
3912 cpi->source_alt_ref_active = FALSE;
3914 // Reset the loop filter deltas and segmentation map
3915 setup_features(cpi);
3917 // If segmentation is enabled force a map update for key frames
3918 if (cpi->mb.e_mbd.segmentation_enabled)
3920 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
3921 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
3924 vp8_restore_coding_context(cpi);
3926 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3928 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3930 // Limit Q range for the adaptive loop.
3931 bottom_index = cpi->active_best_quality;
3932 top_index = cpi->active_worst_quality;
3933 q_low = cpi->active_best_quality;
3934 q_high = cpi->active_worst_quality;
3939 resize_key_frame(cpi);
3945 vp8_clear_system_state();
3947 if (frame_over_shoot_limit == 0)
3948 frame_over_shoot_limit = 1;
3950 // Are we are overshooting and up against the limit of active max Q.
3951 if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
3952 (Q == cpi->active_worst_quality) &&
3953 (cpi->active_worst_quality < cpi->worst_quality) &&
3954 (cpi->projected_frame_size > frame_over_shoot_limit))
3956 int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;
3958 // If so is there any scope for relaxing it
3959 while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
3961 cpi->active_worst_quality++;
3962 top_index = cpi->active_worst_quality;
3963 over_size_percent = (int)(over_size_percent * 0.96); // Assume 1 qstep = about 4% on frame size.
3966 // If we have updated the active max Q do not call vp8_update_rate_correction_factors() this loop.
3967 active_worst_qchanged = TRUE;
3970 active_worst_qchanged = FALSE;
3972 #if !(CONFIG_REALTIME_ONLY)
3973 // Special case handling for forced key frames
3974 if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
3977 int kf_err = vp8_calc_ss_err(cpi->Source,
3978 &cm->yv12_fb[cm->new_fb_idx],
3979 IF_RTCD(&cpi->rtcd.variance));
3981 // The key frame is not good enough
3982 if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
3985 q_high = (Q > q_low) ? (Q - 1) : q_low;
3988 Q = (q_high + q_low) >> 1;
3990 // The key frame is much better than the previous frame
3991 else if ( kf_err < (cpi->ambient_err >> 1) )
3994 q_low = (Q < q_high) ? (Q + 1) : q_high;
3997 Q = (q_high + q_low + 1) >> 1;
4000 // Clamp Q to upper and lower limits:
4006 Loop = ((Q != last_q)) ? TRUE : FALSE;
4009 // Is the projected frame size out of range and are we allowed to attempt to recode.
4010 else if ( recode_loop_test( cpi,
4011 frame_over_shoot_limit, frame_under_shoot_limit,
4012 Q, top_index, bottom_index ) )
4017 // Frame size out of permitted range:
4018 // Update correction factor & compute new Q to try...
4020 // Frame is too large
4021 if (cpi->projected_frame_size > cpi->this_frame_target)
4023 //if ( cpi->zbin_over_quant == 0 )
4024 q_low = (Q < q_high) ? (Q + 1) : q_high; // Raise Qlow as to at least the current value
4026 if (cpi->zbin_over_quant > 0) // If we are using over quant do the same for zbin_oq_low
4027 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi->zbin_over_quant + 1) : zbin_oq_high;
4029 //if ( undershoot_seen || (Q == MAXQ) )
4030 if (undershoot_seen)
4032 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
4033 if (!active_worst_qchanged)
4034 vp8_update_rate_correction_factors(cpi, 1);
4036 Q = (q_high + q_low + 1) / 2;
4038 // Adjust cpi->zbin_over_quant (only allowed when Q is max)
4040 cpi->zbin_over_quant = 0;
4043 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi->zbin_over_quant + 1) : zbin_oq_high;
4044 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
4049 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
4050 if (!active_worst_qchanged)
4051 vp8_update_rate_correction_factors(cpi, 0);
4053 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4055 while (((Q < q_low) || (cpi->zbin_over_quant < zbin_oq_low)) && (Retries < 10))
4057 vp8_update_rate_correction_factors(cpi, 0);
4058 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4063 overshoot_seen = TRUE;
4065 // Frame is too small
4068 if (cpi->zbin_over_quant == 0)
4069 q_high = (Q > q_low) ? (Q - 1) : q_low; // Lower q_high if not using over quant
4070 else // else lower zbin_oq_high
4071 zbin_oq_high = (cpi->zbin_over_quant > zbin_oq_low) ? (cpi->zbin_over_quant - 1) : zbin_oq_low;
4075 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
4076 if (!active_worst_qchanged)
4077 vp8_update_rate_correction_factors(cpi, 1);
4079 Q = (q_high + q_low) / 2;
4081 // Adjust cpi->zbin_over_quant (only allowed when Q is max)
4083 cpi->zbin_over_quant = 0;
4085 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
4089 // Update rate_correction_factor unless cpi->active_worst_quality has changed.
4090 if (!active_worst_qchanged)
4091 vp8_update_rate_correction_factors(cpi, 0);
4093 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4095 // Special case reset for qlow for constrained quality.
4096 // This should only trigger where there is very substantial
4097 // undershoot on a frame and the auto cq level is above
4098 // the user passsed in value.
4099 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4105 while (((Q > q_high) || (cpi->zbin_over_quant > zbin_oq_high)) && (Retries < 10))
4107 vp8_update_rate_correction_factors(cpi, 0);
4108 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4113 undershoot_seen = TRUE;
4116 // Clamp Q to upper and lower limits:
4122 // Clamp cpi->zbin_over_quant
4123 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;
4125 //Loop = ((Q != last_q) || (last_zbin_oq != cpi->zbin_over_quant)) ? TRUE : FALSE;
4126 Loop = ((Q != last_q)) ? TRUE : FALSE;
4127 last_zbin_oq = cpi->zbin_over_quant;
4133 if (cpi->is_src_frame_alt_ref)
4138 vp8_restore_coding_context(cpi);
4141 cpi->tot_recode_hits++;
4145 while (Loop == TRUE);
4148 // Experimental code for lagged and one pass
4149 // Update stats used for one pass GF selection
4153 double frame_intra_error;
4154 double frame_coded_error;
4155 double frame_pcnt_inter;
4156 double frame_pcnt_motion;
4158 double frame_mvr_abs;
4160 double frame_mvc_abs;
4163 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4164 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4165 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4169 // Special case code to reduce pulsing when key frames are forced at a
4170 // fixed interval. Note the reconstruction error if it is the frame before
4171 // the force key frame
4172 if ( cpi->next_key_frame_forced && (cpi->frames_to_key == 0) )
4174 cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
4175 &cm->yv12_fb[cm->new_fb_idx],
4176 IF_RTCD(&cpi->rtcd.variance));
4179 // This frame's MVs are saved and will be used in next frame's MV prediction.
4180 // 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.
4181 if(cm->show_frame) //do not save for altref frame
4185 MODE_INFO *tmp = cm->mip; //point to beginning of allocated MODE_INFO arrays.
4187 if(cm->frame_type != KEY_FRAME)
4189 for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
4191 for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
4193 if(tmp->mbmi.ref_frame != INTRA_FRAME)
4194 cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;
4196 cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4197 cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
4204 // Update the GF useage maps.
4205 // This is done after completing the compression of a frame when all modes etc. are finalized but before loop filter
4206 // This is done after completing the compression of a frame when all modes etc. are finalized but before loop filter
4207 vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4209 if (cm->frame_type == KEY_FRAME)
4210 cm->refresh_last_frame = 1;
4214 FILE *f = fopen("gfactive.stt", "a");
4215 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);
4220 // For inter frames the current default behaviour is that when cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4221 // This is purely an encoder descision at present.
4222 if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
4223 cm->copy_buffer_to_arf = 2;
4225 cm->copy_buffer_to_arf = 0;
4227 if (cm->refresh_last_frame)
4229 vp8_swap_yv12_buffer(&cm->yv12_fb[cm->lst_fb_idx], &cm->yv12_fb[cm->new_fb_idx]);
4230 cm->frame_to_show = &cm->yv12_fb[cm->lst_fb_idx];
4233 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4236 #if CONFIG_MULTITHREAD
4237 if (cpi->b_multi_threaded)
4239 sem_post(&cpi->h_event_start_lpf); /* start loopfilter in separate thread */
4244 loopfilter_frame(cpi, cm);
4247 if (cpi->oxcf.error_resilient_mode == 1)
4249 cm->refresh_entropy_probs = 0;
4252 #if CONFIG_MULTITHREAD
4253 /* wait that filter_level is picked so that we can continue with stream packing */
4254 if (cpi->b_multi_threaded)
4255 sem_wait(&cpi->h_event_end_lpf);
4258 // build the bitstream
4259 vp8_pack_bitstream(cpi, dest, size);
4261 #if CONFIG_MULTITHREAD
4262 /* wait for loopfilter thread done */
4263 if (cpi->b_multi_threaded)
4265 sem_wait(&cpi->h_event_end_lpf);
4269 /* Move storing frame_type out of the above loop since it is also
4270 * needed in motion search besides loopfilter */
4271 cm->last_frame_type = cm->frame_type;
4273 // Update rate control heuristics
4274 cpi->total_byte_count += (*size);
4275 cpi->projected_frame_size = (*size) << 3;
4277 if (!active_worst_qchanged)
4278 vp8_update_rate_correction_factors(cpi, 2);
4280 cpi->last_q[cm->frame_type] = cm->base_qindex;
4282 if (cm->frame_type == KEY_FRAME)
4284 vp8_adjust_key_frame_context(cpi);
4287 // Keep a record of ambient average Q.
4288 if (cm->frame_type != KEY_FRAME)
4289 cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4291 // Keep a record from which we can calculate the average Q excluding GF updates and key frames
4292 if ((cm->frame_type != KEY_FRAME) && !cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)
4296 // Calculate the average Q for normal inter frames (not key or GFU
4298 if ( cpi->pass == 2 )
4300 cpi->ni_tot_qi += Q;
4301 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4305 // Damp value for first few frames
4306 if (cpi->ni_frames > 150 )
4308 cpi->ni_tot_qi += Q;
4309 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4311 // For one pass, early in the clip ... average the current frame Q
4312 // value with the worstq entered by the user as a dampening measure
4315 cpi->ni_tot_qi += Q;
4316 cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4319 // If the average Q is higher than what was used in the last frame
4320 // (after going through the recode loop to keep the frame size within range)
4321 // then use the last frame value - 1.
4322 // The -1 is designed to stop Q and hence the data rate, from progressively
4323 // falling away during difficult sections, but at the same time reduce the number of
4324 // itterations around the recode loop.
4325 if (Q > cpi->ni_av_qi)
4326 cpi->ni_av_qi = Q - 1;
4332 // If the frame was massively oversize and we are below optimal buffer level drop next frame
4333 if ((cpi->drop_frames_allowed) &&
4334 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
4335 (cpi->buffer_level < cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100) &&
4336 (cpi->projected_frame_size > (4 * cpi->this_frame_target)))
4338 cpi->drop_frame = TRUE;
4343 // Set the count for maximum consequative dropped frames based upon the ratio of
4344 // this frame size to the target average per frame bandwidth.
4345 // (cpi->av_per_frame_bandwidth > 0) is just a sanity check to prevent / 0.
4346 if (cpi->drop_frames_allowed && (cpi->av_per_frame_bandwidth > 0))
4348 cpi->max_drop_count = cpi->projected_frame_size / cpi->av_per_frame_bandwidth;
4350 if (cpi->max_drop_count > cpi->max_consec_dropped_frames)
4351 cpi->max_drop_count = cpi->max_consec_dropped_frames;
4354 // Update the buffer level variable.
4355 // Non-viewable frames are a special case and are treated as pure overhead.
4356 if ( !cm->show_frame )
4357 cpi->bits_off_target -= cpi->projected_frame_size;
4359 cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4361 // Rolling monitors of whether we are over or underspending used to help regulate min and Max Q in two pass.
4362 cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
4363 cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
4364 cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
4365 cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;
4367 // Actual bits spent
4368 cpi->total_actual_bits += cpi->projected_frame_size;
4371 cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);
4373 cpi->buffer_level = cpi->bits_off_target;
4375 // Update bits left to the kf and gf groups to account for overshoot or undershoot on these frames
4376 if (cm->frame_type == KEY_FRAME)
4378 cpi->kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4380 if (cpi->kf_group_bits < 0)
4381 cpi->kf_group_bits = 0 ;
4383 else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4385 cpi->gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4387 if (cpi->gf_group_bits < 0)
4388 cpi->gf_group_bits = 0 ;
4391 if (cm->frame_type != KEY_FRAME)
4393 if (cpi->common.refresh_alt_ref_frame)
4395 cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4396 cpi->last_skip_probs_q[2] = cm->base_qindex;
4398 else if (cpi->common.refresh_golden_frame)
4400 cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4401 cpi->last_skip_probs_q[1] = cm->base_qindex;
4405 cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4406 cpi->last_skip_probs_q[0] = cm->base_qindex;
4408 //update the baseline
4409 cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4414 #if 0 && CONFIG_PSNR
4416 FILE *f = fopen("tmp.stt", "a");
4418 vp8_clear_system_state(); //__asm emms;
4420 if (cpi->total_coded_error_left != 0.0)
4421 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %6ld %6ld"
4422 "%6ld %6ld %6ld %5ld %5ld %5ld %8ld %8.2f %10d %10.3f"
4424 cpi->common.current_video_frame, cpi->this_frame_target,
4425 cpi->projected_frame_size,
4426 (cpi->projected_frame_size - cpi->this_frame_target),
4427 (int)cpi->total_target_vs_actual,
4428 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4429 (int)cpi->total_actual_bits, cm->base_qindex,
4430 cpi->active_best_quality, cpi->active_worst_quality,
4431 cpi->ni_av_qi, cpi->cq_target_quality, cpi->zbin_over_quant,
4432 //cpi->avg_frame_qindex, cpi->zbin_over_quant,
4433 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4434 cm->frame_type, cpi->gfu_boost,
4435 cpi->est_max_qcorrection_factor, (int)cpi->bits_left,
4436 cpi->total_coded_error_left,
4437 (double)cpi->bits_left / cpi->total_coded_error_left,
4438 cpi->tot_recode_hits);
4440 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %6ld %6ld"
4441 "%6ld %6ld %6ld %5ld %5ld %5ld %8ld %8.2f %10d %10.3f"
4443 cpi->common.current_video_frame,
4444 cpi->this_frame_target, cpi->projected_frame_size,
4445 (cpi->projected_frame_size - cpi->this_frame_target),
4446 (int)cpi->total_target_vs_actual,
4447 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4448 (int)cpi->total_actual_bits, cm->base_qindex,
4449 cpi->active_best_quality, cpi->active_worst_quality,
4450 cpi->ni_av_qi, cpi->cq_target_quality, cpi->zbin_over_quant,
4451 //cpi->avg_frame_qindex, cpi->zbin_over_quant,
4452 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4453 cm->frame_type, cpi->gfu_boost,
4454 cpi->est_max_qcorrection_factor, (int)cpi->bits_left,
4455 cpi->total_coded_error_left, cpi->tot_recode_hits);
4460 FILE *fmodes = fopen("Modes.stt", "a");
4463 fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4464 cpi->common.current_video_frame,
4465 cm->frame_type, cm->refresh_golden_frame,
4466 cm->refresh_alt_ref_frame);
4468 for (i = 0; i < MAX_MODES; i++)
4469 fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
4471 fprintf(fmodes, "\n");
4479 // If this was a kf or Gf note the Q
4480 if ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4481 cm->last_kf_gf_q = cm->base_qindex;
4483 if (cm->refresh_golden_frame == 1)
4484 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4486 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
4488 if (cm->refresh_alt_ref_frame == 1)
4489 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4491 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
4494 if (cm->refresh_last_frame & cm->refresh_golden_frame) // both refreshed
4495 cpi->gold_is_last = 1;
4496 else if (cm->refresh_last_frame ^ cm->refresh_golden_frame) // 1 refreshed but not the other
4497 cpi->gold_is_last = 0;
4499 if (cm->refresh_last_frame & cm->refresh_alt_ref_frame) // both refreshed
4500 cpi->alt_is_last = 1;
4501 else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame) // 1 refreshed but not the other
4502 cpi->alt_is_last = 0;
4504 if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame) // both refreshed
4505 cpi->gold_is_alt = 1;
4506 else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame) // 1 refreshed but not the other
4507 cpi->gold_is_alt = 0;
4509 cpi->ref_frame_flags = VP8_ALT_FLAG | VP8_GOLD_FLAG | VP8_LAST_FLAG;
4511 if (cpi->gold_is_last)
4512 cpi->ref_frame_flags &= ~VP8_GOLD_FLAG;
4514 if (cpi->alt_is_last)
4515 cpi->ref_frame_flags &= ~VP8_ALT_FLAG;
4517 if (cpi->gold_is_alt)
4518 cpi->ref_frame_flags &= ~VP8_ALT_FLAG;
4521 if (cpi->oxcf.error_resilient_mode)
4523 if (cm->frame_type != KEY_FRAME)
4525 // Is this an alternate reference update
4526 if (cm->refresh_alt_ref_frame)
4527 vp8_yv12_copy_frame_ptr(cm->frame_to_show, &cm->yv12_fb[cm->alt_fb_idx]);
4529 if (cm->refresh_golden_frame)
4530 vp8_yv12_copy_frame_ptr(cm->frame_to_show, &cm->yv12_fb[cm->gld_fb_idx]);
4535 if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
4536 // Update the alternate reference frame and stats as appropriate.
4537 update_alt_ref_frame_and_stats(cpi);
4539 // Update the Golden frame and golden frame and stats as appropriate.
4540 update_golden_frame_and_stats(cpi);
4543 if (cm->frame_type == KEY_FRAME)
4545 // Tell the caller that the frame was coded as a key frame
4546 *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4548 // As this frame is a key frame the next defaults to an inter frame.
4549 cm->frame_type = INTER_FRAME;
4551 cpi->last_frame_percent_intra = 100;
4555 *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
4557 cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4560 // Clear the one shot update flags for segmentation map and mode/ref loop filter deltas.
4561 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4562 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4563 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4566 // Dont increment frame counters if this was an altref buffer update not a real frame
4569 cm->current_video_frame++;
4570 cpi->frames_since_key++;
4573 // reset to normal state now that we are done.
4581 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
4582 recon_file = fopen(filename, "wb");
4583 fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4584 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4590 //vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show);
4596 static void check_gf_quality(VP8_COMP *cpi)
4598 VP8_COMMON *cm = &cpi->common;
4599 int gf_active_pct = (100 * cpi->gf_active_count) / (cm->mb_rows * cm->mb_cols);
4600 int gf_ref_usage_pct = (cpi->count_mb_ref_frame_usage[GOLDEN_FRAME] * 100) / (cm->mb_rows * cm->mb_cols);
4601 int last_ref_zz_useage = (cpi->inter_zz_count * 100) / (cm->mb_rows * cm->mb_cols);
4603 // Gf refresh is not currently being signalled
4604 if (cpi->gf_update_recommended == 0)
4606 if (cpi->common.frames_since_golden > 7)
4609 if ((gf_active_pct < 10) || ((gf_active_pct + gf_ref_usage_pct) < 15))
4611 // ...but last frame zero zero usage is reasonbable so a new gf might be appropriate
4612 if (last_ref_zz_useage >= 25)
4614 cpi->gf_bad_count ++;
4616 if (cpi->gf_bad_count >= 8) // Check that the condition is stable
4618 cpi->gf_update_recommended = 1;
4619 cpi->gf_bad_count = 0;
4623 cpi->gf_bad_count = 0; // Restart count as the background is not stable enough
4626 cpi->gf_bad_count = 0; // Gf useage has picked up so reset count
4629 // If the signal is set but has not been read should we cancel it.
4630 else if (last_ref_zz_useage < 15)
4632 cpi->gf_update_recommended = 0;
4633 cpi->gf_bad_count = 0;
4638 FILE *f = fopen("gfneeded.stt", "a");
4639 fprintf(f, "%10d %10d %10d %10d %10ld \n",
4640 cm->current_video_frame,
4641 cpi->common.frames_since_golden,
4642 gf_active_pct, gf_ref_usage_pct,
4643 cpi->gf_update_recommended);
4650 #if !(CONFIG_REALTIME_ONLY)
4651 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
4654 if (!cpi->common.refresh_alt_ref_frame)
4655 vp8_second_pass(cpi);
4657 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
4658 cpi->bits_left -= 8 * *size;
4660 if (!cpi->common.refresh_alt_ref_frame)
4662 double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
4663 *cpi->oxcf.two_pass_vbrmin_section / 100);
4664 cpi->bits_left += (long long)(two_pass_min_rate / cpi->oxcf.frame_rate);
4669 //For ARM NEON, d8-d15 are callee-saved registers, and need to be saved by us.
4671 extern void vp8_push_neon(INT64 *store);
4672 extern void vp8_pop_neon(INT64 *store);
4674 int vp8_receive_raw_frame(VP8_PTR ptr, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, INT64 time_stamp, INT64 end_time)
4679 VP8_COMP *cpi = (VP8_COMP *) ptr;
4680 VP8_COMMON *cm = &cpi->common;
4681 struct vpx_usec_timer timer;
4687 #if CONFIG_RUNTIME_CPU_DETECT
4688 if (cm->rtcd.flags & HAS_NEON)
4691 vp8_push_neon(store_reg);
4695 vpx_usec_timer_start(&timer);
4697 // no more room for frames;
4698 if (cpi->source_buffer_count != 0 && cpi->source_buffer_count >= cpi->oxcf.lag_in_frames)
4701 #if CONFIG_RUNTIME_CPU_DETECT
4702 if (cm->rtcd.flags & HAS_NEON)
4705 vp8_pop_neon(store_reg);
4711 //printf("in-cpi->source_buffer_count: %d\n", cpi->source_buffer_count);
4713 cm->clr_type = sd->clrtype;
4715 // make a copy of the frame for use later...
4716 #if !(CONFIG_REALTIME_ONLY)
4718 if (cpi->oxcf.allow_lag)
4720 int which_buffer = cpi->source_encode_index - 1;
4723 if (which_buffer == -1)
4724 which_buffer = cpi->oxcf.lag_in_frames - 1;
4726 if (cpi->source_buffer_count < cpi->oxcf.lag_in_frames - 1)
4727 which_buffer = cpi->source_buffer_count;
4729 s = &cpi->src_buffer[which_buffer];
4731 s->source_time_stamp = time_stamp;
4732 s->source_end_time_stamp = end_time;
4733 s->source_frame_flags = frame_flags;
4734 vp8_yv12_copy_frame_ptr(sd, &s->source_buffer);
4736 cpi->source_buffer_count ++;
4742 s = &cpi->src_buffer[0];
4743 s->source_end_time_stamp = end_time;
4744 s->source_time_stamp = time_stamp;
4745 s->source_frame_flags = frame_flags;
4747 #if CONFIG_RUNTIME_CPU_DETECT
4748 if (cm->rtcd.flags & HAS_NEON)
4751 vp8_yv12_copy_src_frame_func_neon(sd, &s->source_buffer);
4753 #if CONFIG_RUNTIME_CPU_DETECT
4757 #if !HAVE_ARMV7 || CONFIG_RUNTIME_CPU_DETECT
4759 vp8_yv12_copy_frame_ptr(sd, &s->source_buffer);
4762 cpi->source_buffer_count = 1;
4765 vpx_usec_timer_mark(&timer);
4766 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
4769 #if CONFIG_RUNTIME_CPU_DETECT
4770 if (cm->rtcd.flags & HAS_NEON)
4773 vp8_pop_neon(store_reg);
4779 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)
4784 VP8_COMP *cpi = (VP8_COMP *) ptr;
4785 VP8_COMMON *cm = &cpi->common;
4786 struct vpx_usec_timer tsctimer;
4787 struct vpx_usec_timer ticktimer;
4788 struct vpx_usec_timer cmptimer;
4794 #if CONFIG_RUNTIME_CPU_DETECT
4795 if (cm->rtcd.flags & HAS_NEON)
4798 vp8_push_neon(store_reg);
4802 vpx_usec_timer_start(&cmptimer);
4805 // flush variable tells us that even though we have less than 10 frames
4806 // in our buffer we need to start producing compressed frames.
4807 // Probably because we are at the end of a file....
4808 if ((cpi->source_buffer_count == cpi->oxcf.lag_in_frames && cpi->oxcf.lag_in_frames > 0)
4809 || (!cpi->oxcf.allow_lag && cpi->source_buffer_count > 0)
4810 || (flush && cpi->source_buffer_count > 0))
4815 s = &cpi->src_buffer[cpi->source_encode_index];
4816 cpi->source_time_stamp = s->source_time_stamp;
4817 cpi->source_end_time_stamp = s->source_end_time_stamp;
4819 #if !(CONFIG_REALTIME_ONLY)
4821 // Should we code an alternate reference frame
4822 if (cpi->oxcf.error_resilient_mode == 0 &&
4823 cpi->oxcf.play_alternate &&
4824 cpi->source_alt_ref_pending &&
4825 (cpi->frames_till_gf_update_due < cpi->source_buffer_count) &&
4826 cpi->oxcf.lag_in_frames != 0)
4828 cpi->last_alt_ref_sei = (cpi->source_encode_index + cpi->frames_till_gf_update_due) % cpi->oxcf.lag_in_frames;
4830 #if VP8_TEMPORAL_ALT_REF
4832 if (cpi->oxcf.arnr_max_frames > 0)
4835 // my attempt at a loop that tests the results of strength filter.
4836 int start_frame = cpi->last_alt_ref_sei - 3;
4838 int i, besti = -1, pastin = cpi->oxcf.arnr_strength;
4842 if (start_frame < 0)
4843 start_frame += cpi->oxcf.lag_in_frames;
4845 besterr = calc_low_ss_err(&cpi->src_buffer[cpi->last_alt_ref_sei].source_buffer,
4846 &cpi->src_buffer[start_frame].source_buffer, IF_RTCD(&cpi->rtcd.variance));
4848 for (i = 0; i < 7; i++)
4851 cpi->oxcf.arnr_strength = i;
4852 vp8_temporal_filter_prepare_c(cpi);
4854 thiserr = calc_low_ss_err(&cpi->alt_ref_buffer.source_buffer,
4855 &cpi->src_buffer[start_frame].source_buffer, IF_RTCD(&cpi->rtcd.variance));
4857 if (10 * thiserr < besterr * 8)
4866 cpi->oxcf.arnr_strength = besti;
4867 vp8_temporal_filter_prepare_c(cpi);
4868 s = &cpi->alt_ref_buffer;
4870 // FWG not sure if I need to copy this data for the Alt Ref frame
4871 s->source_time_stamp = cpi->src_buffer[cpi->last_alt_ref_sei].source_time_stamp;
4872 s->source_end_time_stamp = cpi->src_buffer[cpi->last_alt_ref_sei].source_end_time_stamp;
4873 s->source_frame_flags = cpi->src_buffer[cpi->last_alt_ref_sei].source_frame_flags;
4876 s = &cpi->src_buffer[cpi->last_alt_ref_sei];
4879 vp8_temporal_filter_prepare_c(cpi);
4880 s = &cpi->alt_ref_buffer;
4882 // FWG not sure if I need to copy this data for the Alt Ref frame
4883 s->source_time_stamp = cpi->src_buffer[cpi->last_alt_ref_sei].source_time_stamp;
4884 s->source_end_time_stamp = cpi->src_buffer[cpi->last_alt_ref_sei].source_end_time_stamp;
4885 s->source_frame_flags = cpi->src_buffer[cpi->last_alt_ref_sei].source_frame_flags;
4891 s = &cpi->src_buffer[cpi->last_alt_ref_sei];
4893 cm->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
4894 cm->refresh_alt_ref_frame = 1;
4895 cm->refresh_golden_frame = 0;
4896 cm->refresh_last_frame = 0;
4898 cpi->source_alt_ref_pending = FALSE; // Clear Pending altf Ref flag.
4899 cpi->is_src_frame_alt_ref = 0;
4900 cpi->is_next_src_alt_ref = 0;
4906 #if !(CONFIG_REALTIME_ONLY)
4908 if (cpi->oxcf.allow_lag)
4910 if (cpi->source_encode_index == cpi->last_alt_ref_sei)
4912 cpi->is_src_frame_alt_ref = 1;
4913 cpi->last_alt_ref_sei = -1;
4916 cpi->is_src_frame_alt_ref = 0;
4918 cpi->source_encode_index = (cpi->source_encode_index + 1) % cpi->oxcf.lag_in_frames;
4920 if(cpi->source_encode_index == cpi->last_alt_ref_sei)
4921 cpi->is_next_src_alt_ref = 1;
4923 cpi->is_next_src_alt_ref = 0;
4927 cpi->source_buffer_count--;
4930 cpi->un_scaled_source = &s->source_buffer;
4931 cpi->Source = &s->source_buffer;
4932 cpi->source_frame_flags = s->source_frame_flags;
4934 *time_stamp = cpi->source_time_stamp;
4935 *time_end = cpi->source_end_time_stamp;
4940 #if !(CONFIG_REALTIME_ONLY)
4942 if (flush && cpi->pass == 1 && !cpi->first_pass_done)
4944 vp8_end_first_pass(cpi); /* get last stats packet */
4945 cpi->first_pass_done = 1;
4951 #if CONFIG_RUNTIME_CPU_DETECT
4952 if (cm->rtcd.flags & HAS_NEON)
4955 vp8_pop_neon(store_reg);
4961 *frame_flags = cpi->source_frame_flags;
4963 if (cpi->source_time_stamp < cpi->first_time_stamp_ever)
4965 cpi->first_time_stamp_ever = cpi->source_time_stamp;
4966 cpi->last_end_time_stamp_seen = cpi->source_time_stamp;
4969 // adjust frame rates based on timestamps given
4970 if (!cm->refresh_alt_ref_frame)
4972 if (cpi->source_time_stamp == cpi->first_time_stamp_ever)
4974 double this_fps = 10000000.000 / (cpi->source_end_time_stamp - cpi->source_time_stamp);
4976 vp8_new_frame_rate(cpi, this_fps);
4980 long long nanosecs = cpi->source_end_time_stamp
4981 - cpi->last_end_time_stamp_seen;
4985 double this_fps = 10000000.000 / nanosecs;
4986 vp8_new_frame_rate(cpi, (7 * cpi->oxcf.frame_rate + this_fps) / 8);
4991 cpi->last_time_stamp_seen = cpi->source_time_stamp;
4992 cpi->last_end_time_stamp_seen = cpi->source_end_time_stamp;
4995 if (cpi->compressor_speed == 2)
4997 check_gf_quality(cpi);
4998 vpx_usec_timer_start(&tsctimer);
4999 vpx_usec_timer_start(&ticktimer);
5002 // start with a 0 size frame
5005 // Clear down mmx registers
5006 vp8_clear_system_state(); //__asm emms;
5008 cm->frame_type = INTER_FRAME;
5009 cm->frame_flags = *frame_flags;
5013 if (cm->refresh_alt_ref_frame)
5015 //cm->refresh_golden_frame = 1;
5016 cm->refresh_golden_frame = 0;
5017 cm->refresh_last_frame = 0;
5021 cm->refresh_golden_frame = 0;
5022 cm->refresh_last_frame = 1;
5027 #if !(CONFIG_REALTIME_ONLY)
5031 Pass1Encode(cpi, size, dest, frame_flags);
5033 else if (cpi->pass == 2)
5035 Pass2Encode(cpi, size, dest, frame_flags);
5039 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
5041 if (cpi->compressor_speed == 2)
5043 unsigned int duration, duration2;
5044 vpx_usec_timer_mark(&tsctimer);
5045 vpx_usec_timer_mark(&ticktimer);
5047 duration = vpx_usec_timer_elapsed(&ticktimer);
5048 duration2 = (unsigned int)((double)duration / 2);
5050 if (cm->frame_type != KEY_FRAME)
5052 if (cpi->avg_encode_time == 0)
5053 cpi->avg_encode_time = duration;
5055 cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
5060 //if(*frame_flags!=1)
5063 if (cpi->avg_pick_mode_time == 0)
5064 cpi->avg_pick_mode_time = duration2;
5066 cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
5072 if (cm->refresh_entropy_probs == 0)
5074 vpx_memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
5077 // if its a dropped frame honor the requests on subsequent frames
5081 // return to normal state
5082 cm->refresh_entropy_probs = 1;
5083 cm->refresh_alt_ref_frame = 0;
5084 cm->refresh_golden_frame = 0;
5085 cm->refresh_last_frame = 1;
5086 cm->frame_type = INTER_FRAME;
5090 cpi->ready_for_new_frame = 1;
5092 vpx_usec_timer_mark(&cmptimer);
5093 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
5095 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
5097 generate_psnr_packet(cpi);
5104 cpi->bytes += *size;
5111 if (cpi->b_calculate_psnr)
5116 YV12_BUFFER_CONFIG *orig = cpi->Source;
5117 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
5118 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
5119 int y_samples = orig->y_height * orig->y_width ;
5120 int uv_samples = orig->uv_height * orig->uv_width ;
5121 int t_samples = y_samples + 2 * uv_samples;
5124 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
5125 recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height,
5126 IF_RTCD(&cpi->rtcd.variance));
5128 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
5129 recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height,
5130 IF_RTCD(&cpi->rtcd.variance));
5132 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
5133 recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height,
5134 IF_RTCD(&cpi->rtcd.variance));
5136 sq_error = ye + ue + ve;
5138 frame_psnr = vp8_mse2psnr(t_samples, 255.0, sq_error);
5140 cpi->total_y += vp8_mse2psnr(y_samples, 255.0, ye);
5141 cpi->total_u += vp8_mse2psnr(uv_samples, 255.0, ue);
5142 cpi->total_v += vp8_mse2psnr(uv_samples, 255.0, ve);
5143 cpi->total_sq_error += sq_error;
5144 cpi->total += frame_psnr;
5146 double y2, u2, v2, frame_psnr2, frame_ssim2 = 0;
5149 vp8_deblock(cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0, IF_RTCD(&cm->rtcd.postproc));
5150 vp8_clear_system_state();
5152 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
5153 pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height,
5154 IF_RTCD(&cpi->rtcd.variance));
5156 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
5157 pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height,
5158 IF_RTCD(&cpi->rtcd.variance));
5160 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
5161 pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height,
5162 IF_RTCD(&cpi->rtcd.variance));
5164 sq_error = ye + ue + ve;
5166 frame_psnr2 = vp8_mse2psnr(t_samples, 255.0, sq_error);
5168 cpi->totalp_y += vp8_mse2psnr(y_samples, 255.0, ye);
5169 cpi->totalp_u += vp8_mse2psnr(uv_samples, 255.0, ue);
5170 cpi->totalp_v += vp8_mse2psnr(uv_samples, 255.0, ve);
5171 cpi->total_sq_error2 += sq_error;
5172 cpi->totalp += frame_psnr2;
5174 frame_ssim2 = vp8_calc_ssim(cpi->Source,
5175 &cm->post_proc_buffer, 1, &weight,
5176 IF_RTCD(&cpi->rtcd.variance));
5178 cpi->summed_quality += frame_ssim2 * weight;
5179 cpi->summed_weights += weight;
5184 if (cpi->b_calculate_ssimg)
5186 double y, u, v, frame_all;
5187 frame_all = vp8_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, &v);
5188 cpi->total_ssimg_y += y;
5189 cpi->total_ssimg_u += u;
5190 cpi->total_ssimg_v += v;
5191 cpi->total_ssimg_all += frame_all;
5199 if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
5201 skiptruecount += cpi->skip_true_count;
5202 skipfalsecount += cpi->skip_false_count;
5210 FILE *f = fopen("skip.stt", "a");
5211 fprintf(f, "frame:%4d flags:%4x Q:%4d P:%4d Size:%5d\n", cpi->common.current_video_frame, *frame_flags, cpi->common.base_qindex, cpi->prob_skip_false, *size);
5213 if (cpi->is_src_frame_alt_ref == 1)
5214 fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
5223 #if CONFIG_RUNTIME_CPU_DETECT
5224 if (cm->rtcd.flags & HAS_NEON)
5227 vp8_pop_neon(store_reg);
5234 int vp8_get_preview_raw_frame(VP8_PTR comp, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
5236 VP8_COMP *cpi = (VP8_COMP *) comp;
5238 if (cpi->common.refresh_alt_ref_frame)
5244 ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5247 if (cpi->common.frame_to_show)
5249 *dest = *cpi->common.frame_to_show;
5250 dest->y_width = cpi->common.Width;
5251 dest->y_height = cpi->common.Height;
5252 dest->uv_height = cpi->common.Height / 2;
5260 #endif //!CONFIG_POSTPROC
5261 vp8_clear_system_state();
5266 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])
5268 VP8_COMP *cpi = (VP8_COMP *) comp;
5269 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5271 if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
5276 disable_segmentation((VP8_PTR)cpi);
5280 // Set the segmentation Map
5281 set_segmentation_map((VP8_PTR)cpi, map);
5283 // Activate segmentation.
5284 enable_segmentation((VP8_PTR)cpi);
5286 // Set up the quant segment data
5287 feature_data[MB_LVL_ALT_Q][0] = delta_q[0];
5288 feature_data[MB_LVL_ALT_Q][1] = delta_q[1];
5289 feature_data[MB_LVL_ALT_Q][2] = delta_q[2];
5290 feature_data[MB_LVL_ALT_Q][3] = delta_q[3];
5292 // Set up the loop segment data s
5293 feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5294 feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5295 feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5296 feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5298 cpi->segment_encode_breakout[0] = threshold[0];
5299 cpi->segment_encode_breakout[1] = threshold[1];
5300 cpi->segment_encode_breakout[2] = threshold[2];
5301 cpi->segment_encode_breakout[3] = threshold[3];
5303 // Initialise the feature data structure
5304 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
5305 set_segment_data((VP8_PTR)cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5310 int vp8_set_active_map(VP8_PTR comp, unsigned char *map, unsigned int rows, unsigned int cols)
5312 VP8_COMP *cpi = (VP8_COMP *) comp;
5314 if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols)
5318 vpx_memcpy(cpi->active_map, map, rows * cols);
5319 cpi->active_map_enabled = 1;
5322 cpi->active_map_enabled = 0;
5328 //cpi->active_map_enabled = 0;
5333 int vp8_set_internal_size(VP8_PTR comp, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
5335 VP8_COMP *cpi = (VP8_COMP *) comp;
5337 if (horiz_mode <= ONETWO)
5338 cpi->common.horiz_scale = horiz_mode;
5342 if (vert_mode <= ONETWO)
5343 cpi->common.vert_scale = vert_mode;
5352 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd)
5357 unsigned char *src = source->y_buffer;
5358 unsigned char *dst = dest->y_buffer;
5361 // Loop through the Y plane raw and reconstruction data summing (square differences)
5362 for (i = 0; i < source->y_height; i += 16)
5364 for (j = 0; j < source->y_width; j += 16)
5367 Total += VARIANCE_INVOKE(rtcd, mse16x16)(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
5370 src += 16 * source->y_stride;
5371 dst += 16 * dest->y_stride;
5378 static int calc_low_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd)
5383 unsigned char *src = source->y_buffer;
5384 unsigned char *dst = dest->y_buffer;
5387 // Loop through the Y plane raw and reconstruction data summing (square differences)
5388 for (i = 0; i < source->y_height; i += 16)
5390 for (j = 0; j < source->y_width; j += 16)
5393 VARIANCE_INVOKE(rtcd, mse16x16)(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
5399 src += 16 * source->y_stride;
5400 dst += 16 * dest->y_stride;
5407 int vp8_get_quantizer(VP8_PTR c)
5409 VP8_COMP *cpi = (VP8_COMP *) c;
5410 return cpi->common.base_qindex;