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 "bitstream.h"
16 #include "vp8/common/onyxc_int.h"
17 #include "vp8/common/blockd.h"
19 #include "vp8/common/systemdependent.h"
20 #include "vp8/common/vp8_skin_detection.h"
21 #include "vp8/encoder/quantize.h"
22 #include "vp8/common/alloccommon.h"
24 #include "firstpass.h"
25 #include "vpx_dsp/psnr.h"
26 #include "vpx_scale/vpx_scale.h"
27 #include "vp8/common/extend.h"
29 #include "vp8/common/quant_common.h"
30 #include "segmentation.h"
32 #include "vp8/common/postproc.h"
34 #include "vpx_mem/vpx_mem.h"
35 #include "vp8/common/reconintra.h"
36 #include "vp8/common/swapyv12buffer.h"
37 #include "vp8/common/threading.h"
38 #include "vpx_ports/system_state.h"
39 #include "vpx_ports/vpx_timer.h"
40 #include "vpx_util/vpx_write_yuv_frame.h"
42 #include "vpx_ports/arm.h"
44 #if CONFIG_MULTI_RES_ENCODING
45 #include "mr_dissim.h"
47 #include "encodeframe.h"
48 #if CONFIG_MULTITHREAD
49 #include "ethreading.h"
52 #if !CONFIG_REALTIME_ONLY
53 #include "temporal_filter.h"
61 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
62 extern int vp8_update_coef_context(VP8_COMP *cpi);
65 extern unsigned int vp8_get_processor_freq();
67 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
69 static void set_default_lf_deltas(VP8_COMP *cpi);
71 extern const int vp8_gf_interval_table[101];
73 #if CONFIG_INTERNAL_STATS
75 #include "vpx_dsp/ssim.h"
81 #ifdef OUTPUT_YUV_DENOISED
82 FILE *yuv_denoised_file;
84 #ifdef OUTPUT_YUV_SKINMAP
85 static FILE *yuv_skinmap_file = NULL;
95 extern int skip_true_count;
96 extern int skip_false_count;
100 unsigned int frames_at_speed[16] = { 0, 0, 0, 0, 0, 0, 0, 0,
101 0, 0, 0, 0, 0, 0, 0, 0 };
102 unsigned int tot_pm = 0;
103 unsigned int cnt_pm = 0;
104 unsigned int tot_ef = 0;
105 unsigned int cnt_ef = 0;
109 extern unsigned __int64 Sectionbits[50];
110 extern int y_modes[5];
111 extern int uv_modes[4];
112 extern int b_modes[10];
114 extern int inter_y_modes[10];
115 extern int inter_uv_modes[4];
116 extern unsigned int inter_b_modes[15];
119 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
121 extern const int qrounding_factors[129];
122 extern const int qzbin_factors[129];
123 extern void vp8cx_init_quantizer(VP8_COMP *cpi);
124 extern const int vp8cx_base_skip_false_prob[128];
126 /* Tables relating active max Q to active min Q */
127 static const unsigned char kf_low_motion_minq[QINDEX_RANGE] = {
128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
129 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
130 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
131 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5,
132 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 10, 10, 11,
133 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
134 17, 17, 18, 18, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23
136 static const unsigned char kf_high_motion_minq[QINDEX_RANGE] = {
137 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
138 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
139 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5,
140 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10,
141 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16,
142 16, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21,
143 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30
145 static const unsigned char gf_low_motion_minq[QINDEX_RANGE] = {
146 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3,
147 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8,
148 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15,
149 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
150 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34,
151 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 44,
152 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58
154 static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] = {
155 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5,
156 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11,
157 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18,
158 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
159 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37,
160 37, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 45, 46, 47, 48, 49, 50,
161 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
163 static const unsigned char gf_high_motion_minq[QINDEX_RANGE] = {
164 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
165 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11,
166 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21,
167 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30,
168 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40,
169 40, 41, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
170 57, 58, 59, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80
172 static const unsigned char inter_minq[QINDEX_RANGE] = {
173 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11,
174 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24,
175 24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38,
176 39, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 50, 51, 52, 53,
177 54, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69,
178 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 86,
179 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100
182 #ifdef PACKET_TESTING
183 extern FILE *vpxlogc;
186 void vp8_save_layer_context(VP8_COMP *cpi) {
187 LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
189 /* Save layer dependent coding state */
190 lc->target_bandwidth = cpi->target_bandwidth;
191 lc->starting_buffer_level = cpi->oxcf.starting_buffer_level;
192 lc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level;
193 lc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size;
194 lc->starting_buffer_level_in_ms = cpi->oxcf.starting_buffer_level_in_ms;
195 lc->optimal_buffer_level_in_ms = cpi->oxcf.optimal_buffer_level_in_ms;
196 lc->maximum_buffer_size_in_ms = cpi->oxcf.maximum_buffer_size_in_ms;
197 lc->buffer_level = cpi->buffer_level;
198 lc->bits_off_target = cpi->bits_off_target;
199 lc->total_actual_bits = cpi->total_actual_bits;
200 lc->worst_quality = cpi->worst_quality;
201 lc->active_worst_quality = cpi->active_worst_quality;
202 lc->best_quality = cpi->best_quality;
203 lc->active_best_quality = cpi->active_best_quality;
204 lc->ni_av_qi = cpi->ni_av_qi;
205 lc->ni_tot_qi = cpi->ni_tot_qi;
206 lc->ni_frames = cpi->ni_frames;
207 lc->avg_frame_qindex = cpi->avg_frame_qindex;
208 lc->rate_correction_factor = cpi->rate_correction_factor;
209 lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
210 lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor;
211 lc->zbin_over_quant = cpi->mb.zbin_over_quant;
212 lc->inter_frame_target = cpi->inter_frame_target;
213 lc->total_byte_count = cpi->total_byte_count;
214 lc->filter_level = cpi->common.filter_level;
215 lc->frames_since_last_drop_overshoot = cpi->frames_since_last_drop_overshoot;
216 lc->force_maxqp = cpi->force_maxqp;
217 lc->last_frame_percent_intra = cpi->last_frame_percent_intra;
218 lc->last_q[0] = cpi->last_q[0];
219 lc->last_q[1] = cpi->last_q[1];
221 memcpy(lc->count_mb_ref_frame_usage, cpi->mb.count_mb_ref_frame_usage,
222 sizeof(cpi->mb.count_mb_ref_frame_usage));
225 void vp8_restore_layer_context(VP8_COMP *cpi, const int layer) {
226 LAYER_CONTEXT *lc = &cpi->layer_context[layer];
228 /* Restore layer dependent coding state */
229 cpi->current_layer = layer;
230 cpi->target_bandwidth = lc->target_bandwidth;
231 cpi->oxcf.target_bandwidth = lc->target_bandwidth;
232 cpi->oxcf.starting_buffer_level = lc->starting_buffer_level;
233 cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level;
234 cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size;
235 cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
236 cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms;
237 cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms;
238 cpi->buffer_level = lc->buffer_level;
239 cpi->bits_off_target = lc->bits_off_target;
240 cpi->total_actual_bits = lc->total_actual_bits;
241 cpi->active_worst_quality = lc->active_worst_quality;
242 cpi->active_best_quality = lc->active_best_quality;
243 cpi->ni_av_qi = lc->ni_av_qi;
244 cpi->ni_tot_qi = lc->ni_tot_qi;
245 cpi->ni_frames = lc->ni_frames;
246 cpi->avg_frame_qindex = lc->avg_frame_qindex;
247 cpi->rate_correction_factor = lc->rate_correction_factor;
248 cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
249 cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor;
250 cpi->mb.zbin_over_quant = lc->zbin_over_quant;
251 cpi->inter_frame_target = lc->inter_frame_target;
252 cpi->total_byte_count = lc->total_byte_count;
253 cpi->common.filter_level = lc->filter_level;
254 cpi->frames_since_last_drop_overshoot = lc->frames_since_last_drop_overshoot;
255 cpi->force_maxqp = lc->force_maxqp;
256 cpi->last_frame_percent_intra = lc->last_frame_percent_intra;
257 cpi->last_q[0] = lc->last_q[0];
258 cpi->last_q[1] = lc->last_q[1];
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 void vp8_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)round((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 vp8_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 vp8_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 vp8_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 vp8_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 compute_skin_map(VP8_COMP *cpi) {
607 int mb_row, mb_col, num_bl;
608 VP8_COMMON *cm = &cpi->common;
609 const uint8_t *src_y = cpi->Source->y_buffer;
610 const uint8_t *src_u = cpi->Source->u_buffer;
611 const uint8_t *src_v = cpi->Source->v_buffer;
612 const int src_ystride = cpi->Source->y_stride;
613 const int src_uvstride = cpi->Source->uv_stride;
615 const SKIN_DETECTION_BLOCK_SIZE bsize =
616 (cm->Width * cm->Height <= 352 * 288) ? SKIN_8X8 : SKIN_16X16;
618 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) {
620 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) {
621 const int bl_index = mb_row * cm->mb_cols + mb_col;
622 cpi->skin_map[bl_index] =
623 vp8_compute_skin_block(src_y, src_u, src_v, src_ystride, src_uvstride,
624 bsize, cpi->consec_zero_last[bl_index], 0);
630 src_y += (src_ystride << 4) - (num_bl << 4);
631 src_u += (src_uvstride << 3) - (num_bl << 3);
632 src_v += (src_uvstride << 3) - (num_bl << 3);
635 // Remove isolated skin blocks (none of its neighbors are skin) and isolated
636 // non-skin blocks (all of its neighbors are skin). Skip the boundary.
637 for (mb_row = 1; mb_row < cm->mb_rows - 1; mb_row++) {
638 for (mb_col = 1; mb_col < cm->mb_cols - 1; mb_col++) {
639 const int bl_index = mb_row * cm->mb_cols + mb_col;
640 int num_neighbor = 0;
642 int non_skin_threshold = 8;
644 for (mi = -1; mi <= 1; mi += 1) {
645 for (mj = -1; mj <= 1; mj += 1) {
646 int bl_neighbor_index = (mb_row + mi) * cm->mb_cols + mb_col + mj;
647 if (cpi->skin_map[bl_neighbor_index]) num_neighbor++;
651 if (cpi->skin_map[bl_index] && num_neighbor < 2)
652 cpi->skin_map[bl_index] = 0;
653 if (!cpi->skin_map[bl_index] && num_neighbor == non_skin_threshold)
654 cpi->skin_map[bl_index] = 1;
659 static void set_default_lf_deltas(VP8_COMP *cpi) {
660 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
661 cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
663 memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
664 memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
666 /* Test of ref frame deltas */
667 cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
668 cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
669 cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
670 cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
672 cpi->mb.e_mbd.mode_lf_deltas[0] = 4; /* BPRED */
674 if (cpi->oxcf.Mode == MODE_REALTIME) {
675 cpi->mb.e_mbd.mode_lf_deltas[1] = -12; /* Zero */
677 cpi->mb.e_mbd.mode_lf_deltas[1] = -2; /* Zero */
680 cpi->mb.e_mbd.mode_lf_deltas[2] = 2; /* New mv */
681 cpi->mb.e_mbd.mode_lf_deltas[3] = 4; /* Split mv */
684 /* Convenience macros for mapping speed and mode into a continuous
687 #define GOOD(x) ((x) + 1)
688 #define RT(x) ((x) + 7)
690 static int speed_map(int speed, const int *map) {
695 } while (speed >= *map++);
699 static const int thresh_mult_map_znn[] = {
700 /* map common to zero, nearest, and near */
701 0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
704 static const int thresh_mult_map_vhpred[] = { 1000, GOOD(2), 1500, GOOD(3),
705 2000, RT(0), 1000, RT(1),
706 2000, RT(7), INT_MAX, INT_MAX };
708 static const int thresh_mult_map_bpred[] = { 2000, GOOD(0), 2500, GOOD(2),
709 5000, GOOD(3), 7500, RT(0),
710 2500, RT(1), 5000, RT(6),
713 static const int thresh_mult_map_tm[] = { 1000, GOOD(2), 1500, GOOD(3),
714 2000, RT(0), 0, RT(1),
715 1000, RT(2), 2000, RT(7),
718 static const int thresh_mult_map_new1[] = { 1000, GOOD(2), 2000,
719 RT(0), 2000, INT_MAX };
721 static const int thresh_mult_map_new2[] = { 1000, GOOD(2), 2000, GOOD(3),
722 2500, GOOD(5), 4000, RT(0),
723 2000, RT(2), 2500, RT(5),
726 static const int thresh_mult_map_split1[] = {
727 2500, GOOD(0), 1700, GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
728 RT(0), 5000, RT(1), 10000, RT(2), 25000, RT(3), INT_MAX, INT_MAX
731 static const int thresh_mult_map_split2[] = {
732 5000, GOOD(0), 4500, GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
733 RT(0), 10000, RT(1), 20000, RT(2), 50000, RT(3), INT_MAX, INT_MAX
736 static const int mode_check_freq_map_zn2[] = {
737 /* {zero,nearest}{2,3} */
738 0, RT(10), 1 << 1, RT(11), 1 << 2, RT(12), 1 << 3, INT_MAX
741 static const int mode_check_freq_map_vhbpred[] = { 0, GOOD(5), 2, RT(0),
745 static const int mode_check_freq_map_near2[] = {
746 0, GOOD(5), 2, RT(0), 0, RT(3), 2,
747 RT(10), 1 << 2, RT(11), 1 << 3, RT(12), 1 << 4, INT_MAX
750 static const int mode_check_freq_map_new1[] = {
751 0, RT(10), 1 << 1, RT(11), 1 << 2, RT(12), 1 << 3, INT_MAX
754 static const int mode_check_freq_map_new2[] = { 0, GOOD(5), 4, RT(0),
756 1 << 3, RT(11), 1 << 4, RT(12),
759 static const int mode_check_freq_map_split1[] = { 0, GOOD(2), 2, GOOD(3),
763 static const int mode_check_freq_map_split2[] = { 0, GOOD(1), 2, GOOD(2),
764 4, GOOD(3), 15, RT(1),
765 4, RT(2), 15, INT_MAX };
767 void vp8_set_speed_features(VP8_COMP *cpi) {
768 SPEED_FEATURES *sf = &cpi->sf;
769 int Mode = cpi->compressor_speed;
770 int Speed = cpi->Speed;
773 VP8_COMMON *cm = &cpi->common;
774 int last_improved_quant = sf->improved_quant;
777 /* Initialise default mode frequency sampling variables */
778 for (i = 0; i < MAX_MODES; ++i) {
779 cpi->mode_check_freq[i] = 0;
782 cpi->mb.mbs_tested_so_far = 0;
783 cpi->mb.mbs_zero_last_dot_suppress = 0;
785 /* best quality defaults */
787 sf->search_method = NSTEP;
788 sf->improved_quant = 1;
789 sf->improved_dct = 1;
792 sf->quarter_pixel_search = 1;
793 sf->half_pixel_search = 1;
794 sf->iterative_sub_pixel = 1;
795 sf->optimize_coefficients = 1;
796 sf->use_fastquant_for_pick = 0;
797 sf->no_skip_block4x4_search = 1;
800 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
801 sf->improved_mv_pred = 1;
803 /* default thresholds to 0 */
804 for (i = 0; i < MAX_MODES; ++i) sf->thresh_mult[i] = 0;
806 /* Count enabled references */
808 if (cpi->ref_frame_flags & VP8_LAST_FRAME) ref_frames++;
809 if (cpi->ref_frame_flags & VP8_GOLD_FRAME) ref_frames++;
810 if (cpi->ref_frame_flags & VP8_ALTR_FRAME) ref_frames++;
812 /* Convert speed to continuous range, with clamping */
815 } else if (Mode == 2) {
818 if (Speed > 5) Speed = 5;
822 sf->thresh_mult[THR_ZERO1] = sf->thresh_mult[THR_NEAREST1] =
823 sf->thresh_mult[THR_NEAR1] = sf->thresh_mult[THR_DC] = 0; /* always */
825 sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO3] =
826 sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST3] =
827 sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR3] =
828 speed_map(Speed, thresh_mult_map_znn);
830 sf->thresh_mult[THR_V_PRED] = sf->thresh_mult[THR_H_PRED] =
831 speed_map(Speed, thresh_mult_map_vhpred);
832 sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
833 sf->thresh_mult[THR_TM] = speed_map(Speed, thresh_mult_map_tm);
834 sf->thresh_mult[THR_NEW1] = speed_map(Speed, thresh_mult_map_new1);
835 sf->thresh_mult[THR_NEW2] = sf->thresh_mult[THR_NEW3] =
836 speed_map(Speed, thresh_mult_map_new2);
837 sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
838 sf->thresh_mult[THR_SPLIT2] = sf->thresh_mult[THR_SPLIT3] =
839 speed_map(Speed, thresh_mult_map_split2);
841 // Special case for temporal layers.
842 // Reduce the thresholds for zero/nearest/near for GOLDEN, if GOLDEN is
843 // used as second reference. We don't modify thresholds for ALTREF case
844 // since ALTREF is usually used as long-term reference in temporal layers.
845 if ((cpi->Speed <= 6) && (cpi->oxcf.number_of_layers > 1) &&
846 (cpi->ref_frame_flags & VP8_LAST_FRAME) &&
847 (cpi->ref_frame_flags & VP8_GOLD_FRAME)) {
848 if (cpi->closest_reference_frame == GOLDEN_FRAME) {
849 sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 3;
850 sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 3;
851 sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 3;
853 sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 1;
854 sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 1;
855 sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 1;
859 cpi->mode_check_freq[THR_ZERO1] = cpi->mode_check_freq[THR_NEAREST1] =
860 cpi->mode_check_freq[THR_NEAR1] = cpi->mode_check_freq[THR_TM] =
861 cpi->mode_check_freq[THR_DC] = 0; /* always */
863 cpi->mode_check_freq[THR_ZERO2] = cpi->mode_check_freq[THR_ZERO3] =
864 cpi->mode_check_freq[THR_NEAREST2] = cpi->mode_check_freq[THR_NEAREST3] =
865 speed_map(Speed, mode_check_freq_map_zn2);
867 cpi->mode_check_freq[THR_NEAR2] = cpi->mode_check_freq[THR_NEAR3] =
868 speed_map(Speed, mode_check_freq_map_near2);
870 cpi->mode_check_freq[THR_V_PRED] = cpi->mode_check_freq[THR_H_PRED] =
871 cpi->mode_check_freq[THR_B_PRED] =
872 speed_map(Speed, mode_check_freq_map_vhbpred);
874 // For real-time mode at speed 10 keep the mode_check_freq threshold
875 // for NEW1 similar to that of speed 9.
877 if (cpi->Speed == 10 && Mode == 2) Speed2 = RT(9);
878 cpi->mode_check_freq[THR_NEW1] = speed_map(Speed2, mode_check_freq_map_new1);
880 cpi->mode_check_freq[THR_NEW2] = cpi->mode_check_freq[THR_NEW3] =
881 speed_map(Speed, mode_check_freq_map_new2);
883 cpi->mode_check_freq[THR_SPLIT1] =
884 speed_map(Speed, mode_check_freq_map_split1);
885 cpi->mode_check_freq[THR_SPLIT2] = cpi->mode_check_freq[THR_SPLIT3] =
886 speed_map(Speed, mode_check_freq_map_split2);
889 #if !CONFIG_REALTIME_ONLY
890 case 0: /* best quality mode */
892 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
897 /* Disable coefficient optimization above speed 0 */
898 sf->optimize_coefficients = 0;
899 sf->use_fastquant_for_pick = 1;
900 sf->no_skip_block4x4_search = 0;
906 sf->improved_quant = 0;
907 sf->improved_dct = 0;
909 /* Only do recode loop on key frames, golden frames and
917 sf->recode_loop = 0; /* recode loop off */
918 sf->RD = 0; /* Turn rd off */
922 sf->auto_filter = 0; /* Faster selection of loop filter */
928 sf->optimize_coefficients = 0;
931 sf->iterative_sub_pixel = 1;
932 sf->search_method = NSTEP;
935 sf->improved_quant = 0;
936 sf->improved_dct = 0;
938 sf->use_fastquant_for_pick = 1;
939 sf->no_skip_block4x4_search = 0;
943 if (Speed > 2) sf->auto_filter = 0; /* Faster selection of loop filter */
951 sf->auto_filter = 0; /* Faster selection of loop filter */
952 sf->search_method = HEX;
953 sf->iterative_sub_pixel = 0;
957 unsigned int sum = 0;
958 unsigned int total_mbs = cm->MBs;
960 unsigned int total_skip;
964 if (cpi->oxcf.encode_breakout > 2000) min = cpi->oxcf.encode_breakout;
968 for (i = 0; i < min; ++i) {
969 sum += cpi->mb.error_bins[i];
975 /* i starts from 2 to make sure thresh started from 2048 */
976 for (; i < 1024; ++i) {
977 sum += cpi->mb.error_bins[i];
980 (unsigned int)(cpi->Speed - 6) * (total_mbs - total_skip)) {
988 if (thresh < 2000) thresh = 2000;
990 if (ref_frames > 1) {
991 sf->thresh_mult[THR_NEW1] = thresh;
992 sf->thresh_mult[THR_NEAREST1] = thresh >> 1;
993 sf->thresh_mult[THR_NEAR1] = thresh >> 1;
996 if (ref_frames > 2) {
997 sf->thresh_mult[THR_NEW2] = thresh << 1;
998 sf->thresh_mult[THR_NEAREST2] = thresh;
999 sf->thresh_mult[THR_NEAR2] = thresh;
1002 if (ref_frames > 3) {
1003 sf->thresh_mult[THR_NEW3] = thresh << 1;
1004 sf->thresh_mult[THR_NEAREST3] = thresh;
1005 sf->thresh_mult[THR_NEAR3] = thresh;
1008 sf->improved_mv_pred = 0;
1011 if (Speed > 8) sf->quarter_pixel_search = 0;
1013 if (cm->version == 0) {
1014 cm->filter_type = NORMAL_LOOPFILTER;
1016 if (Speed >= 14) cm->filter_type = SIMPLE_LOOPFILTER;
1018 cm->filter_type = SIMPLE_LOOPFILTER;
1021 /* This has a big hit on quality. Last resort */
1022 if (Speed >= 15) sf->half_pixel_search = 0;
1024 memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
1028 /* Slow quant, dct and trellis not worthwhile for first pass
1029 * so make sure they are always turned off.
1031 if (cpi->pass == 1) {
1032 sf->improved_quant = 0;
1033 sf->optimize_coefficients = 0;
1034 sf->improved_dct = 0;
1037 if (cpi->sf.search_method == NSTEP) {
1038 vp8_init3smotion_compensation(&cpi->mb,
1039 cm->yv12_fb[cm->lst_fb_idx].y_stride);
1040 } else if (cpi->sf.search_method == DIAMOND) {
1041 vp8_init_dsmotion_compensation(&cpi->mb,
1042 cm->yv12_fb[cm->lst_fb_idx].y_stride);
1045 if (cpi->sf.improved_dct) {
1046 cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
1047 cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
1049 /* No fast FDCT defined for any platform at this time. */
1050 cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
1051 cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
1054 cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
1056 if (cpi->sf.improved_quant) {
1057 cpi->mb.quantize_b = vp8_regular_quantize_b;
1059 cpi->mb.quantize_b = vp8_fast_quantize_b;
1061 if (cpi->sf.improved_quant != last_improved_quant) vp8cx_init_quantizer(cpi);
1063 if (cpi->sf.iterative_sub_pixel == 1) {
1064 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
1065 } else if (cpi->sf.quarter_pixel_search) {
1066 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
1067 } else if (cpi->sf.half_pixel_search) {
1068 cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1070 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1073 if (cpi->sf.optimize_coefficients == 1 && cpi->pass != 1) {
1074 cpi->mb.optimize = 1;
1076 cpi->mb.optimize = 0;
1079 if (cpi->common.full_pixel) {
1080 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1084 frames_at_speed[cpi->Speed]++;
1090 static void alloc_raw_frame_buffers(VP8_COMP *cpi) {
1091 #if VP8_TEMPORAL_ALT_REF
1092 int width = (cpi->oxcf.Width + 15) & ~15;
1093 int height = (cpi->oxcf.Height + 15) & ~15;
1096 cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
1097 cpi->oxcf.lag_in_frames);
1098 if (!cpi->lookahead) {
1099 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1100 "Failed to allocate lag buffers");
1103 #if VP8_TEMPORAL_ALT_REF
1105 if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer, width, height,
1106 VP8BORDERINPIXELS)) {
1107 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1108 "Failed to allocate altref buffer");
1114 static void dealloc_raw_frame_buffers(VP8_COMP *cpi) {
1115 #if VP8_TEMPORAL_ALT_REF
1116 vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
1118 vp8_lookahead_destroy(cpi->lookahead);
1121 static int vp8_alloc_partition_data(VP8_COMP *cpi) {
1122 vpx_free(cpi->mb.pip);
1125 vpx_calloc((cpi->common.mb_cols + 1) * (cpi->common.mb_rows + 1),
1126 sizeof(PARTITION_INFO));
1127 if (!cpi->mb.pip) return 1;
1129 cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1134 void vp8_alloc_compressor_data(VP8_COMP *cpi) {
1135 VP8_COMMON *cm = &cpi->common;
1137 int width = cm->Width;
1138 int height = cm->Height;
1140 if (vp8_alloc_frame_buffers(cm, width, height)) {
1141 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1142 "Failed to allocate frame buffers");
1145 if (vp8_alloc_partition_data(cpi)) {
1146 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1147 "Failed to allocate partition data");
1150 if ((width & 0xf) != 0) width += 16 - (width & 0xf);
1152 if ((height & 0xf) != 0) height += 16 - (height & 0xf);
1154 if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame, width, height,
1155 VP8BORDERINPIXELS)) {
1156 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1157 "Failed to allocate last frame buffer");
1160 if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source, width, height,
1161 VP8BORDERINPIXELS)) {
1162 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1163 "Failed to allocate scaled source buffer");
1169 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
1170 unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
1172 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1174 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1177 /* Data used for real time vc mode to see if gf needs refreshing */
1178 cpi->zeromv_count = 0;
1180 /* Structures used to monitor GF usage */
1181 vpx_free(cpi->gf_active_flags);
1183 cpi->gf_active_flags,
1184 vpx_calloc(sizeof(*cpi->gf_active_flags), cm->mb_rows * cm->mb_cols));
1185 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1187 vpx_free(cpi->mb_activity_map);
1189 cpi->mb_activity_map,
1190 vpx_calloc(sizeof(*cpi->mb_activity_map), cm->mb_rows * cm->mb_cols));
1192 /* allocate memory for storing last frame's MVs for MV prediction. */
1193 vpx_free(cpi->lfmv);
1194 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
1195 sizeof(*cpi->lfmv)));
1196 vpx_free(cpi->lf_ref_frame_sign_bias);
1197 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
1198 vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
1199 sizeof(*cpi->lf_ref_frame_sign_bias)));
1200 vpx_free(cpi->lf_ref_frame);
1201 CHECK_MEM_ERROR(cpi->lf_ref_frame,
1202 vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
1203 sizeof(*cpi->lf_ref_frame)));
1205 /* Create the encoder segmentation map and set all entries to 0 */
1206 vpx_free(cpi->segmentation_map);
1208 cpi->segmentation_map,
1209 vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->segmentation_map)));
1210 cpi->cyclic_refresh_mode_index = 0;
1211 vpx_free(cpi->active_map);
1212 CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cm->mb_rows * cm->mb_cols,
1213 sizeof(*cpi->active_map)));
1214 memset(cpi->active_map, 1, (cm->mb_rows * cm->mb_cols));
1216 #if CONFIG_MULTITHREAD
1218 cpi->mt_sync_range = 1;
1219 } else if (width <= 1280) {
1220 cpi->mt_sync_range = 4;
1221 } else if (width <= 2560) {
1222 cpi->mt_sync_range = 8;
1224 cpi->mt_sync_range = 16;
1227 if (cpi->oxcf.multi_threaded > 1) {
1230 vpx_free(cpi->mt_current_mb_col);
1231 CHECK_MEM_ERROR(cpi->mt_current_mb_col,
1232 vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
1233 for (i = 0; i < cm->mb_rows; ++i)
1234 vpx_atomic_init(&cpi->mt_current_mb_col[i], 0);
1239 vpx_free(cpi->tplist);
1240 CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
1242 #if CONFIG_TEMPORAL_DENOISING
1243 if (cpi->oxcf.noise_sensitivity > 0) {
1244 vp8_denoiser_free(&cpi->denoiser);
1245 if (vp8_denoiser_allocate(&cpi->denoiser, width, height, cm->mb_rows,
1246 cm->mb_cols, cpi->oxcf.noise_sensitivity)) {
1247 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1248 "Failed to allocate denoiser");
1255 static const int q_trans[] = {
1256 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19,
1257 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 35, 37, 39, 41,
1258 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 64, 67, 70, 73, 76, 79,
1259 82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127,
1262 int vp8_reverse_trans(int x) {
1265 for (i = 0; i < 64; ++i) {
1266 if (q_trans[i] >= x) return i;
1271 void vp8_new_framerate(VP8_COMP *cpi, double framerate) {
1272 if (framerate < .1) framerate = 30;
1274 cpi->framerate = framerate;
1275 cpi->output_framerate = framerate;
1276 cpi->per_frame_bandwidth =
1277 (int)round(cpi->oxcf.target_bandwidth / cpi->output_framerate);
1278 cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
1279 cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth *
1280 cpi->oxcf.two_pass_vbrmin_section / 100);
1282 /* Set Maximum gf/arf interval */
1283 cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);
1285 if (cpi->max_gf_interval < 12) cpi->max_gf_interval = 12;
1287 /* Extended interval for genuinely static scenes */
1288 cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1290 /* Special conditions when altr ref frame enabled in lagged compress mode */
1291 if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames) {
1292 if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1) {
1293 cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1296 if (cpi->twopass.static_scene_max_gf_interval >
1297 cpi->oxcf.lag_in_frames - 1) {
1298 cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1302 if (cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval) {
1303 cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1307 static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
1308 VP8_COMMON *cm = &cpi->common;
1313 cpi->auto_adjust_gold_quantizer = 1;
1315 cm->version = oxcf->Version;
1316 vp8_setup_version(cm);
1318 /* Frame rate is not available on the first frame, as it's derived from
1319 * the observed timestamps. The actual value used here doesn't matter
1320 * too much, as it will adapt quickly.
1322 if (oxcf->timebase.num > 0) {
1324 (double)(oxcf->timebase.den) / (double)(oxcf->timebase.num);
1326 cpi->framerate = 30;
1329 /* If the reciprocal of the timebase seems like a reasonable framerate,
1330 * then use that as a guess, otherwise use 30.
1332 if (cpi->framerate > 180) cpi->framerate = 30;
1334 cpi->ref_framerate = cpi->framerate;
1336 cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
1338 cm->refresh_golden_frame = 0;
1339 cm->refresh_last_frame = 1;
1340 cm->refresh_entropy_probs = 1;
1342 /* change includes all joint functionality */
1343 vp8_change_config(cpi, oxcf);
1345 /* Initialize active best and worst q and average q values. */
1346 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1347 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1348 cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
1350 /* Initialise the starting buffer levels */
1351 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
1352 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
1354 cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
1355 cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
1356 cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
1357 cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
1359 cpi->total_actual_bits = 0;
1360 cpi->total_target_vs_actual = 0;
1362 /* Temporal scalabilty */
1363 if (cpi->oxcf.number_of_layers > 1) {
1365 double prev_layer_framerate = 0;
1367 for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
1368 vp8_init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
1369 prev_layer_framerate =
1370 cpi->output_framerate / cpi->oxcf.rate_decimator[i];
1374 #if VP8_TEMPORAL_ALT_REF
1378 cpi->fixed_divide[0] = 0;
1380 for (i = 1; i < 512; ++i) cpi->fixed_divide[i] = 0x80000 / i;
1385 void vp8_update_layer_contexts(VP8_COMP *cpi) {
1386 VP8_CONFIG *oxcf = &cpi->oxcf;
1388 /* Update snapshots of the layer contexts to reflect new parameters */
1389 if (oxcf->number_of_layers > 1) {
1391 double prev_layer_framerate = 0;
1393 assert(oxcf->number_of_layers <= VPX_TS_MAX_LAYERS);
1394 for (i = 0; i < oxcf->number_of_layers && i < VPX_TS_MAX_LAYERS; ++i) {
1395 LAYER_CONTEXT *lc = &cpi->layer_context[i];
1397 lc->framerate = cpi->ref_framerate / oxcf->rate_decimator[i];
1398 lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
1400 lc->starting_buffer_level = rescale(
1401 (int)oxcf->starting_buffer_level_in_ms, lc->target_bandwidth, 1000);
1403 if (oxcf->optimal_buffer_level == 0) {
1404 lc->optimal_buffer_level = lc->target_bandwidth / 8;
1406 lc->optimal_buffer_level = rescale(
1407 (int)oxcf->optimal_buffer_level_in_ms, lc->target_bandwidth, 1000);
1410 if (oxcf->maximum_buffer_size == 0) {
1411 lc->maximum_buffer_size = lc->target_bandwidth / 8;
1413 lc->maximum_buffer_size = rescale((int)oxcf->maximum_buffer_size_in_ms,
1414 lc->target_bandwidth, 1000);
1417 /* Work out the average size of a frame within this layer */
1419 lc->avg_frame_size_for_layer =
1420 (int)round((oxcf->target_bitrate[i] - oxcf->target_bitrate[i - 1]) *
1421 1000 / (lc->framerate - prev_layer_framerate));
1424 prev_layer_framerate = lc->framerate;
1429 void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
1430 VP8_COMMON *cm = &cpi->common;
1432 unsigned int prev_number_of_layers;
1433 unsigned int raw_target_rate;
1439 if (cm->version != oxcf->Version) {
1440 cm->version = oxcf->Version;
1441 vp8_setup_version(cm);
1444 last_w = cpi->oxcf.Width;
1445 last_h = cpi->oxcf.Height;
1446 prev_number_of_layers = cpi->oxcf.number_of_layers;
1450 switch (cpi->oxcf.Mode) {
1453 cpi->compressor_speed = 2;
1455 if (cpi->oxcf.cpu_used < -16) {
1456 cpi->oxcf.cpu_used = -16;
1459 if (cpi->oxcf.cpu_used > 16) cpi->oxcf.cpu_used = 16;
1463 case MODE_GOODQUALITY:
1465 cpi->compressor_speed = 1;
1467 if (cpi->oxcf.cpu_used < -5) {
1468 cpi->oxcf.cpu_used = -5;
1471 if (cpi->oxcf.cpu_used > 5) cpi->oxcf.cpu_used = 5;
1475 case MODE_BESTQUALITY:
1477 cpi->compressor_speed = 0;
1480 case MODE_FIRSTPASS:
1482 cpi->compressor_speed = 1;
1484 case MODE_SECONDPASS:
1486 cpi->compressor_speed = 1;
1488 if (cpi->oxcf.cpu_used < -5) {
1489 cpi->oxcf.cpu_used = -5;
1492 if (cpi->oxcf.cpu_used > 5) cpi->oxcf.cpu_used = 5;
1495 case MODE_SECONDPASS_BEST:
1497 cpi->compressor_speed = 0;
1501 if (cpi->pass == 0) cpi->auto_worst_q = 1;
1503 cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1504 cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1505 cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1507 if (oxcf->fixed_q >= 0) {
1508 if (oxcf->worst_allowed_q < 0) {
1509 cpi->oxcf.fixed_q = q_trans[0];
1511 cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1514 if (oxcf->alt_q < 0) {
1515 cpi->oxcf.alt_q = q_trans[0];
1517 cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1520 if (oxcf->key_q < 0) {
1521 cpi->oxcf.key_q = q_trans[0];
1523 cpi->oxcf.key_q = q_trans[oxcf->key_q];
1526 if (oxcf->gold_q < 0) {
1527 cpi->oxcf.gold_q = q_trans[0];
1529 cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1533 cpi->ext_refresh_frame_flags_pending = 0;
1535 cpi->baseline_gf_interval =
1536 cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1538 // GF behavior for 1 pass CBR, used when error_resilience is off.
1539 if (!cpi->oxcf.error_resilient_mode &&
1540 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
1541 cpi->oxcf.Mode == MODE_REALTIME)
1542 cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
1544 #if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
1545 cpi->oxcf.token_partitions = 3;
1548 if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3) {
1549 cm->multi_token_partition = (TOKEN_PARTITION)cpi->oxcf.token_partitions;
1552 setup_features(cpi);
1554 if (!cpi->use_roi_static_threshold) {
1556 for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
1557 cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1561 /* At the moment the first order values may not be > MAXQ */
1562 if (cpi->oxcf.fixed_q > MAXQ) cpi->oxcf.fixed_q = MAXQ;
1564 /* local file playback mode == really big buffer */
1565 if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) {
1566 cpi->oxcf.starting_buffer_level = 60000;
1567 cpi->oxcf.optimal_buffer_level = 60000;
1568 cpi->oxcf.maximum_buffer_size = 240000;
1569 cpi->oxcf.starting_buffer_level_in_ms = 60000;
1570 cpi->oxcf.optimal_buffer_level_in_ms = 60000;
1571 cpi->oxcf.maximum_buffer_size_in_ms = 240000;
1574 raw_target_rate = (unsigned int)((int64_t)cpi->oxcf.Width * cpi->oxcf.Height *
1575 8 * 3 * cpi->framerate / 1000);
1576 if (cpi->oxcf.target_bandwidth > raw_target_rate)
1577 cpi->oxcf.target_bandwidth = raw_target_rate;
1578 /* Convert target bandwidth from Kbit/s to Bit/s */
1579 cpi->oxcf.target_bandwidth *= 1000;
1581 cpi->oxcf.starting_buffer_level = rescale(
1582 (int)cpi->oxcf.starting_buffer_level, cpi->oxcf.target_bandwidth, 1000);
1584 /* Set or reset optimal and maximum buffer levels. */
1585 if (cpi->oxcf.optimal_buffer_level == 0) {
1586 cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1588 cpi->oxcf.optimal_buffer_level = rescale(
1589 (int)cpi->oxcf.optimal_buffer_level, cpi->oxcf.target_bandwidth, 1000);
1592 if (cpi->oxcf.maximum_buffer_size == 0) {
1593 cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1595 cpi->oxcf.maximum_buffer_size = rescale((int)cpi->oxcf.maximum_buffer_size,
1596 cpi->oxcf.target_bandwidth, 1000);
1598 // Under a configuration change, where maximum_buffer_size may change,
1599 // keep buffer level clipped to the maximum allowed buffer size.
1600 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
1601 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
1602 cpi->buffer_level = cpi->bits_off_target;
1605 /* Set up frame rate and related parameters rate control values. */
1606 vp8_new_framerate(cpi, cpi->framerate);
1608 /* Set absolute upper and lower quality limits */
1609 cpi->worst_quality = cpi->oxcf.worst_allowed_q;
1610 cpi->best_quality = cpi->oxcf.best_allowed_q;
1612 /* active values should only be modified if out of new range */
1613 if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q) {
1614 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1617 else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q) {
1618 cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1620 if (cpi->active_best_quality < cpi->oxcf.best_allowed_q) {
1621 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1624 else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q) {
1625 cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1628 cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
1630 cpi->cq_target_quality = cpi->oxcf.cq_level;
1632 /* Only allow dropped frames in buffered mode */
1633 cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1635 cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1637 // Check if the number of temporal layers has changed, and if so reset the
1638 // pattern counter and set/initialize the temporal layer context for the
1639 // new layer configuration.
1640 if (cpi->oxcf.number_of_layers != prev_number_of_layers) {
1641 // If the number of temporal layers are changed we must start at the
1642 // base of the pattern cycle, so set the layer id to 0 and reset
1643 // the temporal pattern counter.
1644 if (cpi->temporal_layer_id > 0) {
1645 cpi->temporal_layer_id = 0;
1647 cpi->temporal_pattern_counter = 0;
1648 reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
1651 if (!cpi->initial_width) {
1652 cpi->initial_width = cpi->oxcf.Width;
1653 cpi->initial_height = cpi->oxcf.Height;
1656 cm->Width = cpi->oxcf.Width;
1657 cm->Height = cpi->oxcf.Height;
1658 assert(cm->Width <= cpi->initial_width);
1659 assert(cm->Height <= cpi->initial_height);
1661 /* TODO(jkoleszar): if an internal spatial resampling is active,
1662 * and we downsize the input image, maybe we should clear the
1663 * internal scale immediately rather than waiting for it to
1667 /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
1668 if (cpi->oxcf.Sharpness > 7) cpi->oxcf.Sharpness = 7;
1670 cm->sharpness_level = cpi->oxcf.Sharpness;
1672 if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL) {
1675 Scale2Ratio(cm->horiz_scale, &hr, &hs);
1676 Scale2Ratio(cm->vert_scale, &vr, &vs);
1678 /* always go to the next whole number */
1679 cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1680 cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1683 if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height) {
1684 cpi->force_next_frame_intra = 1;
1687 if (((cm->Width + 15) & ~15) != cm->yv12_fb[cm->lst_fb_idx].y_width ||
1688 ((cm->Height + 15) & ~15) != cm->yv12_fb[cm->lst_fb_idx].y_height ||
1689 cm->yv12_fb[cm->lst_fb_idx].y_width == 0) {
1690 dealloc_raw_frame_buffers(cpi);
1691 alloc_raw_frame_buffers(cpi);
1692 vp8_alloc_compressor_data(cpi);
1695 if (cpi->oxcf.fixed_q >= 0) {
1696 cpi->last_q[0] = cpi->oxcf.fixed_q;
1697 cpi->last_q[1] = cpi->oxcf.fixed_q;
1700 cpi->Speed = cpi->oxcf.cpu_used;
1702 /* force to allowlag to 0 if lag_in_frames is 0; */
1703 if (cpi->oxcf.lag_in_frames == 0) {
1704 cpi->oxcf.allow_lag = 0;
1706 /* Limit on lag buffers as these are not currently dynamically allocated */
1707 else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS) {
1708 cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1712 cpi->alt_ref_source = NULL;
1713 cpi->is_src_frame_alt_ref = 0;
1715 #if CONFIG_TEMPORAL_DENOISING
1716 if (cpi->oxcf.noise_sensitivity) {
1717 if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc) {
1718 int width = (cpi->oxcf.Width + 15) & ~15;
1719 int height = (cpi->oxcf.Height + 15) & ~15;
1720 if (vp8_denoiser_allocate(&cpi->denoiser, width, height, cm->mb_rows,
1721 cm->mb_cols, cpi->oxcf.noise_sensitivity)) {
1722 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1723 "Failed to allocate denoiser");
1730 /* Experimental RD Code */
1731 cpi->frame_distortion = 0;
1732 cpi->last_frame_distortion = 0;
1737 #define M_LOG2_E 0.693147180559945309417
1739 #define log2f(x) (log(x) / (float)M_LOG2_E)
1741 static void cal_mvsadcosts(int *mvsadcost[2]) {
1744 mvsadcost[0][0] = 300;
1745 mvsadcost[1][0] = 300;
1748 double z = 256 * (2 * (log2f(8 * i) + .6));
1749 mvsadcost[0][i] = (int)z;
1750 mvsadcost[1][i] = (int)z;
1751 mvsadcost[0][-i] = (int)z;
1752 mvsadcost[1][-i] = (int)z;
1753 } while (++i <= mvfp_max);
1756 struct VP8_COMP *vp8_create_compressor(VP8_CONFIG *oxcf) {
1762 cpi = vpx_memalign(32, sizeof(VP8_COMP));
1763 /* Check that the CPI instance is valid */
1768 memset(cpi, 0, sizeof(VP8_COMP));
1770 if (setjmp(cm->error.jmp)) {
1771 cpi->common.error.setjmp = 0;
1772 vp8_remove_compressor(&cpi);
1776 cpi->common.error.setjmp = 1;
1778 CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site),
1779 (MAX_MVSEARCH_STEPS * 8) + 1));
1781 vp8_create_common(&cpi->common);
1783 init_config(cpi, oxcf);
1785 memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob,
1786 sizeof(vp8cx_base_skip_false_prob));
1787 cpi->common.current_video_frame = 0;
1788 cpi->temporal_pattern_counter = 0;
1789 cpi->temporal_layer_id = -1;
1790 cpi->kf_overspend_bits = 0;
1791 cpi->kf_bitrate_adjustment = 0;
1792 cpi->frames_till_gf_update_due = 0;
1793 cpi->gf_overspend_bits = 0;
1794 cpi->non_gf_bitrate_adjustment = 0;
1795 cpi->prob_last_coded = 128;
1796 cpi->prob_gf_coded = 128;
1797 cpi->prob_intra_coded = 63;
1799 /* Prime the recent reference frame usage counters.
1800 * Hereafter they will be maintained as a sort of moving average
1802 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
1803 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
1804 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1805 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1807 /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
1808 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1810 cpi->twopass.gf_decay_rate = 0;
1811 cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1813 cpi->gold_is_last = 0;
1814 cpi->alt_is_last = 0;
1815 cpi->gold_is_alt = 0;
1817 cpi->active_map_enabled = 0;
1819 cpi->use_roi_static_threshold = 0;
1822 /* Experimental code for lagged and one pass */
1823 /* Initialise one_pass GF frames stats */
1824 /* Update stats used for GF selection */
1827 cpi->one_pass_frame_index = 0;
1829 for (i = 0; i < MAX_LAG_BUFFERS; ++i)
1831 cpi->one_pass_frame_stats[i].frames_so_far = 0;
1832 cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1833 cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1834 cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1835 cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1836 cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1837 cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1838 cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1839 cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1844 cpi->mse_source_denoised = 0;
1846 /* Should we use the cyclic refresh method.
1847 * Currently there is no external control for this.
1848 * Enable it for error_resilient_mode, or for 1 pass CBR mode.
1850 cpi->cyclic_refresh_mode_enabled =
1851 (cpi->oxcf.error_resilient_mode ||
1852 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
1853 cpi->oxcf.Mode <= 2));
1854 cpi->cyclic_refresh_mode_max_mbs_perframe =
1855 (cpi->common.mb_rows * cpi->common.mb_cols) / 7;
1856 if (cpi->oxcf.number_of_layers == 1) {
1857 cpi->cyclic_refresh_mode_max_mbs_perframe =
1858 (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
1859 } else if (cpi->oxcf.number_of_layers == 2) {
1860 cpi->cyclic_refresh_mode_max_mbs_perframe =
1861 (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
1863 cpi->cyclic_refresh_mode_index = 0;
1864 cpi->cyclic_refresh_q = 32;
1866 // GF behavior for 1 pass CBR, used when error_resilience is off.
1867 cpi->gf_update_onepass_cbr = 0;
1868 cpi->gf_noboost_onepass_cbr = 0;
1869 if (!cpi->oxcf.error_resilient_mode &&
1870 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER && cpi->oxcf.Mode <= 2) {
1871 cpi->gf_update_onepass_cbr = 1;
1872 cpi->gf_noboost_onepass_cbr = 1;
1873 cpi->gf_interval_onepass_cbr =
1874 cpi->cyclic_refresh_mode_max_mbs_perframe > 0
1875 ? (2 * (cpi->common.mb_rows * cpi->common.mb_cols) /
1876 cpi->cyclic_refresh_mode_max_mbs_perframe)
1878 cpi->gf_interval_onepass_cbr =
1879 VPXMIN(40, VPXMAX(6, cpi->gf_interval_onepass_cbr));
1880 cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
1883 if (cpi->cyclic_refresh_mode_enabled) {
1884 CHECK_MEM_ERROR(cpi->cyclic_refresh_map,
1885 vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1887 cpi->cyclic_refresh_map = (signed char *)NULL;
1890 CHECK_MEM_ERROR(cpi->skin_map, vpx_calloc(cm->mb_rows * cm->mb_cols,
1891 sizeof(cpi->skin_map[0])));
1893 CHECK_MEM_ERROR(cpi->consec_zero_last,
1894 vpx_calloc(cm->mb_rows * cm->mb_cols, 1));
1895 CHECK_MEM_ERROR(cpi->consec_zero_last_mvbias,
1896 vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1898 /*Initialize the feed-forward activity masking.*/
1899 cpi->activity_avg = 90 << 12;
1901 /* Give a sensible default for the first frame. */
1902 cpi->frames_since_key = 8;
1903 cpi->key_frame_frequency = cpi->oxcf.key_freq;
1904 cpi->this_key_frame_forced = 0;
1905 cpi->next_key_frame_forced = 0;
1907 cpi->source_alt_ref_pending = 0;
1908 cpi->source_alt_ref_active = 0;
1909 cpi->common.refresh_alt_ref_frame = 0;
1911 cpi->force_maxqp = 0;
1912 cpi->frames_since_last_drop_overshoot = 0;
1913 cpi->rt_always_update_correction_factor = 0;
1915 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1916 #if CONFIG_INTERNAL_STATS
1917 cpi->b_calculate_ssimg = 0;
1922 if (cpi->b_calculate_psnr) {
1923 cpi->total_sq_error = 0.0;
1924 cpi->total_sq_error2 = 0.0;
1929 cpi->totalp_y = 0.0;
1930 cpi->totalp_u = 0.0;
1931 cpi->totalp_v = 0.0;
1933 cpi->tot_recode_hits = 0;
1934 cpi->summed_quality = 0;
1935 cpi->summed_weights = 0;
1940 cpi->first_time_stamp_ever = 0x7FFFFFFF;
1942 cpi->frames_till_gf_update_due = 0;
1943 cpi->key_frame_count = 1;
1945 cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
1948 cpi->total_byte_count = 0;
1950 cpi->drop_frame = 0;
1952 cpi->rate_correction_factor = 1.0;
1953 cpi->key_frame_rate_correction_factor = 1.0;
1954 cpi->gf_rate_correction_factor = 1.0;
1955 cpi->twopass.est_max_qcorrection_factor = 1.0;
1957 for (i = 0; i < KEY_FRAME_CONTEXT; ++i) {
1958 cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
1961 #ifdef OUTPUT_YUV_SRC
1962 yuv_file = fopen("bd.yuv", "ab");
1964 #ifdef OUTPUT_YUV_DENOISED
1965 yuv_denoised_file = fopen("denoised.yuv", "ab");
1967 #ifdef OUTPUT_YUV_SKINMAP
1968 yuv_skinmap_file = fopen("skinmap.yuv", "wb");
1972 framepsnr = fopen("framepsnr.stt", "a");
1973 kf_list = fopen("kf_list.stt", "w");
1976 cpi->output_pkt_list = oxcf->output_pkt_list;
1978 #if !CONFIG_REALTIME_ONLY
1980 if (cpi->pass == 1) {
1981 vp8_init_first_pass(cpi);
1982 } else if (cpi->pass == 2) {
1983 size_t packet_sz = sizeof(FIRSTPASS_STATS);
1984 int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
1986 cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1987 cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1988 cpi->twopass.stats_in_end =
1989 (void *)((char *)cpi->twopass.stats_in + (packets - 1) * packet_sz);
1990 vp8_init_second_pass(cpi);
1995 if (cpi->compressor_speed == 2) {
1996 cpi->avg_encode_time = 0;
1997 cpi->avg_pick_mode_time = 0;
2000 vp8_set_speed_features(cpi);
2002 /* Set starting values of RD threshold multipliers (128 = *1) */
2003 for (i = 0; i < MAX_MODES; ++i) {
2004 cpi->mb.rd_thresh_mult[i] = 128;
2007 #if CONFIG_MULTITHREAD
2008 if (vp8cx_create_encoder_threads(cpi)) {
2009 vp8_remove_compressor(&cpi);
2014 cpi->fn_ptr[BLOCK_16X16].sdf = vpx_sad16x16;
2015 cpi->fn_ptr[BLOCK_16X16].vf = vpx_variance16x16;
2016 cpi->fn_ptr[BLOCK_16X16].svf = vpx_sub_pixel_variance16x16;
2017 cpi->fn_ptr[BLOCK_16X16].sdx3f = vpx_sad16x16x3;
2018 cpi->fn_ptr[BLOCK_16X16].sdx8f = vpx_sad16x16x8;
2019 cpi->fn_ptr[BLOCK_16X16].sdx4df = vpx_sad16x16x4d;
2021 cpi->fn_ptr[BLOCK_16X8].sdf = vpx_sad16x8;
2022 cpi->fn_ptr[BLOCK_16X8].vf = vpx_variance16x8;
2023 cpi->fn_ptr[BLOCK_16X8].svf = vpx_sub_pixel_variance16x8;
2024 cpi->fn_ptr[BLOCK_16X8].sdx3f = vpx_sad16x8x3;
2025 cpi->fn_ptr[BLOCK_16X8].sdx8f = vpx_sad16x8x8;
2026 cpi->fn_ptr[BLOCK_16X8].sdx4df = vpx_sad16x8x4d;
2028 cpi->fn_ptr[BLOCK_8X16].sdf = vpx_sad8x16;
2029 cpi->fn_ptr[BLOCK_8X16].vf = vpx_variance8x16;
2030 cpi->fn_ptr[BLOCK_8X16].svf = vpx_sub_pixel_variance8x16;
2031 cpi->fn_ptr[BLOCK_8X16].sdx3f = vpx_sad8x16x3;
2032 cpi->fn_ptr[BLOCK_8X16].sdx8f = vpx_sad8x16x8;
2033 cpi->fn_ptr[BLOCK_8X16].sdx4df = vpx_sad8x16x4d;
2035 cpi->fn_ptr[BLOCK_8X8].sdf = vpx_sad8x8;
2036 cpi->fn_ptr[BLOCK_8X8].vf = vpx_variance8x8;
2037 cpi->fn_ptr[BLOCK_8X8].svf = vpx_sub_pixel_variance8x8;
2038 cpi->fn_ptr[BLOCK_8X8].sdx3f = vpx_sad8x8x3;
2039 cpi->fn_ptr[BLOCK_8X8].sdx8f = vpx_sad8x8x8;
2040 cpi->fn_ptr[BLOCK_8X8].sdx4df = vpx_sad8x8x4d;
2042 cpi->fn_ptr[BLOCK_4X4].sdf = vpx_sad4x4;
2043 cpi->fn_ptr[BLOCK_4X4].vf = vpx_variance4x4;
2044 cpi->fn_ptr[BLOCK_4X4].svf = vpx_sub_pixel_variance4x4;
2045 cpi->fn_ptr[BLOCK_4X4].sdx3f = vpx_sad4x4x3;
2046 cpi->fn_ptr[BLOCK_4X4].sdx8f = vpx_sad4x4x8;
2047 cpi->fn_ptr[BLOCK_4X4].sdx4df = vpx_sad4x4x4d;
2049 #if VPX_ARCH_X86 || VPX_ARCH_X86_64
2050 cpi->fn_ptr[BLOCK_16X16].copymem = vp8_copy32xn;
2051 cpi->fn_ptr[BLOCK_16X8].copymem = vp8_copy32xn;
2052 cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn;
2053 cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn;
2054 cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn;
2057 cpi->full_search_sad = vp8_full_search_sad;
2058 cpi->diamond_search_sad = vp8_diamond_search_sad;
2059 cpi->refining_search_sad = vp8_refining_search_sad;
2061 /* make sure frame 1 is okay */
2062 cpi->mb.error_bins[0] = cpi->common.MBs;
2064 /* vp8cx_init_quantizer() is first called here. Add check in
2065 * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
2066 * called later when needed. This will avoid unnecessary calls of
2067 * vp8cx_init_quantizer() for every frame.
2069 vp8cx_init_quantizer(cpi);
2071 vp8_loop_filter_init(cm);
2073 cpi->common.error.setjmp = 0;
2075 #if CONFIG_MULTI_RES_ENCODING
2077 /* Calculate # of MBs in a row in lower-resolution level image. */
2078 if (cpi->oxcf.mr_encoder_id > 0) vp8_cal_low_res_mb_cols(cpi);
2082 /* setup RD costs to MACROBLOCK struct */
2084 cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max + 1];
2085 cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max + 1];
2086 cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max + 1];
2087 cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max + 1];
2089 cal_mvsadcosts(cpi->mb.mvsadcost);
2091 cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
2092 cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
2093 cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
2094 cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
2095 cpi->mb.token_costs = cpi->rd_costs.token_costs;
2097 /* setup block ptrs & offsets */
2098 vp8_setup_block_ptrs(&cpi->mb);
2099 vp8_setup_block_dptrs(&cpi->mb.e_mbd);
2104 void vp8_remove_compressor(VP8_COMP **comp) {
2105 VP8_COMP *cpi = *comp;
2109 if (cpi && (cpi->common.current_video_frame > 0)) {
2110 #if !CONFIG_REALTIME_ONLY
2112 if (cpi->pass == 2) {
2113 vp8_end_second_pass(cpi);
2118 #if CONFIG_INTERNAL_STATS
2120 if (cpi->pass != 1) {
2121 FILE *f = fopen("opsnr.stt", "a");
2122 double time_encoded =
2123 (cpi->last_end_time_stamp_seen - cpi->first_time_stamp_ever) /
2125 double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
2127 if (cpi->b_calculate_psnr) {
2128 if (cpi->oxcf.number_of_layers > 1) {
2132 "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2133 "GLPsnrP\tVPXSSIM\n");
2134 for (i = 0; i < (int)cpi->oxcf.number_of_layers; ++i) {
2136 (double)cpi->bytes_in_layer[i] * 8.0 / 1000.0 / time_encoded;
2137 double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
2138 cpi->common.Width * cpi->common.Height;
2140 vpx_sse_to_psnr(samples, 255.0, cpi->total_error2[i]);
2141 double total_psnr2 =
2142 vpx_sse_to_psnr(samples, 255.0, cpi->total_error2_p[i]);
2144 100 * pow(cpi->sum_ssim[i] / cpi->sum_weights[i], 8.0);
2147 "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2149 i, dr, cpi->sum_psnr[i] / cpi->frames_in_layer[i],
2150 total_psnr, cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
2151 total_psnr2, total_ssim);
2155 3.0 / 2 * cpi->count * cpi->common.Width * cpi->common.Height;
2157 vpx_sse_to_psnr(samples, 255.0, cpi->total_sq_error);
2158 double total_psnr2 =
2159 vpx_sse_to_psnr(samples, 255.0, cpi->total_sq_error2);
2161 100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
2164 "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2165 "GLPsnrP\tVPXSSIM\n");
2167 "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2169 dr, cpi->total / cpi->count, total_psnr,
2170 cpi->totalp / cpi->count, total_psnr2, total_ssim);
2175 f = fopen("qskip.stt", "a");
2176 fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2185 if (cpi->compressor_speed == 2) {
2187 FILE *f = fopen("cxspeed.stt", "a");
2188 cnt_pm /= cpi->common.MBs;
2190 for (i = 0; i < 16; ++i) fprintf(f, "%5d", frames_at_speed[i]);
2200 extern int count_mb_seg[4];
2201 FILE *f = fopen("modes.stt", "a");
2202 double dr = (double)cpi->framerate * (double)bytes * (double)8 /
2203 (double)count / (double)1000;
2204 fprintf(f, "intra_mode in Intra Frames:\n");
2205 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1],
2206 y_modes[2], y_modes[3], y_modes[4]);
2207 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1],
2208 uv_modes[2], uv_modes[3]);
2213 for (i = 0; i < 10; ++i) fprintf(f, "%8d, ", b_modes[i]);
2218 fprintf(f, "Modes in Inter Frames:\n");
2219 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2220 inter_y_modes[0], inter_y_modes[1], inter_y_modes[2],
2221 inter_y_modes[3], inter_y_modes[4], inter_y_modes[5],
2222 inter_y_modes[6], inter_y_modes[7], inter_y_modes[8],
2224 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0],
2225 inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2230 for (i = 0; i < 15; ++i) fprintf(f, "%8d, ", inter_b_modes[i]);
2234 fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1],
2235 count_mb_seg[2], count_mb_seg[3]);
2236 fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4],
2237 inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4],
2238 inter_b_modes[NEW4X4]);
2244 #if defined(SECTIONBITS_OUTPUT)
2248 FILE *f = fopen("tokenbits.stt", "a");
2250 for (i = 0; i < 28; ++i) fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2260 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2261 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
2262 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);
2267 #if CONFIG_MULTITHREAD
2268 vp8cx_remove_encoder_threads(cpi);
2271 #if CONFIG_TEMPORAL_DENOISING
2272 vp8_denoiser_free(&cpi->denoiser);
2274 dealloc_compressor_data(cpi);
2275 vpx_free(cpi->mb.ss);
2277 vpx_free(cpi->skin_map);
2278 vpx_free(cpi->cyclic_refresh_map);
2279 vpx_free(cpi->consec_zero_last);
2280 vpx_free(cpi->consec_zero_last_mvbias);
2282 vp8_remove_common(&cpi->common);
2286 #ifdef OUTPUT_YUV_SRC
2289 #ifdef OUTPUT_YUV_DENOISED
2290 fclose(yuv_denoised_file);
2292 #ifdef OUTPUT_YUV_SKINMAP
2293 fclose(yuv_skinmap_file);
2310 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2311 unsigned char *recon, int recon_stride,
2312 unsigned int cols, unsigned int rows) {
2313 unsigned int row, col;
2314 uint64_t total_sse = 0;
2317 for (row = 0; row + 16 <= rows; row += 16) {
2318 for (col = 0; col + 16 <= cols; col += 16) {
2321 vpx_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse);
2325 /* Handle odd-sized width */
2327 unsigned int border_row, border_col;
2328 unsigned char *border_orig = orig;
2329 unsigned char *border_recon = recon;
2331 for (border_row = 0; border_row < 16; ++border_row) {
2332 for (border_col = col; border_col < cols; ++border_col) {
2333 diff = border_orig[border_col] - border_recon[border_col];
2334 total_sse += diff * diff;
2337 border_orig += orig_stride;
2338 border_recon += recon_stride;
2342 orig += orig_stride * 16;
2343 recon += recon_stride * 16;
2346 /* Handle odd-sized height */
2347 for (; row < rows; ++row) {
2348 for (col = 0; col < cols; ++col) {
2349 diff = orig[col] - recon[col];
2350 total_sse += diff * diff;
2353 orig += orig_stride;
2354 recon += recon_stride;
2357 vpx_clear_system_state();
2361 static void generate_psnr_packet(VP8_COMP *cpi) {
2362 YV12_BUFFER_CONFIG *orig = cpi->Source;
2363 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
2364 struct vpx_codec_cx_pkt pkt;
2367 unsigned int width = cpi->common.Width;
2368 unsigned int height = cpi->common.Height;
2370 pkt.kind = VPX_CODEC_PSNR_PKT;
2371 sse = calc_plane_error(orig->y_buffer, orig->y_stride, recon->y_buffer,
2372 recon->y_stride, width, height);
2373 pkt.data.psnr.sse[0] = sse;
2374 pkt.data.psnr.sse[1] = sse;
2375 pkt.data.psnr.samples[0] = width * height;
2376 pkt.data.psnr.samples[1] = width * height;
2378 width = (width + 1) / 2;
2379 height = (height + 1) / 2;
2381 sse = calc_plane_error(orig->u_buffer, orig->uv_stride, recon->u_buffer,
2382 recon->uv_stride, width, height);
2383 pkt.data.psnr.sse[0] += sse;
2384 pkt.data.psnr.sse[2] = sse;
2385 pkt.data.psnr.samples[0] += width * height;
2386 pkt.data.psnr.samples[2] = width * height;
2388 sse = calc_plane_error(orig->v_buffer, orig->uv_stride, recon->v_buffer,
2389 recon->uv_stride, width, height);
2390 pkt.data.psnr.sse[0] += sse;
2391 pkt.data.psnr.sse[3] = sse;
2392 pkt.data.psnr.samples[0] += width * height;
2393 pkt.data.psnr.samples[3] = width * height;
2395 for (i = 0; i < 4; ++i) {
2396 pkt.data.psnr.psnr[i] = vpx_sse_to_psnr(pkt.data.psnr.samples[i], 255.0,
2397 (double)(pkt.data.psnr.sse[i]));
2400 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2403 int vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags) {
2404 if (ref_frame_flags > 7) return -1;
2406 cpi->ref_frame_flags = ref_frame_flags;
2409 int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags) {
2410 if (ref_frame_flags > 7) return -1;
2412 cpi->common.refresh_golden_frame = 0;
2413 cpi->common.refresh_alt_ref_frame = 0;
2414 cpi->common.refresh_last_frame = 0;
2416 if (ref_frame_flags & VP8_LAST_FRAME) cpi->common.refresh_last_frame = 1;
2418 if (ref_frame_flags & VP8_GOLD_FRAME) cpi->common.refresh_golden_frame = 1;
2420 if (ref_frame_flags & VP8_ALTR_FRAME) cpi->common.refresh_alt_ref_frame = 1;
2422 cpi->ext_refresh_frame_flags_pending = 1;
2426 int vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag,
2427 YV12_BUFFER_CONFIG *sd) {
2428 VP8_COMMON *cm = &cpi->common;
2431 if (ref_frame_flag == VP8_LAST_FRAME) {
2432 ref_fb_idx = cm->lst_fb_idx;
2433 } else if (ref_frame_flag == VP8_GOLD_FRAME) {
2434 ref_fb_idx = cm->gld_fb_idx;
2435 } else if (ref_frame_flag == VP8_ALTR_FRAME) {
2436 ref_fb_idx = cm->alt_fb_idx;
2441 vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
2445 int vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag,
2446 YV12_BUFFER_CONFIG *sd) {
2447 VP8_COMMON *cm = &cpi->common;
2451 if (ref_frame_flag == VP8_LAST_FRAME) {
2452 ref_fb_idx = cm->lst_fb_idx;
2453 } else if (ref_frame_flag == VP8_GOLD_FRAME) {
2454 ref_fb_idx = cm->gld_fb_idx;
2455 } else if (ref_frame_flag == VP8_ALTR_FRAME) {
2456 ref_fb_idx = cm->alt_fb_idx;
2461 vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
2465 int vp8_update_entropy(VP8_COMP *cpi, int update) {
2466 VP8_COMMON *cm = &cpi->common;
2467 cm->refresh_entropy_probs = update;
2472 static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi) {
2473 VP8_COMMON *cm = &cpi->common;
2475 /* are we resizing the image */
2476 if (cm->horiz_scale != 0 || cm->vert_scale != 0) {
2477 #if CONFIG_SPATIAL_RESAMPLING
2481 if (cm->vert_scale == 3) {
2487 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2488 Scale2Ratio(cm->vert_scale, &vr, &vs);
2490 vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2491 tmp_height, hs, hr, vs, vr, 0);
2493 vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2494 cpi->Source = &cpi->scaled_source;
2501 static int resize_key_frame(VP8_COMP *cpi) {
2502 #if CONFIG_SPATIAL_RESAMPLING
2503 VP8_COMMON *cm = &cpi->common;
2505 /* Do we need to apply resampling for one pass cbr.
2506 * In one pass this is more limited than in two pass cbr.
2507 * The test and any change is only made once per key frame sequence.
2509 if (cpi->oxcf.allow_spatial_resampling &&
2510 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) {
2512 int new_width, new_height;
2514 /* If we are below the resample DOWN watermark then scale down a
2517 if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark *
2518 cpi->oxcf.optimal_buffer_level / 100)) {
2520 (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2521 cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2523 /* Should we now start scaling back up */
2524 else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark *
2525 cpi->oxcf.optimal_buffer_level / 100)) {
2527 (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2528 cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2531 /* Get the new height and width */
2532 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2533 Scale2Ratio(cm->vert_scale, &vr, &vs);
2534 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2535 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2537 /* If the image size has changed we need to reallocate the buffers
2538 * and resample the source image
2540 if ((cm->Width != new_width) || (cm->Height != new_height)) {
2541 cm->Width = new_width;
2542 cm->Height = new_height;
2543 vp8_alloc_compressor_data(cpi);
2544 scale_and_extend_source(cpi->un_scaled_source, cpi);
2553 static void update_alt_ref_frame_stats(VP8_COMP *cpi) {
2554 VP8_COMMON *cm = &cpi->common;
2556 /* Select an interval before next GF or altref */
2557 if (!cpi->auto_gold) cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2559 if ((cpi->pass != 2) && cpi->frames_till_gf_update_due) {
2560 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2562 /* Set the bits per frame that we should try and recover in
2563 * subsequent inter frames to account for the extra GF spend...
2564 * note that his does not apply for GF updates that occur
2565 * coincident with a key frame as the extra cost of key frames is
2566 * dealt with elsewhere.
2568 cpi->gf_overspend_bits += cpi->projected_frame_size;
2569 cpi->non_gf_bitrate_adjustment =
2570 cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2573 /* Update data structure that monitors level of reference to last GF */
2574 memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2575 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2577 /* this frame refreshes means next frames don't unless specified by user */
2578 cpi->frames_since_golden = 0;
2580 /* Clear the alternate reference update pending flag. */
2581 cpi->source_alt_ref_pending = 0;
2583 /* Set the alternate reference frame active flag */
2584 cpi->source_alt_ref_active = 1;
2586 static void update_golden_frame_stats(VP8_COMP *cpi) {
2587 VP8_COMMON *cm = &cpi->common;
2589 /* Update the Golden frame usage counts. */
2590 if (cm->refresh_golden_frame) {
2591 /* Select an interval before next GF */
2592 if (!cpi->auto_gold) cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2594 if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0)) {
2595 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2597 /* Set the bits per frame that we should try and recover in
2598 * subsequent inter frames to account for the extra GF spend...
2599 * note that his does not apply for GF updates that occur
2600 * coincident with a key frame as the extra cost of key frames
2601 * is dealt with elsewhere.
2603 if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active) {
2604 /* Calcluate GF bits to be recovered
2605 * Projected size - av frame bits available for inter
2606 * frames for clip as a whole
2608 cpi->gf_overspend_bits +=
2609 (cpi->projected_frame_size - cpi->inter_frame_target);
2612 cpi->non_gf_bitrate_adjustment =
2613 cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2616 /* Update data structure that monitors level of reference to last GF */
2617 memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2618 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2620 /* this frame refreshes means next frames don't unless specified by
2623 cm->refresh_golden_frame = 0;
2624 cpi->frames_since_golden = 0;
2626 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2627 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2628 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2629 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2631 /* ******** Fixed Q test code only ************ */
2632 /* If we are going to use the ALT reference for the next group of
2633 * frames set a flag to say so.
2635 if (cpi->oxcf.fixed_q >= 0 && cpi->oxcf.play_alternate &&
2636 !cpi->common.refresh_alt_ref_frame) {
2637 cpi->source_alt_ref_pending = 1;
2638 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2641 if (!cpi->source_alt_ref_pending) cpi->source_alt_ref_active = 0;
2643 /* Decrement count down till next gf */
2644 if (cpi->frames_till_gf_update_due > 0) cpi->frames_till_gf_update_due--;
2646 } else if (!cpi->common.refresh_alt_ref_frame) {
2647 /* Decrement count down till next gf */
2648 if (cpi->frames_till_gf_update_due > 0) cpi->frames_till_gf_update_due--;
2650 if (cpi->frames_till_alt_ref_frame) cpi->frames_till_alt_ref_frame--;
2652 cpi->frames_since_golden++;
2654 if (cpi->frames_since_golden > 1) {
2655 cpi->recent_ref_frame_usage[INTRA_FRAME] +=
2656 cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
2657 cpi->recent_ref_frame_usage[LAST_FRAME] +=
2658 cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
2659 cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
2660 cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
2661 cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
2662 cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
2667 /* This function updates the reference frame probability estimates that
2668 * will be used during mode selection
2670 static void update_rd_ref_frame_probs(VP8_COMP *cpi) {
2671 VP8_COMMON *cm = &cpi->common;
2673 const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
2674 const int rf_intra = rfct[INTRA_FRAME];
2675 const int rf_inter =
2676 rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2678 if (cm->frame_type == KEY_FRAME) {
2679 cpi->prob_intra_coded = 255;
2680 cpi->prob_last_coded = 128;
2681 cpi->prob_gf_coded = 128;
2682 } else if (!(rf_intra + rf_inter)) {
2683 cpi->prob_intra_coded = 63;
2684 cpi->prob_last_coded = 128;
2685 cpi->prob_gf_coded = 128;
2688 /* update reference frame costs since we can do better than what we got
2691 if (cpi->oxcf.number_of_layers == 1) {
2692 if (cpi->common.refresh_alt_ref_frame) {
2693 cpi->prob_intra_coded += 40;
2694 if (cpi->prob_intra_coded > 255) cpi->prob_intra_coded = 255;
2695 cpi->prob_last_coded = 200;
2696 cpi->prob_gf_coded = 1;
2697 } else if (cpi->frames_since_golden == 0) {
2698 cpi->prob_last_coded = 214;
2699 } else if (cpi->frames_since_golden == 1) {
2700 cpi->prob_last_coded = 192;
2701 cpi->prob_gf_coded = 220;
2702 } else if (cpi->source_alt_ref_active) {
2703 cpi->prob_gf_coded -= 20;
2705 if (cpi->prob_gf_coded < 10) cpi->prob_gf_coded = 10;
2707 if (!cpi->source_alt_ref_active) cpi->prob_gf_coded = 255;
2711 #if !CONFIG_REALTIME_ONLY
2712 /* 1 = key, 0 = inter */
2713 static int decide_key_frame(VP8_COMP *cpi) {
2714 VP8_COMMON *cm = &cpi->common;
2716 int code_key_frame = 0;
2720 if (cpi->Speed > 11) return 0;
2722 /* Clear down mmx registers */
2723 vpx_clear_system_state();
2725 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0)) {
2726 double change = 1.0 *
2727 abs((int)(cpi->mb.intra_error - cpi->last_intra_error)) /
2728 (1 + cpi->last_intra_error);
2731 abs((int)(cpi->mb.prediction_error - cpi->last_prediction_error)) /
2732 (1 + cpi->last_prediction_error);
2733 double minerror = cm->MBs * 256;
2735 cpi->last_intra_error = cpi->mb.intra_error;
2736 cpi->last_prediction_error = cpi->mb.prediction_error;
2738 if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15 &&
2739 cpi->mb.prediction_error > minerror &&
2740 (change > .25 || change2 > .25)) {
2741 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra >
2742 * cpi->last_frame_percent_intra + 3*/
2749 /* If the following are true we might as well code a key frame */
2750 if (((cpi->this_frame_percent_intra == 100) &&
2751 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
2752 ((cpi->this_frame_percent_intra > 95) &&
2753 (cpi->this_frame_percent_intra >=
2754 (cpi->last_frame_percent_intra + 5)))) {
2757 /* in addition if the following are true and this is not a golden frame
2758 * then code a key frame Note that on golden frames there often seems
2759 * to be a pop in intra useage anyway hence this restriction is
2760 * designed to prevent spurious key frames. The Intra pop needs to be
2763 else if (((cpi->this_frame_percent_intra > 60) &&
2764 (cpi->this_frame_percent_intra >
2765 (cpi->last_frame_percent_intra * 2))) ||
2766 ((cpi->this_frame_percent_intra > 75) &&
2767 (cpi->this_frame_percent_intra >
2768 (cpi->last_frame_percent_intra * 3 / 2))) ||
2769 ((cpi->this_frame_percent_intra > 90) &&
2770 (cpi->this_frame_percent_intra >
2771 (cpi->last_frame_percent_intra + 10)))) {
2772 if (!cm->refresh_golden_frame) code_key_frame = 1;
2775 return code_key_frame;
2778 static void Pass1Encode(VP8_COMP *cpi) {
2779 vp8_set_quantizer(cpi, 26);
2780 vp8_first_pass(cpi);
2785 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
2788 /* write the frame */
2793 sprintf(filename, "cx\\y%04d.raw", this_frame);
2794 yframe = fopen(filename, "wb");
2796 for (i = 0; i < frame->y_height; ++i)
2797 fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
2800 sprintf(filename, "cx\\u%04d.raw", this_frame);
2801 yframe = fopen(filename, "wb");
2803 for (i = 0; i < frame->uv_height; ++i)
2804 fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
2807 sprintf(filename, "cx\\v%04d.raw", this_frame);
2808 yframe = fopen(filename, "wb");
2810 for (i = 0; i < frame->uv_height; ++i)
2811 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
2817 #if !CONFIG_REALTIME_ONLY
2818 /* Function to test for conditions that indeicate we should loop
2819 * back and recode a frame.
2821 static int recode_loop_test(VP8_COMP *cpi, int high_limit, int low_limit, int q,
2822 int maxq, int minq) {
2823 int force_recode = 0;
2824 VP8_COMMON *cm = &cpi->common;
2826 /* Is frame recode allowed at all
2827 * Yes if either recode mode 1 is selected or mode two is selcted
2828 * and the frame is a key frame. golden frame or alt_ref_frame
2830 if ((cpi->sf.recode_loop == 1) ||
2831 ((cpi->sf.recode_loop == 2) &&
2832 ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame ||
2833 cm->refresh_alt_ref_frame))) {
2834 /* General over and under shoot tests */
2835 if (((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
2836 ((cpi->projected_frame_size < low_limit) && (q > minq))) {
2839 /* Special Constrained quality tests */
2840 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
2841 /* Undershoot and below auto cq level */
2842 if ((q > cpi->cq_target_quality) &&
2843 (cpi->projected_frame_size < ((cpi->this_frame_target * 7) >> 3))) {
2846 /* Severe undershoot and between auto and user cq level */
2847 else if ((q > cpi->oxcf.cq_level) &&
2848 (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
2849 (cpi->active_best_quality > cpi->oxcf.cq_level)) {
2851 cpi->active_best_quality = cpi->oxcf.cq_level;
2856 return force_recode;
2858 #endif // !CONFIG_REALTIME_ONLY
2860 static void update_reference_frames(VP8_COMP *cpi) {
2861 VP8_COMMON *cm = &cpi->common;
2862 YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
2864 /* At this point the new frame has been encoded.
2865 * If any buffer copy / swapping is signaled it should be done here.
2868 if (cm->frame_type == KEY_FRAME) {
2869 yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME;
2871 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
2872 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
2874 cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
2876 cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
2877 cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
2879 if (cm->refresh_alt_ref_frame) {
2880 assert(!cm->copy_buffer_to_arf);
2882 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
2883 cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
2884 cm->alt_fb_idx = cm->new_fb_idx;
2886 cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
2887 } else if (cm->copy_buffer_to_arf) {
2888 assert(!(cm->copy_buffer_to_arf & ~0x3));
2890 if (cm->copy_buffer_to_arf == 1) {
2891 if (cm->alt_fb_idx != cm->lst_fb_idx) {
2892 yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
2893 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
2894 cm->alt_fb_idx = cm->lst_fb_idx;
2896 cpi->current_ref_frames[ALTREF_FRAME] =
2897 cpi->current_ref_frames[LAST_FRAME];
2900 if (cm->alt_fb_idx != cm->gld_fb_idx) {
2901 yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
2902 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
2903 cm->alt_fb_idx = cm->gld_fb_idx;
2905 cpi->current_ref_frames[ALTREF_FRAME] =
2906 cpi->current_ref_frames[GOLDEN_FRAME];
2911 if (cm->refresh_golden_frame) {
2912 assert(!cm->copy_buffer_to_gf);
2914 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
2915 cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
2916 cm->gld_fb_idx = cm->new_fb_idx;
2918 cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
2919 } else if (cm->copy_buffer_to_gf) {
2920 assert(!(cm->copy_buffer_to_arf & ~0x3));
2922 if (cm->copy_buffer_to_gf == 1) {
2923 if (cm->gld_fb_idx != cm->lst_fb_idx) {
2924 yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
2925 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
2926 cm->gld_fb_idx = cm->lst_fb_idx;
2928 cpi->current_ref_frames[GOLDEN_FRAME] =
2929 cpi->current_ref_frames[LAST_FRAME];
2932 if (cm->alt_fb_idx != cm->gld_fb_idx) {
2933 yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
2934 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
2935 cm->gld_fb_idx = cm->alt_fb_idx;
2937 cpi->current_ref_frames[GOLDEN_FRAME] =
2938 cpi->current_ref_frames[ALTREF_FRAME];
2944 if (cm->refresh_last_frame) {
2945 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
2946 cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
2947 cm->lst_fb_idx = cm->new_fb_idx;
2949 cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
2952 #if CONFIG_TEMPORAL_DENOISING
2953 if (cpi->oxcf.noise_sensitivity) {
2954 /* we shouldn't have to keep multiple copies as we know in advance which
2955 * buffer we should start - for now to get something up and running
2956 * I've chosen to copy the buffers
2958 if (cm->frame_type == KEY_FRAME) {
2960 for (i = LAST_FRAME; i < MAX_REF_FRAMES; ++i)
2961 vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_running_avg[i]);
2963 vp8_yv12_extend_frame_borders(
2964 &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
2966 if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf) {
2967 vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
2968 &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
2970 if (cm->refresh_golden_frame || cm->copy_buffer_to_gf) {
2971 vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
2972 &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
2974 if (cm->refresh_last_frame) {
2975 vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
2976 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
2979 if (cpi->oxcf.noise_sensitivity == 4)
2980 vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_last_source);
2985 static int measure_square_diff_partial(YV12_BUFFER_CONFIG *source,
2986 YV12_BUFFER_CONFIG *dest,
2992 int min_consec_zero_last = 10;
2993 int tot_num_blocks = (source->y_height * source->y_width) >> 8;
2994 unsigned char *src = source->y_buffer;
2995 unsigned char *dst = dest->y_buffer;
2997 /* Loop through the Y plane, every |skip| blocks along rows and colmumns,
2998 * summing the square differences, and only for blocks that have been
2999 * zero_last mode at least |x| frames in a row.
3001 for (i = 0; i < source->y_height; i += 16 * skip) {
3002 int block_index_row = (i >> 4) * cpi->common.mb_cols;
3003 for (j = 0; j < source->y_width; j += 16 * skip) {
3004 int index = block_index_row + (j >> 4);
3005 if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
3007 Total += vpx_mse16x16(src + j, source->y_stride, dst + j,
3008 dest->y_stride, &sse);
3012 src += 16 * skip * source->y_stride;
3013 dst += 16 * skip * dest->y_stride;
3015 // Only return non-zero if we have at least ~1/16 samples for estimate.
3016 if (num_blocks > (tot_num_blocks >> 4)) {
3017 assert(num_blocks != 0);
3018 return (Total / num_blocks);
3024 #if CONFIG_TEMPORAL_DENOISING
3025 static void process_denoiser_mode_change(VP8_COMP *cpi) {
3026 const VP8_COMMON *const cm = &cpi->common;
3030 // Number of blocks skipped along row/column in computing the
3031 // nmse (normalized mean square error) of source.
3033 // Only select blocks for computing nmse that have been encoded
3034 // as ZERO LAST min_consec_zero_last frames in a row.
3035 // Scale with number of temporal layers.
3036 int min_consec_zero_last = 12 / cpi->oxcf.number_of_layers;
3037 // Decision is tested for changing the denoising mode every
3038 // num_mode_change times this function is called. Note that this
3039 // function called every 8 frames, so (8 * num_mode_change) is number
3040 // of frames where denoising mode change is tested for switch.
3041 int num_mode_change = 20;
3042 // Framerate factor, to compensate for larger mse at lower framerates.
3043 // Use ref_framerate, which is full source framerate for temporal layers.
3044 // TODO(marpan): Adjust this factor.
3045 int fac_framerate = cpi->ref_framerate < 25.0f ? 80 : 100;
3046 int tot_num_blocks = cm->mb_rows * cm->mb_cols;
3047 int ystride = cpi->Source->y_stride;
3048 unsigned char *src = cpi->Source->y_buffer;
3049 unsigned char *dst = cpi->denoiser.yv12_last_source.y_buffer;
3050 static const unsigned char const_source[16] = { 128, 128, 128, 128, 128, 128,
3051 128, 128, 128, 128, 128, 128,
3052 128, 128, 128, 128 };
3053 int bandwidth = (int)(cpi->target_bandwidth);
3054 // For temporal layers, use full bandwidth (top layer).
3055 if (cpi->oxcf.number_of_layers > 1) {
3056 LAYER_CONTEXT *lc = &cpi->layer_context[cpi->oxcf.number_of_layers - 1];
3057 bandwidth = (int)(lc->target_bandwidth);
3059 // Loop through the Y plane, every skip blocks along rows and columns,
3060 // summing the normalized mean square error, only for blocks that have
3061 // been encoded as ZEROMV LAST at least min_consec_zero_last least frames in
3062 // a row and have small sum difference between current and previous frame.
3063 // Normalization here is by the contrast of the current frame block.
3064 for (i = 0; i < cm->Height; i += 16 * skip) {
3065 int block_index_row = (i >> 4) * cm->mb_cols;
3066 for (j = 0; j < cm->Width; j += 16 * skip) {
3067 int index = block_index_row + (j >> 4);
3068 if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
3070 const unsigned int var =
3071 vpx_variance16x16(src + j, ystride, dst + j, ystride, &sse);
3072 // Only consider this block as valid for noise measurement
3073 // if the sum_diff average of the current and previous frame
3074 // is small (to avoid effects from lighting change).
3075 if ((sse - var) < 128) {
3077 const unsigned int act =
3078 vpx_variance16x16(src + j, ystride, const_source, 0, &sse2);
3079 if (act > 0) total += sse / act;
3084 src += 16 * skip * ystride;
3085 dst += 16 * skip * ystride;
3087 total = total * fac_framerate / 100;
3089 // Only consider this frame as valid sample if we have computed nmse over
3090 // at least ~1/16 blocks, and Total > 0 (Total == 0 can happen if the
3091 // application inputs duplicate frames, or contrast is all zero).
3092 if (total > 0 && (num_blocks > (tot_num_blocks >> 4))) {
3093 // Update the recursive mean square source_diff.
3094 total = (total << 8) / num_blocks;
3095 if (cpi->denoiser.nmse_source_diff_count == 0) {
3096 // First sample in new interval.
3097 cpi->denoiser.nmse_source_diff = total;
3098 cpi->denoiser.qp_avg = cm->base_qindex;
3100 // For subsequent samples, use average with weight ~1/4 for new sample.
3101 cpi->denoiser.nmse_source_diff =
3102 (int)((total + 3 * cpi->denoiser.nmse_source_diff) >> 2);
3103 cpi->denoiser.qp_avg =
3104 (int)((cm->base_qindex + 3 * cpi->denoiser.qp_avg) >> 2);
3106 cpi->denoiser.nmse_source_diff_count++;
3108 // Check for changing the denoiser mode, when we have obtained #samples =
3109 // num_mode_change. Condition the change also on the bitrate and QP.
3110 if (cpi->denoiser.nmse_source_diff_count == num_mode_change) {
3111 // Check for going up: from normal to aggressive mode.
3112 if ((cpi->denoiser.denoiser_mode == kDenoiserOnYUV) &&
3113 (cpi->denoiser.nmse_source_diff >
3114 cpi->denoiser.threshold_aggressive_mode) &&
3115 (cpi->denoiser.qp_avg < cpi->denoiser.qp_threshold_up &&
3116 bandwidth > cpi->denoiser.bitrate_threshold)) {
3117 vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUVAggressive);
3119 // Check for going down: from aggressive to normal mode.
3120 if (((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
3121 (cpi->denoiser.nmse_source_diff <
3122 cpi->denoiser.threshold_aggressive_mode)) ||
3123 ((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
3124 (cpi->denoiser.qp_avg > cpi->denoiser.qp_threshold_down ||
3125 bandwidth < cpi->denoiser.bitrate_threshold))) {
3126 vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
3129 // Reset metric and counter for next interval.
3130 cpi->denoiser.nmse_source_diff = 0;
3131 cpi->denoiser.qp_avg = 0;
3132 cpi->denoiser.nmse_source_diff_count = 0;
3137 void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) {
3138 const FRAME_TYPE frame_type = cm->frame_type;
3140 int update_any_ref_buffers = 1;
3141 if (cpi->common.refresh_last_frame == 0 &&
3142 cpi->common.refresh_golden_frame == 0 &&
3143 cpi->common.refresh_alt_ref_frame == 0) {
3144 update_any_ref_buffers = 0;
3148 cm->filter_level = 0;
3150 struct vpx_usec_timer timer;
3152 vpx_clear_system_state();
3154 vpx_usec_timer_start(&timer);
3155 if (cpi->sf.auto_filter == 0) {
3156 #if CONFIG_TEMPORAL_DENOISING
3157 if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
3158 // Use the denoised buffer for selecting base loop filter level.
3159 // Denoised signal for current frame is stored in INTRA_FRAME.
3160 // No denoising on key frames.
3161 vp8cx_pick_filter_level_fast(
3162 &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi);
3164 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3167 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3170 #if CONFIG_TEMPORAL_DENOISING
3171 if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
3172 // Use the denoised buffer for selecting base loop filter level.
3173 // Denoised signal for current frame is stored in INTRA_FRAME.
3174 // No denoising on key frames.
3175 vp8cx_pick_filter_level(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3178 vp8cx_pick_filter_level(cpi->Source, cpi);
3181 vp8cx_pick_filter_level(cpi->Source, cpi);
3185 if (cm->filter_level > 0) {
3186 vp8cx_set_alt_lf_level(cpi, cm->filter_level);
3189 vpx_usec_timer_mark(&timer);
3190 cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3193 #if CONFIG_MULTITHREAD
3194 if (vpx_atomic_load_acquire(&cpi->b_multi_threaded)) {
3195 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3199 // No need to apply loop-filter if the encoded frame does not update
3200 // any reference buffers.
3201 if (cm->filter_level > 0 && update_any_ref_buffers) {
3202 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
3205 vp8_yv12_extend_frame_borders(cm->frame_to_show);
3208 static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
3209 unsigned char *dest,
3210 unsigned char *dest_end,
3211 unsigned int *frame_flags) {
3213 int frame_over_shoot_limit;
3214 int frame_under_shoot_limit;
3219 VP8_COMMON *cm = &cpi->common;
3220 int active_worst_qchanged = 0;
3222 #if !CONFIG_REALTIME_ONLY
3226 int zbin_oq_low = 0;
3229 int overshoot_seen = 0;
3230 int undershoot_seen = 0;
3233 int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
3234 cpi->oxcf.optimal_buffer_level / 100);
3235 int drop_mark75 = drop_mark * 2 / 3;
3236 int drop_mark50 = drop_mark / 4;
3237 int drop_mark25 = drop_mark / 8;
3239 /* Clear down mmx registers to allow floating point in what follows */
3240 vpx_clear_system_state();
3242 if (cpi->force_next_frame_intra) {
3243 cm->frame_type = KEY_FRAME; /* delayed intra frame */
3244 cpi->force_next_frame_intra = 0;
3247 /* For an alt ref frame in 2 pass we skip the call to the second pass
3248 * function that sets the target bandwidth
3250 switch (cpi->pass) {
3251 #if !CONFIG_REALTIME_ONLY
3253 if (cpi->common.refresh_alt_ref_frame) {
3254 /* Per frame bit target for the alt ref frame */
3255 cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
3256 /* per second target bitrate */
3257 cpi->target_bandwidth =
3258 (int)(cpi->twopass.gf_bits * cpi->output_framerate);
3261 #endif // !CONFIG_REALTIME_ONLY
3263 cpi->per_frame_bandwidth =
3264 (int)round(cpi->target_bandwidth / cpi->output_framerate);
3268 /* Default turn off buffer to buffer copying */
3269 cm->copy_buffer_to_gf = 0;
3270 cm->copy_buffer_to_arf = 0;
3272 /* Clear zbin over-quant value and mode boost values. */
3273 cpi->mb.zbin_over_quant = 0;
3274 cpi->mb.zbin_mode_boost = 0;
3276 /* Enable or disable mode based tweaking of the zbin
3277 * For 2 Pass Only used where GF/ARF prediction quality
3278 * is above a threshold
3280 cpi->mb.zbin_mode_boost_enabled = 1;
3281 if (cpi->pass == 2) {
3282 if (cpi->gfu_boost <= 400) {
3283 cpi->mb.zbin_mode_boost_enabled = 0;
3287 /* Current default encoder behaviour for the altref sign bias */
3288 if (cpi->source_alt_ref_active) {
3289 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3291 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3294 /* Check to see if a key frame is signaled
3295 * For two pass with auto key frame enabled cm->frame_type may already
3296 * be set, but not for one pass.
3298 if ((cm->current_video_frame == 0) || (cm->frame_flags & FRAMEFLAGS_KEY) ||
3299 (cpi->oxcf.auto_key &&
3300 (cpi->frames_since_key % cpi->key_frame_frequency == 0))) {
3301 /* Key frame from VFW/auto-keyframe/first frame */
3302 cm->frame_type = KEY_FRAME;
3303 #if CONFIG_TEMPORAL_DENOISING
3304 if (cpi->oxcf.noise_sensitivity == 4) {
3305 // For adaptive mode, reset denoiser to normal mode on key frame.
3306 vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
3311 #if CONFIG_MULTI_RES_ENCODING
3312 if (cpi->oxcf.mr_total_resolutions > 1) {
3313 LOWER_RES_FRAME_INFO *low_res_frame_info =
3314 (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
3316 if (cpi->oxcf.mr_encoder_id) {
3317 // Check if lower resolution is available for motion vector reuse.
3318 if (cm->frame_type != KEY_FRAME) {
3319 cpi->mr_low_res_mv_avail = 1;
3320 cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);
3322 if (cpi->ref_frame_flags & VP8_LAST_FRAME)
3323 cpi->mr_low_res_mv_avail &=
3324 (cpi->current_ref_frames[LAST_FRAME] ==
3325 low_res_frame_info->low_res_ref_frames[LAST_FRAME]);
3327 if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
3328 cpi->mr_low_res_mv_avail &=
3329 (cpi->current_ref_frames[GOLDEN_FRAME] ==
3330 low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);
3332 // Don't use altref to determine whether low res is available.
3333 // TODO (marpan): Should we make this type of condition on a
3334 // per-reference frame basis?
3336 if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
3337 cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
3338 == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
3341 // Disable motion vector reuse (i.e., disable any usage of the low_res)
3342 // if the previous lower stream is skipped/disabled.
3343 if (low_res_frame_info->skip_encoding_prev_stream) {
3344 cpi->mr_low_res_mv_avail = 0;
3347 // This stream is not skipped (i.e., it's being encoded), so set this skip
3348 // flag to 0. This is needed for the next stream (i.e., which is the next
3349 // frame to be encoded).
3350 low_res_frame_info->skip_encoding_prev_stream = 0;
3352 // On a key frame: For the lowest resolution, keep track of the key frame
3353 // counter value. For the higher resolutions, reset the current video
3354 // frame counter to that of the lowest resolution.
3355 // This is done to the handle the case where we may stop/start encoding
3356 // higher layer(s). The restart-encoding of higher layer is only signaled
3357 // by a key frame for now.
3358 // TODO (marpan): Add flag to indicate restart-encoding of higher layer.
3359 if (cm->frame_type == KEY_FRAME) {
3360 if (cpi->oxcf.mr_encoder_id) {
3361 // If the initial starting value of the buffer level is zero (this can
3362 // happen because we may have not started encoding this higher stream),
3363 // then reset it to non-zero value based on |starting_buffer_level|.
3364 if (cpi->common.current_video_frame == 0 && cpi->buffer_level == 0) {
3366 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
3367 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
3368 for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
3369 LAYER_CONTEXT *lc = &cpi->layer_context[i];
3370 lc->bits_off_target = lc->starting_buffer_level;
3371 lc->buffer_level = lc->starting_buffer_level;
3374 cpi->common.current_video_frame =
3375 low_res_frame_info->key_frame_counter_value;
3377 low_res_frame_info->key_frame_counter_value =
3378 cpi->common.current_video_frame;
3384 // Find the reference frame closest to the current frame.
3385 cpi->closest_reference_frame = LAST_FRAME;
3386 if (cm->frame_type != KEY_FRAME) {
3388 MV_REFERENCE_FRAME closest_ref = INTRA_FRAME;
3389 if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
3390 closest_ref = LAST_FRAME;
3391 } else if (cpi->ref_frame_flags & VP8_GOLD_FRAME) {
3392 closest_ref = GOLDEN_FRAME;
3393 } else if (cpi->ref_frame_flags & VP8_ALTR_FRAME) {
3394 closest_ref = ALTREF_FRAME;
3396 for (i = 1; i <= 3; ++i) {
3397 vpx_ref_frame_type_t ref_frame_type =
3398 (vpx_ref_frame_type_t)((i == 3) ? 4 : i);
3399 if (cpi->ref_frame_flags & ref_frame_type) {
3400 if ((cm->current_video_frame - cpi->current_ref_frames[i]) <
3401 (cm->current_video_frame - cpi->current_ref_frames[closest_ref])) {
3406 cpi->closest_reference_frame = closest_ref;
3409 /* Set various flags etc to special state if it is a key frame */
3410 if (cm->frame_type == KEY_FRAME) {
3413 // Set the loop filter deltas and segmentation map update
3414 setup_features(cpi);
3416 /* The alternate reference frame cannot be active for a key frame */
3417 cpi->source_alt_ref_active = 0;
3419 /* Reset the RD threshold multipliers to default of * 1 (128) */
3420 for (i = 0; i < MAX_MODES; ++i) {
3421 cpi->mb.rd_thresh_mult[i] = 128;
3424 // Reset the zero_last counter to 0 on key frame.
3425 memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
3426 memset(cpi->consec_zero_last_mvbias, 0,
3427 (cpi->common.mb_rows * cpi->common.mb_cols));
3431 /* Experimental code for lagged compress and one pass
3432 * Initialise one_pass GF frames stats
3433 * Update stats used for GF selection
3436 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3438 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3439 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3440 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3441 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3442 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3443 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3444 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3445 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3446 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3450 update_rd_ref_frame_probs(cpi);
3452 if (cpi->drop_frames_allowed) {
3453 /* The reset to decimation 0 is only done here for one pass.
3454 * Once it is set two pass leaves decimation on till the next kf.
3456 if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0)) {
3457 cpi->decimation_factor--;
3460 if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0) {
3461 cpi->decimation_factor = 1;
3463 } else if (cpi->buffer_level < drop_mark25 &&
3464 (cpi->decimation_factor == 2 || cpi->decimation_factor == 3)) {
3465 cpi->decimation_factor = 3;
3466 } else if (cpi->buffer_level < drop_mark50 &&
3467 (cpi->decimation_factor == 1 || cpi->decimation_factor == 2)) {
3468 cpi->decimation_factor = 2;
3469 } else if (cpi->buffer_level < drop_mark75 &&
3470 (cpi->decimation_factor == 0 || cpi->decimation_factor == 1)) {
3471 cpi->decimation_factor = 1;
3475 /* The following decimates the frame rate according to a regular
3476 * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
3477 * prevent buffer under-run in CBR mode. Alternatively it might be
3478 * desirable in some situations to drop frame rate but throw more bits
3481 * Note that dropping a key frame can be problematic if spatial
3482 * resampling is also active
3484 if (cpi->decimation_factor > 0 && cpi->drop_frames_allowed) {
3485 switch (cpi->decimation_factor) {
3487 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
3490 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3493 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3497 /* Note that we should not throw out a key frame (especially when
3498 * spatial resampling is enabled).
3500 if (cm->frame_type == KEY_FRAME) {
3501 cpi->decimation_count = cpi->decimation_factor;
3502 } else if (cpi->decimation_count > 0) {
3503 cpi->decimation_count--;
3505 cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3506 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
3507 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
3510 #if CONFIG_MULTI_RES_ENCODING
3511 vp8_store_drop_frame_info(cpi);
3514 cm->current_video_frame++;
3515 cpi->frames_since_key++;
3516 cpi->ext_refresh_frame_flags_pending = 0;
3517 // We advance the temporal pattern for dropped frames.
3518 cpi->temporal_pattern_counter++;
3520 #if CONFIG_INTERNAL_STATS
3524 cpi->buffer_level = cpi->bits_off_target;
3526 if (cpi->oxcf.number_of_layers > 1) {
3529 /* Propagate bits saved by dropping the frame to higher
3532 for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
3533 LAYER_CONTEXT *lc = &cpi->layer_context[i];
3534 lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate);
3535 if (lc->bits_off_target > lc->maximum_buffer_size) {
3536 lc->bits_off_target = lc->maximum_buffer_size;
3538 lc->buffer_level = lc->bits_off_target;
3544 cpi->decimation_count = cpi->decimation_factor;
3547 cpi->decimation_count = 0;
3550 /* Decide how big to make the frame */
3551 if (!vp8_pick_frame_size(cpi)) {
3552 /*TODO: 2 drop_frame and return code could be put together. */
3553 #if CONFIG_MULTI_RES_ENCODING
3554 vp8_store_drop_frame_info(cpi);
3556 cm->current_video_frame++;
3557 cpi->frames_since_key++;
3558 cpi->ext_refresh_frame_flags_pending = 0;
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 compute_skin_map(cpi);
3756 /* Setup background Q adjustment for error resilient mode.
3757 * For multi-layer encodes only enable this for the base layer.
3759 if (cpi->cyclic_refresh_mode_enabled) {
3760 // Special case for screen_content_mode with golden frame updates.
3762 (cpi->oxcf.screen_content_mode == 2 && cm->refresh_golden_frame);
3763 if (cpi->current_layer == 0 && cpi->force_maxqp == 0 && !disable_cr_gf) {
3764 cyclic_background_refresh(cpi, Q, 0);
3766 disable_segmentation(cpi);
3770 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
3771 &frame_over_shoot_limit);
3773 #if !CONFIG_REALTIME_ONLY
3774 /* Limit Q range for the adaptive loop. */
3775 bottom_index = cpi->active_best_quality;
3776 top_index = cpi->active_worst_quality;
3777 q_low = cpi->active_best_quality;
3778 q_high = cpi->active_worst_quality;
3781 vp8_save_coding_context(cpi);
3785 scale_and_extend_source(cpi->un_scaled_source, cpi);
3787 #if CONFIG_TEMPORAL_DENOISING && CONFIG_POSTPROC
3788 // Option to apply spatial blur under the aggressive or adaptive
3789 // (temporal denoising) mode.
3790 if (cpi->oxcf.noise_sensitivity >= 3) {
3791 if (cpi->denoiser.denoise_pars.spatial_blur != 0) {
3792 vp8_de_noise(cm, cpi->Source, cpi->denoiser.denoise_pars.spatial_blur, 1);
3797 #if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
3799 if (cpi->oxcf.noise_sensitivity > 0) {
3803 switch (cpi->oxcf.noise_sensitivity) {
3804 case 1: l = 20; break;
3805 case 2: l = 40; break;
3806 case 3: l = 60; break;
3807 case 4: l = 80; break;
3808 case 5: l = 100; break;
3809 case 6: l = 150; break;
3812 if (cm->frame_type == KEY_FRAME) {
3813 vp8_de_noise(cm, cpi->Source, l, 1);
3815 vp8_de_noise(cm, cpi->Source, l, 1);
3817 src = cpi->Source->y_buffer;
3819 if (cpi->Source->y_stride < 0) {
3820 src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
3827 #ifdef OUTPUT_YUV_SRC
3828 vpx_write_yuv_frame(yuv_file, cpi->Source);
3832 vpx_clear_system_state();
3834 vp8_set_quantizer(cpi, Q);
3836 /* setup skip prob for costing in mode/mv decision */
3837 if (cpi->common.mb_no_coeff_skip) {
3838 cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
3840 if (cm->frame_type != KEY_FRAME) {
3841 if (cpi->common.refresh_alt_ref_frame) {
3842 if (cpi->last_skip_false_probs[2] != 0) {
3843 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3847 if(cpi->last_skip_false_probs[2]!=0 && abs(Q-
3848 cpi->last_skip_probs_q[2])<=16 )
3849 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3850 else if (cpi->last_skip_false_probs[2]!=0)
3851 cpi->prob_skip_false = (cpi->last_skip_false_probs[2] +
3852 cpi->prob_skip_false ) / 2;
3854 } else if (cpi->common.refresh_golden_frame) {
3855 if (cpi->last_skip_false_probs[1] != 0) {
3856 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3860 if(cpi->last_skip_false_probs[1]!=0 && abs(Q-
3861 cpi->last_skip_probs_q[1])<=16 )
3862 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3863 else if (cpi->last_skip_false_probs[1]!=0)
3864 cpi->prob_skip_false = (cpi->last_skip_false_probs[1] +
3865 cpi->prob_skip_false ) / 2;
3868 if (cpi->last_skip_false_probs[0] != 0) {
3869 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3873 if(cpi->last_skip_false_probs[0]!=0 && abs(Q-
3874 cpi->last_skip_probs_q[0])<=16 )
3875 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3876 else if(cpi->last_skip_false_probs[0]!=0)
3877 cpi->prob_skip_false = (cpi->last_skip_false_probs[0] +
3878 cpi->prob_skip_false ) / 2;
3882 /* as this is for cost estimate, let's make sure it does not
3883 * go extreme eitehr way
3885 if (cpi->prob_skip_false < 5) cpi->prob_skip_false = 5;
3887 if (cpi->prob_skip_false > 250) cpi->prob_skip_false = 250;
3889 if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref) {
3890 cpi->prob_skip_false = 1;
3898 FILE *f = fopen("skip.stt", "a");
3899 fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
3906 if (cm->frame_type == KEY_FRAME) {
3907 if (resize_key_frame(cpi)) {
3908 /* If the frame size has changed, need to reset Q, quantizer,
3909 * and background refresh.
3911 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3912 if (cpi->cyclic_refresh_mode_enabled) {
3913 if (cpi->current_layer == 0) {
3914 cyclic_background_refresh(cpi, Q, 0);
3916 disable_segmentation(cpi);
3919 // Reset the zero_last counter to 0 on key frame.
3920 memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
3921 memset(cpi->consec_zero_last_mvbias, 0,
3922 (cpi->common.mb_rows * cpi->common.mb_cols));
3923 vp8_set_quantizer(cpi, Q);
3926 vp8_setup_key_frame(cpi);
3929 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
3931 if (cpi->oxcf.error_resilient_mode) cm->refresh_entropy_probs = 0;
3933 if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) {
3934 if (cm->frame_type == KEY_FRAME) cm->refresh_entropy_probs = 1;
3937 if (cm->refresh_entropy_probs == 0) {
3938 /* save a copy for later refresh */
3939 memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
3942 vp8_update_coef_context(cpi);
3944 vp8_update_coef_probs(cpi);
3946 /* transform / motion compensation build reconstruction frame
3947 * +pack coef partitions
3949 vp8_encode_frame(cpi);
3951 /* cpi->projected_frame_size is not needed for RT mode */
3954 /* transform / motion compensation build reconstruction frame */
3955 vp8_encode_frame(cpi);
3957 if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
3958 if (vp8_drop_encodedframe_overshoot(cpi, Q)) {
3959 vpx_clear_system_state();
3962 if (cm->frame_type != KEY_FRAME)
3963 cpi->last_pred_err_mb =
3964 (int)(cpi->mb.prediction_error / cpi->common.MBs);
3967 cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
3968 cpi->projected_frame_size =
3969 (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
3971 vpx_clear_system_state();
3973 /* Test to see if the stats generated for this frame indicate that
3974 * we should have coded a key frame (assuming that we didn't)!
3977 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME &&
3978 cpi->compressor_speed != 2) {
3979 #if !CONFIG_REALTIME_ONLY
3980 if (decide_key_frame(cpi)) {
3981 /* Reset all our sizing numbers and recode */
3982 cm->frame_type = KEY_FRAME;
3984 vp8_pick_frame_size(cpi);
3986 /* Clear the Alt reference frame active flag when we have
3989 cpi->source_alt_ref_active = 0;
3991 // Set the loop filter deltas and segmentation map update
3992 setup_features(cpi);
3994 vp8_restore_coding_context(cpi);
3996 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3998 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
3999 &frame_over_shoot_limit);
4001 /* Limit Q range for the adaptive loop. */
4002 bottom_index = cpi->active_best_quality;
4003 top_index = cpi->active_worst_quality;
4004 q_low = cpi->active_best_quality;
4005 q_high = cpi->active_worst_quality;
4015 vpx_clear_system_state();
4017 if (frame_over_shoot_limit == 0) frame_over_shoot_limit = 1;
4019 /* Are we are overshooting and up against the limit of active max Q. */
4020 if (!cpi->rt_always_update_correction_factor &&
4021 ((cpi->pass != 2) ||
4022 (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
4023 (Q == cpi->active_worst_quality) &&
4024 (cpi->active_worst_quality < cpi->worst_quality) &&
4025 (cpi->projected_frame_size > frame_over_shoot_limit)) {
4026 int over_size_percent =
4027 ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) /
4028 frame_over_shoot_limit;
4030 /* If so is there any scope for relaxing it */
4031 while ((cpi->active_worst_quality < cpi->worst_quality) &&
4032 (over_size_percent > 0)) {
4033 cpi->active_worst_quality++;
4034 /* Assume 1 qstep = about 4% on frame size. */
4035 over_size_percent = (int)(over_size_percent * 0.96);
4037 #if !CONFIG_REALTIME_ONLY
4038 top_index = cpi->active_worst_quality;
4039 #endif // !CONFIG_REALTIME_ONLY
4040 /* If we have updated the active max Q do not call
4041 * vp8_update_rate_correction_factors() this loop.
4043 active_worst_qchanged = 1;
4045 active_worst_qchanged = 0;
4048 #if CONFIG_REALTIME_ONLY
4051 /* Special case handling for forced key frames */
4052 if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
4054 int kf_err = vp8_calc_ss_err(cpi->Source, &cm->yv12_fb[cm->new_fb_idx]);
4056 /* The key frame is not good enough */
4057 if (kf_err > ((cpi->ambient_err * 7) >> 3)) {
4059 q_high = (Q > q_low) ? (Q - 1) : q_low;
4062 Q = (q_high + q_low) >> 1;
4064 /* The key frame is much better than the previous frame */
4065 else if (kf_err < (cpi->ambient_err >> 1)) {
4067 q_low = (Q < q_high) ? (Q + 1) : q_high;
4070 Q = (q_high + q_low + 1) >> 1;
4073 /* Clamp Q to upper and lower limits: */
4076 } else if (Q < q_low) {
4083 /* Is the projected frame size out of range and are we allowed
4084 * to attempt to recode.
4086 else if (recode_loop_test(cpi, frame_over_shoot_limit,
4087 frame_under_shoot_limit, Q, top_index,
4092 /* Frame size out of permitted range. Update correction factor
4093 * & compute new Q to try...
4096 /* Frame is too large */
4097 if (cpi->projected_frame_size > cpi->this_frame_target) {
4098 /* Raise Qlow as to at least the current value */
4099 q_low = (Q < q_high) ? (Q + 1) : q_high;
4101 /* If we are using over quant do the same for zbin_oq_low */
4102 if (cpi->mb.zbin_over_quant > 0) {
4103 zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high)
4104 ? (cpi->mb.zbin_over_quant + 1)
4108 if (undershoot_seen) {
4109 /* Update rate_correction_factor unless
4110 * cpi->active_worst_quality has changed.
4112 if (!active_worst_qchanged) {
4113 vp8_update_rate_correction_factors(cpi, 1);
4116 Q = (q_high + q_low + 1) / 2;
4118 /* Adjust cpi->zbin_over_quant (only allowed when Q
4122 cpi->mb.zbin_over_quant = 0;
4124 zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high)
4125 ? (cpi->mb.zbin_over_quant + 1)
4127 cpi->mb.zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
4130 /* Update rate_correction_factor unless
4131 * cpi->active_worst_quality has changed.
4133 if (!active_worst_qchanged) {
4134 vp8_update_rate_correction_factors(cpi, 0);
4137 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4139 while (((Q < q_low) || (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
4141 vp8_update_rate_correction_factors(cpi, 0);
4142 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4149 /* Frame is too small */
4151 if (cpi->mb.zbin_over_quant == 0) {
4152 /* Lower q_high if not using over quant */
4153 q_high = (Q > q_low) ? (Q - 1) : q_low;
4155 /* else lower zbin_oq_high */
4156 zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low)
4157 ? (cpi->mb.zbin_over_quant - 1)
4161 if (overshoot_seen) {
4162 /* Update rate_correction_factor unless
4163 * cpi->active_worst_quality has changed.
4165 if (!active_worst_qchanged) {
4166 vp8_update_rate_correction_factors(cpi, 1);
4169 Q = (q_high + q_low) / 2;
4171 /* Adjust cpi->zbin_over_quant (only allowed when Q
4175 cpi->mb.zbin_over_quant = 0;
4177 cpi->mb.zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
4180 /* Update rate_correction_factor unless
4181 * cpi->active_worst_quality has changed.
4183 if (!active_worst_qchanged) {
4184 vp8_update_rate_correction_factors(cpi, 0);
4187 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4189 /* Special case reset for qlow for constrained quality.
4190 * This should only trigger where there is very substantial
4191 * undershoot on a frame and the auto cq level is above
4192 * the user passsed in value.
4194 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4199 while (((Q > q_high) || (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
4201 vp8_update_rate_correction_factors(cpi, 0);
4202 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4207 undershoot_seen = 1;
4210 /* Clamp Q to upper and lower limits: */
4213 } else if (Q < q_low) {
4217 /* Clamp cpi->zbin_over_quant */
4218 cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low)
4220 : (cpi->mb.zbin_over_quant > zbin_oq_high)
4222 : cpi->mb.zbin_over_quant;
4228 #endif // CONFIG_REALTIME_ONLY
4230 if (cpi->is_src_frame_alt_ref) Loop = 0;
4233 vp8_restore_coding_context(cpi);
4235 #if CONFIG_INTERNAL_STATS
4236 cpi->tot_recode_hits++;
4239 } while (Loop == 1);
4241 #if defined(DROP_UNCODED_FRAMES)
4242 /* if there are no coded macroblocks at all drop this frame */
4243 if (cpi->common.MBs == cpi->mb.skip_true_count &&
4244 (cpi->drop_frame_count & 7) != 7 && cm->frame_type != KEY_FRAME) {
4245 cpi->common.current_video_frame++;
4246 cpi->frames_since_key++;
4247 cpi->drop_frame_count++;
4248 cpi->ext_refresh_frame_flags_pending = 0;
4249 // We advance the temporal pattern for dropped frames.
4250 cpi->temporal_pattern_counter++;
4253 cpi->drop_frame_count = 0;
4257 /* Experimental code for lagged and one pass
4258 * Update stats used for one pass GF selection
4261 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4262 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4263 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4267 /* Special case code to reduce pulsing when key frames are forced at a
4268 * fixed interval. Note the reconstruction error if it is the frame before
4269 * the force key frame
4271 if (cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0)) {
4273 vp8_calc_ss_err(cpi->Source, &cm->yv12_fb[cm->new_fb_idx]);
4276 /* This frame's MVs are saved and will be used in next frame's MV predictor.
4277 * Last frame has one more line(add to bottom) and one more column(add to
4278 * right) than cm->mip. The edge elements are initialized to 0.
4280 #if CONFIG_MULTI_RES_ENCODING
4281 if (!cpi->oxcf.mr_encoder_id && cm->show_frame)
4283 if (cm->show_frame) /* do not save for altref frame */
4288 /* Point to beginning of allocated MODE_INFO arrays. */
4289 MODE_INFO *tmp = cm->mip;
4291 if (cm->frame_type != KEY_FRAME) {
4292 for (mb_row = 0; mb_row < cm->mb_rows + 1; ++mb_row) {
4293 for (mb_col = 0; mb_col < cm->mb_cols + 1; ++mb_col) {
4294 if (tmp->mbmi.ref_frame != INTRA_FRAME) {
4295 cpi->lfmv[mb_col + mb_row * (cm->mode_info_stride + 1)].as_int =
4296 tmp->mbmi.mv.as_int;
4299 cpi->lf_ref_frame_sign_bias[mb_col +
4300 mb_row * (cm->mode_info_stride + 1)] =
4301 cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4302 cpi->lf_ref_frame[mb_col + mb_row * (cm->mode_info_stride + 1)] =
4303 tmp->mbmi.ref_frame;
4310 /* Count last ref frame 0,0 usage on current encoded frame. */
4314 /* Point to beginning of MODE_INFO arrays. */
4315 MODE_INFO *tmp = cm->mi;
4317 cpi->zeromv_count = 0;
4319 if (cm->frame_type != KEY_FRAME) {
4320 for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
4321 for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
4322 if (tmp->mbmi.mode == ZEROMV && tmp->mbmi.ref_frame == LAST_FRAME) {
4323 cpi->zeromv_count++;
4332 #if CONFIG_MULTI_RES_ENCODING
4333 vp8_cal_dissimilarity(cpi);
4336 /* Update the GF useage maps.
4337 * This is done after completing the compression of a frame when all
4338 * modes etc. are finalized but before loop filter
4340 if (cpi->oxcf.number_of_layers == 1) {
4341 vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4344 if (cm->frame_type == KEY_FRAME) cm->refresh_last_frame = 1;
4348 FILE *f = fopen("gfactive.stt", "a");
4349 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);
4354 /* For inter frames the current default behavior is that when
4355 * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4356 * This is purely an encoder decision at present.
4357 * Avoid this behavior when refresh flags are set by the user.
4359 if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame &&
4360 !cpi->ext_refresh_frame_flags_pending) {
4361 cm->copy_buffer_to_arf = 2;
4363 cm->copy_buffer_to_arf = 0;
4366 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4368 #if CONFIG_TEMPORAL_DENOISING
4369 // Get some measure of the amount of noise, by measuring the (partial) mse
4370 // between source and denoised buffer, for y channel. Partial refers to
4371 // computing the sse for a sub-sample of the frame (i.e., skip x blocks along
4373 // and only for blocks in that set that are consecutive ZEROMV_LAST mode.
4374 // Do this every ~8 frames, to further reduce complexity.
4375 // TODO(marpan): Keep this for now for the case cpi->oxcf.noise_sensitivity <
4377 // should be removed in favor of the process_denoiser_mode_change() function
4379 if (cpi->oxcf.noise_sensitivity > 0 && cpi->oxcf.noise_sensitivity < 4 &&
4380 !cpi->oxcf.screen_content_mode && cpi->frames_since_key % 8 == 0 &&
4381 cm->frame_type != KEY_FRAME) {
4382 cpi->mse_source_denoised = measure_square_diff_partial(
4383 &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi->Source, cpi);
4386 // For the adaptive denoising mode (noise_sensitivity == 4), sample the mse
4387 // of source diff (between current and previous frame), and determine if we
4388 // should switch the denoiser mode. Sampling refers to computing the mse for
4389 // a sub-sample of the frame (i.e., skip x blocks along row/column), and
4390 // only for blocks in that set that have used ZEROMV LAST, along with some
4391 // constraint on the sum diff between blocks. This process is called every
4392 // ~8 frames, to further reduce complexity.
4393 if (cpi->oxcf.noise_sensitivity == 4 && !cpi->oxcf.screen_content_mode &&
4394 cpi->frames_since_key % 8 == 0 && cm->frame_type != KEY_FRAME) {
4395 process_denoiser_mode_change(cpi);
4399 #ifdef OUTPUT_YUV_SKINMAP
4400 if (cpi->common.current_video_frame > 1) {
4401 vp8_compute_skin_map(cpi, yuv_skinmap_file);
4405 #if CONFIG_MULTITHREAD
4406 if (vpx_atomic_load_acquire(&cpi->b_multi_threaded)) {
4407 /* start loopfilter in separate thread */
4408 sem_post(&cpi->h_event_start_lpf);
4409 cpi->b_lpf_running = 1;
4410 /* wait for the filter_level to be picked so that we can continue with
4412 sem_wait(&cpi->h_event_end_lpf);
4416 vp8_loopfilter_frame(cpi, cm);
4419 update_reference_frames(cpi);
4421 #ifdef OUTPUT_YUV_DENOISED
4422 vpx_write_yuv_frame(yuv_denoised_file,
4423 &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
4426 #if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
4427 if (cpi->oxcf.error_resilient_mode) {
4428 cm->refresh_entropy_probs = 0;
4432 /* build the bitstream */
4433 vp8_pack_bitstream(cpi, dest, dest_end, size);
4435 /* Move storing frame_type out of the above loop since it is also
4436 * needed in motion search besides loopfilter */
4437 cm->last_frame_type = cm->frame_type;
4439 /* Update rate control heuristics */
4440 cpi->total_byte_count += (*size);
4441 cpi->projected_frame_size = (int)(*size) << 3;
4443 if (cpi->oxcf.number_of_layers > 1) {
4445 for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
4446 cpi->layer_context[i].total_byte_count += (*size);
4450 if (!active_worst_qchanged) vp8_update_rate_correction_factors(cpi, 2);
4452 cpi->last_q[cm->frame_type] = cm->base_qindex;
4454 if (cm->frame_type == KEY_FRAME) {
4455 vp8_adjust_key_frame_context(cpi);
4458 /* Keep a record of ambient average Q. */
4459 if (cm->frame_type != KEY_FRAME) {
4460 cpi->avg_frame_qindex =
4461 (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4464 /* Keep a record from which we can calculate the average Q excluding
4465 * GF updates and key frames
4467 if ((cm->frame_type != KEY_FRAME) &&
4468 ((cpi->oxcf.number_of_layers > 1) ||
4469 (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame))) {
4472 /* Calculate the average Q for normal inter frames (not key or GFU
4475 if (cpi->pass == 2) {
4476 cpi->ni_tot_qi += Q;
4477 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4479 /* Damp value for first few frames */
4480 if (cpi->ni_frames > 150) {
4481 cpi->ni_tot_qi += Q;
4482 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4484 /* For one pass, early in the clip ... average the current frame Q
4485 * value with the worstq entered by the user as a dampening measure
4488 cpi->ni_tot_qi += Q;
4490 ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4493 /* If the average Q is higher than what was used in the last
4494 * frame (after going through the recode loop to keep the frame
4495 * size within range) then use the last frame value - 1. The -1
4496 * is designed to stop Q and hence the data rate, from
4497 * progressively falling away during difficult sections, but at
4498 * the same time reduce the number of itterations around the
4501 if (Q > cpi->ni_av_qi) cpi->ni_av_qi = Q - 1;
4505 /* Update the buffer level variable. */
4506 /* Non-viewable frames are a special case and are treated as pure overhead. */
4507 if (!cm->show_frame) {
4508 cpi->bits_off_target -= cpi->projected_frame_size;
4510 cpi->bits_off_target +=
4511 cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4514 /* Clip the buffer level to the maximum specified buffer size */
4515 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
4516 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
4519 // Don't let the buffer level go below some threshold, given here
4520 // by -|maximum_buffer_size|. For now we only do this for
4521 // screen content input.
4522 if (cpi->oxcf.screen_content_mode &&
4523 cpi->bits_off_target < -cpi->oxcf.maximum_buffer_size) {
4524 cpi->bits_off_target = -cpi->oxcf.maximum_buffer_size;
4527 /* Rolling monitors of whether we are over or underspending used to
4528 * help regulate min and Max Q in two pass.
4530 cpi->rolling_target_bits = (int)ROUND64_POWER_OF_TWO(
4531 (int64_t)cpi->rolling_target_bits * 3 + cpi->this_frame_target, 2);
4532 cpi->rolling_actual_bits = (int)ROUND64_POWER_OF_TWO(
4533 (int64_t)cpi->rolling_actual_bits * 3 + cpi->projected_frame_size, 2);
4534 cpi->long_rolling_target_bits = (int)ROUND64_POWER_OF_TWO(
4535 (int64_t)cpi->long_rolling_target_bits * 31 + cpi->this_frame_target, 5);
4536 cpi->long_rolling_actual_bits = (int)ROUND64_POWER_OF_TWO(
4537 (int64_t)cpi->long_rolling_actual_bits * 31 + cpi->projected_frame_size,
4540 /* Actual bits spent */
4541 cpi->total_actual_bits += cpi->projected_frame_size;
4543 #if 0 && CONFIG_INTERNAL_STATS
4545 cpi->total_target_vs_actual +=
4546 (cpi->this_frame_target - cpi->projected_frame_size);
4549 cpi->buffer_level = cpi->bits_off_target;
4551 /* Propagate values to higher temporal layers */
4552 if (cpi->oxcf.number_of_layers > 1) {
4555 for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
4556 LAYER_CONTEXT *lc = &cpi->layer_context[i];
4557 int bits_off_for_this_layer = (int)round(
4558 lc->target_bandwidth / lc->framerate - cpi->projected_frame_size);
4560 lc->bits_off_target += bits_off_for_this_layer;
4562 /* Clip buffer level to maximum buffer size for the layer */
4563 if (lc->bits_off_target > lc->maximum_buffer_size) {
4564 lc->bits_off_target = lc->maximum_buffer_size;
4567 lc->total_actual_bits += cpi->projected_frame_size;
4568 lc->total_target_vs_actual += bits_off_for_this_layer;
4569 lc->buffer_level = lc->bits_off_target;
4573 /* Update bits left to the kf and gf groups to account for overshoot
4574 * or undershoot on these frames
4576 if (cm->frame_type == KEY_FRAME) {
4577 cpi->twopass.kf_group_bits +=
4578 cpi->this_frame_target - cpi->projected_frame_size;
4580 if (cpi->twopass.kf_group_bits < 0) cpi->twopass.kf_group_bits = 0;
4581 } else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame) {
4582 cpi->twopass.gf_group_bits +=
4583 cpi->this_frame_target - cpi->projected_frame_size;
4585 if (cpi->twopass.gf_group_bits < 0) cpi->twopass.gf_group_bits = 0;
4588 if (cm->frame_type != KEY_FRAME) {
4589 if (cpi->common.refresh_alt_ref_frame) {
4590 cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4591 cpi->last_skip_probs_q[2] = cm->base_qindex;
4592 } else if (cpi->common.refresh_golden_frame) {
4593 cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4594 cpi->last_skip_probs_q[1] = cm->base_qindex;
4596 cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4597 cpi->last_skip_probs_q[0] = cm->base_qindex;
4599 /* update the baseline */
4600 cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4604 #if 0 && CONFIG_INTERNAL_STATS
4606 FILE *f = fopen("tmp.stt", "a");
4608 vpx_clear_system_state();
4610 if (cpi->twopass.total_left_stats.coded_error != 0.0)
4611 fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
4612 "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
4613 "%8.2lf %"PRId64" %10.3lf %10"PRId64" %8d\n",
4614 cpi->common.current_video_frame, cpi->this_frame_target,
4615 cpi->projected_frame_size,
4616 (cpi->projected_frame_size - cpi->this_frame_target),
4617 cpi->total_target_vs_actual,
4619 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4620 cpi->total_actual_bits, cm->base_qindex,
4621 cpi->active_best_quality, cpi->active_worst_quality,
4622 cpi->ni_av_qi, cpi->cq_target_quality,
4623 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4624 cm->frame_type, cpi->gfu_boost,
4625 cpi->twopass.est_max_qcorrection_factor,
4626 cpi->twopass.bits_left,
4627 cpi->twopass.total_left_stats.coded_error,
4628 (double)cpi->twopass.bits_left /
4629 cpi->twopass.total_left_stats.coded_error,
4630 cpi->tot_recode_hits);
4632 fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
4633 "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
4634 "%8.2lf %"PRId64" %10.3lf %8d\n",
4635 cpi->common.current_video_frame, cpi->this_frame_target,
4636 cpi->projected_frame_size,
4637 (cpi->projected_frame_size - cpi->this_frame_target),
4638 cpi->total_target_vs_actual,
4640 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4641 cpi->total_actual_bits, cm->base_qindex,
4642 cpi->active_best_quality, cpi->active_worst_quality,
4643 cpi->ni_av_qi, cpi->cq_target_quality,
4644 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4645 cm->frame_type, cpi->gfu_boost,
4646 cpi->twopass.est_max_qcorrection_factor,
4647 cpi->twopass.bits_left,
4648 cpi->twopass.total_left_stats.coded_error,
4649 cpi->tot_recode_hits);
4654 FILE *fmodes = fopen("Modes.stt", "a");
4656 fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4657 cpi->common.current_video_frame,
4658 cm->frame_type, cm->refresh_golden_frame,
4659 cm->refresh_alt_ref_frame);
4661 fprintf(fmodes, "\n");
4669 cpi->ext_refresh_frame_flags_pending = 0;
4671 if (cm->refresh_golden_frame == 1) {
4672 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4674 cm->frame_flags = cm->frame_flags & ~FRAMEFLAGS_GOLDEN;
4677 if (cm->refresh_alt_ref_frame == 1) {
4678 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4680 cm->frame_flags = cm->frame_flags & ~FRAMEFLAGS_ALTREF;
4683 if (cm->refresh_last_frame & cm->refresh_golden_frame) { /* both refreshed */
4684 cpi->gold_is_last = 1;
4685 } else if (cm->refresh_last_frame ^ cm->refresh_golden_frame) {
4686 /* 1 refreshed but not the other */
4687 cpi->gold_is_last = 0;
4690 if (cm->refresh_last_frame & cm->refresh_alt_ref_frame) { /* both refreshed */
4691 cpi->alt_is_last = 1;
4692 } else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame) {
4693 /* 1 refreshed but not the other */
4694 cpi->alt_is_last = 0;
4697 if (cm->refresh_alt_ref_frame &
4698 cm->refresh_golden_frame) { /* both refreshed */
4699 cpi->gold_is_alt = 1;
4700 } else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame) {
4701 /* 1 refreshed but not the other */
4702 cpi->gold_is_alt = 0;
4705 cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
4707 if (cpi->gold_is_last) cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;
4709 if (cpi->alt_is_last) cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4711 if (cpi->gold_is_alt) cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4713 if (!cpi->oxcf.error_resilient_mode) {
4714 if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame &&
4715 (cm->frame_type != KEY_FRAME)) {
4716 /* Update the alternate reference frame stats as appropriate. */
4717 update_alt_ref_frame_stats(cpi);
4719 /* Update the Golden frame stats as appropriate. */
4720 update_golden_frame_stats(cpi);
4724 if (cm->frame_type == KEY_FRAME) {
4725 /* Tell the caller that the frame was coded as a key frame */
4726 *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4728 /* As this frame is a key frame the next defaults to an inter frame. */
4729 cm->frame_type = INTER_FRAME;
4731 cpi->last_frame_percent_intra = 100;
4733 *frame_flags = cm->frame_flags & ~FRAMEFLAGS_KEY;
4735 cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4738 /* Clear the one shot update flags for segmentation map and mode/ref
4739 * loop filter deltas.
4741 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4742 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4743 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4745 /* Dont increment frame counters if this was an altref buffer update
4748 if (cm->show_frame) {
4749 cm->current_video_frame++;
4750 cpi->frames_since_key++;
4751 cpi->temporal_pattern_counter++;
4758 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
4759 recon_file = fopen(filename, "wb");
4760 fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4761 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4767 /* vpx_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
4769 #if !CONFIG_REALTIME_ONLY
4770 static void Pass2Encode(VP8_COMP *cpi, size_t *size, unsigned char *dest,
4771 unsigned char *dest_end, unsigned int *frame_flags) {
4772 if (!cpi->common.refresh_alt_ref_frame) vp8_second_pass(cpi);
4774 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
4775 cpi->twopass.bits_left -= 8 * (int)(*size);
4777 if (!cpi->common.refresh_alt_ref_frame) {
4778 double two_pass_min_rate =
4779 (double)(cpi->oxcf.target_bandwidth *
4780 cpi->oxcf.two_pass_vbrmin_section / 100);
4781 cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
4786 int vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags,
4787 YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
4789 struct vpx_usec_timer timer;
4792 vpx_usec_timer_start(&timer);
4794 /* Reinit the lookahead buffer if the frame size changes */
4795 if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height) {
4796 assert(cpi->oxcf.lag_in_frames < 2);
4797 dealloc_raw_frame_buffers(cpi);
4798 alloc_raw_frame_buffers(cpi);
4801 if (vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time, frame_flags,
4802 cpi->active_map_enabled ? cpi->active_map : NULL)) {
4805 vpx_usec_timer_mark(&timer);
4806 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
4811 static int frame_is_reference(const VP8_COMP *cpi) {
4812 const VP8_COMMON *cm = &cpi->common;
4813 const MACROBLOCKD *xd = &cpi->mb.e_mbd;
4815 return cm->frame_type == KEY_FRAME || cm->refresh_last_frame ||
4816 cm->refresh_golden_frame || cm->refresh_alt_ref_frame ||
4817 cm->copy_buffer_to_gf || cm->copy_buffer_to_arf ||
4818 cm->refresh_entropy_probs || xd->mode_ref_lf_delta_update ||
4819 xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
4822 int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags,
4823 size_t *size, unsigned char *dest,
4824 unsigned char *dest_end, int64_t *time_stamp,
4825 int64_t *time_end, int flush) {
4827 struct vpx_usec_timer tsctimer;
4828 struct vpx_usec_timer ticktimer;
4829 struct vpx_usec_timer cmptimer;
4830 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
4832 if (!cpi) return -1;
4836 vpx_usec_timer_start(&cmptimer);
4840 #if !CONFIG_REALTIME_ONLY
4841 /* Should we code an alternate reference frame */
4842 if (cpi->oxcf.error_resilient_mode == 0 && cpi->oxcf.play_alternate &&
4843 cpi->source_alt_ref_pending) {
4844 if ((cpi->source = vp8_lookahead_peek(
4845 cpi->lookahead, cpi->frames_till_gf_update_due, PEEK_FORWARD))) {
4846 cpi->alt_ref_source = cpi->source;
4847 if (cpi->oxcf.arnr_max_frames > 0) {
4848 vp8_temporal_filter_prepare_c(cpi, cpi->frames_till_gf_update_due);
4849 force_src_buffer = &cpi->alt_ref_buffer;
4851 cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
4852 cm->refresh_alt_ref_frame = 1;
4853 cm->refresh_golden_frame = 0;
4854 cm->refresh_last_frame = 0;
4856 /* Clear Pending alt Ref flag. */
4857 cpi->source_alt_ref_pending = 0;
4858 cpi->is_src_frame_alt_ref = 0;
4864 /* Read last frame source if we are encoding first pass. */
4865 if (cpi->pass == 1 && cm->current_video_frame > 0) {
4866 if ((cpi->last_source =
4867 vp8_lookahead_peek(cpi->lookahead, 1, PEEK_BACKWARD)) == NULL) {
4872 if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush))) {
4875 cpi->is_src_frame_alt_ref =
4876 cpi->alt_ref_source && (cpi->source == cpi->alt_ref_source);
4878 if (cpi->is_src_frame_alt_ref) cpi->alt_ref_source = NULL;
4883 cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
4884 cpi->un_scaled_source = cpi->Source;
4885 *time_stamp = cpi->source->ts_start;
4886 *time_end = cpi->source->ts_end;
4887 *frame_flags = cpi->source->flags;
4889 if (cpi->pass == 1 && cm->current_video_frame > 0) {
4890 cpi->last_frame_unscaled_source = &cpi->last_source->img;
4894 #if !CONFIG_REALTIME_ONLY
4896 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
4897 vp8_end_first_pass(cpi); /* get last stats packet */
4898 cpi->twopass.first_pass_done = 1;
4906 if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
4907 cpi->first_time_stamp_ever = cpi->source->ts_start;
4908 cpi->last_end_time_stamp_seen = cpi->source->ts_start;
4911 /* adjust frame rates based on timestamps given */
4912 if (cm->show_frame) {
4913 int64_t this_duration;
4916 if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
4917 this_duration = cpi->source->ts_end - cpi->source->ts_start;
4920 int64_t last_duration;
4922 this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
4923 last_duration = cpi->last_end_time_stamp_seen - cpi->last_time_stamp_seen;
4924 // Cap this to avoid overflow of (this_duration - last_duration) * 10
4925 this_duration = VPXMIN(this_duration, INT64_MAX / 10);
4926 /* do a step update if the duration changes by 10% */
4927 if (last_duration) {
4928 step = (int)(((this_duration - last_duration) * 10 / last_duration));
4932 if (this_duration) {
4934 cpi->ref_framerate = 10000000.0 / this_duration;
4936 double avg_duration, interval;
4938 /* Average this frame's rate into the last second's average
4939 * frame rate. If we haven't seen 1 second yet, then average
4940 * over the whole interval seen.
4942 interval = (double)(cpi->source->ts_end - cpi->first_time_stamp_ever);
4943 if (interval > 10000000.0) interval = 10000000;
4945 avg_duration = 10000000.0 / cpi->ref_framerate;
4946 avg_duration *= (interval - avg_duration + this_duration);
4947 avg_duration /= interval;
4949 cpi->ref_framerate = 10000000.0 / avg_duration;
4951 #if CONFIG_MULTI_RES_ENCODING
4952 if (cpi->oxcf.mr_total_resolutions > 1) {
4953 LOWER_RES_FRAME_INFO *low_res_frame_info =
4954 (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
4955 // Frame rate should be the same for all spatial layers in
4956 // multi-res-encoding (simulcast), so we constrain the frame for
4957 // higher layers to be that of lowest resolution. This is needed
4958 // as he application may decide to skip encoding a high layer and
4959 // then start again, in which case a big jump in time-stamps will
4960 // be received for that high layer, which will yield an incorrect
4961 // frame rate (from time-stamp adjustment in above calculation).
4962 if (cpi->oxcf.mr_encoder_id) {
4963 if (!low_res_frame_info->skip_encoding_base_stream)
4964 cpi->ref_framerate = low_res_frame_info->low_res_framerate;
4966 // Keep track of frame rate for lowest resolution.
4967 low_res_frame_info->low_res_framerate = cpi->ref_framerate;
4968 // The base stream is being encoded so set skip flag to 0.
4969 low_res_frame_info->skip_encoding_base_stream = 0;
4973 if (cpi->oxcf.number_of_layers > 1) {
4976 /* Update frame rates for each layer */
4977 assert(cpi->oxcf.number_of_layers <= VPX_TS_MAX_LAYERS);
4978 for (i = 0; i < cpi->oxcf.number_of_layers && i < VPX_TS_MAX_LAYERS;
4980 LAYER_CONTEXT *lc = &cpi->layer_context[i];
4981 lc->framerate = cpi->ref_framerate / cpi->oxcf.rate_decimator[i];
4984 vp8_new_framerate(cpi, cpi->ref_framerate);
4988 cpi->last_time_stamp_seen = cpi->source->ts_start;
4989 cpi->last_end_time_stamp_seen = cpi->source->ts_end;
4992 if (cpi->oxcf.number_of_layers > 1) {
4995 vp8_update_layer_contexts(cpi);
4997 /* Restore layer specific context & set frame rate */
4998 if (cpi->temporal_layer_id >= 0) {
4999 layer = cpi->temporal_layer_id;
5003 .layer_id[cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
5005 vp8_restore_layer_context(cpi, layer);
5006 vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
5009 if (cpi->compressor_speed == 2) {
5010 vpx_usec_timer_start(&tsctimer);
5011 vpx_usec_timer_start(&ticktimer);
5014 cpi->lf_zeromv_pct = (cpi->zeromv_count * 100) / cm->MBs;
5016 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
5019 const int num_part = (1 << cm->multi_token_partition);
5020 /* the available bytes in dest */
5021 const unsigned long dest_size = dest_end - dest;
5022 const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
5024 unsigned char *dp = dest;
5026 cpi->partition_d[0] = dp;
5027 dp += dest_size / 10; /* reserve 1/10 for control partition */
5028 cpi->partition_d_end[0] = dp;
5030 for (i = 0; i < num_part; ++i) {
5031 cpi->partition_d[i + 1] = dp;
5032 dp += tok_part_buff_size;
5033 cpi->partition_d_end[i + 1] = dp;
5038 /* start with a 0 size frame */
5041 /* Clear down mmx registers */
5042 vpx_clear_system_state();
5044 cm->frame_type = INTER_FRAME;
5045 cm->frame_flags = *frame_flags;
5049 if (cm->refresh_alt_ref_frame)
5051 cm->refresh_golden_frame = 0;
5052 cm->refresh_last_frame = 0;
5056 cm->refresh_golden_frame = 0;
5057 cm->refresh_last_frame = 1;
5061 /* find a free buffer for the new frame */
5064 for (; i < NUM_YV12_BUFFERS; ++i) {
5065 if (!cm->yv12_fb[i].flags) {
5071 assert(i < NUM_YV12_BUFFERS);
5073 switch (cpi->pass) {
5074 #if !CONFIG_REALTIME_ONLY
5075 case 1: Pass1Encode(cpi); break;
5076 case 2: Pass2Encode(cpi, size, dest, dest_end, frame_flags); break;
5077 #endif // !CONFIG_REALTIME_ONLY
5079 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
5083 if (cpi->compressor_speed == 2) {
5084 unsigned int duration, duration2;
5085 vpx_usec_timer_mark(&tsctimer);
5086 vpx_usec_timer_mark(&ticktimer);
5088 duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
5089 duration2 = (unsigned int)((double)duration / 2);
5091 if (cm->frame_type != KEY_FRAME) {
5092 if (cpi->avg_encode_time == 0) {
5093 cpi->avg_encode_time = duration;
5095 cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
5101 if (cpi->avg_pick_mode_time == 0) {
5102 cpi->avg_pick_mode_time = duration2;
5104 cpi->avg_pick_mode_time =
5105 (7 * cpi->avg_pick_mode_time + duration2) >> 3;
5111 if (cm->refresh_entropy_probs == 0) {
5112 memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
5115 /* Save the contexts separately for alt ref, gold and last. */
5116 /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
5117 if (cm->refresh_alt_ref_frame) memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
5119 if (cm->refresh_golden_frame) memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
5121 if (cm->refresh_last_frame) memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
5123 /* if its a dropped frame honor the requests on subsequent frames */
5125 cpi->droppable = !frame_is_reference(cpi);
5127 /* return to normal state */
5128 cm->refresh_entropy_probs = 1;
5129 cm->refresh_alt_ref_frame = 0;
5130 cm->refresh_golden_frame = 0;
5131 cm->refresh_last_frame = 1;
5132 cm->frame_type = INTER_FRAME;
5135 /* Save layer specific state */
5136 if (cpi->oxcf.number_of_layers > 1) vp8_save_layer_context(cpi);
5138 vpx_usec_timer_mark(&cmptimer);
5139 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
5141 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame) {
5142 generate_psnr_packet(cpi);
5145 #if CONFIG_INTERNAL_STATS
5147 if (cpi->pass != 1) {
5148 cpi->bytes += *size;
5150 if (cm->show_frame) {
5151 cpi->common.show_frame_mi = cpi->common.mi;
5154 if (cpi->b_calculate_psnr) {
5155 uint64_t ye, ue, ve;
5157 YV12_BUFFER_CONFIG *orig = cpi->Source;
5158 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
5159 unsigned int y_width = cpi->common.Width;
5160 unsigned int y_height = cpi->common.Height;
5161 unsigned int uv_width = (y_width + 1) / 2;
5162 unsigned int uv_height = (y_height + 1) / 2;
5163 int y_samples = y_height * y_width;
5164 int uv_samples = uv_height * uv_width;
5165 int t_samples = y_samples + 2 * uv_samples;
5168 ye = calc_plane_error(orig->y_buffer, orig->y_stride, recon->y_buffer,
5169 recon->y_stride, y_width, y_height);
5171 ue = calc_plane_error(orig->u_buffer, orig->uv_stride, recon->u_buffer,
5172 recon->uv_stride, uv_width, uv_height);
5174 ve = calc_plane_error(orig->v_buffer, orig->uv_stride, recon->v_buffer,
5175 recon->uv_stride, uv_width, uv_height);
5177 sq_error = (double)(ye + ue + ve);
5179 frame_psnr = vpx_sse_to_psnr(t_samples, 255.0, sq_error);
5181 cpi->total_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
5182 cpi->total_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
5183 cpi->total_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
5184 cpi->total_sq_error += sq_error;
5185 cpi->total += frame_psnr;
5188 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
5190 double frame_psnr2, frame_ssim2 = 0;
5193 vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer,
5194 cm->filter_level * 10 / 6);
5195 vpx_clear_system_state();
5197 ye = calc_plane_error(orig->y_buffer, orig->y_stride, pp->y_buffer,
5198 pp->y_stride, y_width, y_height);
5200 ue = calc_plane_error(orig->u_buffer, orig->uv_stride, pp->u_buffer,
5201 pp->uv_stride, uv_width, uv_height);
5203 ve = calc_plane_error(orig->v_buffer, orig->uv_stride, pp->v_buffer,
5204 pp->uv_stride, uv_width, uv_height);
5206 sq_error2 = (double)(ye + ue + ve);
5208 frame_psnr2 = vpx_sse_to_psnr(t_samples, 255.0, sq_error2);
5210 cpi->totalp_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
5211 cpi->totalp_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
5212 cpi->totalp_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
5213 cpi->total_sq_error2 += sq_error2;
5214 cpi->totalp += frame_psnr2;
5217 vpx_calc_ssim(cpi->Source, &cm->post_proc_buffer, &weight);
5219 cpi->summed_quality += frame_ssim2 * weight;
5220 cpi->summed_weights += weight;
5222 if (cpi->oxcf.number_of_layers > 1) {
5225 for (i = cpi->current_layer; i < cpi->oxcf.number_of_layers; ++i) {
5226 cpi->frames_in_layer[i]++;
5228 cpi->bytes_in_layer[i] += *size;
5229 cpi->sum_psnr[i] += frame_psnr;
5230 cpi->sum_psnr_p[i] += frame_psnr2;
5231 cpi->total_error2[i] += sq_error;
5232 cpi->total_error2_p[i] += sq_error2;
5233 cpi->sum_ssim[i] += frame_ssim2 * weight;
5234 cpi->sum_weights[i] += weight;
5245 if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
5247 skiptruecount += cpi->skip_true_count;
5248 skipfalsecount += cpi->skip_false_count;
5256 FILE *f = fopen("skip.stt", "a");
5257 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);
5259 if (cpi->is_src_frame_alt_ref == 1)
5260 fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
5268 cpi->common.error.setjmp = 0;
5270 #if CONFIG_MULTITHREAD
5271 /* wait for the lpf thread done */
5272 if (vpx_atomic_load_acquire(&cpi->b_multi_threaded) && cpi->b_lpf_running) {
5273 sem_wait(&cpi->h_event_end_lpf);
5274 cpi->b_lpf_running = 0;
5281 int vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest,
5282 vp8_ppflags_t *flags) {
5283 if (cpi->common.refresh_alt_ref_frame) {
5289 cpi->common.show_frame_mi = cpi->common.mi;
5290 ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5294 if (cpi->common.frame_to_show) {
5295 *dest = *cpi->common.frame_to_show;
5296 dest->y_width = cpi->common.Width;
5297 dest->y_height = cpi->common.Height;
5298 dest->uv_height = cpi->common.Height / 2;
5305 vpx_clear_system_state();
5310 int vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows,
5311 unsigned int cols, int delta_q[4], int delta_lf[4],
5312 unsigned int threshold[4]) {
5313 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5314 int internal_delta_q[MAX_MB_SEGMENTS];
5315 const int range = 63;
5318 // Check number of rows and columns match
5319 if (cpi->common.mb_rows != (int)rows || cpi->common.mb_cols != (int)cols) {
5323 for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
5324 // Note abs() alone can't be used as the behavior of abs(INT_MIN) is
5326 if (delta_q[i] > range || delta_q[i] < -range || delta_lf[i] > range ||
5327 delta_lf[i] < -range) {
5332 // Also disable segmentation if no deltas are specified.
5333 if (!map || (delta_q[0] == 0 && delta_q[1] == 0 && delta_q[2] == 0 &&
5334 delta_q[3] == 0 && delta_lf[0] == 0 && delta_lf[1] == 0 &&
5335 delta_lf[2] == 0 && delta_lf[3] == 0 && threshold[0] == 0 &&
5336 threshold[1] == 0 && threshold[2] == 0 && threshold[3] == 0)) {
5337 disable_segmentation(cpi);
5341 // Translate the external delta q values to internal values.
5342 for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
5343 internal_delta_q[i] =
5344 (delta_q[i] >= 0) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];
5347 /* Set the segmentation Map */
5348 set_segmentation_map(cpi, map);
5350 /* Activate segmentation. */
5351 enable_segmentation(cpi);
5353 /* Set up the quant segment data */
5354 feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
5355 feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
5356 feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
5357 feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];
5359 /* Set up the loop segment data s */
5360 feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5361 feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5362 feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5363 feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5365 cpi->segment_encode_breakout[0] = threshold[0];
5366 cpi->segment_encode_breakout[1] = threshold[1];
5367 cpi->segment_encode_breakout[2] = threshold[2];
5368 cpi->segment_encode_breakout[3] = threshold[3];
5370 /* Initialise the feature data structure */
5371 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5373 if (threshold[0] != 0 || threshold[1] != 0 || threshold[2] != 0 ||
5375 cpi->use_roi_static_threshold = 1;
5376 cpi->cyclic_refresh_mode_enabled = 0;
5381 int vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows,
5382 unsigned int cols) {
5383 if ((int)rows == cpi->common.mb_rows && (int)cols == cpi->common.mb_cols) {
5385 memcpy(cpi->active_map, map, rows * cols);
5386 cpi->active_map_enabled = 1;
5388 cpi->active_map_enabled = 0;
5397 int vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode,
5398 VPX_SCALING vert_mode) {
5399 if (horiz_mode <= ONETWO) {
5400 cpi->common.horiz_scale = horiz_mode;
5405 if (vert_mode <= ONETWO) {
5406 cpi->common.vert_scale = vert_mode;
5414 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest) {
5418 unsigned char *src = source->y_buffer;
5419 unsigned char *dst = dest->y_buffer;
5421 /* Loop through the Y plane raw and reconstruction data summing
5422 * (square differences)
5424 for (i = 0; i < source->y_height; i += 16) {
5425 for (j = 0; j < source->y_width; j += 16) {
5427 Total += vpx_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride,
5431 src += 16 * source->y_stride;
5432 dst += 16 * dest->y_stride;
5438 int vp8_get_quantizer(VP8_COMP *cpi) { return cpi->common.base_qindex; }