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.
11 #include "vpx_config.h"
12 #include "./vpx_scale_rtcd.h"
13 #include "./vpx_dsp_rtcd.h"
14 #include "./vp8_rtcd.h"
15 #include "vp8/common/onyxc_int.h"
16 #include "vp8/common/blockd.h"
18 #include "vp8/common/systemdependent.h"
19 #include "vp8/encoder/quantize.h"
20 #include "vp8/common/alloccommon.h"
22 #include "firstpass.h"
23 #include "vpx_dsp/psnr.h"
24 #include "vpx_scale/vpx_scale.h"
25 #include "vp8/common/extend.h"
27 #include "vp8/common/quant_common.h"
28 #include "segmentation.h"
30 #include "vp8/common/postproc.h"
32 #include "vpx_mem/vpx_mem.h"
33 #include "vp8/common/reconintra.h"
34 #include "vp8/common/swapyv12buffer.h"
35 #include "vp8/common/threading.h"
36 #include "vpx_ports/system_state.h"
37 #include "vpx_ports/vpx_timer.h"
39 #include "vpx_ports/arm.h"
41 #if CONFIG_MULTI_RES_ENCODING
42 #include "mr_dissim.h"
44 #include "encodeframe.h"
50 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
51 extern int vp8_update_coef_context(VP8_COMP *cpi);
52 extern void vp8_update_coef_probs(VP8_COMP *cpi);
55 extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
56 extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
57 extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
59 extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source,
60 YV12_BUFFER_CONFIG *post, int filt_lvl,
61 int low_var_thresh, int flag);
62 extern void print_parms(VP8_CONFIG *ocf, char *filenam);
63 extern unsigned int vp8_get_processor_freq();
64 extern void print_tree_update_probs();
65 extern int vp8cx_create_encoder_threads(VP8_COMP *cpi);
66 extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
68 int vp8_estimate_entropy_savings(VP8_COMP *cpi);
70 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
72 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
74 static void set_default_lf_deltas(VP8_COMP *cpi);
76 extern const int vp8_gf_interval_table[101];
78 #if CONFIG_INTERNAL_STATS
80 #include "vpx_dsp/ssim.h"
86 #ifdef OUTPUT_YUV_DENOISED
87 FILE *yuv_denoised_file;
97 extern int skip_true_count;
98 extern int skip_false_count;
101 #ifdef VP8_ENTROPY_STATS
102 extern int intra_mode_stats[10][10][10];
106 unsigned int frames_at_speed[16] = { 0, 0, 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 0, 0 };
108 unsigned int tot_pm = 0;
109 unsigned int cnt_pm = 0;
110 unsigned int tot_ef = 0;
111 unsigned int cnt_ef = 0;
115 extern unsigned __int64 Sectionbits[50];
116 extern int y_modes[5];
117 extern int uv_modes[4];
118 extern int b_modes[10];
120 extern int inter_y_modes[10];
121 extern int inter_uv_modes[4];
122 extern unsigned int inter_b_modes[15];
125 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
127 extern const int qrounding_factors[129];
128 extern const int qzbin_factors[129];
129 extern void vp8cx_init_quantizer(VP8_COMP *cpi);
130 extern const int vp8cx_base_skip_false_prob[128];
132 /* Tables relating active max Q to active min Q */
133 static const unsigned char kf_low_motion_minq[QINDEX_RANGE] = {
134 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
135 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
136 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
137 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5,
138 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 10, 10, 11,
139 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
140 17, 17, 18, 18, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23
142 static const unsigned char kf_high_motion_minq[QINDEX_RANGE] = {
143 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
144 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
145 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5,
146 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10,
147 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16,
148 16, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21,
149 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30
151 static const unsigned char gf_low_motion_minq[QINDEX_RANGE] = {
152 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3,
153 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8,
154 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15,
155 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
156 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34,
157 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 44,
158 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58
160 static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] = {
161 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5,
162 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11,
163 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18,
164 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
165 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37,
166 37, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 45, 46, 47, 48, 49, 50,
167 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
169 static const unsigned char gf_high_motion_minq[QINDEX_RANGE] = {
170 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
171 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11,
172 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21,
173 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30,
174 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40,
175 40, 41, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
176 57, 58, 59, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80
178 static const unsigned char inter_minq[QINDEX_RANGE] = {
179 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11,
180 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24,
181 24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38,
182 39, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 50, 51, 52, 53,
183 54, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69,
184 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 86,
185 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100
188 #ifdef PACKET_TESTING
189 extern FILE *vpxlogc;
192 static void save_layer_context(VP8_COMP *cpi) {
193 LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
195 /* Save layer dependent coding state */
196 lc->target_bandwidth = cpi->target_bandwidth;
197 lc->starting_buffer_level = cpi->oxcf.starting_buffer_level;
198 lc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level;
199 lc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size;
200 lc->starting_buffer_level_in_ms = cpi->oxcf.starting_buffer_level_in_ms;
201 lc->optimal_buffer_level_in_ms = cpi->oxcf.optimal_buffer_level_in_ms;
202 lc->maximum_buffer_size_in_ms = cpi->oxcf.maximum_buffer_size_in_ms;
203 lc->buffer_level = cpi->buffer_level;
204 lc->bits_off_target = cpi->bits_off_target;
205 lc->total_actual_bits = cpi->total_actual_bits;
206 lc->worst_quality = cpi->worst_quality;
207 lc->active_worst_quality = cpi->active_worst_quality;
208 lc->best_quality = cpi->best_quality;
209 lc->active_best_quality = cpi->active_best_quality;
210 lc->ni_av_qi = cpi->ni_av_qi;
211 lc->ni_tot_qi = cpi->ni_tot_qi;
212 lc->ni_frames = cpi->ni_frames;
213 lc->avg_frame_qindex = cpi->avg_frame_qindex;
214 lc->rate_correction_factor = cpi->rate_correction_factor;
215 lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
216 lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor;
217 lc->zbin_over_quant = cpi->mb.zbin_over_quant;
218 lc->inter_frame_target = cpi->inter_frame_target;
219 lc->total_byte_count = cpi->total_byte_count;
220 lc->filter_level = cpi->common.filter_level;
222 lc->last_frame_percent_intra = cpi->last_frame_percent_intra;
224 memcpy(lc->count_mb_ref_frame_usage, cpi->mb.count_mb_ref_frame_usage,
225 sizeof(cpi->mb.count_mb_ref_frame_usage));
228 static void restore_layer_context(VP8_COMP *cpi, const int layer) {
229 LAYER_CONTEXT *lc = &cpi->layer_context[layer];
231 /* Restore layer dependent coding state */
232 cpi->current_layer = layer;
233 cpi->target_bandwidth = lc->target_bandwidth;
234 cpi->oxcf.target_bandwidth = lc->target_bandwidth;
235 cpi->oxcf.starting_buffer_level = lc->starting_buffer_level;
236 cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level;
237 cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size;
238 cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
239 cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms;
240 cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms;
241 cpi->buffer_level = lc->buffer_level;
242 cpi->bits_off_target = lc->bits_off_target;
243 cpi->total_actual_bits = lc->total_actual_bits;
244 cpi->active_worst_quality = lc->active_worst_quality;
245 cpi->active_best_quality = lc->active_best_quality;
246 cpi->ni_av_qi = lc->ni_av_qi;
247 cpi->ni_tot_qi = lc->ni_tot_qi;
248 cpi->ni_frames = lc->ni_frames;
249 cpi->avg_frame_qindex = lc->avg_frame_qindex;
250 cpi->rate_correction_factor = lc->rate_correction_factor;
251 cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
252 cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor;
253 cpi->mb.zbin_over_quant = lc->zbin_over_quant;
254 cpi->inter_frame_target = lc->inter_frame_target;
255 cpi->total_byte_count = lc->total_byte_count;
256 cpi->common.filter_level = lc->filter_level;
258 cpi->last_frame_percent_intra = lc->last_frame_percent_intra;
260 memcpy(cpi->mb.count_mb_ref_frame_usage, lc->count_mb_ref_frame_usage,
261 sizeof(cpi->mb.count_mb_ref_frame_usage));
264 static int rescale(int val, int num, int denom) {
266 int64_t llden = denom;
269 return (int)(llval * llnum / llden);
272 static void init_temporal_layer_context(VP8_COMP *cpi, VP8_CONFIG *oxcf,
274 double prev_layer_framerate) {
275 LAYER_CONTEXT *lc = &cpi->layer_context[layer];
277 lc->framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[layer];
278 lc->target_bandwidth = cpi->oxcf.target_bitrate[layer] * 1000;
280 lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
281 lc->optimal_buffer_level_in_ms = oxcf->optimal_buffer_level;
282 lc->maximum_buffer_size_in_ms = oxcf->maximum_buffer_size;
284 lc->starting_buffer_level =
285 rescale((int)(oxcf->starting_buffer_level), lc->target_bandwidth, 1000);
287 if (oxcf->optimal_buffer_level == 0) {
288 lc->optimal_buffer_level = lc->target_bandwidth / 8;
290 lc->optimal_buffer_level =
291 rescale((int)(oxcf->optimal_buffer_level), lc->target_bandwidth, 1000);
294 if (oxcf->maximum_buffer_size == 0) {
295 lc->maximum_buffer_size = lc->target_bandwidth / 8;
297 lc->maximum_buffer_size =
298 rescale((int)(oxcf->maximum_buffer_size), lc->target_bandwidth, 1000);
301 /* Work out the average size of a frame within this layer */
303 lc->avg_frame_size_for_layer =
304 (int)((cpi->oxcf.target_bitrate[layer] -
305 cpi->oxcf.target_bitrate[layer - 1]) *
306 1000 / (lc->framerate - prev_layer_framerate));
309 lc->active_worst_quality = cpi->oxcf.worst_allowed_q;
310 lc->active_best_quality = cpi->oxcf.best_allowed_q;
311 lc->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
313 lc->buffer_level = lc->starting_buffer_level;
314 lc->bits_off_target = lc->starting_buffer_level;
316 lc->total_actual_bits = 0;
320 lc->rate_correction_factor = 1.0;
321 lc->key_frame_rate_correction_factor = 1.0;
322 lc->gf_rate_correction_factor = 1.0;
323 lc->inter_frame_target = 0;
326 // Upon a run-time change in temporal layers, reset the layer context parameters
327 // for any "new" layers. For "existing" layers, let them inherit the parameters
328 // from the previous layer state (at the same layer #). In future we may want
329 // to better map the previous layer state(s) to the "new" ones.
330 static void reset_temporal_layer_change(VP8_COMP *cpi, VP8_CONFIG *oxcf,
331 const int prev_num_layers) {
333 double prev_layer_framerate = 0;
334 const int curr_num_layers = cpi->oxcf.number_of_layers;
335 // If the previous state was 1 layer, get current layer context from cpi.
336 // We need this to set the layer context for the new layers below.
337 if (prev_num_layers == 1) {
338 cpi->current_layer = 0;
339 save_layer_context(cpi);
341 for (i = 0; i < curr_num_layers; ++i) {
342 LAYER_CONTEXT *lc = &cpi->layer_context[i];
343 if (i >= prev_num_layers) {
344 init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
346 // The initial buffer levels are set based on their starting levels.
347 // We could set the buffer levels based on the previous state (normalized
348 // properly by the layer bandwidths) but we would need to keep track of
349 // the previous set of layer bandwidths (i.e., target_bitrate[i])
350 // before the layer change. For now, reset to the starting levels.
352 cpi->oxcf.starting_buffer_level_in_ms * cpi->oxcf.target_bitrate[i];
353 lc->bits_off_target = lc->buffer_level;
354 // TDOD(marpan): Should we set the rate_correction_factor and
355 // active_worst/best_quality to values derived from the previous layer
356 // state (to smooth-out quality dips/rate fluctuation at transition)?
358 // We need to treat the 1 layer case separately: oxcf.target_bitrate[i]
359 // is not set for 1 layer, and the restore_layer_context/save_context()
360 // are not called in the encoding loop, so we need to call it here to
361 // pass the layer context state to |cpi|.
362 if (curr_num_layers == 1) {
363 lc->target_bandwidth = cpi->oxcf.target_bandwidth;
365 cpi->oxcf.starting_buffer_level_in_ms * lc->target_bandwidth / 1000;
366 lc->bits_off_target = lc->buffer_level;
367 restore_layer_context(cpi, 0);
369 prev_layer_framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[i];
373 static void setup_features(VP8_COMP *cpi) {
374 // If segmentation enabled set the update flags
375 if (cpi->mb.e_mbd.segmentation_enabled) {
376 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
377 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
379 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
380 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
383 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
384 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
385 memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
386 memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
387 memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0,
388 sizeof(cpi->mb.e_mbd.ref_lf_deltas));
389 memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0,
390 sizeof(cpi->mb.e_mbd.mode_lf_deltas));
392 set_default_lf_deltas(cpi);
395 static void dealloc_raw_frame_buffers(VP8_COMP *cpi);
397 void vp8_initialize_enc(void) {
398 static volatile int init_done = 0;
402 vp8_init_intra_predictors();
407 static void dealloc_compressor_data(VP8_COMP *cpi) {
408 vpx_free(cpi->tplist);
411 /* Delete last frame MV storage buffers */
415 vpx_free(cpi->lf_ref_frame_sign_bias);
416 cpi->lf_ref_frame_sign_bias = 0;
418 vpx_free(cpi->lf_ref_frame);
419 cpi->lf_ref_frame = 0;
421 /* Delete sementation map */
422 vpx_free(cpi->segmentation_map);
423 cpi->segmentation_map = 0;
425 vpx_free(cpi->active_map);
428 vp8_de_alloc_frame_buffers(&cpi->common);
430 vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
431 vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
432 dealloc_raw_frame_buffers(cpi);
437 /* Structure used to monitor GF usage */
438 vpx_free(cpi->gf_active_flags);
439 cpi->gf_active_flags = 0;
441 /* Activity mask based per mb zbin adjustments */
442 vpx_free(cpi->mb_activity_map);
443 cpi->mb_activity_map = 0;
445 vpx_free(cpi->mb.pip);
448 #if CONFIG_MULTITHREAD
449 vpx_free(cpi->mt_current_mb_col);
450 cpi->mt_current_mb_col = NULL;
454 static void enable_segmentation(VP8_COMP *cpi) {
455 /* Set the appropriate feature bit */
456 cpi->mb.e_mbd.segmentation_enabled = 1;
457 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
458 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
460 static void disable_segmentation(VP8_COMP *cpi) {
461 /* Clear the appropriate feature bit */
462 cpi->mb.e_mbd.segmentation_enabled = 0;
465 /* Valid values for a segment are 0 to 3
466 * Segmentation map is arrange as [Rows][Columns]
468 static void set_segmentation_map(VP8_COMP *cpi,
469 unsigned char *segmentation_map) {
470 /* Copy in the new segmentation map */
471 memcpy(cpi->segmentation_map, segmentation_map,
472 (cpi->common.mb_rows * cpi->common.mb_cols));
474 /* Signal that the map should be updated. */
475 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
476 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
479 /* The values given for each segment can be either deltas (from the default
480 * value chosen for the frame) or absolute values.
482 * Valid range for abs values is:
483 * (0-127 for MB_LVL_ALT_Q), (0-63 for SEGMENT_ALT_LF)
484 * Valid range for delta values are:
485 * (+/-127 for MB_LVL_ALT_Q), (+/-63 for SEGMENT_ALT_LF)
487 * abs_delta = SEGMENT_DELTADATA (deltas)
488 * abs_delta = SEGMENT_ABSDATA (use the absolute values given).
491 static void set_segment_data(VP8_COMP *cpi, signed char *feature_data,
492 unsigned char abs_delta) {
493 cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
494 memcpy(cpi->segment_feature_data, feature_data,
495 sizeof(cpi->segment_feature_data));
498 /* A simple function to cyclically refresh the background at a lower Q */
499 static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment) {
500 unsigned char *seg_map = cpi->segmentation_map;
501 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
503 int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
504 int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
506 cpi->cyclic_refresh_q = Q / 2;
508 if (cpi->oxcf.screen_content_mode) {
509 // Modify quality ramp-up based on Q. Above some Q level, increase the
510 // number of blocks to be refreshed, and reduce it below the thredhold.
511 // Turn-off under certain conditions (i.e., away from key frame, and if
512 // we are at good quality (low Q) and most of the blocks were
514 // in previous frame.
515 int qp_thresh = (cpi->oxcf.screen_content_mode == 2) ? 80 : 100;
516 if (Q >= qp_thresh) {
517 cpi->cyclic_refresh_mode_max_mbs_perframe =
518 (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
519 } else if (cpi->frames_since_key > 250 && Q < 20 &&
520 cpi->mb.skip_true_count > (int)(0.95 * mbs_in_frame)) {
521 cpi->cyclic_refresh_mode_max_mbs_perframe = 0;
523 cpi->cyclic_refresh_mode_max_mbs_perframe =
524 (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
526 block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
529 // Set every macroblock to be eligible for update.
530 // For key frame this will reset seg map to 0.
531 memset(cpi->segmentation_map, 0, mbs_in_frame);
533 if (cpi->common.frame_type != KEY_FRAME && block_count > 0) {
534 /* Cycle through the macro_block rows */
535 /* MB loop to set local segmentation map */
536 i = cpi->cyclic_refresh_mode_index;
537 assert(i < mbs_in_frame);
539 /* If the MB is as a candidate for clean up then mark it for
540 * possible boost/refresh (segment 1) The segment id may get
541 * reset to 0 later if the MB gets coded anything other than
542 * last frame 0,0 as only (last frame 0,0) MBs are eligable for
543 * refresh : that is to say Mbs likely to be background blocks.
545 if (cpi->cyclic_refresh_map[i] == 0) {
548 } else if (cpi->cyclic_refresh_map[i] < 0) {
549 cpi->cyclic_refresh_map[i]++;
553 if (i == mbs_in_frame) i = 0;
555 } while (block_count && i != cpi->cyclic_refresh_mode_index);
557 cpi->cyclic_refresh_mode_index = i;
559 #if CONFIG_TEMPORAL_DENOISING
560 if (cpi->oxcf.noise_sensitivity > 0) {
561 if (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive &&
562 Q < (int)cpi->denoiser.denoise_pars.qp_thresh &&
563 (cpi->frames_since_key >
564 2 * cpi->denoiser.denoise_pars.consec_zerolast)) {
565 // Under aggressive denoising, use segmentation to turn off loop
566 // filter below some qp thresh. The filter is reduced for all
567 // blocks that have been encoded as ZEROMV LAST x frames in a row,
568 // where x is set by cpi->denoiser.denoise_pars.consec_zerolast.
569 // This is to avoid "dot" artifacts that can occur from repeated
570 // loop filtering on noisy input source.
571 cpi->cyclic_refresh_q = Q;
572 // lf_adjustment = -MAX_LOOP_FILTER;
574 for (i = 0; i < mbs_in_frame; ++i) {
575 seg_map[i] = (cpi->consec_zero_last[i] >
576 cpi->denoiser.denoise_pars.consec_zerolast)
585 /* Activate segmentation. */
586 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
587 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
588 enable_segmentation(cpi);
590 /* Set up the quant segment data */
591 feature_data[MB_LVL_ALT_Q][0] = 0;
592 feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
593 feature_data[MB_LVL_ALT_Q][2] = 0;
594 feature_data[MB_LVL_ALT_Q][3] = 0;
596 /* Set up the loop segment data */
597 feature_data[MB_LVL_ALT_LF][0] = 0;
598 feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
599 feature_data[MB_LVL_ALT_LF][2] = 0;
600 feature_data[MB_LVL_ALT_LF][3] = 0;
602 /* Initialise the feature data structure */
603 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
606 static void set_default_lf_deltas(VP8_COMP *cpi) {
607 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
608 cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
610 memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
611 memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
613 /* Test of ref frame deltas */
614 cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
615 cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
616 cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
617 cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
619 cpi->mb.e_mbd.mode_lf_deltas[0] = 4; /* BPRED */
621 if (cpi->oxcf.Mode == MODE_REALTIME) {
622 cpi->mb.e_mbd.mode_lf_deltas[1] = -12; /* Zero */
624 cpi->mb.e_mbd.mode_lf_deltas[1] = -2; /* Zero */
627 cpi->mb.e_mbd.mode_lf_deltas[2] = 2; /* New mv */
628 cpi->mb.e_mbd.mode_lf_deltas[3] = 4; /* Split mv */
631 /* Convenience macros for mapping speed and mode into a continuous
634 #define GOOD(x) (x + 1)
635 #define RT(x) (x + 7)
637 static int speed_map(int speed, const int *map) {
642 } while (speed >= *map++);
646 static const int thresh_mult_map_znn[] = {
647 /* map common to zero, nearest, and near */
648 0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
651 static const int thresh_mult_map_vhpred[] = { 1000, GOOD(2), 1500, GOOD(3),
652 2000, RT(0), 1000, RT(1),
653 2000, RT(7), INT_MAX, INT_MAX };
655 static const int thresh_mult_map_bpred[] = { 2000, GOOD(0), 2500, GOOD(2),
656 5000, GOOD(3), 7500, RT(0),
657 2500, RT(1), 5000, RT(6),
660 static const int thresh_mult_map_tm[] = { 1000, GOOD(2), 1500, GOOD(3),
661 2000, RT(0), 0, RT(1),
662 1000, RT(2), 2000, RT(7),
665 static const int thresh_mult_map_new1[] = { 1000, GOOD(2), 2000,
666 RT(0), 2000, INT_MAX };
668 static const int thresh_mult_map_new2[] = { 1000, GOOD(2), 2000, GOOD(3),
669 2500, GOOD(5), 4000, RT(0),
670 2000, RT(2), 2500, RT(5),
673 static const int thresh_mult_map_split1[] = {
674 2500, GOOD(0), 1700, GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
675 RT(0), 5000, RT(1), 10000, RT(2), 25000, RT(3), INT_MAX, INT_MAX
678 static const int thresh_mult_map_split2[] = {
679 5000, GOOD(0), 4500, GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
680 RT(0), 10000, RT(1), 20000, RT(2), 50000, RT(3), INT_MAX, INT_MAX
683 static const int mode_check_freq_map_zn2[] = {
684 /* {zero,nearest}{2,3} */
685 0, RT(10), 1 << 1, RT(11), 1 << 2, RT(12), 1 << 3, INT_MAX
688 static const int mode_check_freq_map_vhbpred[] = {
689 0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(5), 4, INT_MAX
692 static const int mode_check_freq_map_near2[] = {
693 0, GOOD(5), 2, RT(0), 0, RT(3), 2,
694 RT(10), 1 << 2, RT(11), 1 << 3, RT(12), 1 << 4, INT_MAX
697 static const int mode_check_freq_map_new1[] = {
698 0, RT(10), 1 << 1, RT(11), 1 << 2, RT(12), 1 << 3, INT_MAX
701 static const int mode_check_freq_map_new2[] = { 0, GOOD(5), 4, RT(0),
703 1 << 3, RT(11), 1 << 4, RT(12),
706 static const int mode_check_freq_map_split1[] = {
707 0, GOOD(2), 2, GOOD(3), 7, RT(1), 2, RT(2), 7, INT_MAX
710 static const int mode_check_freq_map_split2[] = {
711 0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
714 void vp8_set_speed_features(VP8_COMP *cpi) {
715 SPEED_FEATURES *sf = &cpi->sf;
716 int Mode = cpi->compressor_speed;
717 int Speed = cpi->Speed;
719 VP8_COMMON *cm = &cpi->common;
720 int last_improved_quant = sf->improved_quant;
723 /* Initialise default mode frequency sampling variables */
724 for (i = 0; i < MAX_MODES; ++i) {
725 cpi->mode_check_freq[i] = 0;
728 cpi->mb.mbs_tested_so_far = 0;
729 cpi->mb.mbs_zero_last_dot_suppress = 0;
731 /* best quality defaults */
733 sf->search_method = NSTEP;
734 sf->improved_quant = 1;
735 sf->improved_dct = 1;
738 sf->quarter_pixel_search = 1;
739 sf->half_pixel_search = 1;
740 sf->iterative_sub_pixel = 1;
741 sf->optimize_coefficients = 1;
742 sf->use_fastquant_for_pick = 0;
743 sf->no_skip_block4x4_search = 1;
746 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
747 sf->improved_mv_pred = 1;
749 /* default thresholds to 0 */
750 for (i = 0; i < MAX_MODES; ++i) sf->thresh_mult[i] = 0;
752 /* Count enabled references */
754 if (cpi->ref_frame_flags & VP8_LAST_FRAME) ref_frames++;
755 if (cpi->ref_frame_flags & VP8_GOLD_FRAME) ref_frames++;
756 if (cpi->ref_frame_flags & VP8_ALTR_FRAME) ref_frames++;
758 /* Convert speed to continuous range, with clamping */
761 } else if (Mode == 2) {
764 if (Speed > 5) Speed = 5;
768 sf->thresh_mult[THR_ZERO1] = sf->thresh_mult[THR_NEAREST1] =
769 sf->thresh_mult[THR_NEAR1] = sf->thresh_mult[THR_DC] = 0; /* always */
771 sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO3] =
772 sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST3] =
773 sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR3] =
774 speed_map(Speed, thresh_mult_map_znn);
776 sf->thresh_mult[THR_V_PRED] = sf->thresh_mult[THR_H_PRED] =
777 speed_map(Speed, thresh_mult_map_vhpred);
778 sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
779 sf->thresh_mult[THR_TM] = speed_map(Speed, thresh_mult_map_tm);
780 sf->thresh_mult[THR_NEW1] = speed_map(Speed, thresh_mult_map_new1);
781 sf->thresh_mult[THR_NEW2] = sf->thresh_mult[THR_NEW3] =
782 speed_map(Speed, thresh_mult_map_new2);
783 sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
784 sf->thresh_mult[THR_SPLIT2] = sf->thresh_mult[THR_SPLIT3] =
785 speed_map(Speed, thresh_mult_map_split2);
787 // Special case for temporal layers.
788 // Reduce the thresholds for zero/nearest/near for GOLDEN, if GOLDEN is
789 // used as second reference. We don't modify thresholds for ALTREF case
790 // since ALTREF is usually used as long-term reference in temporal layers.
791 if ((cpi->Speed <= 6) && (cpi->oxcf.number_of_layers > 1) &&
792 (cpi->ref_frame_flags & VP8_LAST_FRAME) &&
793 (cpi->ref_frame_flags & VP8_GOLD_FRAME)) {
794 if (cpi->closest_reference_frame == GOLDEN_FRAME) {
795 sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 3;
796 sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 3;
797 sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 3;
799 sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 1;
800 sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 1;
801 sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 1;
805 cpi->mode_check_freq[THR_ZERO1] = cpi->mode_check_freq[THR_NEAREST1] =
806 cpi->mode_check_freq[THR_NEAR1] = cpi->mode_check_freq[THR_TM] =
807 cpi->mode_check_freq[THR_DC] = 0; /* always */
809 cpi->mode_check_freq[THR_ZERO2] = cpi->mode_check_freq[THR_ZERO3] =
810 cpi->mode_check_freq[THR_NEAREST2] = cpi->mode_check_freq[THR_NEAREST3] =
811 speed_map(Speed, mode_check_freq_map_zn2);
813 cpi->mode_check_freq[THR_NEAR2] = cpi->mode_check_freq[THR_NEAR3] =
814 speed_map(Speed, mode_check_freq_map_near2);
816 cpi->mode_check_freq[THR_V_PRED] = cpi->mode_check_freq[THR_H_PRED] =
817 cpi->mode_check_freq[THR_B_PRED] =
818 speed_map(Speed, mode_check_freq_map_vhbpred);
819 cpi->mode_check_freq[THR_NEW1] = speed_map(Speed, mode_check_freq_map_new1);
820 cpi->mode_check_freq[THR_NEW2] = cpi->mode_check_freq[THR_NEW3] =
821 speed_map(Speed, mode_check_freq_map_new2);
822 cpi->mode_check_freq[THR_SPLIT1] =
823 speed_map(Speed, mode_check_freq_map_split1);
824 cpi->mode_check_freq[THR_SPLIT2] = cpi->mode_check_freq[THR_SPLIT3] =
825 speed_map(Speed, mode_check_freq_map_split2);
828 #if !CONFIG_REALTIME_ONLY
829 case 0: /* best quality mode */
831 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
836 /* Disable coefficient optimization above speed 0 */
837 sf->optimize_coefficients = 0;
838 sf->use_fastquant_for_pick = 1;
839 sf->no_skip_block4x4_search = 0;
845 sf->improved_quant = 0;
846 sf->improved_dct = 0;
848 /* Only do recode loop on key frames, golden frames and
856 sf->recode_loop = 0; /* recode loop off */
857 sf->RD = 0; /* Turn rd off */
861 sf->auto_filter = 0; /* Faster selection of loop filter */
867 sf->optimize_coefficients = 0;
870 sf->iterative_sub_pixel = 1;
871 sf->search_method = NSTEP;
874 sf->improved_quant = 0;
875 sf->improved_dct = 0;
877 sf->use_fastquant_for_pick = 1;
878 sf->no_skip_block4x4_search = 0;
882 if (Speed > 2) sf->auto_filter = 0; /* Faster selection of loop filter */
890 sf->auto_filter = 0; /* Faster selection of loop filter */
891 sf->search_method = HEX;
892 sf->iterative_sub_pixel = 0;
896 unsigned int sum = 0;
897 unsigned int total_mbs = cm->MBs;
899 unsigned int total_skip;
903 if (cpi->oxcf.encode_breakout > 2000) min = cpi->oxcf.encode_breakout;
907 for (i = 0; i < min; ++i) {
908 sum += cpi->mb.error_bins[i];
914 /* i starts from 2 to make sure thresh started from 2048 */
915 for (; i < 1024; ++i) {
916 sum += cpi->mb.error_bins[i];
919 (unsigned int)(cpi->Speed - 6) * (total_mbs - total_skip)) {
927 if (thresh < 2000) thresh = 2000;
929 if (ref_frames > 1) {
930 sf->thresh_mult[THR_NEW1] = thresh;
931 sf->thresh_mult[THR_NEAREST1] = thresh >> 1;
932 sf->thresh_mult[THR_NEAR1] = thresh >> 1;
935 if (ref_frames > 2) {
936 sf->thresh_mult[THR_NEW2] = thresh << 1;
937 sf->thresh_mult[THR_NEAREST2] = thresh;
938 sf->thresh_mult[THR_NEAR2] = thresh;
941 if (ref_frames > 3) {
942 sf->thresh_mult[THR_NEW3] = thresh << 1;
943 sf->thresh_mult[THR_NEAREST3] = thresh;
944 sf->thresh_mult[THR_NEAR3] = thresh;
947 sf->improved_mv_pred = 0;
950 if (Speed > 8) sf->quarter_pixel_search = 0;
952 if (cm->version == 0) {
953 cm->filter_type = NORMAL_LOOPFILTER;
955 if (Speed >= 14) cm->filter_type = SIMPLE_LOOPFILTER;
957 cm->filter_type = SIMPLE_LOOPFILTER;
960 /* This has a big hit on quality. Last resort */
961 if (Speed >= 15) sf->half_pixel_search = 0;
963 memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
967 /* Slow quant, dct and trellis not worthwhile for first pass
968 * so make sure they are always turned off.
970 if (cpi->pass == 1) {
971 sf->improved_quant = 0;
972 sf->optimize_coefficients = 0;
973 sf->improved_dct = 0;
976 if (cpi->sf.search_method == NSTEP) {
977 vp8_init3smotion_compensation(&cpi->mb,
978 cm->yv12_fb[cm->lst_fb_idx].y_stride);
979 } else if (cpi->sf.search_method == DIAMOND) {
980 vp8_init_dsmotion_compensation(&cpi->mb,
981 cm->yv12_fb[cm->lst_fb_idx].y_stride);
984 if (cpi->sf.improved_dct) {
985 cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
986 cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
988 /* No fast FDCT defined for any platform at this time. */
989 cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
990 cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
993 cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
995 if (cpi->sf.improved_quant) {
996 cpi->mb.quantize_b = vp8_regular_quantize_b;
998 cpi->mb.quantize_b = vp8_fast_quantize_b;
1000 if (cpi->sf.improved_quant != last_improved_quant) vp8cx_init_quantizer(cpi);
1002 if (cpi->sf.iterative_sub_pixel == 1) {
1003 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
1004 } else if (cpi->sf.quarter_pixel_search) {
1005 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
1006 } else if (cpi->sf.half_pixel_search) {
1007 cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1009 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1012 if (cpi->sf.optimize_coefficients == 1 && cpi->pass != 1) {
1013 cpi->mb.optimize = 1;
1015 cpi->mb.optimize = 0;
1018 if (cpi->common.full_pixel) {
1019 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1023 frames_at_speed[cpi->Speed]++;
1029 static void alloc_raw_frame_buffers(VP8_COMP *cpi) {
1030 #if VP8_TEMPORAL_ALT_REF
1031 int width = (cpi->oxcf.Width + 15) & ~15;
1032 int height = (cpi->oxcf.Height + 15) & ~15;
1035 cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
1036 cpi->oxcf.lag_in_frames);
1037 if (!cpi->lookahead) {
1038 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1039 "Failed to allocate lag buffers");
1042 #if VP8_TEMPORAL_ALT_REF
1044 if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer, width, height,
1045 VP8BORDERINPIXELS)) {
1046 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1047 "Failed to allocate altref buffer");
1053 static void dealloc_raw_frame_buffers(VP8_COMP *cpi) {
1054 #if VP8_TEMPORAL_ALT_REF
1055 vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
1057 vp8_lookahead_destroy(cpi->lookahead);
1060 static int vp8_alloc_partition_data(VP8_COMP *cpi) {
1061 vpx_free(cpi->mb.pip);
1064 vpx_calloc((cpi->common.mb_cols + 1) * (cpi->common.mb_rows + 1),
1065 sizeof(PARTITION_INFO));
1066 if (!cpi->mb.pip) return 1;
1068 cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1073 void vp8_alloc_compressor_data(VP8_COMP *cpi) {
1074 VP8_COMMON *cm = &cpi->common;
1076 int width = cm->Width;
1077 int height = cm->Height;
1079 if (vp8_alloc_frame_buffers(cm, width, height)) {
1080 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1081 "Failed to allocate frame buffers");
1084 if (vp8_alloc_partition_data(cpi)) {
1085 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1086 "Failed to allocate partition data");
1089 if ((width & 0xf) != 0) width += 16 - (width & 0xf);
1091 if ((height & 0xf) != 0) height += 16 - (height & 0xf);
1093 if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame, width, height,
1094 VP8BORDERINPIXELS)) {
1095 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1096 "Failed to allocate last frame buffer");
1099 if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source, width, height,
1100 VP8BORDERINPIXELS)) {
1101 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1102 "Failed to allocate scaled source buffer");
1108 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
1109 unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
1111 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1113 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1116 /* Data used for real time vc mode to see if gf needs refreshing */
1117 cpi->zeromv_count = 0;
1119 /* Structures used to monitor GF usage */
1120 vpx_free(cpi->gf_active_flags);
1122 cpi->gf_active_flags,
1123 vpx_calloc(sizeof(*cpi->gf_active_flags), cm->mb_rows * cm->mb_cols));
1124 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1126 vpx_free(cpi->mb_activity_map);
1128 cpi->mb_activity_map,
1129 vpx_calloc(sizeof(*cpi->mb_activity_map), cm->mb_rows * cm->mb_cols));
1131 /* allocate memory for storing last frame's MVs for MV prediction. */
1132 vpx_free(cpi->lfmv);
1133 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
1134 sizeof(*cpi->lfmv)));
1135 vpx_free(cpi->lf_ref_frame_sign_bias);
1136 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
1137 vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
1138 sizeof(*cpi->lf_ref_frame_sign_bias)));
1139 vpx_free(cpi->lf_ref_frame);
1140 CHECK_MEM_ERROR(cpi->lf_ref_frame,
1141 vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
1142 sizeof(*cpi->lf_ref_frame)));
1144 /* Create the encoder segmentation map and set all entries to 0 */
1145 vpx_free(cpi->segmentation_map);
1147 cpi->segmentation_map,
1148 vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->segmentation_map)));
1149 cpi->cyclic_refresh_mode_index = 0;
1150 vpx_free(cpi->active_map);
1151 CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cm->mb_rows * cm->mb_cols,
1152 sizeof(*cpi->active_map)));
1153 memset(cpi->active_map, 1, (cm->mb_rows * cm->mb_cols));
1155 #if CONFIG_MULTITHREAD
1157 cpi->mt_sync_range = 1;
1158 } else if (width <= 1280) {
1159 cpi->mt_sync_range = 4;
1160 } else if (width <= 2560) {
1161 cpi->mt_sync_range = 8;
1163 cpi->mt_sync_range = 16;
1166 if (cpi->oxcf.multi_threaded > 1) {
1167 vpx_free(cpi->mt_current_mb_col);
1168 CHECK_MEM_ERROR(cpi->mt_current_mb_col,
1169 vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
1174 vpx_free(cpi->tplist);
1175 CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
1177 #if CONFIG_TEMPORAL_DENOISING
1178 if (cpi->oxcf.noise_sensitivity > 0) {
1179 vp8_denoiser_free(&cpi->denoiser);
1180 if (vp8_denoiser_allocate(&cpi->denoiser, width, height, cm->mb_rows,
1181 cm->mb_cols, cpi->oxcf.noise_sensitivity)) {
1182 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1183 "Failed to allocate denoiser");
1190 static const int q_trans[] = {
1191 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19,
1192 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 35, 37, 39, 41,
1193 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 64, 67, 70, 73, 76, 79,
1194 82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127,
1197 int vp8_reverse_trans(int x) {
1200 for (i = 0; i < 64; ++i) {
1201 if (q_trans[i] >= x) return i;
1206 void vp8_new_framerate(VP8_COMP *cpi, double framerate) {
1207 if (framerate < .1) framerate = 30;
1209 cpi->framerate = framerate;
1210 cpi->output_framerate = framerate;
1211 cpi->per_frame_bandwidth =
1212 (int)(cpi->oxcf.target_bandwidth / cpi->output_framerate);
1213 cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
1214 cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth *
1215 cpi->oxcf.two_pass_vbrmin_section / 100);
1217 /* Set Maximum gf/arf interval */
1218 cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);
1220 if (cpi->max_gf_interval < 12) cpi->max_gf_interval = 12;
1222 /* Extended interval for genuinely static scenes */
1223 cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1225 /* Special conditions when altr ref frame enabled in lagged compress mode */
1226 if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames) {
1227 if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1) {
1228 cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1231 if (cpi->twopass.static_scene_max_gf_interval >
1232 cpi->oxcf.lag_in_frames - 1) {
1233 cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1237 if (cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval) {
1238 cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1242 static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
1243 VP8_COMMON *cm = &cpi->common;
1248 cpi->auto_adjust_gold_quantizer = 1;
1250 cm->version = oxcf->Version;
1251 vp8_setup_version(cm);
1253 /* Frame rate is not available on the first frame, as it's derived from
1254 * the observed timestamps. The actual value used here doesn't matter
1255 * too much, as it will adapt quickly.
1257 if (oxcf->timebase.num > 0) {
1259 (double)(oxcf->timebase.den) / (double)(oxcf->timebase.num);
1261 cpi->framerate = 30;
1264 /* If the reciprocal of the timebase seems like a reasonable framerate,
1265 * then use that as a guess, otherwise use 30.
1267 if (cpi->framerate > 180) cpi->framerate = 30;
1269 cpi->ref_framerate = cpi->framerate;
1271 cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
1273 cm->refresh_golden_frame = 0;
1274 cm->refresh_last_frame = 1;
1275 cm->refresh_entropy_probs = 1;
1277 /* change includes all joint functionality */
1278 vp8_change_config(cpi, oxcf);
1280 /* Initialize active best and worst q and average q values. */
1281 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1282 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1283 cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
1285 /* Initialise the starting buffer levels */
1286 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
1287 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
1289 cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
1290 cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
1291 cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
1292 cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
1294 cpi->total_actual_bits = 0;
1295 cpi->total_target_vs_actual = 0;
1297 /* Temporal scalabilty */
1298 if (cpi->oxcf.number_of_layers > 1) {
1300 double prev_layer_framerate = 0;
1302 for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
1303 init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
1304 prev_layer_framerate =
1305 cpi->output_framerate / cpi->oxcf.rate_decimator[i];
1309 #if VP8_TEMPORAL_ALT_REF
1313 cpi->fixed_divide[0] = 0;
1315 for (i = 1; i < 512; ++i) cpi->fixed_divide[i] = 0x80000 / i;
1320 static void update_layer_contexts(VP8_COMP *cpi) {
1321 VP8_CONFIG *oxcf = &cpi->oxcf;
1323 /* Update snapshots of the layer contexts to reflect new parameters */
1324 if (oxcf->number_of_layers > 1) {
1326 double prev_layer_framerate = 0;
1328 assert(oxcf->number_of_layers <= VPX_TS_MAX_LAYERS);
1329 for (i = 0; i < oxcf->number_of_layers && i < VPX_TS_MAX_LAYERS; ++i) {
1330 LAYER_CONTEXT *lc = &cpi->layer_context[i];
1332 lc->framerate = cpi->ref_framerate / oxcf->rate_decimator[i];
1333 lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
1335 lc->starting_buffer_level = rescale(
1336 (int)oxcf->starting_buffer_level_in_ms, lc->target_bandwidth, 1000);
1338 if (oxcf->optimal_buffer_level == 0) {
1339 lc->optimal_buffer_level = lc->target_bandwidth / 8;
1341 lc->optimal_buffer_level = rescale(
1342 (int)oxcf->optimal_buffer_level_in_ms, lc->target_bandwidth, 1000);
1345 if (oxcf->maximum_buffer_size == 0) {
1346 lc->maximum_buffer_size = lc->target_bandwidth / 8;
1348 lc->maximum_buffer_size = rescale((int)oxcf->maximum_buffer_size_in_ms,
1349 lc->target_bandwidth, 1000);
1352 /* Work out the average size of a frame within this layer */
1354 lc->avg_frame_size_for_layer =
1355 (int)((oxcf->target_bitrate[i] - oxcf->target_bitrate[i - 1]) *
1356 1000 / (lc->framerate - prev_layer_framerate));
1359 prev_layer_framerate = lc->framerate;
1364 void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
1365 VP8_COMMON *cm = &cpi->common;
1367 unsigned int prev_number_of_layers;
1373 if (cm->version != oxcf->Version) {
1374 cm->version = oxcf->Version;
1375 vp8_setup_version(cm);
1378 last_w = cpi->oxcf.Width;
1379 last_h = cpi->oxcf.Height;
1380 prev_number_of_layers = cpi->oxcf.number_of_layers;
1384 switch (cpi->oxcf.Mode) {
1387 cpi->compressor_speed = 2;
1389 if (cpi->oxcf.cpu_used < -16) {
1390 cpi->oxcf.cpu_used = -16;
1393 if (cpi->oxcf.cpu_used > 16) cpi->oxcf.cpu_used = 16;
1397 case MODE_GOODQUALITY:
1399 cpi->compressor_speed = 1;
1401 if (cpi->oxcf.cpu_used < -5) {
1402 cpi->oxcf.cpu_used = -5;
1405 if (cpi->oxcf.cpu_used > 5) cpi->oxcf.cpu_used = 5;
1409 case MODE_BESTQUALITY:
1411 cpi->compressor_speed = 0;
1414 case MODE_FIRSTPASS:
1416 cpi->compressor_speed = 1;
1418 case MODE_SECONDPASS:
1420 cpi->compressor_speed = 1;
1422 if (cpi->oxcf.cpu_used < -5) {
1423 cpi->oxcf.cpu_used = -5;
1426 if (cpi->oxcf.cpu_used > 5) cpi->oxcf.cpu_used = 5;
1429 case MODE_SECONDPASS_BEST:
1431 cpi->compressor_speed = 0;
1435 if (cpi->pass == 0) cpi->auto_worst_q = 1;
1437 cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1438 cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1439 cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1441 if (oxcf->fixed_q >= 0) {
1442 if (oxcf->worst_allowed_q < 0) {
1443 cpi->oxcf.fixed_q = q_trans[0];
1445 cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1448 if (oxcf->alt_q < 0) {
1449 cpi->oxcf.alt_q = q_trans[0];
1451 cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1454 if (oxcf->key_q < 0) {
1455 cpi->oxcf.key_q = q_trans[0];
1457 cpi->oxcf.key_q = q_trans[oxcf->key_q];
1460 if (oxcf->gold_q < 0) {
1461 cpi->oxcf.gold_q = q_trans[0];
1463 cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1467 cpi->baseline_gf_interval =
1468 cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1470 // GF behavior for 1 pass CBR, used when error_resilience is off.
1471 if (!cpi->oxcf.error_resilient_mode &&
1472 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
1473 cpi->oxcf.Mode == MODE_REALTIME)
1474 cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
1476 #if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
1477 cpi->oxcf.token_partitions = 3;
1480 if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3) {
1481 cm->multi_token_partition = (TOKEN_PARTITION)cpi->oxcf.token_partitions;
1484 setup_features(cpi);
1489 for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
1490 cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1494 /* At the moment the first order values may not be > MAXQ */
1495 if (cpi->oxcf.fixed_q > MAXQ) cpi->oxcf.fixed_q = MAXQ;
1497 /* local file playback mode == really big buffer */
1498 if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) {
1499 cpi->oxcf.starting_buffer_level = 60000;
1500 cpi->oxcf.optimal_buffer_level = 60000;
1501 cpi->oxcf.maximum_buffer_size = 240000;
1502 cpi->oxcf.starting_buffer_level_in_ms = 60000;
1503 cpi->oxcf.optimal_buffer_level_in_ms = 60000;
1504 cpi->oxcf.maximum_buffer_size_in_ms = 240000;
1507 /* Convert target bandwidth from Kbit/s to Bit/s */
1508 cpi->oxcf.target_bandwidth *= 1000;
1510 cpi->oxcf.starting_buffer_level = rescale(
1511 (int)cpi->oxcf.starting_buffer_level, cpi->oxcf.target_bandwidth, 1000);
1513 /* Set or reset optimal and maximum buffer levels. */
1514 if (cpi->oxcf.optimal_buffer_level == 0) {
1515 cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1517 cpi->oxcf.optimal_buffer_level = rescale(
1518 (int)cpi->oxcf.optimal_buffer_level, cpi->oxcf.target_bandwidth, 1000);
1521 if (cpi->oxcf.maximum_buffer_size == 0) {
1522 cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1524 cpi->oxcf.maximum_buffer_size = rescale((int)cpi->oxcf.maximum_buffer_size,
1525 cpi->oxcf.target_bandwidth, 1000);
1527 // Under a configuration change, where maximum_buffer_size may change,
1528 // keep buffer level clipped to the maximum allowed buffer size.
1529 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
1530 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
1531 cpi->buffer_level = cpi->bits_off_target;
1534 /* Set up frame rate and related parameters rate control values. */
1535 vp8_new_framerate(cpi, cpi->framerate);
1537 /* Set absolute upper and lower quality limits */
1538 cpi->worst_quality = cpi->oxcf.worst_allowed_q;
1539 cpi->best_quality = cpi->oxcf.best_allowed_q;
1541 /* active values should only be modified if out of new range */
1542 if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q) {
1543 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1546 else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q) {
1547 cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1549 if (cpi->active_best_quality < cpi->oxcf.best_allowed_q) {
1550 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1553 else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q) {
1554 cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1557 cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
1559 cpi->cq_target_quality = cpi->oxcf.cq_level;
1561 /* Only allow dropped frames in buffered mode */
1562 cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1564 cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1566 // Check if the number of temporal layers has changed, and if so reset the
1567 // pattern counter and set/initialize the temporal layer context for the
1568 // new layer configuration.
1569 if (cpi->oxcf.number_of_layers != prev_number_of_layers) {
1570 // If the number of temporal layers are changed we must start at the
1571 // base of the pattern cycle, so set the layer id to 0 and reset
1572 // the temporal pattern counter.
1573 if (cpi->temporal_layer_id > 0) {
1574 cpi->temporal_layer_id = 0;
1576 cpi->temporal_pattern_counter = 0;
1577 reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
1580 if (!cpi->initial_width) {
1581 cpi->initial_width = cpi->oxcf.Width;
1582 cpi->initial_height = cpi->oxcf.Height;
1585 cm->Width = cpi->oxcf.Width;
1586 cm->Height = cpi->oxcf.Height;
1587 assert(cm->Width <= cpi->initial_width);
1588 assert(cm->Height <= cpi->initial_height);
1590 /* TODO(jkoleszar): if an internal spatial resampling is active,
1591 * and we downsize the input image, maybe we should clear the
1592 * internal scale immediately rather than waiting for it to
1596 /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
1597 if (cpi->oxcf.Sharpness > 7) cpi->oxcf.Sharpness = 7;
1599 cm->sharpness_level = cpi->oxcf.Sharpness;
1601 if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL) {
1602 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
1603 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
1605 Scale2Ratio(cm->horiz_scale, &hr, &hs);
1606 Scale2Ratio(cm->vert_scale, &vr, &vs);
1608 /* always go to the next whole number */
1609 cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1610 cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1613 if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height) {
1614 cpi->force_next_frame_intra = 1;
1617 if (((cm->Width + 15) & ~15) != cm->yv12_fb[cm->lst_fb_idx].y_width ||
1618 ((cm->Height + 15) & ~15) != cm->yv12_fb[cm->lst_fb_idx].y_height ||
1619 cm->yv12_fb[cm->lst_fb_idx].y_width == 0) {
1620 dealloc_raw_frame_buffers(cpi);
1621 alloc_raw_frame_buffers(cpi);
1622 vp8_alloc_compressor_data(cpi);
1625 if (cpi->oxcf.fixed_q >= 0) {
1626 cpi->last_q[0] = cpi->oxcf.fixed_q;
1627 cpi->last_q[1] = cpi->oxcf.fixed_q;
1630 cpi->Speed = cpi->oxcf.cpu_used;
1632 /* force to allowlag to 0 if lag_in_frames is 0; */
1633 if (cpi->oxcf.lag_in_frames == 0) {
1634 cpi->oxcf.allow_lag = 0;
1636 /* Limit on lag buffers as these are not currently dynamically allocated */
1637 else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS) {
1638 cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1642 cpi->alt_ref_source = NULL;
1643 cpi->is_src_frame_alt_ref = 0;
1645 #if CONFIG_TEMPORAL_DENOISING
1646 if (cpi->oxcf.noise_sensitivity) {
1647 if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc) {
1648 int width = (cpi->oxcf.Width + 15) & ~15;
1649 int height = (cpi->oxcf.Height + 15) & ~15;
1650 if (vp8_denoiser_allocate(&cpi->denoiser, width, height, cm->mb_rows,
1651 cm->mb_cols, cpi->oxcf.noise_sensitivity)) {
1652 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1653 "Failed to allocate denoiser");
1660 /* Experimental RD Code */
1661 cpi->frame_distortion = 0;
1662 cpi->last_frame_distortion = 0;
1667 #define M_LOG2_E 0.693147180559945309417
1669 #define log2f(x) (log(x) / (float)M_LOG2_E)
1671 static void cal_mvsadcosts(int *mvsadcost[2]) {
1674 mvsadcost[0][0] = 300;
1675 mvsadcost[1][0] = 300;
1678 double z = 256 * (2 * (log2f(8 * i) + .6));
1679 mvsadcost[0][i] = (int)z;
1680 mvsadcost[1][i] = (int)z;
1681 mvsadcost[0][-i] = (int)z;
1682 mvsadcost[1][-i] = (int)z;
1683 } while (++i <= mvfp_max);
1686 struct VP8_COMP *vp8_create_compressor(VP8_CONFIG *oxcf) {
1692 cpi = vpx_memalign(32, sizeof(VP8_COMP));
1693 /* Check that the CPI instance is valid */
1698 memset(cpi, 0, sizeof(VP8_COMP));
1700 if (setjmp(cm->error.jmp)) {
1701 cpi->common.error.setjmp = 0;
1702 vp8_remove_compressor(&cpi);
1706 cpi->common.error.setjmp = 1;
1708 CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site),
1709 (MAX_MVSEARCH_STEPS * 8) + 1));
1711 vp8_create_common(&cpi->common);
1713 init_config(cpi, oxcf);
1715 memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob,
1716 sizeof(vp8cx_base_skip_false_prob));
1717 cpi->common.current_video_frame = 0;
1718 cpi->temporal_pattern_counter = 0;
1719 cpi->temporal_layer_id = -1;
1720 cpi->kf_overspend_bits = 0;
1721 cpi->kf_bitrate_adjustment = 0;
1722 cpi->frames_till_gf_update_due = 0;
1723 cpi->gf_overspend_bits = 0;
1724 cpi->non_gf_bitrate_adjustment = 0;
1725 cpi->prob_last_coded = 128;
1726 cpi->prob_gf_coded = 128;
1727 cpi->prob_intra_coded = 63;
1729 /* Prime the recent reference frame usage counters.
1730 * Hereafter they will be maintained as a sort of moving average
1732 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
1733 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
1734 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1735 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1737 /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
1738 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1740 cpi->twopass.gf_decay_rate = 0;
1741 cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1743 cpi->gold_is_last = 0;
1744 cpi->alt_is_last = 0;
1745 cpi->gold_is_alt = 0;
1747 cpi->active_map_enabled = 0;
1750 /* Experimental code for lagged and one pass */
1751 /* Initialise one_pass GF frames stats */
1752 /* Update stats used for GF selection */
1755 cpi->one_pass_frame_index = 0;
1757 for (i = 0; i < MAX_LAG_BUFFERS; ++i)
1759 cpi->one_pass_frame_stats[i].frames_so_far = 0;
1760 cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1761 cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1762 cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1763 cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1764 cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1765 cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1766 cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1767 cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1772 cpi->mse_source_denoised = 0;
1774 /* Should we use the cyclic refresh method.
1775 * Currently there is no external control for this.
1776 * Enable it for error_resilient_mode, or for 1 pass CBR mode.
1778 cpi->cyclic_refresh_mode_enabled =
1779 (cpi->oxcf.error_resilient_mode ||
1780 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
1781 cpi->oxcf.Mode <= 2));
1782 cpi->cyclic_refresh_mode_max_mbs_perframe =
1783 (cpi->common.mb_rows * cpi->common.mb_cols) / 7;
1784 if (cpi->oxcf.number_of_layers == 1) {
1785 cpi->cyclic_refresh_mode_max_mbs_perframe =
1786 (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
1787 } else if (cpi->oxcf.number_of_layers == 2) {
1788 cpi->cyclic_refresh_mode_max_mbs_perframe =
1789 (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
1791 cpi->cyclic_refresh_mode_index = 0;
1792 cpi->cyclic_refresh_q = 32;
1794 // GF behavior for 1 pass CBR, used when error_resilience is off.
1795 cpi->gf_update_onepass_cbr = 0;
1796 cpi->gf_noboost_onepass_cbr = 0;
1797 if (!cpi->oxcf.error_resilient_mode &&
1798 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER && cpi->oxcf.Mode <= 2) {
1799 cpi->gf_update_onepass_cbr = 1;
1800 cpi->gf_noboost_onepass_cbr = 1;
1801 cpi->gf_interval_onepass_cbr =
1802 cpi->cyclic_refresh_mode_max_mbs_perframe > 0
1803 ? (2 * (cpi->common.mb_rows * cpi->common.mb_cols) /
1804 cpi->cyclic_refresh_mode_max_mbs_perframe)
1806 cpi->gf_interval_onepass_cbr =
1807 VPXMIN(40, VPXMAX(6, cpi->gf_interval_onepass_cbr));
1808 cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
1811 if (cpi->cyclic_refresh_mode_enabled) {
1812 CHECK_MEM_ERROR(cpi->cyclic_refresh_map,
1813 vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1815 cpi->cyclic_refresh_map = (signed char *)NULL;
1818 CHECK_MEM_ERROR(cpi->consec_zero_last,
1819 vpx_calloc(cm->mb_rows * cm->mb_cols, 1));
1820 CHECK_MEM_ERROR(cpi->consec_zero_last_mvbias,
1821 vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1823 #ifdef VP8_ENTROPY_STATS
1824 init_context_counters();
1827 /*Initialize the feed-forward activity masking.*/
1828 cpi->activity_avg = 90 << 12;
1830 /* Give a sensible default for the first frame. */
1831 cpi->frames_since_key = 8;
1832 cpi->key_frame_frequency = cpi->oxcf.key_freq;
1833 cpi->this_key_frame_forced = 0;
1834 cpi->next_key_frame_forced = 0;
1836 cpi->source_alt_ref_pending = 0;
1837 cpi->source_alt_ref_active = 0;
1838 cpi->common.refresh_alt_ref_frame = 0;
1840 cpi->force_maxqp = 0;
1842 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1843 #if CONFIG_INTERNAL_STATS
1844 cpi->b_calculate_ssimg = 0;
1849 if (cpi->b_calculate_psnr) {
1850 cpi->total_sq_error = 0.0;
1851 cpi->total_sq_error2 = 0.0;
1856 cpi->totalp_y = 0.0;
1857 cpi->totalp_u = 0.0;
1858 cpi->totalp_v = 0.0;
1860 cpi->tot_recode_hits = 0;
1861 cpi->summed_quality = 0;
1862 cpi->summed_weights = 0;
1867 cpi->first_time_stamp_ever = 0x7FFFFFFF;
1869 cpi->frames_till_gf_update_due = 0;
1870 cpi->key_frame_count = 1;
1872 cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
1875 cpi->total_byte_count = 0;
1877 cpi->drop_frame = 0;
1879 cpi->rate_correction_factor = 1.0;
1880 cpi->key_frame_rate_correction_factor = 1.0;
1881 cpi->gf_rate_correction_factor = 1.0;
1882 cpi->twopass.est_max_qcorrection_factor = 1.0;
1884 for (i = 0; i < KEY_FRAME_CONTEXT; ++i) {
1885 cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
1888 #ifdef OUTPUT_YUV_SRC
1889 yuv_file = fopen("bd.yuv", "ab");
1891 #ifdef OUTPUT_YUV_DENOISED
1892 yuv_denoised_file = fopen("denoised.yuv", "ab");
1896 framepsnr = fopen("framepsnr.stt", "a");
1897 kf_list = fopen("kf_list.stt", "w");
1900 cpi->output_pkt_list = oxcf->output_pkt_list;
1902 #if !CONFIG_REALTIME_ONLY
1904 if (cpi->pass == 1) {
1905 vp8_init_first_pass(cpi);
1906 } else if (cpi->pass == 2) {
1907 size_t packet_sz = sizeof(FIRSTPASS_STATS);
1908 int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
1910 cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1911 cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1912 cpi->twopass.stats_in_end =
1913 (void *)((char *)cpi->twopass.stats_in + (packets - 1) * packet_sz);
1914 vp8_init_second_pass(cpi);
1919 if (cpi->compressor_speed == 2) {
1920 cpi->avg_encode_time = 0;
1921 cpi->avg_pick_mode_time = 0;
1924 vp8_set_speed_features(cpi);
1926 /* Set starting values of RD threshold multipliers (128 = *1) */
1927 for (i = 0; i < MAX_MODES; ++i) {
1928 cpi->mb.rd_thresh_mult[i] = 128;
1931 #ifdef VP8_ENTROPY_STATS
1932 init_mv_ref_counts();
1935 #if CONFIG_MULTITHREAD
1936 if (vp8cx_create_encoder_threads(cpi)) {
1937 vp8_remove_compressor(&cpi);
1942 cpi->fn_ptr[BLOCK_16X16].sdf = vpx_sad16x16;
1943 cpi->fn_ptr[BLOCK_16X16].vf = vpx_variance16x16;
1944 cpi->fn_ptr[BLOCK_16X16].svf = vpx_sub_pixel_variance16x16;
1945 cpi->fn_ptr[BLOCK_16X16].sdx3f = vpx_sad16x16x3;
1946 cpi->fn_ptr[BLOCK_16X16].sdx8f = vpx_sad16x16x8;
1947 cpi->fn_ptr[BLOCK_16X16].sdx4df = vpx_sad16x16x4d;
1949 cpi->fn_ptr[BLOCK_16X8].sdf = vpx_sad16x8;
1950 cpi->fn_ptr[BLOCK_16X8].vf = vpx_variance16x8;
1951 cpi->fn_ptr[BLOCK_16X8].svf = vpx_sub_pixel_variance16x8;
1952 cpi->fn_ptr[BLOCK_16X8].sdx3f = vpx_sad16x8x3;
1953 cpi->fn_ptr[BLOCK_16X8].sdx8f = vpx_sad16x8x8;
1954 cpi->fn_ptr[BLOCK_16X8].sdx4df = vpx_sad16x8x4d;
1956 cpi->fn_ptr[BLOCK_8X16].sdf = vpx_sad8x16;
1957 cpi->fn_ptr[BLOCK_8X16].vf = vpx_variance8x16;
1958 cpi->fn_ptr[BLOCK_8X16].svf = vpx_sub_pixel_variance8x16;
1959 cpi->fn_ptr[BLOCK_8X16].sdx3f = vpx_sad8x16x3;
1960 cpi->fn_ptr[BLOCK_8X16].sdx8f = vpx_sad8x16x8;
1961 cpi->fn_ptr[BLOCK_8X16].sdx4df = vpx_sad8x16x4d;
1963 cpi->fn_ptr[BLOCK_8X8].sdf = vpx_sad8x8;
1964 cpi->fn_ptr[BLOCK_8X8].vf = vpx_variance8x8;
1965 cpi->fn_ptr[BLOCK_8X8].svf = vpx_sub_pixel_variance8x8;
1966 cpi->fn_ptr[BLOCK_8X8].sdx3f = vpx_sad8x8x3;
1967 cpi->fn_ptr[BLOCK_8X8].sdx8f = vpx_sad8x8x8;
1968 cpi->fn_ptr[BLOCK_8X8].sdx4df = vpx_sad8x8x4d;
1970 cpi->fn_ptr[BLOCK_4X4].sdf = vpx_sad4x4;
1971 cpi->fn_ptr[BLOCK_4X4].vf = vpx_variance4x4;
1972 cpi->fn_ptr[BLOCK_4X4].svf = vpx_sub_pixel_variance4x4;
1973 cpi->fn_ptr[BLOCK_4X4].sdx3f = vpx_sad4x4x3;
1974 cpi->fn_ptr[BLOCK_4X4].sdx8f = vpx_sad4x4x8;
1975 cpi->fn_ptr[BLOCK_4X4].sdx4df = vpx_sad4x4x4d;
1977 #if ARCH_X86 || ARCH_X86_64
1978 cpi->fn_ptr[BLOCK_16X16].copymem = vp8_copy32xn;
1979 cpi->fn_ptr[BLOCK_16X8].copymem = vp8_copy32xn;
1980 cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn;
1981 cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn;
1982 cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn;
1985 cpi->full_search_sad = vp8_full_search_sad;
1986 cpi->diamond_search_sad = vp8_diamond_search_sad;
1987 cpi->refining_search_sad = vp8_refining_search_sad;
1989 /* make sure frame 1 is okay */
1990 cpi->mb.error_bins[0] = cpi->common.MBs;
1992 /* vp8cx_init_quantizer() is first called here. Add check in
1993 * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
1994 * called later when needed. This will avoid unnecessary calls of
1995 * vp8cx_init_quantizer() for every frame.
1997 vp8cx_init_quantizer(cpi);
1999 vp8_loop_filter_init(cm);
2001 cpi->common.error.setjmp = 0;
2003 #if CONFIG_MULTI_RES_ENCODING
2005 /* Calculate # of MBs in a row in lower-resolution level image. */
2006 if (cpi->oxcf.mr_encoder_id > 0) vp8_cal_low_res_mb_cols(cpi);
2010 /* setup RD costs to MACROBLOCK struct */
2012 cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max + 1];
2013 cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max + 1];
2014 cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max + 1];
2015 cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max + 1];
2017 cal_mvsadcosts(cpi->mb.mvsadcost);
2019 cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
2020 cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
2021 cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
2022 cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
2023 cpi->mb.token_costs = cpi->rd_costs.token_costs;
2025 /* setup block ptrs & offsets */
2026 vp8_setup_block_ptrs(&cpi->mb);
2027 vp8_setup_block_dptrs(&cpi->mb.e_mbd);
2032 void vp8_remove_compressor(VP8_COMP **ptr) {
2033 VP8_COMP *cpi = *ptr;
2037 if (cpi && (cpi->common.current_video_frame > 0)) {
2038 #if !CONFIG_REALTIME_ONLY
2040 if (cpi->pass == 2) {
2041 vp8_end_second_pass(cpi);
2046 #ifdef VP8_ENTROPY_STATS
2047 print_context_counters();
2048 print_tree_update_probs();
2049 print_mode_context();
2052 #if CONFIG_INTERNAL_STATS
2054 if (cpi->pass != 1) {
2055 FILE *f = fopen("opsnr.stt", "a");
2056 double time_encoded =
2057 (cpi->last_end_time_stamp_seen - cpi->first_time_stamp_ever) /
2059 double total_encode_time =
2060 (cpi->time_receive_data + cpi->time_compress_data) / 1000.000;
2061 double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
2062 const double target_rate = (double)cpi->oxcf.target_bandwidth / 1000;
2063 const double rate_err = ((100.0 * (dr - target_rate)) / target_rate);
2065 if (cpi->b_calculate_psnr) {
2066 if (cpi->oxcf.number_of_layers > 1) {
2070 "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2071 "GLPsnrP\tVPXSSIM\n");
2072 for (i = 0; i < (int)cpi->oxcf.number_of_layers; ++i) {
2074 (double)cpi->bytes_in_layer[i] * 8.0 / 1000.0 / time_encoded;
2075 double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
2076 cpi->common.Width * cpi->common.Height;
2078 vpx_sse_to_psnr(samples, 255.0, cpi->total_error2[i]);
2079 double total_psnr2 =
2080 vpx_sse_to_psnr(samples, 255.0, cpi->total_error2_p[i]);
2082 100 * pow(cpi->sum_ssim[i] / cpi->sum_weights[i], 8.0);
2085 "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2087 i, dr, cpi->sum_psnr[i] / cpi->frames_in_layer[i],
2088 total_psnr, cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
2089 total_psnr2, total_ssim);
2093 3.0 / 2 * cpi->count * cpi->common.Width * cpi->common.Height;
2095 vpx_sse_to_psnr(samples, 255.0, cpi->total_sq_error);
2096 double total_psnr2 =
2097 vpx_sse_to_psnr(samples, 255.0, cpi->total_sq_error2);
2099 100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
2102 "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2103 "GLPsnrP\tVPXSSIM\n");
2105 "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2107 dr, cpi->total / cpi->count, total_psnr,
2108 cpi->totalp / cpi->count, total_psnr2, total_ssim);
2113 f = fopen("qskip.stt", "a");
2114 fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2123 if (cpi->compressor_speed == 2) {
2125 FILE *f = fopen("cxspeed.stt", "a");
2126 cnt_pm /= cpi->common.MBs;
2128 for (i = 0; i < 16; ++i) fprintf(f, "%5d", frames_at_speed[i]);
2138 extern int count_mb_seg[4];
2139 FILE *f = fopen("modes.stt", "a");
2140 double dr = (double)cpi->framerate * (double)bytes * (double)8 /
2141 (double)count / (double)1000;
2142 fprintf(f, "intra_mode in Intra Frames:\n");
2143 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1],
2144 y_modes[2], y_modes[3], y_modes[4]);
2145 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1],
2146 uv_modes[2], uv_modes[3]);
2151 for (i = 0; i < 10; ++i) fprintf(f, "%8d, ", b_modes[i]);
2156 fprintf(f, "Modes in Inter Frames:\n");
2157 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2158 inter_y_modes[0], inter_y_modes[1], inter_y_modes[2],
2159 inter_y_modes[3], inter_y_modes[4], inter_y_modes[5],
2160 inter_y_modes[6], inter_y_modes[7], inter_y_modes[8],
2162 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0],
2163 inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2168 for (i = 0; i < 15; ++i) fprintf(f, "%8d, ", inter_b_modes[i]);
2172 fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1],
2173 count_mb_seg[2], count_mb_seg[3]);
2174 fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4],
2175 inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4],
2176 inter_b_modes[NEW4X4]);
2182 #ifdef VP8_ENTROPY_STATS
2185 FILE *fmode = fopen("modecontext.c", "w");
2187 fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
2188 fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
2190 "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
2192 for (i = 0; i < 10; ++i) {
2193 fprintf(fmode, " { /* Above Mode : %d */\n", i);
2195 for (j = 0; j < 10; ++j) {
2196 fprintf(fmode, " {");
2198 for (k = 0; k < 10; ++k) {
2199 if (!intra_mode_stats[i][j][k])
2200 fprintf(fmode, " %5d, ", 1);
2202 fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2205 fprintf(fmode, "}, /* left_mode %d */\n", j);
2208 fprintf(fmode, " },\n");
2211 fprintf(fmode, "};\n");
2216 #if defined(SECTIONBITS_OUTPUT)
2220 FILE *f = fopen("tokenbits.stt", "a");
2222 for (i = 0; i < 28; ++i) fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2232 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2233 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
2234 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);
2239 #if CONFIG_MULTITHREAD
2240 vp8cx_remove_encoder_threads(cpi);
2243 #if CONFIG_TEMPORAL_DENOISING
2244 vp8_denoiser_free(&cpi->denoiser);
2246 dealloc_compressor_data(cpi);
2247 vpx_free(cpi->mb.ss);
2249 vpx_free(cpi->cyclic_refresh_map);
2250 vpx_free(cpi->consec_zero_last);
2251 vpx_free(cpi->consec_zero_last_mvbias);
2253 vp8_remove_common(&cpi->common);
2257 #ifdef OUTPUT_YUV_SRC
2260 #ifdef OUTPUT_YUV_DENOISED
2261 fclose(yuv_denoised_file);
2278 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2279 unsigned char *recon, int recon_stride,
2280 unsigned int cols, unsigned int rows) {
2281 unsigned int row, col;
2282 uint64_t total_sse = 0;
2285 for (row = 0; row + 16 <= rows; row += 16) {
2286 for (col = 0; col + 16 <= cols; col += 16) {
2289 vpx_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse);
2293 /* Handle odd-sized width */
2295 unsigned int border_row, border_col;
2296 unsigned char *border_orig = orig;
2297 unsigned char *border_recon = recon;
2299 for (border_row = 0; border_row < 16; ++border_row) {
2300 for (border_col = col; border_col < cols; ++border_col) {
2301 diff = border_orig[border_col] - border_recon[border_col];
2302 total_sse += diff * diff;
2305 border_orig += orig_stride;
2306 border_recon += recon_stride;
2310 orig += orig_stride * 16;
2311 recon += recon_stride * 16;
2314 /* Handle odd-sized height */
2315 for (; row < rows; ++row) {
2316 for (col = 0; col < cols; ++col) {
2317 diff = orig[col] - recon[col];
2318 total_sse += diff * diff;
2321 orig += orig_stride;
2322 recon += recon_stride;
2325 vpx_clear_system_state();
2329 static void generate_psnr_packet(VP8_COMP *cpi) {
2330 YV12_BUFFER_CONFIG *orig = cpi->Source;
2331 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
2332 struct vpx_codec_cx_pkt pkt;
2335 unsigned int width = cpi->common.Width;
2336 unsigned int height = cpi->common.Height;
2338 pkt.kind = VPX_CODEC_PSNR_PKT;
2339 sse = calc_plane_error(orig->y_buffer, orig->y_stride, recon->y_buffer,
2340 recon->y_stride, width, height);
2341 pkt.data.psnr.sse[0] = sse;
2342 pkt.data.psnr.sse[1] = sse;
2343 pkt.data.psnr.samples[0] = width * height;
2344 pkt.data.psnr.samples[1] = width * height;
2346 width = (width + 1) / 2;
2347 height = (height + 1) / 2;
2349 sse = calc_plane_error(orig->u_buffer, orig->uv_stride, recon->u_buffer,
2350 recon->uv_stride, width, height);
2351 pkt.data.psnr.sse[0] += sse;
2352 pkt.data.psnr.sse[2] = sse;
2353 pkt.data.psnr.samples[0] += width * height;
2354 pkt.data.psnr.samples[2] = width * height;
2356 sse = calc_plane_error(orig->v_buffer, orig->uv_stride, recon->v_buffer,
2357 recon->uv_stride, width, height);
2358 pkt.data.psnr.sse[0] += sse;
2359 pkt.data.psnr.sse[3] = sse;
2360 pkt.data.psnr.samples[0] += width * height;
2361 pkt.data.psnr.samples[3] = width * height;
2363 for (i = 0; i < 4; ++i) {
2364 pkt.data.psnr.psnr[i] = vpx_sse_to_psnr(pkt.data.psnr.samples[i], 255.0,
2365 (double)(pkt.data.psnr.sse[i]));
2368 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2371 int vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags) {
2372 if (ref_frame_flags > 7) return -1;
2374 cpi->ref_frame_flags = ref_frame_flags;
2377 int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags) {
2378 if (ref_frame_flags > 7) return -1;
2380 cpi->common.refresh_golden_frame = 0;
2381 cpi->common.refresh_alt_ref_frame = 0;
2382 cpi->common.refresh_last_frame = 0;
2384 if (ref_frame_flags & VP8_LAST_FRAME) cpi->common.refresh_last_frame = 1;
2386 if (ref_frame_flags & VP8_GOLD_FRAME) cpi->common.refresh_golden_frame = 1;
2388 if (ref_frame_flags & VP8_ALTR_FRAME) cpi->common.refresh_alt_ref_frame = 1;
2393 int vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag,
2394 YV12_BUFFER_CONFIG *sd) {
2395 VP8_COMMON *cm = &cpi->common;
2398 if (ref_frame_flag == VP8_LAST_FRAME) {
2399 ref_fb_idx = cm->lst_fb_idx;
2400 } else if (ref_frame_flag == VP8_GOLD_FRAME) {
2401 ref_fb_idx = cm->gld_fb_idx;
2402 } else if (ref_frame_flag == VP8_ALTR_FRAME) {
2403 ref_fb_idx = cm->alt_fb_idx;
2408 vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
2412 int vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag,
2413 YV12_BUFFER_CONFIG *sd) {
2414 VP8_COMMON *cm = &cpi->common;
2418 if (ref_frame_flag == VP8_LAST_FRAME) {
2419 ref_fb_idx = cm->lst_fb_idx;
2420 } else if (ref_frame_flag == VP8_GOLD_FRAME) {
2421 ref_fb_idx = cm->gld_fb_idx;
2422 } else if (ref_frame_flag == VP8_ALTR_FRAME) {
2423 ref_fb_idx = cm->alt_fb_idx;
2428 vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
2432 int vp8_update_entropy(VP8_COMP *cpi, int update) {
2433 VP8_COMMON *cm = &cpi->common;
2434 cm->refresh_entropy_probs = update;
2439 #if defined(OUTPUT_YUV_SRC) || defined(OUTPUT_YUV_DENOISED)
2440 void vp8_write_yuv_frame(FILE *yuv_file, YV12_BUFFER_CONFIG *s) {
2441 unsigned char *src = s->y_buffer;
2442 int h = s->y_height;
2445 fwrite(src, s->y_width, 1, yuv_file);
2453 fwrite(src, s->uv_width, 1, yuv_file);
2454 src += s->uv_stride;
2461 fwrite(src, s->uv_width, 1, yuv_file);
2462 src += s->uv_stride;
2467 static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi) {
2468 VP8_COMMON *cm = &cpi->common;
2470 /* are we resizing the image */
2471 if (cm->horiz_scale != 0 || cm->vert_scale != 0) {
2472 #if CONFIG_SPATIAL_RESAMPLING
2473 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2474 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2477 if (cm->vert_scale == 3) {
2483 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2484 Scale2Ratio(cm->vert_scale, &vr, &vs);
2486 vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2487 tmp_height, hs, hr, vs, vr, 0);
2489 vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2490 cpi->Source = &cpi->scaled_source;
2497 static int resize_key_frame(VP8_COMP *cpi) {
2498 #if CONFIG_SPATIAL_RESAMPLING
2499 VP8_COMMON *cm = &cpi->common;
2501 /* Do we need to apply resampling for one pass cbr.
2502 * In one pass this is more limited than in two pass cbr.
2503 * The test and any change is only made once per key frame sequence.
2505 if (cpi->oxcf.allow_spatial_resampling &&
2506 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) {
2507 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2508 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2509 int new_width, new_height;
2511 /* If we are below the resample DOWN watermark then scale down a
2514 if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark *
2515 cpi->oxcf.optimal_buffer_level / 100)) {
2517 (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2518 cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2520 /* Should we now start scaling back up */
2521 else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark *
2522 cpi->oxcf.optimal_buffer_level / 100)) {
2524 (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2525 cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2528 /* Get the new height and width */
2529 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2530 Scale2Ratio(cm->vert_scale, &vr, &vs);
2531 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2532 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2534 /* If the image size has changed we need to reallocate the buffers
2535 * and resample the source image
2537 if ((cm->Width != new_width) || (cm->Height != new_height)) {
2538 cm->Width = new_width;
2539 cm->Height = new_height;
2540 vp8_alloc_compressor_data(cpi);
2541 scale_and_extend_source(cpi->un_scaled_source, cpi);
2550 static void update_alt_ref_frame_stats(VP8_COMP *cpi) {
2551 VP8_COMMON *cm = &cpi->common;
2553 /* Select an interval before next GF or altref */
2554 if (!cpi->auto_gold) cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2556 if ((cpi->pass != 2) && cpi->frames_till_gf_update_due) {
2557 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2559 /* Set the bits per frame that we should try and recover in
2560 * subsequent inter frames to account for the extra GF spend...
2561 * note that his does not apply for GF updates that occur
2562 * coincident with a key frame as the extra cost of key frames is
2563 * dealt with elsewhere.
2565 cpi->gf_overspend_bits += cpi->projected_frame_size;
2566 cpi->non_gf_bitrate_adjustment =
2567 cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2570 /* Update data structure that monitors level of reference to last GF */
2571 memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2572 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2574 /* this frame refreshes means next frames don't unless specified by user */
2575 cpi->frames_since_golden = 0;
2577 /* Clear the alternate reference update pending flag. */
2578 cpi->source_alt_ref_pending = 0;
2580 /* Set the alternate reference frame active flag */
2581 cpi->source_alt_ref_active = 1;
2583 static void update_golden_frame_stats(VP8_COMP *cpi) {
2584 VP8_COMMON *cm = &cpi->common;
2586 /* Update the Golden frame usage counts. */
2587 if (cm->refresh_golden_frame) {
2588 /* Select an interval before next GF */
2589 if (!cpi->auto_gold) cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2591 if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0)) {
2592 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2594 /* Set the bits per frame that we should try and recover in
2595 * subsequent inter frames to account for the extra GF spend...
2596 * note that his does not apply for GF updates that occur
2597 * coincident with a key frame as the extra cost of key frames
2598 * is dealt with elsewhere.
2600 if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active) {
2601 /* Calcluate GF bits to be recovered
2602 * Projected size - av frame bits available for inter
2603 * frames for clip as a whole
2605 cpi->gf_overspend_bits +=
2606 (cpi->projected_frame_size - cpi->inter_frame_target);
2609 cpi->non_gf_bitrate_adjustment =
2610 cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2613 /* Update data structure that monitors level of reference to last GF */
2614 memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2615 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2617 /* this frame refreshes means next frames don't unless specified by
2620 cm->refresh_golden_frame = 0;
2621 cpi->frames_since_golden = 0;
2623 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2624 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2625 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2626 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2628 /* ******** Fixed Q test code only ************ */
2629 /* If we are going to use the ALT reference for the next group of
2630 * frames set a flag to say so.
2632 if (cpi->oxcf.fixed_q >= 0 && cpi->oxcf.play_alternate &&
2633 !cpi->common.refresh_alt_ref_frame) {
2634 cpi->source_alt_ref_pending = 1;
2635 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2638 if (!cpi->source_alt_ref_pending) cpi->source_alt_ref_active = 0;
2640 /* Decrement count down till next gf */
2641 if (cpi->frames_till_gf_update_due > 0) cpi->frames_till_gf_update_due--;
2643 } else if (!cpi->common.refresh_alt_ref_frame) {
2644 /* Decrement count down till next gf */
2645 if (cpi->frames_till_gf_update_due > 0) cpi->frames_till_gf_update_due--;
2647 if (cpi->frames_till_alt_ref_frame) cpi->frames_till_alt_ref_frame--;
2649 cpi->frames_since_golden++;
2651 if (cpi->frames_since_golden > 1) {
2652 cpi->recent_ref_frame_usage[INTRA_FRAME] +=
2653 cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
2654 cpi->recent_ref_frame_usage[LAST_FRAME] +=
2655 cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
2656 cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
2657 cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
2658 cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
2659 cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
2664 /* This function updates the reference frame probability estimates that
2665 * will be used during mode selection
2667 static void update_rd_ref_frame_probs(VP8_COMP *cpi) {
2668 VP8_COMMON *cm = &cpi->common;
2670 const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
2671 const int rf_intra = rfct[INTRA_FRAME];
2672 const int rf_inter =
2673 rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2675 if (cm->frame_type == KEY_FRAME) {
2676 cpi->prob_intra_coded = 255;
2677 cpi->prob_last_coded = 128;
2678 cpi->prob_gf_coded = 128;
2679 } else if (!(rf_intra + rf_inter)) {
2680 cpi->prob_intra_coded = 63;
2681 cpi->prob_last_coded = 128;
2682 cpi->prob_gf_coded = 128;
2685 /* update reference frame costs since we can do better than what we got
2688 if (cpi->oxcf.number_of_layers == 1) {
2689 if (cpi->common.refresh_alt_ref_frame) {
2690 cpi->prob_intra_coded += 40;
2691 if (cpi->prob_intra_coded > 255) cpi->prob_intra_coded = 255;
2692 cpi->prob_last_coded = 200;
2693 cpi->prob_gf_coded = 1;
2694 } else if (cpi->frames_since_golden == 0) {
2695 cpi->prob_last_coded = 214;
2696 } else if (cpi->frames_since_golden == 1) {
2697 cpi->prob_last_coded = 192;
2698 cpi->prob_gf_coded = 220;
2699 } else if (cpi->source_alt_ref_active) {
2700 cpi->prob_gf_coded -= 20;
2702 if (cpi->prob_gf_coded < 10) cpi->prob_gf_coded = 10;
2704 if (!cpi->source_alt_ref_active) cpi->prob_gf_coded = 255;
2708 #if !CONFIG_REALTIME_ONLY
2709 /* 1 = key, 0 = inter */
2710 static int decide_key_frame(VP8_COMP *cpi) {
2711 VP8_COMMON *cm = &cpi->common;
2713 int code_key_frame = 0;
2717 if (cpi->Speed > 11) return 0;
2719 /* Clear down mmx registers */
2720 vpx_clear_system_state();
2722 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0)) {
2723 double change = 1.0 *
2724 abs((int)(cpi->mb.intra_error - cpi->last_intra_error)) /
2725 (1 + cpi->last_intra_error);
2728 abs((int)(cpi->mb.prediction_error - cpi->last_prediction_error)) /
2729 (1 + cpi->last_prediction_error);
2730 double minerror = cm->MBs * 256;
2732 cpi->last_intra_error = cpi->mb.intra_error;
2733 cpi->last_prediction_error = cpi->mb.prediction_error;
2735 if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15 &&
2736 cpi->mb.prediction_error > minerror &&
2737 (change > .25 || change2 > .25)) {
2738 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra >
2739 * cpi->last_frame_percent_intra + 3*/
2746 /* If the following are true we might as well code a key frame */
2747 if (((cpi->this_frame_percent_intra == 100) &&
2748 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
2749 ((cpi->this_frame_percent_intra > 95) &&
2750 (cpi->this_frame_percent_intra >=
2751 (cpi->last_frame_percent_intra + 5)))) {
2754 /* in addition if the following are true and this is not a golden frame
2755 * then code a key frame Note that on golden frames there often seems
2756 * to be a pop in intra useage anyway hence this restriction is
2757 * designed to prevent spurious key frames. The Intra pop needs to be
2760 else if (((cpi->this_frame_percent_intra > 60) &&
2761 (cpi->this_frame_percent_intra >
2762 (cpi->last_frame_percent_intra * 2))) ||
2763 ((cpi->this_frame_percent_intra > 75) &&
2764 (cpi->this_frame_percent_intra >
2765 (cpi->last_frame_percent_intra * 3 / 2))) ||
2766 ((cpi->this_frame_percent_intra > 90) &&
2767 (cpi->this_frame_percent_intra >
2768 (cpi->last_frame_percent_intra + 10)))) {
2769 if (!cm->refresh_golden_frame) code_key_frame = 1;
2772 return code_key_frame;
2775 static void Pass1Encode(VP8_COMP *cpi, size_t *size, unsigned char *dest,
2776 unsigned int *frame_flags) {
2780 vp8_set_quantizer(cpi, 26);
2782 vp8_first_pass(cpi);
2787 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
2790 /* write the frame */
2795 sprintf(filename, "cx\\y%04d.raw", this_frame);
2796 yframe = fopen(filename, "wb");
2798 for (i = 0; i < frame->y_height; ++i)
2799 fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
2802 sprintf(filename, "cx\\u%04d.raw", this_frame);
2803 yframe = fopen(filename, "wb");
2805 for (i = 0; i < frame->uv_height; ++i)
2806 fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
2809 sprintf(filename, "cx\\v%04d.raw", this_frame);
2810 yframe = fopen(filename, "wb");
2812 for (i = 0; i < frame->uv_height; ++i)
2813 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
2818 /* return of 0 means drop frame */
2820 #if !CONFIG_REALTIME_ONLY
2821 /* Function to test for conditions that indeicate we should loop
2822 * back and recode a frame.
2824 static int recode_loop_test(VP8_COMP *cpi, int high_limit, int low_limit, int q,
2825 int maxq, int minq) {
2826 int force_recode = 0;
2827 VP8_COMMON *cm = &cpi->common;
2829 /* Is frame recode allowed at all
2830 * Yes if either recode mode 1 is selected or mode two is selcted
2831 * and the frame is a key frame. golden frame or alt_ref_frame
2833 if ((cpi->sf.recode_loop == 1) ||
2834 ((cpi->sf.recode_loop == 2) &&
2835 ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame ||
2836 cm->refresh_alt_ref_frame))) {
2837 /* General over and under shoot tests */
2838 if (((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
2839 ((cpi->projected_frame_size < low_limit) && (q > minq))) {
2842 /* Special Constrained quality tests */
2843 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
2844 /* Undershoot and below auto cq level */
2845 if ((q > cpi->cq_target_quality) &&
2846 (cpi->projected_frame_size < ((cpi->this_frame_target * 7) >> 3))) {
2849 /* Severe undershoot and between auto and user cq level */
2850 else if ((q > cpi->oxcf.cq_level) &&
2851 (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
2852 (cpi->active_best_quality > cpi->oxcf.cq_level)) {
2854 cpi->active_best_quality = cpi->oxcf.cq_level;
2859 return force_recode;
2861 #endif // !CONFIG_REALTIME_ONLY
2863 static void update_reference_frames(VP8_COMP *cpi) {
2864 VP8_COMMON *cm = &cpi->common;
2865 YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
2867 /* At this point the new frame has been encoded.
2868 * If any buffer copy / swapping is signaled it should be done here.
2871 if (cm->frame_type == KEY_FRAME) {
2872 yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME;
2874 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
2875 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
2877 cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
2879 cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
2880 cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
2881 } else /* For non key frames */
2883 if (cm->refresh_alt_ref_frame) {
2884 assert(!cm->copy_buffer_to_arf);
2886 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
2887 cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
2888 cm->alt_fb_idx = cm->new_fb_idx;
2890 cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
2891 } else if (cm->copy_buffer_to_arf) {
2892 assert(!(cm->copy_buffer_to_arf & ~0x3));
2894 if (cm->copy_buffer_to_arf == 1) {
2895 if (cm->alt_fb_idx != cm->lst_fb_idx) {
2896 yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
2897 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
2898 cm->alt_fb_idx = cm->lst_fb_idx;
2900 cpi->current_ref_frames[ALTREF_FRAME] =
2901 cpi->current_ref_frames[LAST_FRAME];
2903 } else /* if (cm->copy_buffer_to_arf == 2) */
2905 if (cm->alt_fb_idx != cm->gld_fb_idx) {
2906 yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
2907 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
2908 cm->alt_fb_idx = cm->gld_fb_idx;
2910 cpi->current_ref_frames[ALTREF_FRAME] =
2911 cpi->current_ref_frames[GOLDEN_FRAME];
2916 if (cm->refresh_golden_frame) {
2917 assert(!cm->copy_buffer_to_gf);
2919 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
2920 cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
2921 cm->gld_fb_idx = cm->new_fb_idx;
2923 cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
2924 } else if (cm->copy_buffer_to_gf) {
2925 assert(!(cm->copy_buffer_to_arf & ~0x3));
2927 if (cm->copy_buffer_to_gf == 1) {
2928 if (cm->gld_fb_idx != cm->lst_fb_idx) {
2929 yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
2930 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
2931 cm->gld_fb_idx = cm->lst_fb_idx;
2933 cpi->current_ref_frames[GOLDEN_FRAME] =
2934 cpi->current_ref_frames[LAST_FRAME];
2936 } else /* if (cm->copy_buffer_to_gf == 2) */
2938 if (cm->alt_fb_idx != cm->gld_fb_idx) {
2939 yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
2940 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
2941 cm->gld_fb_idx = cm->alt_fb_idx;
2943 cpi->current_ref_frames[GOLDEN_FRAME] =
2944 cpi->current_ref_frames[ALTREF_FRAME];
2950 if (cm->refresh_last_frame) {
2951 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
2952 cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
2953 cm->lst_fb_idx = cm->new_fb_idx;
2955 cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
2958 #if CONFIG_TEMPORAL_DENOISING
2959 if (cpi->oxcf.noise_sensitivity) {
2960 /* we shouldn't have to keep multiple copies as we know in advance which
2961 * buffer we should start - for now to get something up and running
2962 * I've chosen to copy the buffers
2964 if (cm->frame_type == KEY_FRAME) {
2966 for (i = LAST_FRAME; i < MAX_REF_FRAMES; ++i)
2967 vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_running_avg[i]);
2968 } else /* For non key frames */
2970 vp8_yv12_extend_frame_borders(
2971 &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
2973 if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf) {
2974 vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
2975 &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
2977 if (cm->refresh_golden_frame || cm->copy_buffer_to_gf) {
2978 vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
2979 &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
2981 if (cm->refresh_last_frame) {
2982 vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
2983 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
2986 if (cpi->oxcf.noise_sensitivity == 4)
2987 vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_last_source);
2992 static int measure_square_diff_partial(YV12_BUFFER_CONFIG *source,
2993 YV12_BUFFER_CONFIG *dest,
2999 int min_consec_zero_last = 10;
3000 int tot_num_blocks = (source->y_height * source->y_width) >> 8;
3001 unsigned char *src = source->y_buffer;
3002 unsigned char *dst = dest->y_buffer;
3004 /* Loop through the Y plane, every |skip| blocks along rows and colmumns,
3005 * summing the square differences, and only for blocks that have been
3006 * zero_last mode at least |x| frames in a row.
3008 for (i = 0; i < source->y_height; i += 16 * skip) {
3009 int block_index_row = (i >> 4) * cpi->common.mb_cols;
3010 for (j = 0; j < source->y_width; j += 16 * skip) {
3011 int index = block_index_row + (j >> 4);
3012 if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
3014 Total += vpx_mse16x16(src + j, source->y_stride, dst + j,
3015 dest->y_stride, &sse);
3019 src += 16 * skip * source->y_stride;
3020 dst += 16 * skip * dest->y_stride;
3022 // Only return non-zero if we have at least ~1/16 samples for estimate.
3023 if (num_blocks > (tot_num_blocks >> 4)) {
3024 return (Total / num_blocks);
3030 #if CONFIG_TEMPORAL_DENOISING
3031 static void process_denoiser_mode_change(VP8_COMP *cpi) {
3032 const VP8_COMMON *const cm = &cpi->common;
3036 // Number of blocks skipped along row/column in computing the
3037 // nmse (normalized mean square error) of source.
3039 // Only select blocks for computing nmse that have been encoded
3040 // as ZERO LAST min_consec_zero_last frames in a row.
3041 // Scale with number of temporal layers.
3042 int min_consec_zero_last = 12 / cpi->oxcf.number_of_layers;
3043 // Decision is tested for changing the denoising mode every
3044 // num_mode_change times this function is called. Note that this
3045 // function called every 8 frames, so (8 * num_mode_change) is number
3046 // of frames where denoising mode change is tested for switch.
3047 int num_mode_change = 20;
3048 // Framerate factor, to compensate for larger mse at lower framerates.
3049 // Use ref_framerate, which is full source framerate for temporal layers.
3050 // TODO(marpan): Adjust this factor.
3051 int fac_framerate = cpi->ref_framerate < 25.0f ? 80 : 100;
3052 int tot_num_blocks = cm->mb_rows * cm->mb_cols;
3053 int ystride = cpi->Source->y_stride;
3054 unsigned char *src = cpi->Source->y_buffer;
3055 unsigned char *dst = cpi->denoiser.yv12_last_source.y_buffer;
3056 static const unsigned char const_source[16] = { 128, 128, 128, 128, 128, 128,
3057 128, 128, 128, 128, 128, 128,
3058 128, 128, 128, 128 };
3059 int bandwidth = (int)(cpi->target_bandwidth);
3060 // For temporal layers, use full bandwidth (top layer).
3061 if (cpi->oxcf.number_of_layers > 1) {
3062 LAYER_CONTEXT *lc = &cpi->layer_context[cpi->oxcf.number_of_layers - 1];
3063 bandwidth = (int)(lc->target_bandwidth);
3065 // Loop through the Y plane, every skip blocks along rows and columns,
3066 // summing the normalized mean square error, only for blocks that have
3067 // been encoded as ZEROMV LAST at least min_consec_zero_last least frames in
3068 // a row and have small sum difference between current and previous frame.
3069 // Normalization here is by the contrast of the current frame block.
3070 for (i = 0; i < cm->Height; i += 16 * skip) {
3071 int block_index_row = (i >> 4) * cm->mb_cols;
3072 for (j = 0; j < cm->Width; j += 16 * skip) {
3073 int index = block_index_row + (j >> 4);
3074 if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
3076 const unsigned int var =
3077 vpx_variance16x16(src + j, ystride, dst + j, ystride, &sse);
3078 // Only consider this block as valid for noise measurement
3079 // if the sum_diff average of the current and previous frame
3080 // is small (to avoid effects from lighting change).
3081 if ((sse - var) < 128) {
3083 const unsigned int act =
3084 vpx_variance16x16(src + j, ystride, const_source, 0, &sse2);
3085 if (act > 0) total += sse / act;
3090 src += 16 * skip * ystride;
3091 dst += 16 * skip * ystride;
3093 total = total * fac_framerate / 100;
3095 // Only consider this frame as valid sample if we have computed nmse over
3096 // at least ~1/16 blocks, and Total > 0 (Total == 0 can happen if the
3097 // application inputs duplicate frames, or contrast is all zero).
3098 if (total > 0 && (num_blocks > (tot_num_blocks >> 4))) {
3099 // Update the recursive mean square source_diff.
3100 total = (total << 8) / num_blocks;
3101 if (cpi->denoiser.nmse_source_diff_count == 0) {
3102 // First sample in new interval.
3103 cpi->denoiser.nmse_source_diff = total;
3104 cpi->denoiser.qp_avg = cm->base_qindex;
3106 // For subsequent samples, use average with weight ~1/4 for new sample.
3107 cpi->denoiser.nmse_source_diff =
3108 (int)((total + 3 * cpi->denoiser.nmse_source_diff) >> 2);
3109 cpi->denoiser.qp_avg =
3110 (int)((cm->base_qindex + 3 * cpi->denoiser.qp_avg) >> 2);
3112 cpi->denoiser.nmse_source_diff_count++;
3114 // Check for changing the denoiser mode, when we have obtained #samples =
3115 // num_mode_change. Condition the change also on the bitrate and QP.
3116 if (cpi->denoiser.nmse_source_diff_count == num_mode_change) {
3117 // Check for going up: from normal to aggressive mode.
3118 if ((cpi->denoiser.denoiser_mode == kDenoiserOnYUV) &&
3119 (cpi->denoiser.nmse_source_diff >
3120 cpi->denoiser.threshold_aggressive_mode) &&
3121 (cpi->denoiser.qp_avg < cpi->denoiser.qp_threshold_up &&
3122 bandwidth > cpi->denoiser.bitrate_threshold)) {
3123 vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUVAggressive);
3125 // Check for going down: from aggressive to normal mode.
3126 if (((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
3127 (cpi->denoiser.nmse_source_diff <
3128 cpi->denoiser.threshold_aggressive_mode)) ||
3129 ((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
3130 (cpi->denoiser.qp_avg > cpi->denoiser.qp_threshold_down ||
3131 bandwidth < cpi->denoiser.bitrate_threshold))) {
3132 vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
3135 // Reset metric and counter for next interval.
3136 cpi->denoiser.nmse_source_diff = 0;
3137 cpi->denoiser.qp_avg = 0;
3138 cpi->denoiser.nmse_source_diff_count = 0;
3143 void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) {
3144 const FRAME_TYPE frame_type = cm->frame_type;
3146 int update_any_ref_buffers = 1;
3147 if (cpi->common.refresh_last_frame == 0 &&
3148 cpi->common.refresh_golden_frame == 0 &&
3149 cpi->common.refresh_alt_ref_frame == 0) {
3150 update_any_ref_buffers = 0;
3154 cm->filter_level = 0;
3156 struct vpx_usec_timer timer;
3158 vpx_clear_system_state();
3160 vpx_usec_timer_start(&timer);
3161 if (cpi->sf.auto_filter == 0) {
3162 #if CONFIG_TEMPORAL_DENOISING
3163 if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
3164 // Use the denoised buffer for selecting base loop filter level.
3165 // Denoised signal for current frame is stored in INTRA_FRAME.
3166 // No denoising on key frames.
3167 vp8cx_pick_filter_level_fast(
3168 &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi);
3170 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3173 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3176 #if CONFIG_TEMPORAL_DENOISING
3177 if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
3178 // Use the denoised buffer for selecting base loop filter level.
3179 // Denoised signal for current frame is stored in INTRA_FRAME.
3180 // No denoising on key frames.
3181 vp8cx_pick_filter_level(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3184 vp8cx_pick_filter_level(cpi->Source, cpi);
3187 vp8cx_pick_filter_level(cpi->Source, cpi);
3191 if (cm->filter_level > 0) {
3192 vp8cx_set_alt_lf_level(cpi, cm->filter_level);
3195 vpx_usec_timer_mark(&timer);
3196 cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3199 #if CONFIG_MULTITHREAD
3200 if (cpi->b_multi_threaded) {
3201 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3205 // No need to apply loop-filter if the encoded frame does not update
3206 // any reference buffers.
3207 if (cm->filter_level > 0 && update_any_ref_buffers) {
3208 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
3211 vp8_yv12_extend_frame_borders(cm->frame_to_show);
3214 static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
3215 unsigned char *dest,
3216 unsigned char *dest_end,
3217 unsigned int *frame_flags) {
3219 int frame_over_shoot_limit;
3220 int frame_under_shoot_limit;
3225 VP8_COMMON *cm = &cpi->common;
3226 int active_worst_qchanged = 0;
3228 #if !CONFIG_REALTIME_ONLY
3232 int zbin_oq_low = 0;
3235 int overshoot_seen = 0;
3236 int undershoot_seen = 0;
3239 int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
3240 cpi->oxcf.optimal_buffer_level / 100);
3241 int drop_mark75 = drop_mark * 2 / 3;
3242 int drop_mark50 = drop_mark / 4;
3243 int drop_mark25 = drop_mark / 8;
3245 /* Clear down mmx registers to allow floating point in what follows */
3246 vpx_clear_system_state();
3248 if (cpi->force_next_frame_intra) {
3249 cm->frame_type = KEY_FRAME; /* delayed intra frame */
3250 cpi->force_next_frame_intra = 0;
3253 /* For an alt ref frame in 2 pass we skip the call to the second pass
3254 * function that sets the target bandwidth
3256 switch (cpi->pass) {
3257 #if !CONFIG_REALTIME_ONLY
3259 if (cpi->common.refresh_alt_ref_frame) {
3260 /* Per frame bit target for the alt ref frame */
3261 cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
3262 /* per second target bitrate */
3263 cpi->target_bandwidth =
3264 (int)(cpi->twopass.gf_bits * cpi->output_framerate);
3267 #endif // !CONFIG_REALTIME_ONLY
3269 cpi->per_frame_bandwidth =
3270 (int)(cpi->target_bandwidth / cpi->output_framerate);
3274 /* Default turn off buffer to buffer copying */
3275 cm->copy_buffer_to_gf = 0;
3276 cm->copy_buffer_to_arf = 0;
3278 /* Clear zbin over-quant value and mode boost values. */
3279 cpi->mb.zbin_over_quant = 0;
3280 cpi->mb.zbin_mode_boost = 0;
3282 /* Enable or disable mode based tweaking of the zbin
3283 * For 2 Pass Only used where GF/ARF prediction quality
3284 * is above a threshold
3286 cpi->mb.zbin_mode_boost_enabled = 1;
3287 if (cpi->pass == 2) {
3288 if (cpi->gfu_boost <= 400) {
3289 cpi->mb.zbin_mode_boost_enabled = 0;
3293 /* Current default encoder behaviour for the altref sign bias */
3294 if (cpi->source_alt_ref_active) {
3295 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3297 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3300 /* Check to see if a key frame is signaled
3301 * For two pass with auto key frame enabled cm->frame_type may already
3302 * be set, but not for one pass.
3304 if ((cm->current_video_frame == 0) || (cm->frame_flags & FRAMEFLAGS_KEY) ||
3305 (cpi->oxcf.auto_key &&
3306 (cpi->frames_since_key % cpi->key_frame_frequency == 0))) {
3307 /* Key frame from VFW/auto-keyframe/first frame */
3308 cm->frame_type = KEY_FRAME;
3309 #if CONFIG_TEMPORAL_DENOISING
3310 if (cpi->oxcf.noise_sensitivity == 4) {
3311 // For adaptive mode, reset denoiser to normal mode on key frame.
3312 vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
3317 #if CONFIG_MULTI_RES_ENCODING
3318 if (cpi->oxcf.mr_total_resolutions > 1) {
3319 LOWER_RES_FRAME_INFO *low_res_frame_info =
3320 (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
3322 if (cpi->oxcf.mr_encoder_id) {
3323 // TODO(marpan): This constraint shouldn't be needed, as we would like
3324 // to allow for key frame setting (forced or periodic) defined per
3325 // spatial layer. For now, keep this in.
3326 cm->frame_type = low_res_frame_info->frame_type;
3328 // Check if lower resolution is available for motion vector reuse.
3329 if (cm->frame_type != KEY_FRAME) {
3330 cpi->mr_low_res_mv_avail = 1;
3331 cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);
3333 if (cpi->ref_frame_flags & VP8_LAST_FRAME)
3334 cpi->mr_low_res_mv_avail &=
3335 (cpi->current_ref_frames[LAST_FRAME] ==
3336 low_res_frame_info->low_res_ref_frames[LAST_FRAME]);
3338 if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
3339 cpi->mr_low_res_mv_avail &=
3340 (cpi->current_ref_frames[GOLDEN_FRAME] ==
3341 low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);
3343 // Don't use altref to determine whether low res is available.
3344 // TODO (marpan): Should we make this type of condition on a
3345 // per-reference frame basis?
3347 if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
3348 cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
3349 == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
3354 // On a key frame: For the lowest resolution, keep track of the key frame
3355 // counter value. For the higher resolutions, reset the current video
3356 // frame counter to that of the lowest resolution.
3357 // This is done to the handle the case where we may stop/start encoding
3358 // higher layer(s). The restart-encoding of higher layer is only signaled
3359 // by a key frame for now.
3360 // TODO (marpan): Add flag to indicate restart-encoding of higher layer.
3361 if (cm->frame_type == KEY_FRAME) {
3362 if (cpi->oxcf.mr_encoder_id) {
3363 // If the initial starting value of the buffer level is zero (this can
3364 // happen because we may have not started encoding this higher stream),
3365 // then reset it to non-zero value based on |starting_buffer_level|.
3366 if (cpi->common.current_video_frame == 0 && cpi->buffer_level == 0) {
3368 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
3369 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
3370 for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
3371 LAYER_CONTEXT *lc = &cpi->layer_context[i];
3372 lc->bits_off_target = lc->starting_buffer_level;
3373 lc->buffer_level = lc->starting_buffer_level;
3376 cpi->common.current_video_frame =
3377 low_res_frame_info->key_frame_counter_value;
3379 low_res_frame_info->key_frame_counter_value =
3380 cpi->common.current_video_frame;
3386 // Find the reference frame closest to the current frame.
3387 cpi->closest_reference_frame = LAST_FRAME;
3388 if (cm->frame_type != KEY_FRAME) {
3390 MV_REFERENCE_FRAME closest_ref = INTRA_FRAME;
3391 if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
3392 closest_ref = LAST_FRAME;
3393 } else if (cpi->ref_frame_flags & VP8_GOLD_FRAME) {
3394 closest_ref = GOLDEN_FRAME;
3395 } else if (cpi->ref_frame_flags & VP8_ALTR_FRAME) {
3396 closest_ref = ALTREF_FRAME;
3398 for (i = 1; i <= 3; ++i) {
3399 vpx_ref_frame_type_t ref_frame_type =
3400 (vpx_ref_frame_type_t)((i == 3) ? 4 : i);
3401 if (cpi->ref_frame_flags & ref_frame_type) {
3402 if ((cm->current_video_frame - cpi->current_ref_frames[i]) <
3403 (cm->current_video_frame - cpi->current_ref_frames[closest_ref])) {
3408 cpi->closest_reference_frame = closest_ref;
3411 /* Set various flags etc to special state if it is a key frame */
3412 if (cm->frame_type == KEY_FRAME) {
3415 // Set the loop filter deltas and segmentation map update
3416 setup_features(cpi);
3418 /* The alternate reference frame cannot be active for a key frame */
3419 cpi->source_alt_ref_active = 0;
3421 /* Reset the RD threshold multipliers to default of * 1 (128) */
3422 for (i = 0; i < MAX_MODES; ++i) {
3423 cpi->mb.rd_thresh_mult[i] = 128;
3426 // Reset the zero_last counter to 0 on key frame.
3427 memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
3428 memset(cpi->consec_zero_last_mvbias, 0,
3429 (cpi->common.mb_rows * cpi->common.mb_cols));
3433 /* Experimental code for lagged compress and one pass
3434 * Initialise one_pass GF frames stats
3435 * Update stats used for GF selection
3438 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3440 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3441 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3442 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3443 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3444 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3445 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3446 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3447 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3448 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3452 update_rd_ref_frame_probs(cpi);
3454 if (cpi->drop_frames_allowed) {
3455 /* The reset to decimation 0 is only done here for one pass.
3456 * Once it is set two pass leaves decimation on till the next kf.
3458 if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0)) {
3459 cpi->decimation_factor--;
3462 if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0) {
3463 cpi->decimation_factor = 1;
3465 } else if (cpi->buffer_level < drop_mark25 &&
3466 (cpi->decimation_factor == 2 || cpi->decimation_factor == 3)) {
3467 cpi->decimation_factor = 3;
3468 } else if (cpi->buffer_level < drop_mark50 &&
3469 (cpi->decimation_factor == 1 || cpi->decimation_factor == 2)) {
3470 cpi->decimation_factor = 2;
3471 } else if (cpi->buffer_level < drop_mark75 &&
3472 (cpi->decimation_factor == 0 || cpi->decimation_factor == 1)) {
3473 cpi->decimation_factor = 1;
3477 /* The following decimates the frame rate according to a regular
3478 * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
3479 * prevent buffer under-run in CBR mode. Alternatively it might be
3480 * desirable in some situations to drop frame rate but throw more bits
3483 * Note that dropping a key frame can be problematic if spatial
3484 * resampling is also active
3486 if (cpi->decimation_factor > 0) {
3487 switch (cpi->decimation_factor) {
3489 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
3492 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3495 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3499 /* Note that we should not throw out a key frame (especially when
3500 * spatial resampling is enabled).
3502 if (cm->frame_type == KEY_FRAME) {
3503 cpi->decimation_count = cpi->decimation_factor;
3504 } else if (cpi->decimation_count > 0) {
3505 cpi->decimation_count--;
3507 cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3508 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
3509 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
3512 #if CONFIG_MULTI_RES_ENCODING
3513 vp8_store_drop_frame_info(cpi);
3516 cm->current_video_frame++;
3517 cpi->frames_since_key++;
3518 // We advance the temporal pattern for dropped frames.
3519 cpi->temporal_pattern_counter++;
3521 #if CONFIG_INTERNAL_STATS
3525 cpi->buffer_level = cpi->bits_off_target;
3527 if (cpi->oxcf.number_of_layers > 1) {
3530 /* Propagate bits saved by dropping the frame to higher
3533 for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
3534 LAYER_CONTEXT *lc = &cpi->layer_context[i];
3535 lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate);
3536 if (lc->bits_off_target > lc->maximum_buffer_size) {
3537 lc->bits_off_target = lc->maximum_buffer_size;
3539 lc->buffer_level = lc->bits_off_target;
3545 cpi->decimation_count = cpi->decimation_factor;
3548 cpi->decimation_count = 0;
3551 /* Decide how big to make the frame */
3552 if (!vp8_pick_frame_size(cpi)) {
3553 /*TODO: 2 drop_frame and return code could be put together. */
3554 #if CONFIG_MULTI_RES_ENCODING
3555 vp8_store_drop_frame_info(cpi);
3557 cm->current_video_frame++;
3558 cpi->frames_since_key++;
3559 // We advance the temporal pattern for dropped frames.
3560 cpi->temporal_pattern_counter++;
3564 /* Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
3565 * This has a knock on effect on active best quality as well.
3566 * For CBR if the buffer reaches its maximum level then we can no longer
3567 * save up bits for later frames so we might as well use them up
3568 * on the current frame.
3570 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
3571 (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) &&
3572 cpi->buffered_mode) {
3573 /* Max adjustment is 1/4 */
3574 int Adjustment = cpi->active_worst_quality / 4;
3579 if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size) {
3580 buff_lvl_step = (int)((cpi->oxcf.maximum_buffer_size -
3581 cpi->oxcf.optimal_buffer_level) /
3584 if (buff_lvl_step) {
3586 (int)((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) /
3593 cpi->active_worst_quality -= Adjustment;
3595 if (cpi->active_worst_quality < cpi->active_best_quality) {
3596 cpi->active_worst_quality = cpi->active_best_quality;
3601 /* Set an active best quality and if necessary active worst quality
3602 * There is some odd behavior for one pass here that needs attention.
3604 if ((cpi->pass == 2) || (cpi->ni_frames > 150)) {
3605 vpx_clear_system_state();
3607 Q = cpi->active_worst_quality;
3609 if (cm->frame_type == KEY_FRAME) {
3610 if (cpi->pass == 2) {
3611 if (cpi->gfu_boost > 600) {
3612 cpi->active_best_quality = kf_low_motion_minq[Q];
3614 cpi->active_best_quality = kf_high_motion_minq[Q];
3617 /* Special case for key frames forced because we have reached
3618 * the maximum key frame interval. Here force the Q to a range
3619 * based on the ambient Q to reduce the risk of popping
3621 if (cpi->this_key_frame_forced) {
3622 if (cpi->active_best_quality > cpi->avg_frame_qindex * 7 / 8) {
3623 cpi->active_best_quality = cpi->avg_frame_qindex * 7 / 8;
3624 } else if (cpi->active_best_quality<cpi->avg_frame_qindex>> 2) {
3625 cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3629 /* One pass more conservative */
3631 cpi->active_best_quality = kf_high_motion_minq[Q];
3635 else if (cpi->oxcf.number_of_layers == 1 &&
3636 (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame)) {
3637 /* Use the lower of cpi->active_worst_quality and recent
3638 * average Q as basis for GF/ARF Q limit unless last frame was
3641 if ((cpi->frames_since_key > 1) &&
3642 (cpi->avg_frame_qindex < cpi->active_worst_quality)) {
3643 Q = cpi->avg_frame_qindex;
3646 /* For constrained quality dont allow Q less than the cq level */
3647 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3648 (Q < cpi->cq_target_quality)) {
3649 Q = cpi->cq_target_quality;
3652 if (cpi->pass == 2) {
3653 if (cpi->gfu_boost > 1000) {
3654 cpi->active_best_quality = gf_low_motion_minq[Q];
3655 } else if (cpi->gfu_boost < 400) {
3656 cpi->active_best_quality = gf_high_motion_minq[Q];
3658 cpi->active_best_quality = gf_mid_motion_minq[Q];
3661 /* Constrained quality use slightly lower active best. */
3662 if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
3663 cpi->active_best_quality = cpi->active_best_quality * 15 / 16;
3666 /* One pass more conservative */
3668 cpi->active_best_quality = gf_high_motion_minq[Q];
3671 cpi->active_best_quality = inter_minq[Q];
3673 /* For the constant/constrained quality mode we dont want
3674 * q to fall below the cq level.
3676 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3677 (cpi->active_best_quality < cpi->cq_target_quality)) {
3678 /* If we are strongly undershooting the target rate in the last
3679 * frames then use the user passed in cq value not the auto
3682 if (cpi->rolling_actual_bits < cpi->min_frame_bandwidth) {
3683 cpi->active_best_quality = cpi->oxcf.cq_level;
3685 cpi->active_best_quality = cpi->cq_target_quality;
3690 /* If CBR and the buffer is as full then it is reasonable to allow
3691 * higher quality on the frames to prevent bits just going to waste.
3693 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
3694 /* Note that the use of >= here elliminates the risk of a devide
3695 * by 0 error in the else if clause
3697 if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size) {
3698 cpi->active_best_quality = cpi->best_quality;
3700 } else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level) {
3702 (int)(((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128) /
3703 (cpi->oxcf.maximum_buffer_size -
3704 cpi->oxcf.optimal_buffer_level));
3705 int min_qadjustment =
3706 ((cpi->active_best_quality - cpi->best_quality) * Fraction) / 128;
3708 cpi->active_best_quality -= min_qadjustment;
3712 /* Make sure constrained quality mode limits are adhered to for the first
3713 * few frames of one pass encodes
3715 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
3716 if ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame ||
3717 cpi->common.refresh_alt_ref_frame) {
3718 cpi->active_best_quality = cpi->best_quality;
3719 } else if (cpi->active_best_quality < cpi->cq_target_quality) {
3720 cpi->active_best_quality = cpi->cq_target_quality;
3724 /* Clip the active best and worst quality values to limits */
3725 if (cpi->active_worst_quality > cpi->worst_quality) {
3726 cpi->active_worst_quality = cpi->worst_quality;
3729 if (cpi->active_best_quality < cpi->best_quality) {
3730 cpi->active_best_quality = cpi->best_quality;
3733 if (cpi->active_worst_quality < cpi->active_best_quality) {
3734 cpi->active_worst_quality = cpi->active_best_quality;
3737 /* Determine initial Q to try */
3738 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3740 #if !CONFIG_REALTIME_ONLY
3742 /* Set highest allowed value for Zbin over quant */
3743 if (cm->frame_type == KEY_FRAME) {
3745 } else if ((cpi->oxcf.number_of_layers == 1) &&
3746 ((cm->refresh_alt_ref_frame ||
3747 (cm->refresh_golden_frame && !cpi->source_alt_ref_active)))) {
3750 zbin_oq_high = ZBIN_OQ_MAX;
3754 /* Setup background Q adjustment for error resilient mode.
3755 * For multi-layer encodes only enable this for the base layer.
3757 if (cpi->cyclic_refresh_mode_enabled) {
3758 // Special case for screen_content_mode with golden frame updates.
3760 (cpi->oxcf.screen_content_mode == 2 && cm->refresh_golden_frame);
3761 if (cpi->current_layer == 0 && cpi->force_maxqp == 0 && !disable_cr_gf) {
3762 cyclic_background_refresh(cpi, Q, 0);
3764 disable_segmentation(cpi);
3768 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
3769 &frame_over_shoot_limit);
3771 #if !CONFIG_REALTIME_ONLY
3772 /* Limit Q range for the adaptive loop. */
3773 bottom_index = cpi->active_best_quality;
3774 top_index = cpi->active_worst_quality;
3775 q_low = cpi->active_best_quality;
3776 q_high = cpi->active_worst_quality;
3779 vp8_save_coding_context(cpi);
3783 scale_and_extend_source(cpi->un_scaled_source, cpi);
3785 #if CONFIG_TEMPORAL_DENOISING && CONFIG_POSTPROC
3786 // Option to apply spatial blur under the aggressive or adaptive
3787 // (temporal denoising) mode.
3788 if (cpi->oxcf.noise_sensitivity >= 3) {
3789 if (cpi->denoiser.denoise_pars.spatial_blur != 0) {
3790 vp8_de_noise(cm, cpi->Source, cpi->Source,
3791 cpi->denoiser.denoise_pars.spatial_blur, 1, 0, 0);
3796 #if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
3798 if (cpi->oxcf.noise_sensitivity > 0) {
3802 switch (cpi->oxcf.noise_sensitivity) {
3803 case 1: l = 20; break;
3804 case 2: l = 40; break;
3805 case 3: l = 60; break;
3806 case 4: l = 80; break;
3807 case 5: l = 100; break;
3808 case 6: l = 150; break;
3811 if (cm->frame_type == KEY_FRAME) {
3812 vp8_de_noise(cm, cpi->Source, cpi->Source, l, 1, 0, 1);
3814 vp8_de_noise(cm, cpi->Source, cpi->Source, l, 1, 0, 1);
3816 src = cpi->Source->y_buffer;
3818 if (cpi->Source->y_stride < 0) {
3819 src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
3826 #ifdef OUTPUT_YUV_SRC
3827 vp8_write_yuv_frame(yuv_file, cpi->Source);
3831 vpx_clear_system_state();
3833 vp8_set_quantizer(cpi, Q);
3835 /* setup skip prob for costing in mode/mv decision */
3836 if (cpi->common.mb_no_coeff_skip) {
3837 cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
3839 if (cm->frame_type != KEY_FRAME) {
3840 if (cpi->common.refresh_alt_ref_frame) {
3841 if (cpi->last_skip_false_probs[2] != 0) {
3842 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3846 if(cpi->last_skip_false_probs[2]!=0 && abs(Q-
3847 cpi->last_skip_probs_q[2])<=16 )
3848 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3849 else if (cpi->last_skip_false_probs[2]!=0)
3850 cpi->prob_skip_false = (cpi->last_skip_false_probs[2] +
3851 cpi->prob_skip_false ) / 2;
3853 } else if (cpi->common.refresh_golden_frame) {
3854 if (cpi->last_skip_false_probs[1] != 0) {
3855 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3859 if(cpi->last_skip_false_probs[1]!=0 && abs(Q-
3860 cpi->last_skip_probs_q[1])<=16 )
3861 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3862 else if (cpi->last_skip_false_probs[1]!=0)
3863 cpi->prob_skip_false = (cpi->last_skip_false_probs[1] +
3864 cpi->prob_skip_false ) / 2;
3867 if (cpi->last_skip_false_probs[0] != 0) {
3868 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3872 if(cpi->last_skip_false_probs[0]!=0 && abs(Q-
3873 cpi->last_skip_probs_q[0])<=16 )
3874 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3875 else if(cpi->last_skip_false_probs[0]!=0)
3876 cpi->prob_skip_false = (cpi->last_skip_false_probs[0] +
3877 cpi->prob_skip_false ) / 2;
3881 /* as this is for cost estimate, let's make sure it does not
3882 * go extreme eitehr way
3884 if (cpi->prob_skip_false < 5) cpi->prob_skip_false = 5;
3886 if (cpi->prob_skip_false > 250) cpi->prob_skip_false = 250;
3888 if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref) {
3889 cpi->prob_skip_false = 1;
3897 FILE *f = fopen("skip.stt", "a");
3898 fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
3905 if (cm->frame_type == KEY_FRAME) {
3906 if (resize_key_frame(cpi)) {
3907 /* If the frame size has changed, need to reset Q, quantizer,
3908 * and background refresh.
3910 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3911 if (cpi->cyclic_refresh_mode_enabled) {
3912 if (cpi->current_layer == 0) {
3913 cyclic_background_refresh(cpi, Q, 0);
3915 disable_segmentation(cpi);
3918 // Reset the zero_last counter to 0 on key frame.
3919 memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
3920 memset(cpi->consec_zero_last_mvbias, 0,
3921 (cpi->common.mb_rows * cpi->common.mb_cols));
3922 vp8_set_quantizer(cpi, Q);
3925 vp8_setup_key_frame(cpi);
3928 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
3930 if (cpi->oxcf.error_resilient_mode) cm->refresh_entropy_probs = 0;
3932 if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) {
3933 if (cm->frame_type == KEY_FRAME) cm->refresh_entropy_probs = 1;
3936 if (cm->refresh_entropy_probs == 0) {
3937 /* save a copy for later refresh */
3938 memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
3941 vp8_update_coef_context(cpi);
3943 vp8_update_coef_probs(cpi);
3945 /* transform / motion compensation build reconstruction frame
3946 * +pack coef partitions
3948 vp8_encode_frame(cpi);
3950 /* cpi->projected_frame_size is not needed for RT mode */
3953 /* transform / motion compensation build reconstruction frame */
3954 vp8_encode_frame(cpi);
3955 if (cpi->oxcf.screen_content_mode == 2) {
3956 if (vp8_drop_encodedframe_overshoot(cpi, Q)) return;
3959 cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
3960 cpi->projected_frame_size =
3961 (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
3963 vpx_clear_system_state();
3965 /* Test to see if the stats generated for this frame indicate that
3966 * we should have coded a key frame (assuming that we didn't)!
3969 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME &&
3970 cpi->compressor_speed != 2) {
3971 #if !CONFIG_REALTIME_ONLY
3972 if (decide_key_frame(cpi)) {
3973 /* Reset all our sizing numbers and recode */
3974 cm->frame_type = KEY_FRAME;
3976 vp8_pick_frame_size(cpi);
3978 /* Clear the Alt reference frame active flag when we have
3981 cpi->source_alt_ref_active = 0;
3983 // Set the loop filter deltas and segmentation map update
3984 setup_features(cpi);
3986 vp8_restore_coding_context(cpi);
3988 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3990 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
3991 &frame_over_shoot_limit);
3993 /* Limit Q range for the adaptive loop. */
3994 bottom_index = cpi->active_best_quality;
3995 top_index = cpi->active_worst_quality;
3996 q_low = cpi->active_best_quality;
3997 q_high = cpi->active_worst_quality;
4007 vpx_clear_system_state();
4009 if (frame_over_shoot_limit == 0) frame_over_shoot_limit = 1;
4011 /* Are we are overshooting and up against the limit of active max Q. */
4012 if (((cpi->pass != 2) ||
4013 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
4014 (Q == cpi->active_worst_quality) &&
4015 (cpi->active_worst_quality < cpi->worst_quality) &&
4016 (cpi->projected_frame_size > frame_over_shoot_limit)) {
4017 int over_size_percent =
4018 ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) /
4019 frame_over_shoot_limit;
4021 /* If so is there any scope for relaxing it */
4022 while ((cpi->active_worst_quality < cpi->worst_quality) &&
4023 (over_size_percent > 0)) {
4024 cpi->active_worst_quality++;
4025 /* Assume 1 qstep = about 4% on frame size. */
4026 over_size_percent = (int)(over_size_percent * 0.96);
4028 #if !CONFIG_REALTIME_ONLY
4029 top_index = cpi->active_worst_quality;
4030 #endif // !CONFIG_REALTIME_ONLY
4031 /* If we have updated the active max Q do not call
4032 * vp8_update_rate_correction_factors() this loop.
4034 active_worst_qchanged = 1;
4036 active_worst_qchanged = 0;
4039 #if CONFIG_REALTIME_ONLY
4042 /* Special case handling for forced key frames */
4043 if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
4045 int kf_err = vp8_calc_ss_err(cpi->Source, &cm->yv12_fb[cm->new_fb_idx]);
4047 /* The key frame is not good enough */
4048 if (kf_err > ((cpi->ambient_err * 7) >> 3)) {
4050 q_high = (Q > q_low) ? (Q - 1) : q_low;
4053 Q = (q_high + q_low) >> 1;
4055 /* The key frame is much better than the previous frame */
4056 else if (kf_err < (cpi->ambient_err >> 1)) {
4058 q_low = (Q < q_high) ? (Q + 1) : q_high;
4061 Q = (q_high + q_low + 1) >> 1;
4064 /* Clamp Q to upper and lower limits: */
4067 } else if (Q < q_low) {
4074 /* Is the projected frame size out of range and are we allowed
4075 * to attempt to recode.
4077 else if (recode_loop_test(cpi, frame_over_shoot_limit,
4078 frame_under_shoot_limit, Q, top_index,
4083 /* Frame size out of permitted range. Update correction factor
4084 * & compute new Q to try...
4087 /* Frame is too large */
4088 if (cpi->projected_frame_size > cpi->this_frame_target) {
4089 /* Raise Qlow as to at least the current value */
4090 q_low = (Q < q_high) ? (Q + 1) : q_high;
4092 /* If we are using over quant do the same for zbin_oq_low */
4093 if (cpi->mb.zbin_over_quant > 0) {
4094 zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high)
4095 ? (cpi->mb.zbin_over_quant + 1)
4099 if (undershoot_seen) {
4100 /* Update rate_correction_factor unless
4101 * cpi->active_worst_quality has changed.
4103 if (!active_worst_qchanged) {
4104 vp8_update_rate_correction_factors(cpi, 1);
4107 Q = (q_high + q_low + 1) / 2;
4109 /* Adjust cpi->zbin_over_quant (only allowed when Q
4113 cpi->mb.zbin_over_quant = 0;
4115 zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high)
4116 ? (cpi->mb.zbin_over_quant + 1)
4118 cpi->mb.zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
4121 /* Update rate_correction_factor unless
4122 * cpi->active_worst_quality has changed.
4124 if (!active_worst_qchanged) {
4125 vp8_update_rate_correction_factors(cpi, 0);
4128 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4130 while (((Q < q_low) || (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
4132 vp8_update_rate_correction_factors(cpi, 0);
4133 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4140 /* Frame is too small */
4142 if (cpi->mb.zbin_over_quant == 0) {
4143 /* Lower q_high if not using over quant */
4144 q_high = (Q > q_low) ? (Q - 1) : q_low;
4146 /* else lower zbin_oq_high */
4147 zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low)
4148 ? (cpi->mb.zbin_over_quant - 1)
4152 if (overshoot_seen) {
4153 /* Update rate_correction_factor unless
4154 * cpi->active_worst_quality has changed.
4156 if (!active_worst_qchanged) {
4157 vp8_update_rate_correction_factors(cpi, 1);
4160 Q = (q_high + q_low) / 2;
4162 /* Adjust cpi->zbin_over_quant (only allowed when Q
4166 cpi->mb.zbin_over_quant = 0;
4168 cpi->mb.zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
4171 /* Update rate_correction_factor unless
4172 * cpi->active_worst_quality has changed.
4174 if (!active_worst_qchanged) {
4175 vp8_update_rate_correction_factors(cpi, 0);
4178 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4180 /* Special case reset for qlow for constrained quality.
4181 * This should only trigger where there is very substantial
4182 * undershoot on a frame and the auto cq level is above
4183 * the user passsed in value.
4185 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4190 while (((Q > q_high) || (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
4192 vp8_update_rate_correction_factors(cpi, 0);
4193 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4198 undershoot_seen = 1;
4201 /* Clamp Q to upper and lower limits: */
4204 } else if (Q < q_low) {
4208 /* Clamp cpi->zbin_over_quant */
4209 cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low)
4211 : (cpi->mb.zbin_over_quant > zbin_oq_high)
4213 : cpi->mb.zbin_over_quant;
4219 #endif // CONFIG_REALTIME_ONLY
4221 if (cpi->is_src_frame_alt_ref) Loop = 0;
4224 vp8_restore_coding_context(cpi);
4226 #if CONFIG_INTERNAL_STATS
4227 cpi->tot_recode_hits++;
4230 } while (Loop == 1);
4232 #if defined(DROP_UNCODED_FRAMES)
4233 /* if there are no coded macroblocks at all drop this frame */
4234 if (cpi->common.MBs == cpi->mb.skip_true_count &&
4235 (cpi->drop_frame_count & 7) != 7 && cm->frame_type != KEY_FRAME) {
4236 cpi->common.current_video_frame++;
4237 cpi->frames_since_key++;
4238 cpi->drop_frame_count++;
4239 // We advance the temporal pattern for dropped frames.
4240 cpi->temporal_pattern_counter++;
4243 cpi->drop_frame_count = 0;
4247 /* Experimental code for lagged and one pass
4248 * Update stats used for one pass GF selection
4251 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4252 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4253 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4257 /* Special case code to reduce pulsing when key frames are forced at a
4258 * fixed interval. Note the reconstruction error if it is the frame before
4259 * the force key frame
4261 if (cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0)) {
4263 vp8_calc_ss_err(cpi->Source, &cm->yv12_fb[cm->new_fb_idx]);
4266 /* This frame's MVs are saved and will be used in next frame's MV predictor.
4267 * Last frame has one more line(add to bottom) and one more column(add to
4268 * right) than cm->mip. The edge elements are initialized to 0.
4270 #if CONFIG_MULTI_RES_ENCODING
4271 if (!cpi->oxcf.mr_encoder_id && cm->show_frame)
4273 if (cm->show_frame) /* do not save for altref frame */
4278 /* Point to beginning of allocated MODE_INFO arrays. */
4279 MODE_INFO *tmp = cm->mip;
4281 if (cm->frame_type != KEY_FRAME) {
4282 for (mb_row = 0; mb_row < cm->mb_rows + 1; ++mb_row) {
4283 for (mb_col = 0; mb_col < cm->mb_cols + 1; ++mb_col) {
4284 if (tmp->mbmi.ref_frame != INTRA_FRAME) {
4285 cpi->lfmv[mb_col + mb_row * (cm->mode_info_stride + 1)].as_int =
4286 tmp->mbmi.mv.as_int;
4289 cpi->lf_ref_frame_sign_bias[mb_col +
4290 mb_row * (cm->mode_info_stride + 1)] =
4291 cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4292 cpi->lf_ref_frame[mb_col + mb_row * (cm->mode_info_stride + 1)] =
4293 tmp->mbmi.ref_frame;
4300 /* Count last ref frame 0,0 usage on current encoded frame. */
4304 /* Point to beginning of MODE_INFO arrays. */
4305 MODE_INFO *tmp = cm->mi;
4307 cpi->zeromv_count = 0;
4309 if (cm->frame_type != KEY_FRAME) {
4310 for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
4311 for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
4312 if (tmp->mbmi.mode == ZEROMV && tmp->mbmi.ref_frame == LAST_FRAME) {
4313 cpi->zeromv_count++;
4322 #if CONFIG_MULTI_RES_ENCODING
4323 vp8_cal_dissimilarity(cpi);
4326 /* Update the GF useage maps.
4327 * This is done after completing the compression of a frame when all
4328 * modes etc. are finalized but before loop filter
4330 if (cpi->oxcf.number_of_layers == 1) {
4331 vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4334 if (cm->frame_type == KEY_FRAME) cm->refresh_last_frame = 1;
4338 FILE *f = fopen("gfactive.stt", "a");
4339 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);
4344 /* For inter frames the current default behavior is that when
4345 * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4346 * This is purely an encoder decision at present.
4348 if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame) {
4349 cm->copy_buffer_to_arf = 2;
4351 cm->copy_buffer_to_arf = 0;
4354 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4356 #if CONFIG_TEMPORAL_DENOISING
4357 // Get some measure of the amount of noise, by measuring the (partial) mse
4358 // between source and denoised buffer, for y channel. Partial refers to
4359 // computing the sse for a sub-sample of the frame (i.e., skip x blocks along
4361 // and only for blocks in that set that are consecutive ZEROMV_LAST mode.
4362 // Do this every ~8 frames, to further reduce complexity.
4363 // TODO(marpan): Keep this for now for the case cpi->oxcf.noise_sensitivity <
4365 // should be removed in favor of the process_denoiser_mode_change() function
4367 if (cpi->oxcf.noise_sensitivity > 0 && cpi->oxcf.noise_sensitivity < 4 &&
4368 !cpi->oxcf.screen_content_mode && cpi->frames_since_key % 8 == 0 &&
4369 cm->frame_type != KEY_FRAME) {
4370 cpi->mse_source_denoised = measure_square_diff_partial(
4371 &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi->Source, cpi);
4374 // For the adaptive denoising mode (noise_sensitivity == 4), sample the mse
4375 // of source diff (between current and previous frame), and determine if we
4376 // should switch the denoiser mode. Sampling refers to computing the mse for
4377 // a sub-sample of the frame (i.e., skip x blocks along row/column), and
4378 // only for blocks in that set that have used ZEROMV LAST, along with some
4379 // constraint on the sum diff between blocks. This process is called every
4380 // ~8 frames, to further reduce complexity.
4381 if (cpi->oxcf.noise_sensitivity == 4 && !cpi->oxcf.screen_content_mode &&
4382 cpi->frames_since_key % 8 == 0 && cm->frame_type != KEY_FRAME) {
4383 process_denoiser_mode_change(cpi);
4387 #if CONFIG_MULTITHREAD
4388 if (cpi->b_multi_threaded) {
4389 /* start loopfilter in separate thread */
4390 sem_post(&cpi->h_event_start_lpf);
4391 cpi->b_lpf_running = 1;
4395 vp8_loopfilter_frame(cpi, cm);
4398 update_reference_frames(cpi);
4400 #ifdef OUTPUT_YUV_DENOISED
4401 vp8_write_yuv_frame(yuv_denoised_file,
4402 &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
4405 #if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
4406 if (cpi->oxcf.error_resilient_mode) {
4407 cm->refresh_entropy_probs = 0;
4411 #if CONFIG_MULTITHREAD
4412 /* wait that filter_level is picked so that we can continue with stream
4414 if (cpi->b_multi_threaded) sem_wait(&cpi->h_event_end_lpf);
4417 /* build the bitstream */
4418 vp8_pack_bitstream(cpi, dest, dest_end, size);
4420 /* Move storing frame_type out of the above loop since it is also
4421 * needed in motion search besides loopfilter */
4422 cm->last_frame_type = cm->frame_type;
4424 /* Update rate control heuristics */
4425 cpi->total_byte_count += (*size);
4426 cpi->projected_frame_size = (int)(*size) << 3;
4428 if (cpi->oxcf.number_of_layers > 1) {
4430 for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
4431 cpi->layer_context[i].total_byte_count += (*size);
4435 if (!active_worst_qchanged) vp8_update_rate_correction_factors(cpi, 2);
4437 cpi->last_q[cm->frame_type] = cm->base_qindex;
4439 if (cm->frame_type == KEY_FRAME) {
4440 vp8_adjust_key_frame_context(cpi);
4443 /* Keep a record of ambient average Q. */
4444 if (cm->frame_type != KEY_FRAME) {
4445 cpi->avg_frame_qindex =
4446 (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4449 /* Keep a record from which we can calculate the average Q excluding
4450 * GF updates and key frames
4452 if ((cm->frame_type != KEY_FRAME) &&
4453 ((cpi->oxcf.number_of_layers > 1) ||
4454 (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame))) {
4457 /* Calculate the average Q for normal inter frames (not key or GFU
4460 if (cpi->pass == 2) {
4461 cpi->ni_tot_qi += Q;
4462 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4464 /* Damp value for first few frames */
4465 if (cpi->ni_frames > 150) {
4466 cpi->ni_tot_qi += Q;
4467 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4469 /* For one pass, early in the clip ... average the current frame Q
4470 * value with the worstq entered by the user as a dampening measure
4473 cpi->ni_tot_qi += Q;
4475 ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4478 /* If the average Q is higher than what was used in the last
4479 * frame (after going through the recode loop to keep the frame
4480 * size within range) then use the last frame value - 1. The -1
4481 * is designed to stop Q and hence the data rate, from
4482 * progressively falling away during difficult sections, but at
4483 * the same time reduce the number of itterations around the
4486 if (Q > cpi->ni_av_qi) cpi->ni_av_qi = Q - 1;
4490 /* Update the buffer level variable. */
4491 /* Non-viewable frames are a special case and are treated as pure overhead. */
4492 if (!cm->show_frame) {
4493 cpi->bits_off_target -= cpi->projected_frame_size;
4495 cpi->bits_off_target +=
4496 cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4499 /* Clip the buffer level to the maximum specified buffer size */
4500 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
4501 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
4504 // If the frame dropper is not enabled, don't let the buffer level go below
4505 // some threshold, given here by -|maximum_buffer_size|. For now we only do
4506 // this for screen content input.
4507 if (cpi->drop_frames_allowed == 0 && cpi->oxcf.screen_content_mode &&
4508 cpi->bits_off_target < -cpi->oxcf.maximum_buffer_size) {
4509 cpi->bits_off_target = -cpi->oxcf.maximum_buffer_size;
4512 /* Rolling monitors of whether we are over or underspending used to
4513 * help regulate min and Max Q in two pass.
4515 cpi->rolling_target_bits =
4516 ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
4517 cpi->rolling_actual_bits =
4518 ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
4519 cpi->long_rolling_target_bits =
4520 ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
4521 cpi->long_rolling_actual_bits =
4522 ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) /
4525 /* Actual bits spent */
4526 cpi->total_actual_bits += cpi->projected_frame_size;
4529 cpi->total_target_vs_actual +=
4530 (cpi->this_frame_target - cpi->projected_frame_size);
4532 cpi->buffer_level = cpi->bits_off_target;
4534 /* Propagate values to higher temporal layers */
4535 if (cpi->oxcf.number_of_layers > 1) {
4538 for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
4539 LAYER_CONTEXT *lc = &cpi->layer_context[i];
4540 int bits_off_for_this_layer = (int)(lc->target_bandwidth / lc->framerate -
4541 cpi->projected_frame_size);
4543 lc->bits_off_target += bits_off_for_this_layer;
4545 /* Clip buffer level to maximum buffer size for the layer */
4546 if (lc->bits_off_target > lc->maximum_buffer_size) {
4547 lc->bits_off_target = lc->maximum_buffer_size;
4550 lc->total_actual_bits += cpi->projected_frame_size;
4551 lc->total_target_vs_actual += bits_off_for_this_layer;
4552 lc->buffer_level = lc->bits_off_target;
4556 /* Update bits left to the kf and gf groups to account for overshoot
4557 * or undershoot on these frames
4559 if (cm->frame_type == KEY_FRAME) {
4560 cpi->twopass.kf_group_bits +=
4561 cpi->this_frame_target - cpi->projected_frame_size;
4563 if (cpi->twopass.kf_group_bits < 0) cpi->twopass.kf_group_bits = 0;
4564 } else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame) {
4565 cpi->twopass.gf_group_bits +=
4566 cpi->this_frame_target - cpi->projected_frame_size;
4568 if (cpi->twopass.gf_group_bits < 0) cpi->twopass.gf_group_bits = 0;
4571 if (cm->frame_type != KEY_FRAME) {
4572 if (cpi->common.refresh_alt_ref_frame) {
4573 cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4574 cpi->last_skip_probs_q[2] = cm->base_qindex;
4575 } else if (cpi->common.refresh_golden_frame) {
4576 cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4577 cpi->last_skip_probs_q[1] = cm->base_qindex;
4579 cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4580 cpi->last_skip_probs_q[0] = cm->base_qindex;
4582 /* update the baseline */
4583 cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4587 #if 0 && CONFIG_INTERNAL_STATS
4589 FILE *f = fopen("tmp.stt", "a");
4591 vpx_clear_system_state();
4593 if (cpi->twopass.total_left_stats.coded_error != 0.0)
4594 fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
4595 "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
4596 "%8.2lf %"PRId64" %10.3lf %10"PRId64" %8d\n",
4597 cpi->common.current_video_frame, cpi->this_frame_target,
4598 cpi->projected_frame_size,
4599 (cpi->projected_frame_size - cpi->this_frame_target),
4600 cpi->total_target_vs_actual,
4602 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4603 cpi->total_actual_bits, cm->base_qindex,
4604 cpi->active_best_quality, cpi->active_worst_quality,
4605 cpi->ni_av_qi, cpi->cq_target_quality,
4606 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4607 cm->frame_type, cpi->gfu_boost,
4608 cpi->twopass.est_max_qcorrection_factor,
4609 cpi->twopass.bits_left,
4610 cpi->twopass.total_left_stats.coded_error,
4611 (double)cpi->twopass.bits_left /
4612 cpi->twopass.total_left_stats.coded_error,
4613 cpi->tot_recode_hits);
4615 fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
4616 "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
4617 "%8.2lf %"PRId64" %10.3lf %8d\n",
4618 cpi->common.current_video_frame, cpi->this_frame_target,
4619 cpi->projected_frame_size,
4620 (cpi->projected_frame_size - cpi->this_frame_target),
4621 cpi->total_target_vs_actual,
4623 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4624 cpi->total_actual_bits, cm->base_qindex,
4625 cpi->active_best_quality, cpi->active_worst_quality,
4626 cpi->ni_av_qi, cpi->cq_target_quality,
4627 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4628 cm->frame_type, cpi->gfu_boost,
4629 cpi->twopass.est_max_qcorrection_factor,
4630 cpi->twopass.bits_left,
4631 cpi->twopass.total_left_stats.coded_error,
4632 cpi->tot_recode_hits);
4637 FILE *fmodes = fopen("Modes.stt", "a");
4639 fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4640 cpi->common.current_video_frame,
4641 cm->frame_type, cm->refresh_golden_frame,
4642 cm->refresh_alt_ref_frame);
4644 fprintf(fmodes, "\n");
4652 if (cm->refresh_golden_frame == 1) {
4653 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4655 cm->frame_flags = cm->frame_flags & ~FRAMEFLAGS_GOLDEN;
4658 if (cm->refresh_alt_ref_frame == 1) {
4659 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4661 cm->frame_flags = cm->frame_flags & ~FRAMEFLAGS_ALTREF;
4664 if (cm->refresh_last_frame & cm->refresh_golden_frame) { /* both refreshed */
4665 cpi->gold_is_last = 1;
4666 } else if (cm->refresh_last_frame ^ cm->refresh_golden_frame) {
4667 /* 1 refreshed but not the other */
4668 cpi->gold_is_last = 0;
4671 if (cm->refresh_last_frame & cm->refresh_alt_ref_frame) { /* both refreshed */
4672 cpi->alt_is_last = 1;
4673 } else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame) {
4674 /* 1 refreshed but not the other */
4675 cpi->alt_is_last = 0;
4678 if (cm->refresh_alt_ref_frame &
4679 cm->refresh_golden_frame) { /* both refreshed */
4680 cpi->gold_is_alt = 1;
4681 } else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame) {
4682 /* 1 refreshed but not the other */
4683 cpi->gold_is_alt = 0;
4686 cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
4688 if (cpi->gold_is_last) cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;
4690 if (cpi->alt_is_last) cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4692 if (cpi->gold_is_alt) cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4694 if (!cpi->oxcf.error_resilient_mode) {
4695 if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame &&
4696 (cm->frame_type != KEY_FRAME)) {
4697 /* Update the alternate reference frame stats as appropriate. */
4698 update_alt_ref_frame_stats(cpi);
4700 /* Update the Golden frame stats as appropriate. */
4701 update_golden_frame_stats(cpi);
4705 if (cm->frame_type == KEY_FRAME) {
4706 /* Tell the caller that the frame was coded as a key frame */
4707 *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4709 /* As this frame is a key frame the next defaults to an inter frame. */
4710 cm->frame_type = INTER_FRAME;
4712 cpi->last_frame_percent_intra = 100;
4714 *frame_flags = cm->frame_flags & ~FRAMEFLAGS_KEY;
4716 cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4719 /* Clear the one shot update flags for segmentation map and mode/ref
4720 * loop filter deltas.
4722 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4723 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4724 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4726 /* Dont increment frame counters if this was an altref buffer update
4729 if (cm->show_frame) {
4730 cm->current_video_frame++;
4731 cpi->frames_since_key++;
4732 cpi->temporal_pattern_counter++;
4735 /* reset to normal state now that we are done. */
4741 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
4742 recon_file = fopen(filename, "wb");
4743 fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4744 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4750 /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
4752 #if !CONFIG_REALTIME_ONLY
4753 static void Pass2Encode(VP8_COMP *cpi, size_t *size, unsigned char *dest,
4754 unsigned char *dest_end, unsigned int *frame_flags) {
4755 if (!cpi->common.refresh_alt_ref_frame) vp8_second_pass(cpi);
4757 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
4758 cpi->twopass.bits_left -= 8 * (int)(*size);
4760 if (!cpi->common.refresh_alt_ref_frame) {
4761 double two_pass_min_rate =
4762 (double)(cpi->oxcf.target_bandwidth *
4763 cpi->oxcf.two_pass_vbrmin_section / 100);
4764 cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
4769 int vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags,
4770 YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
4772 struct vpx_usec_timer timer;
4775 vpx_usec_timer_start(&timer);
4777 /* Reinit the lookahead buffer if the frame size changes */
4778 if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height) {
4779 assert(cpi->oxcf.lag_in_frames < 2);
4780 dealloc_raw_frame_buffers(cpi);
4781 alloc_raw_frame_buffers(cpi);
4784 if (vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time, frame_flags,
4785 cpi->active_map_enabled ? cpi->active_map : NULL)) {
4788 vpx_usec_timer_mark(&timer);
4789 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
4794 static int frame_is_reference(const VP8_COMP *cpi) {
4795 const VP8_COMMON *cm = &cpi->common;
4796 const MACROBLOCKD *xd = &cpi->mb.e_mbd;
4798 return cm->frame_type == KEY_FRAME || cm->refresh_last_frame ||
4799 cm->refresh_golden_frame || cm->refresh_alt_ref_frame ||
4800 cm->copy_buffer_to_gf || cm->copy_buffer_to_arf ||
4801 cm->refresh_entropy_probs || xd->mode_ref_lf_delta_update ||
4802 xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
4805 int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags,
4806 size_t *size, unsigned char *dest,
4807 unsigned char *dest_end, int64_t *time_stamp,
4808 int64_t *time_end, int flush) {
4810 struct vpx_usec_timer tsctimer;
4811 struct vpx_usec_timer ticktimer;
4812 struct vpx_usec_timer cmptimer;
4813 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
4815 if (!cpi) return -1;
4819 if (setjmp(cpi->common.error.jmp)) {
4820 cpi->common.error.setjmp = 0;
4821 vpx_clear_system_state();
4822 return VPX_CODEC_CORRUPT_FRAME;
4825 cpi->common.error.setjmp = 1;
4827 vpx_usec_timer_start(&cmptimer);
4831 #if !CONFIG_REALTIME_ONLY
4832 /* Should we code an alternate reference frame */
4833 if (cpi->oxcf.error_resilient_mode == 0 && cpi->oxcf.play_alternate &&
4834 cpi->source_alt_ref_pending) {
4835 if ((cpi->source = vp8_lookahead_peek(
4836 cpi->lookahead, cpi->frames_till_gf_update_due, PEEK_FORWARD))) {
4837 cpi->alt_ref_source = cpi->source;
4838 if (cpi->oxcf.arnr_max_frames > 0) {
4839 vp8_temporal_filter_prepare_c(cpi, cpi->frames_till_gf_update_due);
4840 force_src_buffer = &cpi->alt_ref_buffer;
4842 cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
4843 cm->refresh_alt_ref_frame = 1;
4844 cm->refresh_golden_frame = 0;
4845 cm->refresh_last_frame = 0;
4847 /* Clear Pending alt Ref flag. */
4848 cpi->source_alt_ref_pending = 0;
4849 cpi->is_src_frame_alt_ref = 0;
4855 /* Read last frame source if we are encoding first pass. */
4856 if (cpi->pass == 1 && cm->current_video_frame > 0) {
4857 if ((cpi->last_source =
4858 vp8_lookahead_peek(cpi->lookahead, 1, PEEK_BACKWARD)) == NULL) {
4863 if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush))) {
4866 cpi->is_src_frame_alt_ref =
4867 cpi->alt_ref_source && (cpi->source == cpi->alt_ref_source);
4869 if (cpi->is_src_frame_alt_ref) cpi->alt_ref_source = NULL;
4874 cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
4875 cpi->un_scaled_source = cpi->Source;
4876 *time_stamp = cpi->source->ts_start;
4877 *time_end = cpi->source->ts_end;
4878 *frame_flags = cpi->source->flags;
4880 if (cpi->pass == 1 && cm->current_video_frame > 0) {
4881 cpi->last_frame_unscaled_source = &cpi->last_source->img;
4885 #if !CONFIG_REALTIME_ONLY
4887 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
4888 vp8_end_first_pass(cpi); /* get last stats packet */
4889 cpi->twopass.first_pass_done = 1;
4897 if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
4898 cpi->first_time_stamp_ever = cpi->source->ts_start;
4899 cpi->last_end_time_stamp_seen = cpi->source->ts_start;
4902 /* adjust frame rates based on timestamps given */
4903 if (cm->show_frame) {
4904 int64_t this_duration;
4907 if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
4908 this_duration = cpi->source->ts_end - cpi->source->ts_start;
4911 int64_t last_duration;
4913 this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
4914 last_duration = cpi->last_end_time_stamp_seen - cpi->last_time_stamp_seen;
4915 /* do a step update if the duration changes by 10% */
4916 if (last_duration) {
4917 step = (int)(((this_duration - last_duration) * 10 / last_duration));
4921 if (this_duration) {
4923 cpi->ref_framerate = 10000000.0 / this_duration;
4925 double avg_duration, interval;
4927 /* Average this frame's rate into the last second's average
4928 * frame rate. If we haven't seen 1 second yet, then average
4929 * over the whole interval seen.
4931 interval = (double)(cpi->source->ts_end - cpi->first_time_stamp_ever);
4932 if (interval > 10000000.0) interval = 10000000;
4934 avg_duration = 10000000.0 / cpi->ref_framerate;
4935 avg_duration *= (interval - avg_duration + this_duration);
4936 avg_duration /= interval;
4938 cpi->ref_framerate = 10000000.0 / avg_duration;
4940 #if CONFIG_MULTI_RES_ENCODING
4941 if (cpi->oxcf.mr_total_resolutions > 1) {
4942 LOWER_RES_FRAME_INFO *low_res_frame_info =
4943 (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
4944 // Frame rate should be the same for all spatial layers in
4945 // multi-res-encoding (simulcast), so we constrain the frame for
4946 // higher layers to be that of lowest resolution. This is needed
4947 // as he application may decide to skip encoding a high layer and
4948 // then start again, in which case a big jump in time-stamps will
4949 // be received for that high layer, which will yield an incorrect
4950 // frame rate (from time-stamp adjustment in above calculation).
4951 if (cpi->oxcf.mr_encoder_id) {
4952 cpi->ref_framerate = low_res_frame_info->low_res_framerate;
4954 // Keep track of frame rate for lowest resolution.
4955 low_res_frame_info->low_res_framerate = cpi->ref_framerate;
4959 if (cpi->oxcf.number_of_layers > 1) {
4962 /* Update frame rates for each layer */
4963 assert(cpi->oxcf.number_of_layers <= VPX_TS_MAX_LAYERS);
4964 for (i = 0; i < cpi->oxcf.number_of_layers && i < VPX_TS_MAX_LAYERS;
4966 LAYER_CONTEXT *lc = &cpi->layer_context[i];
4967 lc->framerate = cpi->ref_framerate / cpi->oxcf.rate_decimator[i];
4970 vp8_new_framerate(cpi, cpi->ref_framerate);
4974 cpi->last_time_stamp_seen = cpi->source->ts_start;
4975 cpi->last_end_time_stamp_seen = cpi->source->ts_end;
4978 if (cpi->oxcf.number_of_layers > 1) {
4981 update_layer_contexts(cpi);
4983 /* Restore layer specific context & set frame rate */
4984 if (cpi->temporal_layer_id >= 0) {
4985 layer = cpi->temporal_layer_id;
4989 .layer_id[cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
4991 restore_layer_context(cpi, layer);
4992 vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
4995 if (cpi->compressor_speed == 2) {
4996 vpx_usec_timer_start(&tsctimer);
4997 vpx_usec_timer_start(&ticktimer);
5000 cpi->lf_zeromv_pct = (cpi->zeromv_count * 100) / cm->MBs;
5002 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
5005 const int num_part = (1 << cm->multi_token_partition);
5006 /* the available bytes in dest */
5007 const unsigned long dest_size = dest_end - dest;
5008 const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
5010 unsigned char *dp = dest;
5012 cpi->partition_d[0] = dp;
5013 dp += dest_size / 10; /* reserve 1/10 for control partition */
5014 cpi->partition_d_end[0] = dp;
5016 for (i = 0; i < num_part; ++i) {
5017 cpi->partition_d[i + 1] = dp;
5018 dp += tok_part_buff_size;
5019 cpi->partition_d_end[i + 1] = dp;
5024 /* start with a 0 size frame */
5027 /* Clear down mmx registers */
5028 vpx_clear_system_state();
5030 cm->frame_type = INTER_FRAME;
5031 cm->frame_flags = *frame_flags;
5035 if (cm->refresh_alt_ref_frame)
5037 cm->refresh_golden_frame = 0;
5038 cm->refresh_last_frame = 0;
5042 cm->refresh_golden_frame = 0;
5043 cm->refresh_last_frame = 1;
5047 /* find a free buffer for the new frame */
5050 for (; i < NUM_YV12_BUFFERS; ++i) {
5051 if (!cm->yv12_fb[i].flags) {
5057 assert(i < NUM_YV12_BUFFERS);
5059 switch (cpi->pass) {
5060 #if !CONFIG_REALTIME_ONLY
5061 case 1: Pass1Encode(cpi, size, dest, frame_flags); break;
5062 case 2: Pass2Encode(cpi, size, dest, dest_end, frame_flags); break;
5063 #endif // !CONFIG_REALTIME_ONLY
5065 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
5069 if (cpi->compressor_speed == 2) {
5070 unsigned int duration, duration2;
5071 vpx_usec_timer_mark(&tsctimer);
5072 vpx_usec_timer_mark(&ticktimer);
5074 duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
5075 duration2 = (unsigned int)((double)duration / 2);
5077 if (cm->frame_type != KEY_FRAME) {
5078 if (cpi->avg_encode_time == 0) {
5079 cpi->avg_encode_time = duration;
5081 cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
5087 if (cpi->avg_pick_mode_time == 0) {
5088 cpi->avg_pick_mode_time = duration2;
5090 cpi->avg_pick_mode_time =
5091 (7 * cpi->avg_pick_mode_time + duration2) >> 3;
5097 if (cm->refresh_entropy_probs == 0) {
5098 memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
5101 /* Save the contexts separately for alt ref, gold and last. */
5102 /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
5103 if (cm->refresh_alt_ref_frame) memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
5105 if (cm->refresh_golden_frame) memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
5107 if (cm->refresh_last_frame) memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
5109 /* if its a dropped frame honor the requests on subsequent frames */
5111 cpi->droppable = !frame_is_reference(cpi);
5113 /* return to normal state */
5114 cm->refresh_entropy_probs = 1;
5115 cm->refresh_alt_ref_frame = 0;
5116 cm->refresh_golden_frame = 0;
5117 cm->refresh_last_frame = 1;
5118 cm->frame_type = INTER_FRAME;
5121 /* Save layer specific state */
5122 if (cpi->oxcf.number_of_layers > 1) save_layer_context(cpi);
5124 vpx_usec_timer_mark(&cmptimer);
5125 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
5127 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame) {
5128 generate_psnr_packet(cpi);
5131 #if CONFIG_INTERNAL_STATS
5133 if (cpi->pass != 1) {
5134 cpi->bytes += *size;
5136 if (cm->show_frame) {
5137 cpi->common.show_frame_mi = cpi->common.mi;
5140 if (cpi->b_calculate_psnr) {
5141 uint64_t ye, ue, ve;
5143 YV12_BUFFER_CONFIG *orig = cpi->Source;
5144 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
5145 unsigned int y_width = cpi->common.Width;
5146 unsigned int y_height = cpi->common.Height;
5147 unsigned int uv_width = (y_width + 1) / 2;
5148 unsigned int uv_height = (y_height + 1) / 2;
5149 int y_samples = y_height * y_width;
5150 int uv_samples = uv_height * uv_width;
5151 int t_samples = y_samples + 2 * uv_samples;
5154 ye = calc_plane_error(orig->y_buffer, orig->y_stride, recon->y_buffer,
5155 recon->y_stride, y_width, y_height);
5157 ue = calc_plane_error(orig->u_buffer, orig->uv_stride, recon->u_buffer,
5158 recon->uv_stride, uv_width, uv_height);
5160 ve = calc_plane_error(orig->v_buffer, orig->uv_stride, recon->v_buffer,
5161 recon->uv_stride, uv_width, uv_height);
5163 sq_error = (double)(ye + ue + ve);
5165 frame_psnr = vpx_sse_to_psnr(t_samples, 255.0, sq_error);
5167 cpi->total_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
5168 cpi->total_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
5169 cpi->total_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
5170 cpi->total_sq_error += sq_error;
5171 cpi->total += frame_psnr;
5174 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
5176 double frame_psnr2, frame_ssim2 = 0;
5179 vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer,
5180 cm->filter_level * 10 / 6, 1, 0);
5181 vpx_clear_system_state();
5183 ye = calc_plane_error(orig->y_buffer, orig->y_stride, pp->y_buffer,
5184 pp->y_stride, y_width, y_height);
5186 ue = calc_plane_error(orig->u_buffer, orig->uv_stride, pp->u_buffer,
5187 pp->uv_stride, uv_width, uv_height);
5189 ve = calc_plane_error(orig->v_buffer, orig->uv_stride, pp->v_buffer,
5190 pp->uv_stride, uv_width, uv_height);
5192 sq_error2 = (double)(ye + ue + ve);
5194 frame_psnr2 = vpx_sse_to_psnr(t_samples, 255.0, sq_error2);
5196 cpi->totalp_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
5197 cpi->totalp_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
5198 cpi->totalp_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
5199 cpi->total_sq_error2 += sq_error2;
5200 cpi->totalp += frame_psnr2;
5203 vpx_calc_ssim(cpi->Source, &cm->post_proc_buffer, &weight);
5205 cpi->summed_quality += frame_ssim2 * weight;
5206 cpi->summed_weights += weight;
5208 if (cpi->oxcf.number_of_layers > 1) {
5211 for (i = cpi->current_layer; i < cpi->oxcf.number_of_layers; ++i) {
5212 cpi->frames_in_layer[i]++;
5214 cpi->bytes_in_layer[i] += *size;
5215 cpi->sum_psnr[i] += frame_psnr;
5216 cpi->sum_psnr_p[i] += frame_psnr2;
5217 cpi->total_error2[i] += sq_error;
5218 cpi->total_error2_p[i] += sq_error2;
5219 cpi->sum_ssim[i] += frame_ssim2 * weight;
5220 cpi->sum_weights[i] += weight;
5231 if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
5233 skiptruecount += cpi->skip_true_count;
5234 skipfalsecount += cpi->skip_false_count;
5242 FILE *f = fopen("skip.stt", "a");
5243 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);
5245 if (cpi->is_src_frame_alt_ref == 1)
5246 fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
5254 cpi->common.error.setjmp = 0;
5256 #if CONFIG_MULTITHREAD
5257 /* wait for the lpf thread done */
5258 if (cpi->b_multi_threaded && cpi->b_lpf_running) {
5259 sem_wait(&cpi->h_event_end_lpf);
5260 cpi->b_lpf_running = 0;
5267 int vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest,
5268 vp8_ppflags_t *flags) {
5269 if (cpi->common.refresh_alt_ref_frame) {
5275 cpi->common.show_frame_mi = cpi->common.mi;
5276 ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5280 if (cpi->common.frame_to_show) {
5281 *dest = *cpi->common.frame_to_show;
5282 dest->y_width = cpi->common.Width;
5283 dest->y_height = cpi->common.Height;
5284 dest->uv_height = cpi->common.Height / 2;
5291 vpx_clear_system_state();
5296 int vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows,
5297 unsigned int cols, int delta_q[4], int delta_lf[4],
5298 unsigned int threshold[4]) {
5299 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5300 int internal_delta_q[MAX_MB_SEGMENTS];
5301 const int range = 63;
5304 // This method is currently incompatible with the cyclic refresh method
5305 if (cpi->cyclic_refresh_mode_enabled) return -1;
5307 // Check number of rows and columns match
5308 if (cpi->common.mb_rows != (int)rows || cpi->common.mb_cols != (int)cols) {
5312 // Range check the delta Q values and convert the external Q range values
5313 // to internal ones.
5314 if ((abs(delta_q[0]) > range) || (abs(delta_q[1]) > range) ||
5315 (abs(delta_q[2]) > range) || (abs(delta_q[3]) > range)) {
5319 // Range check the delta lf values
5320 if ((abs(delta_lf[0]) > range) || (abs(delta_lf[1]) > range) ||
5321 (abs(delta_lf[2]) > range) || (abs(delta_lf[3]) > range)) {
5326 disable_segmentation(cpi);
5330 // Translate the external delta q values to internal values.
5331 for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
5332 internal_delta_q[i] =
5333 (delta_q[i] >= 0) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];
5336 /* Set the segmentation Map */
5337 set_segmentation_map(cpi, map);
5339 /* Activate segmentation. */
5340 enable_segmentation(cpi);
5342 /* Set up the quant segment data */
5343 feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
5344 feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
5345 feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
5346 feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];
5348 /* Set up the loop segment data s */
5349 feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5350 feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5351 feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5352 feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5354 cpi->segment_encode_breakout[0] = threshold[0];
5355 cpi->segment_encode_breakout[1] = threshold[1];
5356 cpi->segment_encode_breakout[2] = threshold[2];
5357 cpi->segment_encode_breakout[3] = threshold[3];
5359 /* Initialise the feature data structure */
5360 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5365 int vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows,
5366 unsigned int cols) {
5367 if ((int)rows == cpi->common.mb_rows && (int)cols == cpi->common.mb_cols) {
5369 memcpy(cpi->active_map, map, rows * cols);
5370 cpi->active_map_enabled = 1;
5372 cpi->active_map_enabled = 0;
5381 int vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode,
5382 VPX_SCALING vert_mode) {
5383 if (horiz_mode <= ONETWO) {
5384 cpi->common.horiz_scale = horiz_mode;
5389 if (vert_mode <= ONETWO) {
5390 cpi->common.vert_scale = vert_mode;
5398 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest) {
5402 unsigned char *src = source->y_buffer;
5403 unsigned char *dst = dest->y_buffer;
5405 /* Loop through the Y plane raw and reconstruction data summing
5406 * (square differences)
5408 for (i = 0; i < source->y_height; i += 16) {
5409 for (j = 0; j < source->y_width; j += 16) {
5411 Total += vpx_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride,
5415 src += 16 * source->y_stride;
5416 dst += 16 * dest->y_stride;
5422 int vp8_get_quantizer(VP8_COMP *cpi) { return cpi->common.base_qindex; }