media/libvpx/vp8/encoder/onyx_if.c

branch
TOR_BUG_9701
changeset 10
ac0c01689b40
equal deleted inserted replaced
-1:000000000000 0:c0c7bbe96766
1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
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.
9 */
10
11
12 #include "vpx_config.h"
13 #include "./vpx_scale_rtcd.h"
14 #include "vp8/common/onyxc_int.h"
15 #include "vp8/common/blockd.h"
16 #include "onyx_int.h"
17 #include "vp8/common/systemdependent.h"
18 #include "quantize.h"
19 #include "vp8/common/alloccommon.h"
20 #include "mcomp.h"
21 #include "firstpass.h"
22 #include "psnr.h"
23 #include "vpx_scale/vpx_scale.h"
24 #include "vp8/common/extend.h"
25 #include "ratectrl.h"
26 #include "vp8/common/quant_common.h"
27 #include "segmentation.h"
28 #if CONFIG_POSTPROC
29 #include "vp8/common/postproc.h"
30 #endif
31 #include "vpx_mem/vpx_mem.h"
32 #include "vp8/common/swapyv12buffer.h"
33 #include "vp8/common/threading.h"
34 #include "vpx_ports/vpx_timer.h"
35 #if ARCH_ARM
36 #include "vpx_ports/arm.h"
37 #endif
38 #if CONFIG_MULTI_RES_ENCODING
39 #include "mr_dissim.h"
40 #endif
41 #include "encodeframe.h"
42
43 #include <math.h>
44 #include <stdio.h>
45 #include <limits.h>
46
47 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
48 extern int vp8_update_coef_context(VP8_COMP *cpi);
49 extern void vp8_update_coef_probs(VP8_COMP *cpi);
50 #endif
51
52 extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
53 extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
54 extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
55
56 extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
57 extern void print_parms(VP8_CONFIG *ocf, char *filenam);
58 extern unsigned int vp8_get_processor_freq();
59 extern void print_tree_update_probs();
60 extern int vp8cx_create_encoder_threads(VP8_COMP *cpi);
61 extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
62
63 int vp8_estimate_entropy_savings(VP8_COMP *cpi);
64
65 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
66
67 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
68
69 static void set_default_lf_deltas(VP8_COMP *cpi);
70
71 extern const int vp8_gf_interval_table[101];
72
73 #if CONFIG_INTERNAL_STATS
74 #include "math.h"
75
76 extern double vp8_calc_ssim
77 (
78 YV12_BUFFER_CONFIG *source,
79 YV12_BUFFER_CONFIG *dest,
80 int lumamask,
81 double *weight
82 );
83
84
85 extern double vp8_calc_ssimg
86 (
87 YV12_BUFFER_CONFIG *source,
88 YV12_BUFFER_CONFIG *dest,
89 double *ssim_y,
90 double *ssim_u,
91 double *ssim_v
92 );
93
94
95 #endif
96
97
98 #ifdef OUTPUT_YUV_SRC
99 FILE *yuv_file;
100 #endif
101
102 #if 0
103 FILE *framepsnr;
104 FILE *kf_list;
105 FILE *keyfile;
106 #endif
107
108 #if 0
109 extern int skip_true_count;
110 extern int skip_false_count;
111 #endif
112
113
114 #ifdef VP8_ENTROPY_STATS
115 extern int intra_mode_stats[10][10][10];
116 #endif
117
118 #ifdef SPEEDSTATS
119 unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
120 unsigned int tot_pm = 0;
121 unsigned int cnt_pm = 0;
122 unsigned int tot_ef = 0;
123 unsigned int cnt_ef = 0;
124 #endif
125
126 #ifdef MODE_STATS
127 extern unsigned __int64 Sectionbits[50];
128 extern int y_modes[5] ;
129 extern int uv_modes[4] ;
130 extern int b_modes[10] ;
131
132 extern int inter_y_modes[10] ;
133 extern int inter_uv_modes[4] ;
134 extern unsigned int inter_b_modes[15];
135 #endif
136
137 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
138
139 extern const int qrounding_factors[129];
140 extern const int qzbin_factors[129];
141 extern void vp8cx_init_quantizer(VP8_COMP *cpi);
142 extern const int vp8cx_base_skip_false_prob[128];
143
144 /* Tables relating active max Q to active min Q */
145 static const unsigned char kf_low_motion_minq[QINDEX_RANGE] =
146 {
147 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
148 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
149 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
150 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
151 3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,
152 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
153 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
154 16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23
155 };
156 static const unsigned char kf_high_motion_minq[QINDEX_RANGE] =
157 {
158 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
159 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160 1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,
161 3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6,
162 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
163 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
164 16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21,
165 21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30
166 };
167 static const unsigned char gf_low_motion_minq[QINDEX_RANGE] =
168 {
169 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
170 3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,
171 7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,
172 11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,
173 19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,
174 27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,
175 35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,
176 43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
177 };
178 static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] =
179 {
180 0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4,
181 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
182 9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,
183 14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,
184 22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,
185 30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,
186 38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48,
187 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
188 };
189 static const unsigned char gf_high_motion_minq[QINDEX_RANGE] =
190 {
191 0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4,
192 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
193 9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
194 17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,
195 25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,
196 33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,
197 41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54,
198 55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
199 };
200 static const unsigned char inter_minq[QINDEX_RANGE] =
201 {
202 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
203 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
204 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
205 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
206 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
207 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
208 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
209 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
210 };
211
212 #ifdef PACKET_TESTING
213 extern FILE *vpxlogc;
214 #endif
215
216 static void save_layer_context(VP8_COMP *cpi)
217 {
218 LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
219
220 /* Save layer dependent coding state */
221 lc->target_bandwidth = cpi->target_bandwidth;
222 lc->starting_buffer_level = cpi->oxcf.starting_buffer_level;
223 lc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level;
224 lc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size;
225 lc->starting_buffer_level_in_ms = cpi->oxcf.starting_buffer_level_in_ms;
226 lc->optimal_buffer_level_in_ms = cpi->oxcf.optimal_buffer_level_in_ms;
227 lc->maximum_buffer_size_in_ms = cpi->oxcf.maximum_buffer_size_in_ms;
228 lc->buffer_level = cpi->buffer_level;
229 lc->bits_off_target = cpi->bits_off_target;
230 lc->total_actual_bits = cpi->total_actual_bits;
231 lc->worst_quality = cpi->worst_quality;
232 lc->active_worst_quality = cpi->active_worst_quality;
233 lc->best_quality = cpi->best_quality;
234 lc->active_best_quality = cpi->active_best_quality;
235 lc->ni_av_qi = cpi->ni_av_qi;
236 lc->ni_tot_qi = cpi->ni_tot_qi;
237 lc->ni_frames = cpi->ni_frames;
238 lc->avg_frame_qindex = cpi->avg_frame_qindex;
239 lc->rate_correction_factor = cpi->rate_correction_factor;
240 lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
241 lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor;
242 lc->zbin_over_quant = cpi->mb.zbin_over_quant;
243 lc->inter_frame_target = cpi->inter_frame_target;
244 lc->total_byte_count = cpi->total_byte_count;
245 lc->filter_level = cpi->common.filter_level;
246
247 lc->last_frame_percent_intra = cpi->last_frame_percent_intra;
248
249 memcpy (lc->count_mb_ref_frame_usage,
250 cpi->mb.count_mb_ref_frame_usage,
251 sizeof(cpi->mb.count_mb_ref_frame_usage));
252 }
253
254 static void restore_layer_context(VP8_COMP *cpi, const int layer)
255 {
256 LAYER_CONTEXT *lc = &cpi->layer_context[layer];
257
258 /* Restore layer dependent coding state */
259 cpi->current_layer = layer;
260 cpi->target_bandwidth = lc->target_bandwidth;
261 cpi->oxcf.target_bandwidth = lc->target_bandwidth;
262 cpi->oxcf.starting_buffer_level = lc->starting_buffer_level;
263 cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level;
264 cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size;
265 cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
266 cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms;
267 cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms;
268 cpi->buffer_level = lc->buffer_level;
269 cpi->bits_off_target = lc->bits_off_target;
270 cpi->total_actual_bits = lc->total_actual_bits;
271 cpi->active_worst_quality = lc->active_worst_quality;
272 cpi->active_best_quality = lc->active_best_quality;
273 cpi->ni_av_qi = lc->ni_av_qi;
274 cpi->ni_tot_qi = lc->ni_tot_qi;
275 cpi->ni_frames = lc->ni_frames;
276 cpi->avg_frame_qindex = lc->avg_frame_qindex;
277 cpi->rate_correction_factor = lc->rate_correction_factor;
278 cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
279 cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor;
280 cpi->mb.zbin_over_quant = lc->zbin_over_quant;
281 cpi->inter_frame_target = lc->inter_frame_target;
282 cpi->total_byte_count = lc->total_byte_count;
283 cpi->common.filter_level = lc->filter_level;
284
285 cpi->last_frame_percent_intra = lc->last_frame_percent_intra;
286
287 memcpy (cpi->mb.count_mb_ref_frame_usage,
288 lc->count_mb_ref_frame_usage,
289 sizeof(cpi->mb.count_mb_ref_frame_usage));
290 }
291
292 static int rescale(int val, int num, int denom)
293 {
294 int64_t llnum = num;
295 int64_t llden = denom;
296 int64_t llval = val;
297
298 return (int)(llval * llnum / llden);
299 }
300
301 static void init_temporal_layer_context(VP8_COMP *cpi,
302 VP8_CONFIG *oxcf,
303 const int layer,
304 double prev_layer_framerate)
305 {
306 LAYER_CONTEXT *lc = &cpi->layer_context[layer];
307
308 lc->framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[layer];
309 lc->target_bandwidth = cpi->oxcf.target_bitrate[layer] * 1000;
310
311 lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
312 lc->optimal_buffer_level_in_ms = oxcf->optimal_buffer_level;
313 lc->maximum_buffer_size_in_ms = oxcf->maximum_buffer_size;
314
315 lc->starting_buffer_level =
316 rescale((int)(oxcf->starting_buffer_level),
317 lc->target_bandwidth, 1000);
318
319 if (oxcf->optimal_buffer_level == 0)
320 lc->optimal_buffer_level = lc->target_bandwidth / 8;
321 else
322 lc->optimal_buffer_level =
323 rescale((int)(oxcf->optimal_buffer_level),
324 lc->target_bandwidth, 1000);
325
326 if (oxcf->maximum_buffer_size == 0)
327 lc->maximum_buffer_size = lc->target_bandwidth / 8;
328 else
329 lc->maximum_buffer_size =
330 rescale((int)(oxcf->maximum_buffer_size),
331 lc->target_bandwidth, 1000);
332
333 /* Work out the average size of a frame within this layer */
334 if (layer > 0)
335 lc->avg_frame_size_for_layer =
336 (int)((cpi->oxcf.target_bitrate[layer] -
337 cpi->oxcf.target_bitrate[layer-1]) * 1000 /
338 (lc->framerate - prev_layer_framerate));
339
340 lc->active_worst_quality = cpi->oxcf.worst_allowed_q;
341 lc->active_best_quality = cpi->oxcf.best_allowed_q;
342 lc->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
343
344 lc->buffer_level = lc->starting_buffer_level;
345 lc->bits_off_target = lc->starting_buffer_level;
346
347 lc->total_actual_bits = 0;
348 lc->ni_av_qi = 0;
349 lc->ni_tot_qi = 0;
350 lc->ni_frames = 0;
351 lc->rate_correction_factor = 1.0;
352 lc->key_frame_rate_correction_factor = 1.0;
353 lc->gf_rate_correction_factor = 1.0;
354 lc->inter_frame_target = 0;
355 }
356
357 // Upon a run-time change in temporal layers, reset the layer context parameters
358 // for any "new" layers. For "existing" layers, let them inherit the parameters
359 // from the previous layer state (at the same layer #). In future we may want
360 // to better map the previous layer state(s) to the "new" ones.
361 static void reset_temporal_layer_change(VP8_COMP *cpi,
362 VP8_CONFIG *oxcf,
363 const int prev_num_layers)
364 {
365 int i;
366 double prev_layer_framerate = 0;
367 const int curr_num_layers = cpi->oxcf.number_of_layers;
368 // If the previous state was 1 layer, get current layer context from cpi.
369 // We need this to set the layer context for the new layers below.
370 if (prev_num_layers == 1)
371 {
372 cpi->current_layer = 0;
373 save_layer_context(cpi);
374 }
375 for (i = 0; i < curr_num_layers; i++)
376 {
377 LAYER_CONTEXT *lc = &cpi->layer_context[i];
378 if (i >= prev_num_layers)
379 {
380 init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
381 }
382 // The initial buffer levels are set based on their starting levels.
383 // We could set the buffer levels based on the previous state (normalized
384 // properly by the layer bandwidths) but we would need to keep track of
385 // the previous set of layer bandwidths (i.e., target_bitrate[i])
386 // before the layer change. For now, reset to the starting levels.
387 lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
388 cpi->oxcf.target_bitrate[i];
389 lc->bits_off_target = lc->buffer_level;
390 // TDOD(marpan): Should we set the rate_correction_factor and
391 // active_worst/best_quality to values derived from the previous layer
392 // state (to smooth-out quality dips/rate fluctuation at transition)?
393
394 // We need to treat the 1 layer case separately: oxcf.target_bitrate[i]
395 // is not set for 1 layer, and the restore_layer_context/save_context()
396 // are not called in the encoding loop, so we need to call it here to
397 // pass the layer context state to |cpi|.
398 if (curr_num_layers == 1)
399 {
400 lc->target_bandwidth = cpi->oxcf.target_bandwidth;
401 lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
402 lc->target_bandwidth / 1000;
403 lc->bits_off_target = lc->buffer_level;
404 restore_layer_context(cpi, 0);
405 }
406 prev_layer_framerate = cpi->output_framerate /
407 cpi->oxcf.rate_decimator[i];
408 }
409 }
410
411 static void setup_features(VP8_COMP *cpi)
412 {
413 // If segmentation enabled set the update flags
414 if ( cpi->mb.e_mbd.segmentation_enabled )
415 {
416 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
417 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
418 }
419 else
420 {
421 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
422 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
423 }
424
425 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
426 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
427 vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
428 vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
429 vpx_memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
430 vpx_memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
431
432 set_default_lf_deltas(cpi);
433
434 }
435
436
437 static void dealloc_raw_frame_buffers(VP8_COMP *cpi);
438
439
440 static void dealloc_compressor_data(VP8_COMP *cpi)
441 {
442 vpx_free(cpi->tplist);
443 cpi->tplist = NULL;
444
445 /* Delete last frame MV storage buffers */
446 vpx_free(cpi->lfmv);
447 cpi->lfmv = 0;
448
449 vpx_free(cpi->lf_ref_frame_sign_bias);
450 cpi->lf_ref_frame_sign_bias = 0;
451
452 vpx_free(cpi->lf_ref_frame);
453 cpi->lf_ref_frame = 0;
454
455 /* Delete sementation map */
456 vpx_free(cpi->segmentation_map);
457 cpi->segmentation_map = 0;
458
459 vpx_free(cpi->active_map);
460 cpi->active_map = 0;
461
462 vp8_de_alloc_frame_buffers(&cpi->common);
463
464 vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
465 vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
466 dealloc_raw_frame_buffers(cpi);
467
468 vpx_free(cpi->tok);
469 cpi->tok = 0;
470
471 /* Structure used to monitor GF usage */
472 vpx_free(cpi->gf_active_flags);
473 cpi->gf_active_flags = 0;
474
475 /* Activity mask based per mb zbin adjustments */
476 vpx_free(cpi->mb_activity_map);
477 cpi->mb_activity_map = 0;
478
479 vpx_free(cpi->mb.pip);
480 cpi->mb.pip = 0;
481
482 #if CONFIG_MULTITHREAD
483 vpx_free(cpi->mt_current_mb_col);
484 cpi->mt_current_mb_col = NULL;
485 #endif
486 }
487
488 static void enable_segmentation(VP8_COMP *cpi)
489 {
490 /* Set the appropriate feature bit */
491 cpi->mb.e_mbd.segmentation_enabled = 1;
492 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
493 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
494 }
495 static void disable_segmentation(VP8_COMP *cpi)
496 {
497 /* Clear the appropriate feature bit */
498 cpi->mb.e_mbd.segmentation_enabled = 0;
499 }
500
501 /* Valid values for a segment are 0 to 3
502 * Segmentation map is arrange as [Rows][Columns]
503 */
504 static void set_segmentation_map(VP8_COMP *cpi, unsigned char *segmentation_map)
505 {
506 /* Copy in the new segmentation map */
507 vpx_memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));
508
509 /* Signal that the map should be updated. */
510 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
511 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
512 }
513
514 /* The values given for each segment can be either deltas (from the default
515 * value chosen for the frame) or absolute values.
516 *
517 * Valid range for abs values is:
518 * (0-127 for MB_LVL_ALT_Q), (0-63 for SEGMENT_ALT_LF)
519 * Valid range for delta values are:
520 * (+/-127 for MB_LVL_ALT_Q), (+/-63 for SEGMENT_ALT_LF)
521 *
522 * abs_delta = SEGMENT_DELTADATA (deltas)
523 * abs_delta = SEGMENT_ABSDATA (use the absolute values given).
524 *
525 */
526 static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned char abs_delta)
527 {
528 cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
529 vpx_memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
530 }
531
532
533 static void segmentation_test_function(VP8_COMP *cpi)
534 {
535 unsigned char *seg_map;
536 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
537
538 // Create a temporary map for segmentation data.
539 CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
540
541 // Set the segmentation Map
542 set_segmentation_map(cpi, seg_map);
543
544 // Activate segmentation.
545 enable_segmentation(cpi);
546
547 // Set up the quant segment data
548 feature_data[MB_LVL_ALT_Q][0] = 0;
549 feature_data[MB_LVL_ALT_Q][1] = 4;
550 feature_data[MB_LVL_ALT_Q][2] = 0;
551 feature_data[MB_LVL_ALT_Q][3] = 0;
552 // Set up the loop segment data
553 feature_data[MB_LVL_ALT_LF][0] = 0;
554 feature_data[MB_LVL_ALT_LF][1] = 0;
555 feature_data[MB_LVL_ALT_LF][2] = 0;
556 feature_data[MB_LVL_ALT_LF][3] = 0;
557
558 // Initialise the feature data structure
559 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
560 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
561
562 // Delete sementation map
563 vpx_free(seg_map);
564
565 seg_map = 0;
566 }
567
568 /* A simple function to cyclically refresh the background at a lower Q */
569 static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
570 {
571 unsigned char *seg_map = cpi->segmentation_map;
572 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
573 int i;
574 int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
575 int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
576
577 cpi->cyclic_refresh_q = Q / 2;
578
579 // Set every macroblock to be eligible for update.
580 // For key frame this will reset seg map to 0.
581 vpx_memset(cpi->segmentation_map, 0, mbs_in_frame);
582
583 if (cpi->common.frame_type != KEY_FRAME)
584 {
585 /* Cycle through the macro_block rows */
586 /* MB loop to set local segmentation map */
587 i = cpi->cyclic_refresh_mode_index;
588 assert(i < mbs_in_frame);
589 do
590 {
591 /* If the MB is as a candidate for clean up then mark it for
592 * possible boost/refresh (segment 1) The segment id may get
593 * reset to 0 later if the MB gets coded anything other than
594 * last frame 0,0 as only (last frame 0,0) MBs are eligable for
595 * refresh : that is to say Mbs likely to be background blocks.
596 */
597 if (cpi->cyclic_refresh_map[i] == 0)
598 {
599 seg_map[i] = 1;
600 block_count --;
601 }
602 else if (cpi->cyclic_refresh_map[i] < 0)
603 cpi->cyclic_refresh_map[i]++;
604
605 i++;
606 if (i == mbs_in_frame)
607 i = 0;
608
609 }
610 while(block_count && i != cpi->cyclic_refresh_mode_index);
611
612 cpi->cyclic_refresh_mode_index = i;
613 }
614
615 /* Activate segmentation. */
616 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
617 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
618 enable_segmentation(cpi);
619
620 /* Set up the quant segment data */
621 feature_data[MB_LVL_ALT_Q][0] = 0;
622 feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
623 feature_data[MB_LVL_ALT_Q][2] = 0;
624 feature_data[MB_LVL_ALT_Q][3] = 0;
625
626 /* Set up the loop segment data */
627 feature_data[MB_LVL_ALT_LF][0] = 0;
628 feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
629 feature_data[MB_LVL_ALT_LF][2] = 0;
630 feature_data[MB_LVL_ALT_LF][3] = 0;
631
632 /* Initialise the feature data structure */
633 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
634
635 }
636
637 static void set_default_lf_deltas(VP8_COMP *cpi)
638 {
639 cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
640 cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
641
642 vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
643 vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
644
645 /* Test of ref frame deltas */
646 cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
647 cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
648 cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
649 cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
650
651 cpi->mb.e_mbd.mode_lf_deltas[0] = 4; /* BPRED */
652
653 if(cpi->oxcf.Mode == MODE_REALTIME)
654 cpi->mb.e_mbd.mode_lf_deltas[1] = -12; /* Zero */
655 else
656 cpi->mb.e_mbd.mode_lf_deltas[1] = -2; /* Zero */
657
658 cpi->mb.e_mbd.mode_lf_deltas[2] = 2; /* New mv */
659 cpi->mb.e_mbd.mode_lf_deltas[3] = 4; /* Split mv */
660 }
661
662 /* Convenience macros for mapping speed and mode into a continuous
663 * range
664 */
665 #define GOOD(x) (x+1)
666 #define RT(x) (x+7)
667
668 static int speed_map(int speed, const int *map)
669 {
670 int res;
671
672 do
673 {
674 res = *map++;
675 } while(speed >= *map++);
676 return res;
677 }
678
679 static const int thresh_mult_map_znn[] = {
680 /* map common to zero, nearest, and near */
681 0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
682 };
683
684 static const int thresh_mult_map_vhpred[] = {
685 1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(1), 2000,
686 RT(7), INT_MAX, INT_MAX
687 };
688
689 static const int thresh_mult_map_bpred[] = {
690 2000, GOOD(0), 2500, GOOD(2), 5000, GOOD(3), 7500, RT(0), 2500, RT(1), 5000,
691 RT(6), INT_MAX, INT_MAX
692 };
693
694 static const int thresh_mult_map_tm[] = {
695 1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 0, RT(1), 1000, RT(2), 2000,
696 RT(7), INT_MAX, INT_MAX
697 };
698
699 static const int thresh_mult_map_new1[] = {
700 1000, GOOD(2), 2000, RT(0), 2000, INT_MAX
701 };
702
703 static const int thresh_mult_map_new2[] = {
704 1000, GOOD(2), 2000, GOOD(3), 2500, GOOD(5), 4000, RT(0), 2000, RT(2), 2500,
705 RT(5), 4000, INT_MAX
706 };
707
708 static const int thresh_mult_map_split1[] = {
709 2500, GOOD(0), 1700, GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
710 RT(0), 5000, RT(1), 10000, RT(2), 25000, RT(3), INT_MAX, INT_MAX
711 };
712
713 static const int thresh_mult_map_split2[] = {
714 5000, GOOD(0), 4500, GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
715 RT(0), 10000, RT(1), 20000, RT(2), 50000, RT(3), INT_MAX, INT_MAX
716 };
717
718 static const int mode_check_freq_map_zn2[] = {
719 /* {zero,nearest}{2,3} */
720 0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
721 };
722
723 static const int mode_check_freq_map_vhbpred[] = {
724 0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(5), 4, INT_MAX
725 };
726
727 static const int mode_check_freq_map_near2[] = {
728 0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(10), 1<<2, RT(11), 1<<3, RT(12), 1<<4,
729 INT_MAX
730 };
731
732 static const int mode_check_freq_map_new1[] = {
733 0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
734 };
735
736 static const int mode_check_freq_map_new2[] = {
737 0, GOOD(5), 4, RT(0), 0, RT(3), 4, RT(10), 1<<3, RT(11), 1<<4, RT(12), 1<<5,
738 INT_MAX
739 };
740
741 static const int mode_check_freq_map_split1[] = {
742 0, GOOD(2), 2, GOOD(3), 7, RT(1), 2, RT(2), 7, INT_MAX
743 };
744
745 static const int mode_check_freq_map_split2[] = {
746 0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
747 };
748
749 void vp8_set_speed_features(VP8_COMP *cpi)
750 {
751 SPEED_FEATURES *sf = &cpi->sf;
752 int Mode = cpi->compressor_speed;
753 int Speed = cpi->Speed;
754 int i;
755 VP8_COMMON *cm = &cpi->common;
756 int last_improved_quant = sf->improved_quant;
757 int ref_frames;
758
759 /* Initialise default mode frequency sampling variables */
760 for (i = 0; i < MAX_MODES; i ++)
761 {
762 cpi->mode_check_freq[i] = 0;
763 }
764
765 cpi->mb.mbs_tested_so_far = 0;
766
767 /* best quality defaults */
768 sf->RD = 1;
769 sf->search_method = NSTEP;
770 sf->improved_quant = 1;
771 sf->improved_dct = 1;
772 sf->auto_filter = 1;
773 sf->recode_loop = 1;
774 sf->quarter_pixel_search = 1;
775 sf->half_pixel_search = 1;
776 sf->iterative_sub_pixel = 1;
777 sf->optimize_coefficients = 1;
778 sf->use_fastquant_for_pick = 0;
779 sf->no_skip_block4x4_search = 1;
780
781 sf->first_step = 0;
782 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
783 sf->improved_mv_pred = 1;
784
785 /* default thresholds to 0 */
786 for (i = 0; i < MAX_MODES; i++)
787 sf->thresh_mult[i] = 0;
788
789 /* Count enabled references */
790 ref_frames = 1;
791 if (cpi->ref_frame_flags & VP8_LAST_FRAME)
792 ref_frames++;
793 if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
794 ref_frames++;
795 if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
796 ref_frames++;
797
798 /* Convert speed to continuous range, with clamping */
799 if (Mode == 0)
800 Speed = 0;
801 else if (Mode == 2)
802 Speed = RT(Speed);
803 else
804 {
805 if (Speed > 5)
806 Speed = 5;
807 Speed = GOOD(Speed);
808 }
809
810 sf->thresh_mult[THR_ZERO1] =
811 sf->thresh_mult[THR_NEAREST1] =
812 sf->thresh_mult[THR_NEAR1] =
813 sf->thresh_mult[THR_DC] = 0; /* always */
814
815 sf->thresh_mult[THR_ZERO2] =
816 sf->thresh_mult[THR_ZERO3] =
817 sf->thresh_mult[THR_NEAREST2] =
818 sf->thresh_mult[THR_NEAREST3] =
819 sf->thresh_mult[THR_NEAR2] =
820 sf->thresh_mult[THR_NEAR3] = speed_map(Speed, thresh_mult_map_znn);
821
822 sf->thresh_mult[THR_V_PRED] =
823 sf->thresh_mult[THR_H_PRED] = speed_map(Speed, thresh_mult_map_vhpred);
824 sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
825 sf->thresh_mult[THR_TM] = speed_map(Speed, thresh_mult_map_tm);
826 sf->thresh_mult[THR_NEW1] = speed_map(Speed, thresh_mult_map_new1);
827 sf->thresh_mult[THR_NEW2] =
828 sf->thresh_mult[THR_NEW3] = speed_map(Speed, thresh_mult_map_new2);
829 sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
830 sf->thresh_mult[THR_SPLIT2] =
831 sf->thresh_mult[THR_SPLIT3] = speed_map(Speed, thresh_mult_map_split2);
832
833 cpi->mode_check_freq[THR_ZERO1] =
834 cpi->mode_check_freq[THR_NEAREST1] =
835 cpi->mode_check_freq[THR_NEAR1] =
836 cpi->mode_check_freq[THR_TM] =
837 cpi->mode_check_freq[THR_DC] = 0; /* always */
838
839 cpi->mode_check_freq[THR_ZERO2] =
840 cpi->mode_check_freq[THR_ZERO3] =
841 cpi->mode_check_freq[THR_NEAREST2] =
842 cpi->mode_check_freq[THR_NEAREST3] = speed_map(Speed,
843 mode_check_freq_map_zn2);
844
845 cpi->mode_check_freq[THR_NEAR2] =
846 cpi->mode_check_freq[THR_NEAR3] = speed_map(Speed,
847 mode_check_freq_map_near2);
848
849 cpi->mode_check_freq[THR_V_PRED] =
850 cpi->mode_check_freq[THR_H_PRED] =
851 cpi->mode_check_freq[THR_B_PRED] = speed_map(Speed,
852 mode_check_freq_map_vhbpred);
853 cpi->mode_check_freq[THR_NEW1] = speed_map(Speed,
854 mode_check_freq_map_new1);
855 cpi->mode_check_freq[THR_NEW2] =
856 cpi->mode_check_freq[THR_NEW3] = speed_map(Speed,
857 mode_check_freq_map_new2);
858 cpi->mode_check_freq[THR_SPLIT1] = speed_map(Speed,
859 mode_check_freq_map_split1);
860 cpi->mode_check_freq[THR_SPLIT2] =
861 cpi->mode_check_freq[THR_SPLIT3] = speed_map(Speed,
862 mode_check_freq_map_split2);
863 Speed = cpi->Speed;
864 switch (Mode)
865 {
866 #if !(CONFIG_REALTIME_ONLY)
867 case 0: /* best quality mode */
868 sf->first_step = 0;
869 sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
870 break;
871 case 1:
872 case 3:
873 if (Speed > 0)
874 {
875 /* Disable coefficient optimization above speed 0 */
876 sf->optimize_coefficients = 0;
877 sf->use_fastquant_for_pick = 1;
878 sf->no_skip_block4x4_search = 0;
879
880 sf->first_step = 1;
881 }
882
883 if (Speed > 2)
884 {
885 sf->improved_quant = 0;
886 sf->improved_dct = 0;
887
888 /* Only do recode loop on key frames, golden frames and
889 * alt ref frames
890 */
891 sf->recode_loop = 2;
892
893 }
894
895 if (Speed > 3)
896 {
897 sf->auto_filter = 1;
898 sf->recode_loop = 0; /* recode loop off */
899 sf->RD = 0; /* Turn rd off */
900
901 }
902
903 if (Speed > 4)
904 {
905 sf->auto_filter = 0; /* Faster selection of loop filter */
906 }
907
908 break;
909 #endif
910 case 2:
911 sf->optimize_coefficients = 0;
912 sf->recode_loop = 0;
913 sf->auto_filter = 1;
914 sf->iterative_sub_pixel = 1;
915 sf->search_method = NSTEP;
916
917 if (Speed > 0)
918 {
919 sf->improved_quant = 0;
920 sf->improved_dct = 0;
921
922 sf->use_fastquant_for_pick = 1;
923 sf->no_skip_block4x4_search = 0;
924 sf->first_step = 1;
925 }
926
927 if (Speed > 2)
928 sf->auto_filter = 0; /* Faster selection of loop filter */
929
930 if (Speed > 3)
931 {
932 sf->RD = 0;
933 sf->auto_filter = 1;
934 }
935
936 if (Speed > 4)
937 {
938 sf->auto_filter = 0; /* Faster selection of loop filter */
939 sf->search_method = HEX;
940 sf->iterative_sub_pixel = 0;
941 }
942
943 if (Speed > 6)
944 {
945 unsigned int sum = 0;
946 unsigned int total_mbs = cm->MBs;
947 int thresh;
948 unsigned int total_skip;
949
950 int min = 2000;
951
952 if (cpi->oxcf.encode_breakout > 2000)
953 min = cpi->oxcf.encode_breakout;
954
955 min >>= 7;
956
957 for (i = 0; i < min; i++)
958 {
959 sum += cpi->mb.error_bins[i];
960 }
961
962 total_skip = sum;
963 sum = 0;
964
965 /* i starts from 2 to make sure thresh started from 2048 */
966 for (; i < 1024; i++)
967 {
968 sum += cpi->mb.error_bins[i];
969
970 if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
971 break;
972 }
973
974 i--;
975 thresh = (i << 7);
976
977 if (thresh < 2000)
978 thresh = 2000;
979
980 if (ref_frames > 1)
981 {
982 sf->thresh_mult[THR_NEW1 ] = thresh;
983 sf->thresh_mult[THR_NEAREST1 ] = thresh >> 1;
984 sf->thresh_mult[THR_NEAR1 ] = thresh >> 1;
985 }
986
987 if (ref_frames > 2)
988 {
989 sf->thresh_mult[THR_NEW2] = thresh << 1;
990 sf->thresh_mult[THR_NEAREST2 ] = thresh;
991 sf->thresh_mult[THR_NEAR2 ] = thresh;
992 }
993
994 if (ref_frames > 3)
995 {
996 sf->thresh_mult[THR_NEW3] = thresh << 1;
997 sf->thresh_mult[THR_NEAREST3 ] = thresh;
998 sf->thresh_mult[THR_NEAR3 ] = thresh;
999 }
1000
1001 sf->improved_mv_pred = 0;
1002 }
1003
1004 if (Speed > 8)
1005 sf->quarter_pixel_search = 0;
1006
1007 if(cm->version == 0)
1008 {
1009 cm->filter_type = NORMAL_LOOPFILTER;
1010
1011 if (Speed >= 14)
1012 cm->filter_type = SIMPLE_LOOPFILTER;
1013 }
1014 else
1015 {
1016 cm->filter_type = SIMPLE_LOOPFILTER;
1017 }
1018
1019 /* This has a big hit on quality. Last resort */
1020 if (Speed >= 15)
1021 sf->half_pixel_search = 0;
1022
1023 vpx_memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
1024
1025 }; /* switch */
1026
1027 /* Slow quant, dct and trellis not worthwhile for first pass
1028 * so make sure they are always turned off.
1029 */
1030 if ( cpi->pass == 1 )
1031 {
1032 sf->improved_quant = 0;
1033 sf->optimize_coefficients = 0;
1034 sf->improved_dct = 0;
1035 }
1036
1037 if (cpi->sf.search_method == NSTEP)
1038 {
1039 vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1040 }
1041 else if (cpi->sf.search_method == DIAMOND)
1042 {
1043 vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
1044 }
1045
1046 if (cpi->sf.improved_dct)
1047 {
1048 cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
1049 cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
1050 }
1051 else
1052 {
1053 /* No fast FDCT defined for any platform at this time. */
1054 cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
1055 cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
1056 }
1057
1058 cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
1059
1060 if (cpi->sf.improved_quant)
1061 {
1062 cpi->mb.quantize_b = vp8_regular_quantize_b;
1063 cpi->mb.quantize_b_pair = vp8_regular_quantize_b_pair;
1064 }
1065 else
1066 {
1067 cpi->mb.quantize_b = vp8_fast_quantize_b;
1068 cpi->mb.quantize_b_pair = vp8_fast_quantize_b_pair;
1069 }
1070 if (cpi->sf.improved_quant != last_improved_quant)
1071 vp8cx_init_quantizer(cpi);
1072
1073 if (cpi->sf.iterative_sub_pixel == 1)
1074 {
1075 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
1076 }
1077 else if (cpi->sf.quarter_pixel_search)
1078 {
1079 cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
1080 }
1081 else if (cpi->sf.half_pixel_search)
1082 {
1083 cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
1084 }
1085 else
1086 {
1087 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1088 }
1089
1090 if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
1091 cpi->mb.optimize = 1;
1092 else
1093 cpi->mb.optimize = 0;
1094
1095 if (cpi->common.full_pixel)
1096 cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
1097
1098 #ifdef SPEEDSTATS
1099 frames_at_speed[cpi->Speed]++;
1100 #endif
1101 }
1102 #undef GOOD
1103 #undef RT
1104
1105 static void alloc_raw_frame_buffers(VP8_COMP *cpi)
1106 {
1107 #if VP8_TEMPORAL_ALT_REF
1108 int width = (cpi->oxcf.Width + 15) & ~15;
1109 int height = (cpi->oxcf.Height + 15) & ~15;
1110 #endif
1111
1112 cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
1113 cpi->oxcf.lag_in_frames);
1114 if(!cpi->lookahead)
1115 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1116 "Failed to allocate lag buffers");
1117
1118 #if VP8_TEMPORAL_ALT_REF
1119
1120 if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
1121 width, height, VP8BORDERINPIXELS))
1122 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1123 "Failed to allocate altref buffer");
1124
1125 #endif
1126 }
1127
1128
1129 static void dealloc_raw_frame_buffers(VP8_COMP *cpi)
1130 {
1131 #if VP8_TEMPORAL_ALT_REF
1132 vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
1133 #endif
1134 vp8_lookahead_destroy(cpi->lookahead);
1135 }
1136
1137
1138 static int vp8_alloc_partition_data(VP8_COMP *cpi)
1139 {
1140 vpx_free(cpi->mb.pip);
1141
1142 cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
1143 (cpi->common.mb_rows + 1),
1144 sizeof(PARTITION_INFO));
1145 if(!cpi->mb.pip)
1146 return 1;
1147
1148 cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
1149
1150 return 0;
1151 }
1152
1153 void vp8_alloc_compressor_data(VP8_COMP *cpi)
1154 {
1155 VP8_COMMON *cm = & cpi->common;
1156
1157 int width = cm->Width;
1158 int height = cm->Height;
1159
1160 if (vp8_alloc_frame_buffers(cm, width, height))
1161 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1162 "Failed to allocate frame buffers");
1163
1164 if (vp8_alloc_partition_data(cpi))
1165 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1166 "Failed to allocate partition data");
1167
1168
1169 if ((width & 0xf) != 0)
1170 width += 16 - (width & 0xf);
1171
1172 if ((height & 0xf) != 0)
1173 height += 16 - (height & 0xf);
1174
1175
1176 if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame,
1177 width, height, VP8BORDERINPIXELS))
1178 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1179 "Failed to allocate last frame buffer");
1180
1181 if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
1182 width, height, VP8BORDERINPIXELS))
1183 vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1184 "Failed to allocate scaled source buffer");
1185
1186 vpx_free(cpi->tok);
1187
1188 {
1189 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
1190 unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
1191 #else
1192 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1193 #endif
1194 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1195 }
1196
1197 /* Data used for real time vc mode to see if gf needs refreshing */
1198 cpi->zeromv_count = 0;
1199
1200
1201 /* Structures used to monitor GF usage */
1202 vpx_free(cpi->gf_active_flags);
1203 CHECK_MEM_ERROR(cpi->gf_active_flags,
1204 vpx_calloc(sizeof(*cpi->gf_active_flags),
1205 cm->mb_rows * cm->mb_cols));
1206 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1207
1208 vpx_free(cpi->mb_activity_map);
1209 CHECK_MEM_ERROR(cpi->mb_activity_map,
1210 vpx_calloc(sizeof(*cpi->mb_activity_map),
1211 cm->mb_rows * cm->mb_cols));
1212
1213 /* allocate memory for storing last frame's MVs for MV prediction. */
1214 vpx_free(cpi->lfmv);
1215 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1216 sizeof(*cpi->lfmv)));
1217 vpx_free(cpi->lf_ref_frame_sign_bias);
1218 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
1219 vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1220 sizeof(*cpi->lf_ref_frame_sign_bias)));
1221 vpx_free(cpi->lf_ref_frame);
1222 CHECK_MEM_ERROR(cpi->lf_ref_frame,
1223 vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1224 sizeof(*cpi->lf_ref_frame)));
1225
1226 /* Create the encoder segmentation map and set all entries to 0 */
1227 vpx_free(cpi->segmentation_map);
1228 CHECK_MEM_ERROR(cpi->segmentation_map,
1229 vpx_calloc(cm->mb_rows * cm->mb_cols,
1230 sizeof(*cpi->segmentation_map)));
1231 cpi->cyclic_refresh_mode_index = 0;
1232 vpx_free(cpi->active_map);
1233 CHECK_MEM_ERROR(cpi->active_map,
1234 vpx_calloc(cm->mb_rows * cm->mb_cols,
1235 sizeof(*cpi->active_map)));
1236 vpx_memset(cpi->active_map , 1, (cm->mb_rows * cm->mb_cols));
1237
1238 #if CONFIG_MULTITHREAD
1239 if (width < 640)
1240 cpi->mt_sync_range = 1;
1241 else if (width <= 1280)
1242 cpi->mt_sync_range = 4;
1243 else if (width <= 2560)
1244 cpi->mt_sync_range = 8;
1245 else
1246 cpi->mt_sync_range = 16;
1247
1248 if (cpi->oxcf.multi_threaded > 1)
1249 {
1250 vpx_free(cpi->mt_current_mb_col);
1251 CHECK_MEM_ERROR(cpi->mt_current_mb_col,
1252 vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
1253 }
1254
1255 #endif
1256
1257 vpx_free(cpi->tplist);
1258 CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
1259 }
1260
1261
1262 /* Quant MOD */
1263 static const int q_trans[] =
1264 {
1265 0, 1, 2, 3, 4, 5, 7, 8,
1266 9, 10, 12, 13, 15, 17, 18, 19,
1267 20, 21, 23, 24, 25, 26, 27, 28,
1268 29, 30, 31, 33, 35, 37, 39, 41,
1269 43, 45, 47, 49, 51, 53, 55, 57,
1270 59, 61, 64, 67, 70, 73, 76, 79,
1271 82, 85, 88, 91, 94, 97, 100, 103,
1272 106, 109, 112, 115, 118, 121, 124, 127,
1273 };
1274
1275 int vp8_reverse_trans(int x)
1276 {
1277 int i;
1278
1279 for (i = 0; i < 64; i++)
1280 if (q_trans[i] >= x)
1281 return i;
1282
1283 return 63;
1284 }
1285 void vp8_new_framerate(VP8_COMP *cpi, double framerate)
1286 {
1287 if(framerate < .1)
1288 framerate = 30;
1289
1290 cpi->framerate = framerate;
1291 cpi->output_framerate = framerate;
1292 cpi->per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth /
1293 cpi->output_framerate);
1294 cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
1295 cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth *
1296 cpi->oxcf.two_pass_vbrmin_section / 100);
1297
1298 /* Set Maximum gf/arf interval */
1299 cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);
1300
1301 if(cpi->max_gf_interval < 12)
1302 cpi->max_gf_interval = 12;
1303
1304 /* Extended interval for genuinely static scenes */
1305 cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1306
1307 /* Special conditions when altr ref frame enabled in lagged compress mode */
1308 if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
1309 {
1310 if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1311 cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1312
1313 if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1314 cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1315 }
1316
1317 if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
1318 cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1319 }
1320
1321
1322 static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
1323 {
1324 VP8_COMMON *cm = &cpi->common;
1325
1326 cpi->oxcf = *oxcf;
1327
1328 cpi->auto_gold = 1;
1329 cpi->auto_adjust_gold_quantizer = 1;
1330
1331 cm->version = oxcf->Version;
1332 vp8_setup_version(cm);
1333
1334 /* frame rate is not available on the first frame, as it's derived from
1335 * the observed timestamps. The actual value used here doesn't matter
1336 * too much, as it will adapt quickly. If the reciprocal of the timebase
1337 * seems like a reasonable framerate, then use that as a guess, otherwise
1338 * use 30.
1339 */
1340 cpi->framerate = (double)(oxcf->timebase.den) /
1341 (double)(oxcf->timebase.num);
1342
1343 if (cpi->framerate > 180)
1344 cpi->framerate = 30;
1345
1346 cpi->ref_framerate = cpi->framerate;
1347
1348 /* change includes all joint functionality */
1349 vp8_change_config(cpi, oxcf);
1350
1351 /* Initialize active best and worst q and average q values. */
1352 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1353 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1354 cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
1355
1356 /* Initialise the starting buffer levels */
1357 cpi->buffer_level = cpi->oxcf.starting_buffer_level;
1358 cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
1359
1360 cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
1361 cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
1362 cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
1363 cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
1364
1365 cpi->total_actual_bits = 0;
1366 cpi->total_target_vs_actual = 0;
1367
1368 /* Temporal scalabilty */
1369 if (cpi->oxcf.number_of_layers > 1)
1370 {
1371 unsigned int i;
1372 double prev_layer_framerate=0;
1373
1374 for (i=0; i<cpi->oxcf.number_of_layers; i++)
1375 {
1376 init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
1377 prev_layer_framerate = cpi->output_framerate /
1378 cpi->oxcf.rate_decimator[i];
1379 }
1380 }
1381
1382 #if VP8_TEMPORAL_ALT_REF
1383 {
1384 int i;
1385
1386 cpi->fixed_divide[0] = 0;
1387
1388 for (i = 1; i < 512; i++)
1389 cpi->fixed_divide[i] = 0x80000 / i;
1390 }
1391 #endif
1392 }
1393
1394 static void update_layer_contexts (VP8_COMP *cpi)
1395 {
1396 VP8_CONFIG *oxcf = &cpi->oxcf;
1397
1398 /* Update snapshots of the layer contexts to reflect new parameters */
1399 if (oxcf->number_of_layers > 1)
1400 {
1401 unsigned int i;
1402 double prev_layer_framerate=0;
1403
1404 for (i=0; i<oxcf->number_of_layers; i++)
1405 {
1406 LAYER_CONTEXT *lc = &cpi->layer_context[i];
1407
1408 lc->framerate =
1409 cpi->ref_framerate / oxcf->rate_decimator[i];
1410 lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
1411
1412 lc->starting_buffer_level = rescale(
1413 (int)oxcf->starting_buffer_level_in_ms,
1414 lc->target_bandwidth, 1000);
1415
1416 if (oxcf->optimal_buffer_level == 0)
1417 lc->optimal_buffer_level = lc->target_bandwidth / 8;
1418 else
1419 lc->optimal_buffer_level = rescale(
1420 (int)oxcf->optimal_buffer_level_in_ms,
1421 lc->target_bandwidth, 1000);
1422
1423 if (oxcf->maximum_buffer_size == 0)
1424 lc->maximum_buffer_size = lc->target_bandwidth / 8;
1425 else
1426 lc->maximum_buffer_size = rescale(
1427 (int)oxcf->maximum_buffer_size_in_ms,
1428 lc->target_bandwidth, 1000);
1429
1430 /* Work out the average size of a frame within this layer */
1431 if (i > 0)
1432 lc->avg_frame_size_for_layer =
1433 (int)((oxcf->target_bitrate[i] -
1434 oxcf->target_bitrate[i-1]) * 1000 /
1435 (lc->framerate - prev_layer_framerate));
1436
1437 prev_layer_framerate = lc->framerate;
1438 }
1439 }
1440 }
1441
1442 void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
1443 {
1444 VP8_COMMON *cm = &cpi->common;
1445 int last_w, last_h, prev_number_of_layers;
1446
1447 if (!cpi)
1448 return;
1449
1450 if (!oxcf)
1451 return;
1452
1453 #if CONFIG_MULTITHREAD
1454 /* wait for the last picture loopfilter thread done */
1455 if (cpi->b_lpf_running)
1456 {
1457 sem_wait(&cpi->h_event_end_lpf);
1458 cpi->b_lpf_running = 0;
1459 }
1460 #endif
1461
1462 if (cm->version != oxcf->Version)
1463 {
1464 cm->version = oxcf->Version;
1465 vp8_setup_version(cm);
1466 }
1467
1468 last_w = cpi->oxcf.Width;
1469 last_h = cpi->oxcf.Height;
1470 prev_number_of_layers = cpi->oxcf.number_of_layers;
1471
1472 cpi->oxcf = *oxcf;
1473
1474 switch (cpi->oxcf.Mode)
1475 {
1476
1477 case MODE_REALTIME:
1478 cpi->pass = 0;
1479 cpi->compressor_speed = 2;
1480
1481 if (cpi->oxcf.cpu_used < -16)
1482 {
1483 cpi->oxcf.cpu_used = -16;
1484 }
1485
1486 if (cpi->oxcf.cpu_used > 16)
1487 cpi->oxcf.cpu_used = 16;
1488
1489 break;
1490
1491 case MODE_GOODQUALITY:
1492 cpi->pass = 0;
1493 cpi->compressor_speed = 1;
1494
1495 if (cpi->oxcf.cpu_used < -5)
1496 {
1497 cpi->oxcf.cpu_used = -5;
1498 }
1499
1500 if (cpi->oxcf.cpu_used > 5)
1501 cpi->oxcf.cpu_used = 5;
1502
1503 break;
1504
1505 case MODE_BESTQUALITY:
1506 cpi->pass = 0;
1507 cpi->compressor_speed = 0;
1508 break;
1509
1510 case MODE_FIRSTPASS:
1511 cpi->pass = 1;
1512 cpi->compressor_speed = 1;
1513 break;
1514 case MODE_SECONDPASS:
1515 cpi->pass = 2;
1516 cpi->compressor_speed = 1;
1517
1518 if (cpi->oxcf.cpu_used < -5)
1519 {
1520 cpi->oxcf.cpu_used = -5;
1521 }
1522
1523 if (cpi->oxcf.cpu_used > 5)
1524 cpi->oxcf.cpu_used = 5;
1525
1526 break;
1527 case MODE_SECONDPASS_BEST:
1528 cpi->pass = 2;
1529 cpi->compressor_speed = 0;
1530 break;
1531 }
1532
1533 if (cpi->pass == 0)
1534 cpi->auto_worst_q = 1;
1535
1536 cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1537 cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1538 cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1539
1540 if (oxcf->fixed_q >= 0)
1541 {
1542 if (oxcf->worst_allowed_q < 0)
1543 cpi->oxcf.fixed_q = q_trans[0];
1544 else
1545 cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
1546
1547 if (oxcf->alt_q < 0)
1548 cpi->oxcf.alt_q = q_trans[0];
1549 else
1550 cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
1551
1552 if (oxcf->key_q < 0)
1553 cpi->oxcf.key_q = q_trans[0];
1554 else
1555 cpi->oxcf.key_q = q_trans[oxcf->key_q];
1556
1557 if (oxcf->gold_q < 0)
1558 cpi->oxcf.gold_q = q_trans[0];
1559 else
1560 cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
1561
1562 }
1563
1564 cpi->baseline_gf_interval =
1565 cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
1566
1567 cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
1568
1569 cm->refresh_golden_frame = 0;
1570 cm->refresh_last_frame = 1;
1571 cm->refresh_entropy_probs = 1;
1572
1573 #if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
1574 cpi->oxcf.token_partitions = 3;
1575 #endif
1576
1577 if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
1578 cm->multi_token_partition =
1579 (TOKEN_PARTITION) cpi->oxcf.token_partitions;
1580
1581 setup_features(cpi);
1582
1583 {
1584 int i;
1585
1586 for (i = 0; i < MAX_MB_SEGMENTS; i++)
1587 cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1588 }
1589
1590 /* At the moment the first order values may not be > MAXQ */
1591 if (cpi->oxcf.fixed_q > MAXQ)
1592 cpi->oxcf.fixed_q = MAXQ;
1593
1594 /* local file playback mode == really big buffer */
1595 if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
1596 {
1597 cpi->oxcf.starting_buffer_level = 60000;
1598 cpi->oxcf.optimal_buffer_level = 60000;
1599 cpi->oxcf.maximum_buffer_size = 240000;
1600 cpi->oxcf.starting_buffer_level_in_ms = 60000;
1601 cpi->oxcf.optimal_buffer_level_in_ms = 60000;
1602 cpi->oxcf.maximum_buffer_size_in_ms = 240000;
1603 }
1604
1605 /* Convert target bandwidth from Kbit/s to Bit/s */
1606 cpi->oxcf.target_bandwidth *= 1000;
1607
1608 cpi->oxcf.starting_buffer_level =
1609 rescale((int)cpi->oxcf.starting_buffer_level,
1610 cpi->oxcf.target_bandwidth, 1000);
1611
1612 /* Set or reset optimal and maximum buffer levels. */
1613 if (cpi->oxcf.optimal_buffer_level == 0)
1614 cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1615 else
1616 cpi->oxcf.optimal_buffer_level =
1617 rescale((int)cpi->oxcf.optimal_buffer_level,
1618 cpi->oxcf.target_bandwidth, 1000);
1619
1620 if (cpi->oxcf.maximum_buffer_size == 0)
1621 cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1622 else
1623 cpi->oxcf.maximum_buffer_size =
1624 rescale((int)cpi->oxcf.maximum_buffer_size,
1625 cpi->oxcf.target_bandwidth, 1000);
1626
1627 /* Set up frame rate and related parameters rate control values. */
1628 vp8_new_framerate(cpi, cpi->framerate);
1629
1630 /* Set absolute upper and lower quality limits */
1631 cpi->worst_quality = cpi->oxcf.worst_allowed_q;
1632 cpi->best_quality = cpi->oxcf.best_allowed_q;
1633
1634 /* active values should only be modified if out of new range */
1635 if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
1636 {
1637 cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
1638 }
1639 /* less likely */
1640 else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
1641 {
1642 cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
1643 }
1644 if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
1645 {
1646 cpi->active_best_quality = cpi->oxcf.best_allowed_q;
1647 }
1648 /* less likely */
1649 else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
1650 {
1651 cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
1652 }
1653
1654 cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
1655
1656 cpi->cq_target_quality = cpi->oxcf.cq_level;
1657
1658 /* Only allow dropped frames in buffered mode */
1659 cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
1660
1661 cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1662
1663 // Check if the number of temporal layers has changed, and if so reset the
1664 // pattern counter and set/initialize the temporal layer context for the
1665 // new layer configuration.
1666 if (cpi->oxcf.number_of_layers != prev_number_of_layers)
1667 {
1668 // If the number of temporal layers are changed we must start at the
1669 // base of the pattern cycle, so reset temporal_pattern_counter.
1670 cpi->temporal_pattern_counter = 0;
1671 reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
1672 }
1673
1674 cm->Width = cpi->oxcf.Width;
1675 cm->Height = cpi->oxcf.Height;
1676
1677 /* TODO(jkoleszar): if an internal spatial resampling is active,
1678 * and we downsize the input image, maybe we should clear the
1679 * internal scale immediately rather than waiting for it to
1680 * correct.
1681 */
1682
1683 /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
1684 if (cpi->oxcf.Sharpness > 7)
1685 cpi->oxcf.Sharpness = 7;
1686
1687 cm->sharpness_level = cpi->oxcf.Sharpness;
1688
1689 if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
1690 {
1691 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
1692 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
1693
1694 Scale2Ratio(cm->horiz_scale, &hr, &hs);
1695 Scale2Ratio(cm->vert_scale, &vr, &vs);
1696
1697 /* always go to the next whole number */
1698 cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
1699 cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
1700 }
1701
1702 if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height)
1703 cpi->force_next_frame_intra = 1;
1704
1705 if (((cm->Width + 15) & 0xfffffff0) !=
1706 cm->yv12_fb[cm->lst_fb_idx].y_width ||
1707 ((cm->Height + 15) & 0xfffffff0) !=
1708 cm->yv12_fb[cm->lst_fb_idx].y_height ||
1709 cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
1710 {
1711 dealloc_raw_frame_buffers(cpi);
1712 alloc_raw_frame_buffers(cpi);
1713 vp8_alloc_compressor_data(cpi);
1714 }
1715
1716 if (cpi->oxcf.fixed_q >= 0)
1717 {
1718 cpi->last_q[0] = cpi->oxcf.fixed_q;
1719 cpi->last_q[1] = cpi->oxcf.fixed_q;
1720 }
1721
1722 cpi->Speed = cpi->oxcf.cpu_used;
1723
1724 /* force to allowlag to 0 if lag_in_frames is 0; */
1725 if (cpi->oxcf.lag_in_frames == 0)
1726 {
1727 cpi->oxcf.allow_lag = 0;
1728 }
1729 /* Limit on lag buffers as these are not currently dynamically allocated */
1730 else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
1731 cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1732
1733 /* YX Temp */
1734 cpi->alt_ref_source = NULL;
1735 cpi->is_src_frame_alt_ref = 0;
1736
1737 #if CONFIG_TEMPORAL_DENOISING
1738 if (cpi->oxcf.noise_sensitivity)
1739 {
1740 if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc)
1741 {
1742 int width = (cpi->oxcf.Width + 15) & ~15;
1743 int height = (cpi->oxcf.Height + 15) & ~15;
1744 vp8_denoiser_allocate(&cpi->denoiser, width, height);
1745 }
1746 }
1747 #endif
1748
1749 #if 0
1750 /* Experimental RD Code */
1751 cpi->frame_distortion = 0;
1752 cpi->last_frame_distortion = 0;
1753 #endif
1754
1755 }
1756
1757 #define M_LOG2_E 0.693147180559945309417
1758 #define log2f(x) (log (x) / (float) M_LOG2_E)
1759 static void cal_mvsadcosts(int *mvsadcost[2])
1760 {
1761 int i = 1;
1762
1763 mvsadcost [0] [0] = 300;
1764 mvsadcost [1] [0] = 300;
1765
1766 do
1767 {
1768 double z = 256 * (2 * (log2f(8 * i) + .6));
1769 mvsadcost [0][i] = (int) z;
1770 mvsadcost [1][i] = (int) z;
1771 mvsadcost [0][-i] = (int) z;
1772 mvsadcost [1][-i] = (int) z;
1773 }
1774 while (++i <= mvfp_max);
1775 }
1776
1777 struct VP8_COMP* vp8_create_compressor(VP8_CONFIG *oxcf)
1778 {
1779 int i;
1780
1781 VP8_COMP *cpi;
1782 VP8_COMMON *cm;
1783
1784 cpi = vpx_memalign(32, sizeof(VP8_COMP));
1785 /* Check that the CPI instance is valid */
1786 if (!cpi)
1787 return 0;
1788
1789 cm = &cpi->common;
1790
1791 vpx_memset(cpi, 0, sizeof(VP8_COMP));
1792
1793 if (setjmp(cm->error.jmp))
1794 {
1795 cpi->common.error.setjmp = 0;
1796 vp8_remove_compressor(&cpi);
1797 return 0;
1798 }
1799
1800 cpi->common.error.setjmp = 1;
1801
1802 CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));
1803
1804 vp8_create_common(&cpi->common);
1805
1806 init_config(cpi, oxcf);
1807
1808 memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
1809 cpi->common.current_video_frame = 0;
1810 cpi->temporal_pattern_counter = 0;
1811 cpi->kf_overspend_bits = 0;
1812 cpi->kf_bitrate_adjustment = 0;
1813 cpi->frames_till_gf_update_due = 0;
1814 cpi->gf_overspend_bits = 0;
1815 cpi->non_gf_bitrate_adjustment = 0;
1816 cpi->prob_last_coded = 128;
1817 cpi->prob_gf_coded = 128;
1818 cpi->prob_intra_coded = 63;
1819
1820 /* Prime the recent reference frame usage counters.
1821 * Hereafter they will be maintained as a sort of moving average
1822 */
1823 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
1824 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
1825 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
1826 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
1827
1828 /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
1829 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
1830
1831 cpi->twopass.gf_decay_rate = 0;
1832 cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1833
1834 cpi->gold_is_last = 0 ;
1835 cpi->alt_is_last = 0 ;
1836 cpi->gold_is_alt = 0 ;
1837
1838 cpi->active_map_enabled = 0;
1839
1840 #if 0
1841 /* Experimental code for lagged and one pass */
1842 /* Initialise one_pass GF frames stats */
1843 /* Update stats used for GF selection */
1844 if (cpi->pass == 0)
1845 {
1846 cpi->one_pass_frame_index = 0;
1847
1848 for (i = 0; i < MAX_LAG_BUFFERS; i++)
1849 {
1850 cpi->one_pass_frame_stats[i].frames_so_far = 0;
1851 cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
1852 cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
1853 cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
1854 cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
1855 cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
1856 cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
1857 cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
1858 cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
1859 }
1860 }
1861 #endif
1862
1863 /* Should we use the cyclic refresh method.
1864 * Currently this is tied to error resilliant mode
1865 */
1866 cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
1867 cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 5;
1868 cpi->cyclic_refresh_mode_index = 0;
1869 cpi->cyclic_refresh_q = 32;
1870
1871 if (cpi->cyclic_refresh_mode_enabled)
1872 {
1873 CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
1874 }
1875 else
1876 cpi->cyclic_refresh_map = (signed char *) NULL;
1877
1878 #ifdef VP8_ENTROPY_STATS
1879 init_context_counters();
1880 #endif
1881
1882 /*Initialize the feed-forward activity masking.*/
1883 cpi->activity_avg = 90<<12;
1884
1885 /* Give a sensible default for the first frame. */
1886 cpi->frames_since_key = 8;
1887 cpi->key_frame_frequency = cpi->oxcf.key_freq;
1888 cpi->this_key_frame_forced = 0;
1889 cpi->next_key_frame_forced = 0;
1890
1891 cpi->source_alt_ref_pending = 0;
1892 cpi->source_alt_ref_active = 0;
1893 cpi->common.refresh_alt_ref_frame = 0;
1894
1895 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1896 #if CONFIG_INTERNAL_STATS
1897 cpi->b_calculate_ssimg = 0;
1898
1899 cpi->count = 0;
1900 cpi->bytes = 0;
1901
1902 if (cpi->b_calculate_psnr)
1903 {
1904 cpi->total_sq_error = 0.0;
1905 cpi->total_sq_error2 = 0.0;
1906 cpi->total_y = 0.0;
1907 cpi->total_u = 0.0;
1908 cpi->total_v = 0.0;
1909 cpi->total = 0.0;
1910 cpi->totalp_y = 0.0;
1911 cpi->totalp_u = 0.0;
1912 cpi->totalp_v = 0.0;
1913 cpi->totalp = 0.0;
1914 cpi->tot_recode_hits = 0;
1915 cpi->summed_quality = 0;
1916 cpi->summed_weights = 0;
1917 }
1918
1919 if (cpi->b_calculate_ssimg)
1920 {
1921 cpi->total_ssimg_y = 0;
1922 cpi->total_ssimg_u = 0;
1923 cpi->total_ssimg_v = 0;
1924 cpi->total_ssimg_all = 0;
1925 }
1926
1927 #endif
1928
1929 cpi->first_time_stamp_ever = 0x7FFFFFFF;
1930
1931 cpi->frames_till_gf_update_due = 0;
1932 cpi->key_frame_count = 1;
1933
1934 cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
1935 cpi->ni_tot_qi = 0;
1936 cpi->ni_frames = 0;
1937 cpi->total_byte_count = 0;
1938
1939 cpi->drop_frame = 0;
1940
1941 cpi->rate_correction_factor = 1.0;
1942 cpi->key_frame_rate_correction_factor = 1.0;
1943 cpi->gf_rate_correction_factor = 1.0;
1944 cpi->twopass.est_max_qcorrection_factor = 1.0;
1945
1946 for (i = 0; i < KEY_FRAME_CONTEXT; i++)
1947 {
1948 cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
1949 }
1950
1951 #ifdef OUTPUT_YUV_SRC
1952 yuv_file = fopen("bd.yuv", "ab");
1953 #endif
1954
1955 #if 0
1956 framepsnr = fopen("framepsnr.stt", "a");
1957 kf_list = fopen("kf_list.stt", "w");
1958 #endif
1959
1960 cpi->output_pkt_list = oxcf->output_pkt_list;
1961
1962 #if !(CONFIG_REALTIME_ONLY)
1963
1964 if (cpi->pass == 1)
1965 {
1966 vp8_init_first_pass(cpi);
1967 }
1968 else if (cpi->pass == 2)
1969 {
1970 size_t packet_sz = sizeof(FIRSTPASS_STATS);
1971 int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
1972
1973 cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1974 cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1975 cpi->twopass.stats_in_end = (void*)((char *)cpi->twopass.stats_in
1976 + (packets - 1) * packet_sz);
1977 vp8_init_second_pass(cpi);
1978 }
1979
1980 #endif
1981
1982 if (cpi->compressor_speed == 2)
1983 {
1984 cpi->avg_encode_time = 0;
1985 cpi->avg_pick_mode_time = 0;
1986 }
1987
1988 vp8_set_speed_features(cpi);
1989
1990 /* Set starting values of RD threshold multipliers (128 = *1) */
1991 for (i = 0; i < MAX_MODES; i++)
1992 {
1993 cpi->mb.rd_thresh_mult[i] = 128;
1994 }
1995
1996 #ifdef VP8_ENTROPY_STATS
1997 init_mv_ref_counts();
1998 #endif
1999
2000 #if CONFIG_MULTITHREAD
2001 if(vp8cx_create_encoder_threads(cpi))
2002 {
2003 vp8_remove_compressor(&cpi);
2004 return 0;
2005 }
2006 #endif
2007
2008 cpi->fn_ptr[BLOCK_16X16].sdf = vp8_sad16x16;
2009 cpi->fn_ptr[BLOCK_16X16].vf = vp8_variance16x16;
2010 cpi->fn_ptr[BLOCK_16X16].svf = vp8_sub_pixel_variance16x16;
2011 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h = vp8_variance_halfpixvar16x16_h;
2012 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v = vp8_variance_halfpixvar16x16_v;
2013 cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = vp8_variance_halfpixvar16x16_hv;
2014 cpi->fn_ptr[BLOCK_16X16].sdx3f = vp8_sad16x16x3;
2015 cpi->fn_ptr[BLOCK_16X16].sdx8f = vp8_sad16x16x8;
2016 cpi->fn_ptr[BLOCK_16X16].sdx4df = vp8_sad16x16x4d;
2017
2018 cpi->fn_ptr[BLOCK_16X8].sdf = vp8_sad16x8;
2019 cpi->fn_ptr[BLOCK_16X8].vf = vp8_variance16x8;
2020 cpi->fn_ptr[BLOCK_16X8].svf = vp8_sub_pixel_variance16x8;
2021 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h = NULL;
2022 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v = NULL;
2023 cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
2024 cpi->fn_ptr[BLOCK_16X8].sdx3f = vp8_sad16x8x3;
2025 cpi->fn_ptr[BLOCK_16X8].sdx8f = vp8_sad16x8x8;
2026 cpi->fn_ptr[BLOCK_16X8].sdx4df = vp8_sad16x8x4d;
2027
2028 cpi->fn_ptr[BLOCK_8X16].sdf = vp8_sad8x16;
2029 cpi->fn_ptr[BLOCK_8X16].vf = vp8_variance8x16;
2030 cpi->fn_ptr[BLOCK_8X16].svf = vp8_sub_pixel_variance8x16;
2031 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h = NULL;
2032 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v = NULL;
2033 cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
2034 cpi->fn_ptr[BLOCK_8X16].sdx3f = vp8_sad8x16x3;
2035 cpi->fn_ptr[BLOCK_8X16].sdx8f = vp8_sad8x16x8;
2036 cpi->fn_ptr[BLOCK_8X16].sdx4df = vp8_sad8x16x4d;
2037
2038 cpi->fn_ptr[BLOCK_8X8].sdf = vp8_sad8x8;
2039 cpi->fn_ptr[BLOCK_8X8].vf = vp8_variance8x8;
2040 cpi->fn_ptr[BLOCK_8X8].svf = vp8_sub_pixel_variance8x8;
2041 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h = NULL;
2042 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v = NULL;
2043 cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
2044 cpi->fn_ptr[BLOCK_8X8].sdx3f = vp8_sad8x8x3;
2045 cpi->fn_ptr[BLOCK_8X8].sdx8f = vp8_sad8x8x8;
2046 cpi->fn_ptr[BLOCK_8X8].sdx4df = vp8_sad8x8x4d;
2047
2048 cpi->fn_ptr[BLOCK_4X4].sdf = vp8_sad4x4;
2049 cpi->fn_ptr[BLOCK_4X4].vf = vp8_variance4x4;
2050 cpi->fn_ptr[BLOCK_4X4].svf = vp8_sub_pixel_variance4x4;
2051 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h = NULL;
2052 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v = NULL;
2053 cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
2054 cpi->fn_ptr[BLOCK_4X4].sdx3f = vp8_sad4x4x3;
2055 cpi->fn_ptr[BLOCK_4X4].sdx8f = vp8_sad4x4x8;
2056 cpi->fn_ptr[BLOCK_4X4].sdx4df = vp8_sad4x4x4d;
2057
2058 #if ARCH_X86 || ARCH_X86_64
2059 cpi->fn_ptr[BLOCK_16X16].copymem = vp8_copy32xn;
2060 cpi->fn_ptr[BLOCK_16X8].copymem = vp8_copy32xn;
2061 cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn;
2062 cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn;
2063 cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn;
2064 #endif
2065
2066 cpi->full_search_sad = vp8_full_search_sad;
2067 cpi->diamond_search_sad = vp8_diamond_search_sad;
2068 cpi->refining_search_sad = vp8_refining_search_sad;
2069
2070 /* make sure frame 1 is okay */
2071 cpi->mb.error_bins[0] = cpi->common.MBs;
2072
2073 /* vp8cx_init_quantizer() is first called here. Add check in
2074 * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
2075 * called later when needed. This will avoid unnecessary calls of
2076 * vp8cx_init_quantizer() for every frame.
2077 */
2078 vp8cx_init_quantizer(cpi);
2079
2080 vp8_loop_filter_init(cm);
2081
2082 cpi->common.error.setjmp = 0;
2083
2084 #if CONFIG_MULTI_RES_ENCODING
2085
2086 /* Calculate # of MBs in a row in lower-resolution level image. */
2087 if (cpi->oxcf.mr_encoder_id > 0)
2088 vp8_cal_low_res_mb_cols(cpi);
2089
2090 #endif
2091
2092 /* setup RD costs to MACROBLOCK struct */
2093
2094 cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max+1];
2095 cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max+1];
2096 cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max+1];
2097 cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max+1];
2098
2099 cal_mvsadcosts(cpi->mb.mvsadcost);
2100
2101 cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
2102 cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
2103 cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
2104 cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
2105 cpi->mb.token_costs = cpi->rd_costs.token_costs;
2106
2107 /* setup block ptrs & offsets */
2108 vp8_setup_block_ptrs(&cpi->mb);
2109 vp8_setup_block_dptrs(&cpi->mb.e_mbd);
2110
2111 return cpi;
2112 }
2113
2114
2115 void vp8_remove_compressor(VP8_COMP **ptr)
2116 {
2117 VP8_COMP *cpi = *ptr;
2118
2119 if (!cpi)
2120 return;
2121
2122 if (cpi && (cpi->common.current_video_frame > 0))
2123 {
2124 #if !(CONFIG_REALTIME_ONLY)
2125
2126 if (cpi->pass == 2)
2127 {
2128 vp8_end_second_pass(cpi);
2129 }
2130
2131 #endif
2132
2133 #ifdef VP8_ENTROPY_STATS
2134 print_context_counters();
2135 print_tree_update_probs();
2136 print_mode_context();
2137 #endif
2138
2139 #if CONFIG_INTERNAL_STATS
2140
2141 if (cpi->pass != 1)
2142 {
2143 FILE *f = fopen("opsnr.stt", "a");
2144 double time_encoded = (cpi->last_end_time_stamp_seen
2145 - cpi->first_time_stamp_ever) / 10000000.000;
2146 double total_encode_time = (cpi->time_receive_data +
2147 cpi->time_compress_data) / 1000.000;
2148 double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
2149
2150 if (cpi->b_calculate_psnr)
2151 {
2152 YV12_BUFFER_CONFIG *lst_yv12 =
2153 &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
2154
2155 if (cpi->oxcf.number_of_layers > 1)
2156 {
2157 int i;
2158
2159 fprintf(f, "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2160 "GLPsnrP\tVPXSSIM\t\n");
2161 for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
2162 {
2163 double dr = (double)cpi->bytes_in_layer[i] *
2164 8.0 / 1000.0 / time_encoded;
2165 double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
2166 lst_yv12->y_width * lst_yv12->y_height;
2167 double total_psnr = vp8_mse2psnr(samples, 255.0,
2168 cpi->total_error2[i]);
2169 double total_psnr2 = vp8_mse2psnr(samples, 255.0,
2170 cpi->total_error2_p[i]);
2171 double total_ssim = 100 * pow(cpi->sum_ssim[i] /
2172 cpi->sum_weights[i], 8.0);
2173
2174 fprintf(f, "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2175 "%7.3f\t%7.3f\n",
2176 i, dr,
2177 cpi->sum_psnr[i] / cpi->frames_in_layer[i],
2178 total_psnr,
2179 cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
2180 total_psnr2, total_ssim);
2181 }
2182 }
2183 else
2184 {
2185 double samples = 3.0 / 2 * cpi->count *
2186 lst_yv12->y_width * lst_yv12->y_height;
2187 double total_psnr = vp8_mse2psnr(samples, 255.0,
2188 cpi->total_sq_error);
2189 double total_psnr2 = vp8_mse2psnr(samples, 255.0,
2190 cpi->total_sq_error2);
2191 double total_ssim = 100 * pow(cpi->summed_quality /
2192 cpi->summed_weights, 8.0);
2193
2194 fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
2195 "GLPsnrP\tVPXSSIM\t Time(us)\n");
2196 fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2197 "%7.3f\t%8.0f\n",
2198 dr, cpi->total / cpi->count, total_psnr,
2199 cpi->totalp / cpi->count, total_psnr2,
2200 total_ssim, total_encode_time);
2201 }
2202 }
2203
2204 if (cpi->b_calculate_ssimg)
2205 {
2206 if (cpi->oxcf.number_of_layers > 1)
2207 {
2208 int i;
2209
2210 fprintf(f, "Layer\tBitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
2211 "Time(us)\n");
2212 for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
2213 {
2214 double dr = (double)cpi->bytes_in_layer[i] *
2215 8.0 / 1000.0 / time_encoded;
2216 fprintf(f, "%5d\t%7.3f\t%6.4f\t"
2217 "%6.4f\t%6.4f\t%6.4f\t%8.0f\n",
2218 i, dr,
2219 cpi->total_ssimg_y_in_layer[i] /
2220 cpi->frames_in_layer[i],
2221 cpi->total_ssimg_u_in_layer[i] /
2222 cpi->frames_in_layer[i],
2223 cpi->total_ssimg_v_in_layer[i] /
2224 cpi->frames_in_layer[i],
2225 cpi->total_ssimg_all_in_layer[i] /
2226 cpi->frames_in_layer[i],
2227 total_encode_time);
2228 }
2229 }
2230 else
2231 {
2232 fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
2233 "Time(us)\n");
2234 fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
2235 cpi->total_ssimg_y / cpi->count,
2236 cpi->total_ssimg_u / cpi->count,
2237 cpi->total_ssimg_v / cpi->count,
2238 cpi->total_ssimg_all / cpi->count, total_encode_time);
2239 }
2240 }
2241
2242 fclose(f);
2243 #if 0
2244 f = fopen("qskip.stt", "a");
2245 fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
2246 fclose(f);
2247 #endif
2248
2249 }
2250
2251 #endif
2252
2253
2254 #ifdef SPEEDSTATS
2255
2256 if (cpi->compressor_speed == 2)
2257 {
2258 int i;
2259 FILE *f = fopen("cxspeed.stt", "a");
2260 cnt_pm /= cpi->common.MBs;
2261
2262 for (i = 0; i < 16; i++)
2263 fprintf(f, "%5d", frames_at_speed[i]);
2264
2265 fprintf(f, "\n");
2266 fclose(f);
2267 }
2268
2269 #endif
2270
2271
2272 #ifdef MODE_STATS
2273 {
2274 extern int count_mb_seg[4];
2275 FILE *f = fopen("modes.stt", "a");
2276 double dr = (double)cpi->framerate * (double)bytes * (double)8 / (double)count / (double)1000 ;
2277 fprintf(f, "intra_mode in Intra Frames:\n");
2278 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
2279 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
2280 fprintf(f, "B: ");
2281 {
2282 int i;
2283
2284 for (i = 0; i < 10; i++)
2285 fprintf(f, "%8d, ", b_modes[i]);
2286
2287 fprintf(f, "\n");
2288
2289 }
2290
2291 fprintf(f, "Modes in Inter Frames:\n");
2292 fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
2293 inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
2294 inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
2295 fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
2296 fprintf(f, "B: ");
2297 {
2298 int i;
2299
2300 for (i = 0; i < 15; i++)
2301 fprintf(f, "%8d, ", inter_b_modes[i]);
2302
2303 fprintf(f, "\n");
2304
2305 }
2306 fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
2307 fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);
2308
2309
2310
2311 fclose(f);
2312 }
2313 #endif
2314
2315 #ifdef VP8_ENTROPY_STATS
2316 {
2317 int i, j, k;
2318 FILE *fmode = fopen("modecontext.c", "w");
2319
2320 fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
2321 fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
2322 fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
2323
2324 for (i = 0; i < 10; i++)
2325 {
2326
2327 fprintf(fmode, " { /* Above Mode : %d */\n", i);
2328
2329 for (j = 0; j < 10; j++)
2330 {
2331
2332 fprintf(fmode, " {");
2333
2334 for (k = 0; k < 10; k++)
2335 {
2336 if (!intra_mode_stats[i][j][k])
2337 fprintf(fmode, " %5d, ", 1);
2338 else
2339 fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2340 }
2341
2342 fprintf(fmode, "}, /* left_mode %d */\n", j);
2343
2344 }
2345
2346 fprintf(fmode, " },\n");
2347
2348 }
2349
2350 fprintf(fmode, "};\n");
2351 fclose(fmode);
2352 }
2353 #endif
2354
2355
2356 #if defined(SECTIONBITS_OUTPUT)
2357
2358 if (0)
2359 {
2360 int i;
2361 FILE *f = fopen("tokenbits.stt", "a");
2362
2363 for (i = 0; i < 28; i++)
2364 fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2365
2366 fprintf(f, "\n");
2367 fclose(f);
2368 }
2369
2370 #endif
2371
2372 #if 0
2373 {
2374 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2375 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
2376 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);
2377 }
2378 #endif
2379
2380 }
2381
2382 #if CONFIG_MULTITHREAD
2383 vp8cx_remove_encoder_threads(cpi);
2384 #endif
2385
2386 #if CONFIG_TEMPORAL_DENOISING
2387 vp8_denoiser_free(&cpi->denoiser);
2388 #endif
2389 dealloc_compressor_data(cpi);
2390 vpx_free(cpi->mb.ss);
2391 vpx_free(cpi->tok);
2392 vpx_free(cpi->cyclic_refresh_map);
2393
2394 vp8_remove_common(&cpi->common);
2395 vpx_free(cpi);
2396 *ptr = 0;
2397
2398 #ifdef OUTPUT_YUV_SRC
2399 fclose(yuv_file);
2400 #endif
2401
2402 #if 0
2403
2404 if (keyfile)
2405 fclose(keyfile);
2406
2407 if (framepsnr)
2408 fclose(framepsnr);
2409
2410 if (kf_list)
2411 fclose(kf_list);
2412
2413 #endif
2414
2415 }
2416
2417
2418 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
2419 unsigned char *recon, int recon_stride,
2420 unsigned int cols, unsigned int rows)
2421 {
2422 unsigned int row, col;
2423 uint64_t total_sse = 0;
2424 int diff;
2425
2426 for (row = 0; row + 16 <= rows; row += 16)
2427 {
2428 for (col = 0; col + 16 <= cols; col += 16)
2429 {
2430 unsigned int sse;
2431
2432 vp8_mse16x16(orig + col, orig_stride,
2433 recon + col, recon_stride,
2434 &sse);
2435 total_sse += sse;
2436 }
2437
2438 /* Handle odd-sized width */
2439 if (col < cols)
2440 {
2441 unsigned int border_row, border_col;
2442 unsigned char *border_orig = orig;
2443 unsigned char *border_recon = recon;
2444
2445 for (border_row = 0; border_row < 16; border_row++)
2446 {
2447 for (border_col = col; border_col < cols; border_col++)
2448 {
2449 diff = border_orig[border_col] - border_recon[border_col];
2450 total_sse += diff * diff;
2451 }
2452
2453 border_orig += orig_stride;
2454 border_recon += recon_stride;
2455 }
2456 }
2457
2458 orig += orig_stride * 16;
2459 recon += recon_stride * 16;
2460 }
2461
2462 /* Handle odd-sized height */
2463 for (; row < rows; row++)
2464 {
2465 for (col = 0; col < cols; col++)
2466 {
2467 diff = orig[col] - recon[col];
2468 total_sse += diff * diff;
2469 }
2470
2471 orig += orig_stride;
2472 recon += recon_stride;
2473 }
2474
2475 vp8_clear_system_state();
2476 return total_sse;
2477 }
2478
2479
2480 static void generate_psnr_packet(VP8_COMP *cpi)
2481 {
2482 YV12_BUFFER_CONFIG *orig = cpi->Source;
2483 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
2484 struct vpx_codec_cx_pkt pkt;
2485 uint64_t sse;
2486 int i;
2487 unsigned int width = cpi->common.Width;
2488 unsigned int height = cpi->common.Height;
2489
2490 pkt.kind = VPX_CODEC_PSNR_PKT;
2491 sse = calc_plane_error(orig->y_buffer, orig->y_stride,
2492 recon->y_buffer, recon->y_stride,
2493 width, height);
2494 pkt.data.psnr.sse[0] = sse;
2495 pkt.data.psnr.sse[1] = sse;
2496 pkt.data.psnr.samples[0] = width * height;
2497 pkt.data.psnr.samples[1] = width * height;
2498
2499 width = (width + 1) / 2;
2500 height = (height + 1) / 2;
2501
2502 sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
2503 recon->u_buffer, recon->uv_stride,
2504 width, height);
2505 pkt.data.psnr.sse[0] += sse;
2506 pkt.data.psnr.sse[2] = sse;
2507 pkt.data.psnr.samples[0] += width * height;
2508 pkt.data.psnr.samples[2] = width * height;
2509
2510 sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
2511 recon->v_buffer, recon->uv_stride,
2512 width, height);
2513 pkt.data.psnr.sse[0] += sse;
2514 pkt.data.psnr.sse[3] = sse;
2515 pkt.data.psnr.samples[0] += width * height;
2516 pkt.data.psnr.samples[3] = width * height;
2517
2518 for (i = 0; i < 4; i++)
2519 pkt.data.psnr.psnr[i] = vp8_mse2psnr(pkt.data.psnr.samples[i], 255.0,
2520 (double)(pkt.data.psnr.sse[i]));
2521
2522 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2523 }
2524
2525
2526 int vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags)
2527 {
2528 if (ref_frame_flags > 7)
2529 return -1 ;
2530
2531 cpi->ref_frame_flags = ref_frame_flags;
2532 return 0;
2533 }
2534 int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags)
2535 {
2536 if (ref_frame_flags > 7)
2537 return -1 ;
2538
2539 cpi->common.refresh_golden_frame = 0;
2540 cpi->common.refresh_alt_ref_frame = 0;
2541 cpi->common.refresh_last_frame = 0;
2542
2543 if (ref_frame_flags & VP8_LAST_FRAME)
2544 cpi->common.refresh_last_frame = 1;
2545
2546 if (ref_frame_flags & VP8_GOLD_FRAME)
2547 cpi->common.refresh_golden_frame = 1;
2548
2549 if (ref_frame_flags & VP8_ALTR_FRAME)
2550 cpi->common.refresh_alt_ref_frame = 1;
2551
2552 return 0;
2553 }
2554
2555 int vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2556 {
2557 VP8_COMMON *cm = &cpi->common;
2558 int ref_fb_idx;
2559
2560 if (ref_frame_flag == VP8_LAST_FRAME)
2561 ref_fb_idx = cm->lst_fb_idx;
2562 else if (ref_frame_flag == VP8_GOLD_FRAME)
2563 ref_fb_idx = cm->gld_fb_idx;
2564 else if (ref_frame_flag == VP8_ALTR_FRAME)
2565 ref_fb_idx = cm->alt_fb_idx;
2566 else
2567 return -1;
2568
2569 vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
2570
2571 return 0;
2572 }
2573 int vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
2574 {
2575 VP8_COMMON *cm = &cpi->common;
2576
2577 int ref_fb_idx;
2578
2579 if (ref_frame_flag == VP8_LAST_FRAME)
2580 ref_fb_idx = cm->lst_fb_idx;
2581 else if (ref_frame_flag == VP8_GOLD_FRAME)
2582 ref_fb_idx = cm->gld_fb_idx;
2583 else if (ref_frame_flag == VP8_ALTR_FRAME)
2584 ref_fb_idx = cm->alt_fb_idx;
2585 else
2586 return -1;
2587
2588 vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
2589
2590 return 0;
2591 }
2592 int vp8_update_entropy(VP8_COMP *cpi, int update)
2593 {
2594 VP8_COMMON *cm = &cpi->common;
2595 cm->refresh_entropy_probs = update;
2596
2597 return 0;
2598 }
2599
2600
2601 #if OUTPUT_YUV_SRC
2602 void vp8_write_yuv_frame(const char *name, YV12_BUFFER_CONFIG *s)
2603 {
2604 FILE *yuv_file = fopen(name, "ab");
2605 unsigned char *src = s->y_buffer;
2606 int h = s->y_height;
2607
2608 do
2609 {
2610 fwrite(src, s->y_width, 1, yuv_file);
2611 src += s->y_stride;
2612 }
2613 while (--h);
2614
2615 src = s->u_buffer;
2616 h = s->uv_height;
2617
2618 do
2619 {
2620 fwrite(src, s->uv_width, 1, yuv_file);
2621 src += s->uv_stride;
2622 }
2623 while (--h);
2624
2625 src = s->v_buffer;
2626 h = s->uv_height;
2627
2628 do
2629 {
2630 fwrite(src, s->uv_width, 1, yuv_file);
2631 src += s->uv_stride;
2632 }
2633 while (--h);
2634
2635 fclose(yuv_file);
2636 }
2637 #endif
2638
2639
2640 static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
2641 {
2642 VP8_COMMON *cm = &cpi->common;
2643
2644 /* are we resizing the image */
2645 if (cm->horiz_scale != 0 || cm->vert_scale != 0)
2646 {
2647 #if CONFIG_SPATIAL_RESAMPLING
2648 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2649 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2650 int tmp_height;
2651
2652 if (cm->vert_scale == 3)
2653 tmp_height = 9;
2654 else
2655 tmp_height = 11;
2656
2657 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2658 Scale2Ratio(cm->vert_scale, &vr, &vs);
2659
2660 vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2661 tmp_height, hs, hr, vs, vr, 0);
2662
2663 vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2664 cpi->Source = &cpi->scaled_source;
2665 #endif
2666 }
2667 else
2668 cpi->Source = sd;
2669 }
2670
2671
2672 static int resize_key_frame(VP8_COMP *cpi)
2673 {
2674 #if CONFIG_SPATIAL_RESAMPLING
2675 VP8_COMMON *cm = &cpi->common;
2676
2677 /* Do we need to apply resampling for one pass cbr.
2678 * In one pass this is more limited than in two pass cbr
2679 * The test and any change is only made one per key frame sequence
2680 */
2681 if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
2682 {
2683 int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
2684 int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
2685 int new_width, new_height;
2686
2687 /* If we are below the resample DOWN watermark then scale down a
2688 * notch.
2689 */
2690 if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2691 {
2692 cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
2693 cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
2694 }
2695 /* Should we now start scaling back up */
2696 else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
2697 {
2698 cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
2699 cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
2700 }
2701
2702 /* Get the new hieght and width */
2703 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2704 Scale2Ratio(cm->vert_scale, &vr, &vs);
2705 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
2706 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
2707
2708 /* If the image size has changed we need to reallocate the buffers
2709 * and resample the source image
2710 */
2711 if ((cm->Width != new_width) || (cm->Height != new_height))
2712 {
2713 cm->Width = new_width;
2714 cm->Height = new_height;
2715 vp8_alloc_compressor_data(cpi);
2716 scale_and_extend_source(cpi->un_scaled_source, cpi);
2717 return 1;
2718 }
2719 }
2720
2721 #endif
2722 return 0;
2723 }
2724
2725
2726 static void update_alt_ref_frame_stats(VP8_COMP *cpi)
2727 {
2728 VP8_COMMON *cm = &cpi->common;
2729
2730 /* Select an interval before next GF or altref */
2731 if (!cpi->auto_gold)
2732 cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2733
2734 if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
2735 {
2736 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2737
2738 /* Set the bits per frame that we should try and recover in
2739 * subsequent inter frames to account for the extra GF spend...
2740 * note that his does not apply for GF updates that occur
2741 * coincident with a key frame as the extra cost of key frames is
2742 * dealt with elsewhere.
2743 */
2744 cpi->gf_overspend_bits += cpi->projected_frame_size;
2745 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2746 }
2747
2748 /* Update data structure that monitors level of reference to last GF */
2749 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2750 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2751
2752 /* this frame refreshes means next frames don't unless specified by user */
2753 cpi->frames_since_golden = 0;
2754
2755 /* Clear the alternate reference update pending flag. */
2756 cpi->source_alt_ref_pending = 0;
2757
2758 /* Set the alternate reference frame active flag */
2759 cpi->source_alt_ref_active = 1;
2760
2761
2762 }
2763 static void update_golden_frame_stats(VP8_COMP *cpi)
2764 {
2765 VP8_COMMON *cm = &cpi->common;
2766
2767 /* Update the Golden frame usage counts. */
2768 if (cm->refresh_golden_frame)
2769 {
2770 /* Select an interval before next GF */
2771 if (!cpi->auto_gold)
2772 cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2773
2774 if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
2775 {
2776 cpi->current_gf_interval = cpi->frames_till_gf_update_due;
2777
2778 /* Set the bits per frame that we should try and recover in
2779 * subsequent inter frames to account for the extra GF spend...
2780 * note that his does not apply for GF updates that occur
2781 * coincident with a key frame as the extra cost of key frames
2782 * is dealt with elsewhere.
2783 */
2784 if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
2785 {
2786 /* Calcluate GF bits to be recovered
2787 * Projected size - av frame bits available for inter
2788 * frames for clip as a whole
2789 */
2790 cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
2791 }
2792
2793 cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
2794
2795 }
2796
2797 /* Update data structure that monitors level of reference to last GF */
2798 vpx_memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
2799 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
2800
2801 /* this frame refreshes means next frames don't unless specified by
2802 * user
2803 */
2804 cm->refresh_golden_frame = 0;
2805 cpi->frames_since_golden = 0;
2806
2807 cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
2808 cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
2809 cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
2810 cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
2811
2812 /* ******** Fixed Q test code only ************ */
2813 /* If we are going to use the ALT reference for the next group of
2814 * frames set a flag to say so.
2815 */
2816 if (cpi->oxcf.fixed_q >= 0 &&
2817 cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
2818 {
2819 cpi->source_alt_ref_pending = 1;
2820 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2821 }
2822
2823 if (!cpi->source_alt_ref_pending)
2824 cpi->source_alt_ref_active = 0;
2825
2826 /* Decrement count down till next gf */
2827 if (cpi->frames_till_gf_update_due > 0)
2828 cpi->frames_till_gf_update_due--;
2829
2830 }
2831 else if (!cpi->common.refresh_alt_ref_frame)
2832 {
2833 /* Decrement count down till next gf */
2834 if (cpi->frames_till_gf_update_due > 0)
2835 cpi->frames_till_gf_update_due--;
2836
2837 if (cpi->frames_till_alt_ref_frame)
2838 cpi->frames_till_alt_ref_frame --;
2839
2840 cpi->frames_since_golden ++;
2841
2842 if (cpi->frames_since_golden > 1)
2843 {
2844 cpi->recent_ref_frame_usage[INTRA_FRAME] +=
2845 cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
2846 cpi->recent_ref_frame_usage[LAST_FRAME] +=
2847 cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
2848 cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
2849 cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
2850 cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
2851 cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
2852 }
2853 }
2854 }
2855
2856 /* This function updates the reference frame probability estimates that
2857 * will be used during mode selection
2858 */
2859 static void update_rd_ref_frame_probs(VP8_COMP *cpi)
2860 {
2861 VP8_COMMON *cm = &cpi->common;
2862
2863 const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
2864 const int rf_intra = rfct[INTRA_FRAME];
2865 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
2866
2867 if (cm->frame_type == KEY_FRAME)
2868 {
2869 cpi->prob_intra_coded = 255;
2870 cpi->prob_last_coded = 128;
2871 cpi->prob_gf_coded = 128;
2872 }
2873 else if (!(rf_intra + rf_inter))
2874 {
2875 cpi->prob_intra_coded = 63;
2876 cpi->prob_last_coded = 128;
2877 cpi->prob_gf_coded = 128;
2878 }
2879
2880 /* update reference frame costs since we can do better than what we got
2881 * last frame.
2882 */
2883 if (cpi->oxcf.number_of_layers == 1)
2884 {
2885 if (cpi->common.refresh_alt_ref_frame)
2886 {
2887 cpi->prob_intra_coded += 40;
2888 if (cpi->prob_intra_coded > 255)
2889 cpi->prob_intra_coded = 255;
2890 cpi->prob_last_coded = 200;
2891 cpi->prob_gf_coded = 1;
2892 }
2893 else if (cpi->frames_since_golden == 0)
2894 {
2895 cpi->prob_last_coded = 214;
2896 }
2897 else if (cpi->frames_since_golden == 1)
2898 {
2899 cpi->prob_last_coded = 192;
2900 cpi->prob_gf_coded = 220;
2901 }
2902 else if (cpi->source_alt_ref_active)
2903 {
2904 cpi->prob_gf_coded -= 20;
2905
2906 if (cpi->prob_gf_coded < 10)
2907 cpi->prob_gf_coded = 10;
2908 }
2909 if (!cpi->source_alt_ref_active)
2910 cpi->prob_gf_coded = 255;
2911 }
2912 }
2913
2914
2915 /* 1 = key, 0 = inter */
2916 static int decide_key_frame(VP8_COMP *cpi)
2917 {
2918 VP8_COMMON *cm = &cpi->common;
2919
2920 int code_key_frame = 0;
2921
2922 cpi->kf_boost = 0;
2923
2924 if (cpi->Speed > 11)
2925 return 0;
2926
2927 /* Clear down mmx registers */
2928 vp8_clear_system_state();
2929
2930 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
2931 {
2932 double change = 1.0 * abs((int)(cpi->mb.intra_error -
2933 cpi->last_intra_error)) / (1 + cpi->last_intra_error);
2934 double change2 = 1.0 * abs((int)(cpi->mb.prediction_error -
2935 cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
2936 double minerror = cm->MBs * 256;
2937
2938 cpi->last_intra_error = cpi->mb.intra_error;
2939 cpi->last_prediction_error = cpi->mb.prediction_error;
2940
2941 if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15
2942 && cpi->mb.prediction_error > minerror
2943 && (change > .25 || change2 > .25))
2944 {
2945 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
2946 return 1;
2947 }
2948
2949 return 0;
2950
2951 }
2952
2953 /* If the following are true we might as well code a key frame */
2954 if (((cpi->this_frame_percent_intra == 100) &&
2955 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
2956 ((cpi->this_frame_percent_intra > 95) &&
2957 (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
2958 {
2959 code_key_frame = 1;
2960 }
2961 /* in addition if the following are true and this is not a golden frame
2962 * then code a key frame Note that on golden frames there often seems
2963 * to be a pop in intra useage anyway hence this restriction is
2964 * designed to prevent spurious key frames. The Intra pop needs to be
2965 * investigated.
2966 */
2967 else if (((cpi->this_frame_percent_intra > 60) &&
2968 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
2969 ((cpi->this_frame_percent_intra > 75) &&
2970 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
2971 ((cpi->this_frame_percent_intra > 90) &&
2972 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
2973 {
2974 if (!cm->refresh_golden_frame)
2975 code_key_frame = 1;
2976 }
2977
2978 return code_key_frame;
2979
2980 }
2981
2982 #if !(CONFIG_REALTIME_ONLY)
2983 static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
2984 {
2985 (void) size;
2986 (void) dest;
2987 (void) frame_flags;
2988 vp8_set_quantizer(cpi, 26);
2989
2990 vp8_first_pass(cpi);
2991 }
2992 #endif
2993
2994 #if 0
2995 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
2996 {
2997
2998 /* write the frame */
2999 FILE *yframe;
3000 int i;
3001 char filename[255];
3002
3003 sprintf(filename, "cx\\y%04d.raw", this_frame);
3004 yframe = fopen(filename, "wb");
3005
3006 for (i = 0; i < frame->y_height; i++)
3007 fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
3008
3009 fclose(yframe);
3010 sprintf(filename, "cx\\u%04d.raw", this_frame);
3011 yframe = fopen(filename, "wb");
3012
3013 for (i = 0; i < frame->uv_height; i++)
3014 fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3015
3016 fclose(yframe);
3017 sprintf(filename, "cx\\v%04d.raw", this_frame);
3018 yframe = fopen(filename, "wb");
3019
3020 for (i = 0; i < frame->uv_height; i++)
3021 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
3022
3023 fclose(yframe);
3024 }
3025 #endif
3026 /* return of 0 means drop frame */
3027
3028 /* Function to test for conditions that indeicate we should loop
3029 * back and recode a frame.
3030 */
3031 static int recode_loop_test( VP8_COMP *cpi,
3032 int high_limit, int low_limit,
3033 int q, int maxq, int minq )
3034 {
3035 int force_recode = 0;
3036 VP8_COMMON *cm = &cpi->common;
3037
3038 /* Is frame recode allowed at all
3039 * Yes if either recode mode 1 is selected or mode two is selcted
3040 * and the frame is a key frame. golden frame or alt_ref_frame
3041 */
3042 if ( (cpi->sf.recode_loop == 1) ||
3043 ( (cpi->sf.recode_loop == 2) &&
3044 ( (cm->frame_type == KEY_FRAME) ||
3045 cm->refresh_golden_frame ||
3046 cm->refresh_alt_ref_frame ) ) )
3047 {
3048 /* General over and under shoot tests */
3049 if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
3050 ((cpi->projected_frame_size < low_limit) && (q > minq)) )
3051 {
3052 force_recode = 1;
3053 }
3054 /* Special Constrained quality tests */
3055 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3056 {
3057 /* Undershoot and below auto cq level */
3058 if ( (q > cpi->cq_target_quality) &&
3059 (cpi->projected_frame_size <
3060 ((cpi->this_frame_target * 7) >> 3)))
3061 {
3062 force_recode = 1;
3063 }
3064 /* Severe undershoot and between auto and user cq level */
3065 else if ( (q > cpi->oxcf.cq_level) &&
3066 (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
3067 (cpi->active_best_quality > cpi->oxcf.cq_level))
3068 {
3069 force_recode = 1;
3070 cpi->active_best_quality = cpi->oxcf.cq_level;
3071 }
3072 }
3073 }
3074
3075 return force_recode;
3076 }
3077
3078 static void update_reference_frames(VP8_COMP *cpi)
3079 {
3080 VP8_COMMON *cm = &cpi->common;
3081 YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
3082
3083 /* At this point the new frame has been encoded.
3084 * If any buffer copy / swapping is signaled it should be done here.
3085 */
3086
3087 if (cm->frame_type == KEY_FRAME)
3088 {
3089 yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME ;
3090
3091 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3092 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3093
3094 cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
3095
3096 #if CONFIG_MULTI_RES_ENCODING
3097 cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
3098 cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
3099 #endif
3100 }
3101 else /* For non key frames */
3102 {
3103 if (cm->refresh_alt_ref_frame)
3104 {
3105 assert(!cm->copy_buffer_to_arf);
3106
3107 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
3108 cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3109 cm->alt_fb_idx = cm->new_fb_idx;
3110
3111 #if CONFIG_MULTI_RES_ENCODING
3112 cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
3113 #endif
3114 }
3115 else if (cm->copy_buffer_to_arf)
3116 {
3117 assert(!(cm->copy_buffer_to_arf & ~0x3));
3118
3119 if (cm->copy_buffer_to_arf == 1)
3120 {
3121 if(cm->alt_fb_idx != cm->lst_fb_idx)
3122 {
3123 yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
3124 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3125 cm->alt_fb_idx = cm->lst_fb_idx;
3126
3127 #if CONFIG_MULTI_RES_ENCODING
3128 cpi->current_ref_frames[ALTREF_FRAME] =
3129 cpi->current_ref_frames[LAST_FRAME];
3130 #endif
3131 }
3132 }
3133 else /* if (cm->copy_buffer_to_arf == 2) */
3134 {
3135 if(cm->alt_fb_idx != cm->gld_fb_idx)
3136 {
3137 yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
3138 yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
3139 cm->alt_fb_idx = cm->gld_fb_idx;
3140
3141 #if CONFIG_MULTI_RES_ENCODING
3142 cpi->current_ref_frames[ALTREF_FRAME] =
3143 cpi->current_ref_frames[GOLDEN_FRAME];
3144 #endif
3145 }
3146 }
3147 }
3148
3149 if (cm->refresh_golden_frame)
3150 {
3151 assert(!cm->copy_buffer_to_gf);
3152
3153 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
3154 cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3155 cm->gld_fb_idx = cm->new_fb_idx;
3156
3157 #if CONFIG_MULTI_RES_ENCODING
3158 cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
3159 #endif
3160 }
3161 else if (cm->copy_buffer_to_gf)
3162 {
3163 assert(!(cm->copy_buffer_to_arf & ~0x3));
3164
3165 if (cm->copy_buffer_to_gf == 1)
3166 {
3167 if(cm->gld_fb_idx != cm->lst_fb_idx)
3168 {
3169 yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
3170 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3171 cm->gld_fb_idx = cm->lst_fb_idx;
3172
3173 #if CONFIG_MULTI_RES_ENCODING
3174 cpi->current_ref_frames[GOLDEN_FRAME] =
3175 cpi->current_ref_frames[LAST_FRAME];
3176 #endif
3177 }
3178 }
3179 else /* if (cm->copy_buffer_to_gf == 2) */
3180 {
3181 if(cm->alt_fb_idx != cm->gld_fb_idx)
3182 {
3183 yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
3184 yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
3185 cm->gld_fb_idx = cm->alt_fb_idx;
3186
3187 #if CONFIG_MULTI_RES_ENCODING
3188 cpi->current_ref_frames[GOLDEN_FRAME] =
3189 cpi->current_ref_frames[ALTREF_FRAME];
3190 #endif
3191 }
3192 }
3193 }
3194 }
3195
3196 if (cm->refresh_last_frame)
3197 {
3198 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
3199 cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
3200 cm->lst_fb_idx = cm->new_fb_idx;
3201
3202 #if CONFIG_MULTI_RES_ENCODING
3203 cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
3204 #endif
3205 }
3206
3207 #if CONFIG_TEMPORAL_DENOISING
3208 if (cpi->oxcf.noise_sensitivity)
3209 {
3210 /* we shouldn't have to keep multiple copies as we know in advance which
3211 * buffer we should start - for now to get something up and running
3212 * I've chosen to copy the buffers
3213 */
3214 if (cm->frame_type == KEY_FRAME)
3215 {
3216 int i;
3217 vp8_yv12_copy_frame(
3218 cpi->Source,
3219 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3220
3221 vp8_yv12_extend_frame_borders(
3222 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3223
3224 for (i = 2; i < MAX_REF_FRAMES - 1; i++)
3225 vp8_yv12_copy_frame(
3226 &cpi->denoiser.yv12_running_avg[LAST_FRAME],
3227 &cpi->denoiser.yv12_running_avg[i]);
3228 }
3229 else /* For non key frames */
3230 {
3231 vp8_yv12_extend_frame_borders(
3232 &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
3233
3234 if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf)
3235 {
3236 vp8_yv12_copy_frame(
3237 &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3238 &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
3239 }
3240 if (cm->refresh_golden_frame || cm->copy_buffer_to_gf)
3241 {
3242 vp8_yv12_copy_frame(
3243 &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3244 &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
3245 }
3246 if(cm->refresh_last_frame)
3247 {
3248 vp8_yv12_copy_frame(
3249 &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3250 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3251 }
3252 }
3253
3254 }
3255 #endif
3256
3257 }
3258
3259 void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
3260 {
3261 const FRAME_TYPE frame_type = cm->frame_type;
3262
3263 if (cm->no_lpf)
3264 {
3265 cm->filter_level = 0;
3266 }
3267 else
3268 {
3269 struct vpx_usec_timer timer;
3270
3271 vp8_clear_system_state();
3272
3273 vpx_usec_timer_start(&timer);
3274 if (cpi->sf.auto_filter == 0)
3275 vp8cx_pick_filter_level_fast(cpi->Source, cpi);
3276
3277 else
3278 vp8cx_pick_filter_level(cpi->Source, cpi);
3279
3280 if (cm->filter_level > 0)
3281 {
3282 vp8cx_set_alt_lf_level(cpi, cm->filter_level);
3283 }
3284
3285 vpx_usec_timer_mark(&timer);
3286 cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3287 }
3288
3289 #if CONFIG_MULTITHREAD
3290 if (cpi->b_multi_threaded)
3291 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3292 #endif
3293
3294 if (cm->filter_level > 0)
3295 {
3296 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
3297 }
3298
3299 vp8_yv12_extend_frame_borders(cm->frame_to_show);
3300
3301 }
3302
3303 static void encode_frame_to_data_rate
3304 (
3305 VP8_COMP *cpi,
3306 unsigned long *size,
3307 unsigned char *dest,
3308 unsigned char* dest_end,
3309 unsigned int *frame_flags
3310 )
3311 {
3312 int Q;
3313 int frame_over_shoot_limit;
3314 int frame_under_shoot_limit;
3315
3316 int Loop = 0;
3317 int loop_count;
3318
3319 VP8_COMMON *cm = &cpi->common;
3320 int active_worst_qchanged = 0;
3321
3322 #if !(CONFIG_REALTIME_ONLY)
3323 int q_low;
3324 int q_high;
3325 int zbin_oq_high;
3326 int zbin_oq_low = 0;
3327 int top_index;
3328 int bottom_index;
3329 int overshoot_seen = 0;
3330 int undershoot_seen = 0;
3331 #endif
3332
3333 int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
3334 cpi->oxcf.optimal_buffer_level / 100);
3335 int drop_mark75 = drop_mark * 2 / 3;
3336 int drop_mark50 = drop_mark / 4;
3337 int drop_mark25 = drop_mark / 8;
3338
3339
3340 /* Clear down mmx registers to allow floating point in what follows */
3341 vp8_clear_system_state();
3342
3343 #if CONFIG_MULTITHREAD
3344 /* wait for the last picture loopfilter thread done */
3345 if (cpi->b_lpf_running)
3346 {
3347 sem_wait(&cpi->h_event_end_lpf);
3348 cpi->b_lpf_running = 0;
3349 }
3350 #endif
3351
3352 if(cpi->force_next_frame_intra)
3353 {
3354 cm->frame_type = KEY_FRAME; /* delayed intra frame */
3355 cpi->force_next_frame_intra = 0;
3356 }
3357
3358 /* For an alt ref frame in 2 pass we skip the call to the second pass
3359 * function that sets the target bandwidth
3360 */
3361 #if !(CONFIG_REALTIME_ONLY)
3362
3363 if (cpi->pass == 2)
3364 {
3365 if (cpi->common.refresh_alt_ref_frame)
3366 {
3367 /* Per frame bit target for the alt ref frame */
3368 cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
3369 /* per second target bitrate */
3370 cpi->target_bandwidth = (int)(cpi->twopass.gf_bits *
3371 cpi->output_framerate);
3372 }
3373 }
3374 else
3375 #endif
3376 cpi->per_frame_bandwidth = (int)(cpi->target_bandwidth / cpi->output_framerate);
3377
3378 /* Default turn off buffer to buffer copying */
3379 cm->copy_buffer_to_gf = 0;
3380 cm->copy_buffer_to_arf = 0;
3381
3382 /* Clear zbin over-quant value and mode boost values. */
3383 cpi->mb.zbin_over_quant = 0;
3384 cpi->mb.zbin_mode_boost = 0;
3385
3386 /* Enable or disable mode based tweaking of the zbin
3387 * For 2 Pass Only used where GF/ARF prediction quality
3388 * is above a threshold
3389 */
3390 cpi->mb.zbin_mode_boost_enabled = 1;
3391 if (cpi->pass == 2)
3392 {
3393 if ( cpi->gfu_boost <= 400 )
3394 {
3395 cpi->mb.zbin_mode_boost_enabled = 0;
3396 }
3397 }
3398
3399 /* Current default encoder behaviour for the altref sign bias */
3400 if (cpi->source_alt_ref_active)
3401 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3402 else
3403 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3404
3405 /* Check to see if a key frame is signaled
3406 * For two pass with auto key frame enabled cm->frame_type may already
3407 * be set, but not for one pass.
3408 */
3409 if ((cm->current_video_frame == 0) ||
3410 (cm->frame_flags & FRAMEFLAGS_KEY) ||
3411 (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
3412 {
3413 /* Key frame from VFW/auto-keyframe/first frame */
3414 cm->frame_type = KEY_FRAME;
3415 }
3416
3417 #if CONFIG_MULTI_RES_ENCODING
3418 /* In multi-resolution encoding, frame_type is decided by lowest-resolution
3419 * encoder. Same frame_type is adopted while encoding at other resolution.
3420 */
3421 if (cpi->oxcf.mr_encoder_id)
3422 {
3423 LOWER_RES_FRAME_INFO* low_res_frame_info
3424 = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info;
3425
3426 cm->frame_type = low_res_frame_info->frame_type;
3427
3428 if(cm->frame_type != KEY_FRAME)
3429 {
3430 cpi->mr_low_res_mv_avail = 1;
3431 cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);
3432
3433 if (cpi->ref_frame_flags & VP8_LAST_FRAME)
3434 cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[LAST_FRAME]
3435 == low_res_frame_info->low_res_ref_frames[LAST_FRAME]);
3436
3437 if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
3438 cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[GOLDEN_FRAME]
3439 == low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);
3440
3441 if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
3442 cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
3443 == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
3444 }
3445 }
3446 #endif
3447
3448 /* Set various flags etc to special state if it is a key frame */
3449 if (cm->frame_type == KEY_FRAME)
3450 {
3451 int i;
3452
3453 // Set the loop filter deltas and segmentation map update
3454 setup_features(cpi);
3455
3456 /* The alternate reference frame cannot be active for a key frame */
3457 cpi->source_alt_ref_active = 0;
3458
3459 /* Reset the RD threshold multipliers to default of * 1 (128) */
3460 for (i = 0; i < MAX_MODES; i++)
3461 {
3462 cpi->mb.rd_thresh_mult[i] = 128;
3463 }
3464 }
3465
3466 #if 0
3467 /* Experimental code for lagged compress and one pass
3468 * Initialise one_pass GF frames stats
3469 * Update stats used for GF selection
3470 */
3471 {
3472 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
3473
3474 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
3475 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
3476 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
3477 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
3478 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
3479 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
3480 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
3481 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
3482 cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
3483 }
3484 #endif
3485
3486 update_rd_ref_frame_probs(cpi);
3487
3488 if (cpi->drop_frames_allowed)
3489 {
3490 /* The reset to decimation 0 is only done here for one pass.
3491 * Once it is set two pass leaves decimation on till the next kf.
3492 */
3493 if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
3494 cpi->decimation_factor --;
3495
3496 if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
3497 cpi->decimation_factor = 1;
3498
3499 else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
3500 {
3501 cpi->decimation_factor = 3;
3502 }
3503 else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
3504 {
3505 cpi->decimation_factor = 2;
3506 }
3507 else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
3508 {
3509 cpi->decimation_factor = 1;
3510 }
3511 }
3512
3513 /* The following decimates the frame rate according to a regular
3514 * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
3515 * prevent buffer under-run in CBR mode. Alternatively it might be
3516 * desirable in some situations to drop frame rate but throw more bits
3517 * at each frame.
3518 *
3519 * Note that dropping a key frame can be problematic if spatial
3520 * resampling is also active
3521 */
3522 if (cpi->decimation_factor > 0)
3523 {
3524 switch (cpi->decimation_factor)
3525 {
3526 case 1:
3527 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
3528 break;
3529 case 2:
3530 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3531 break;
3532 case 3:
3533 cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
3534 break;
3535 }
3536
3537 /* Note that we should not throw out a key frame (especially when
3538 * spatial resampling is enabled).
3539 */
3540 if (cm->frame_type == KEY_FRAME)
3541 {
3542 cpi->decimation_count = cpi->decimation_factor;
3543 }
3544 else if (cpi->decimation_count > 0)
3545 {
3546 cpi->decimation_count --;
3547
3548 cpi->bits_off_target += cpi->av_per_frame_bandwidth;
3549 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
3550 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
3551
3552 #if CONFIG_MULTI_RES_ENCODING
3553 vp8_store_drop_frame_info(cpi);
3554 #endif
3555
3556 cm->current_video_frame++;
3557 cpi->frames_since_key++;
3558 // We advance the temporal pattern for dropped frames.
3559 cpi->temporal_pattern_counter++;
3560
3561 #if CONFIG_INTERNAL_STATS
3562 cpi->count ++;
3563 #endif
3564
3565 cpi->buffer_level = cpi->bits_off_target;
3566
3567 if (cpi->oxcf.number_of_layers > 1)
3568 {
3569 unsigned int i;
3570
3571 /* Propagate bits saved by dropping the frame to higher
3572 * layers
3573 */
3574 for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
3575 {
3576 LAYER_CONTEXT *lc = &cpi->layer_context[i];
3577 lc->bits_off_target += (int)(lc->target_bandwidth /
3578 lc->framerate);
3579 if (lc->bits_off_target > lc->maximum_buffer_size)
3580 lc->bits_off_target = lc->maximum_buffer_size;
3581 lc->buffer_level = lc->bits_off_target;
3582 }
3583 }
3584
3585 return;
3586 }
3587 else
3588 cpi->decimation_count = cpi->decimation_factor;
3589 }
3590 else
3591 cpi->decimation_count = 0;
3592
3593 /* Decide how big to make the frame */
3594 if (!vp8_pick_frame_size(cpi))
3595 {
3596 /*TODO: 2 drop_frame and return code could be put together. */
3597 #if CONFIG_MULTI_RES_ENCODING
3598 vp8_store_drop_frame_info(cpi);
3599 #endif
3600 cm->current_video_frame++;
3601 cpi->frames_since_key++;
3602 // We advance the temporal pattern for dropped frames.
3603 cpi->temporal_pattern_counter++;
3604 return;
3605 }
3606
3607 /* Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
3608 * This has a knock on effect on active best quality as well.
3609 * For CBR if the buffer reaches its maximum level then we can no longer
3610 * save up bits for later frames so we might as well use them up
3611 * on the current frame.
3612 */
3613 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
3614 (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
3615 {
3616 /* Max adjustment is 1/4 */
3617 int Adjustment = cpi->active_worst_quality / 4;
3618
3619 if (Adjustment)
3620 {
3621 int buff_lvl_step;
3622
3623 if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
3624 {
3625 buff_lvl_step = (int)
3626 ((cpi->oxcf.maximum_buffer_size -
3627 cpi->oxcf.optimal_buffer_level) /
3628 Adjustment);
3629
3630 if (buff_lvl_step)
3631 Adjustment = (int)
3632 ((cpi->buffer_level -
3633 cpi->oxcf.optimal_buffer_level) /
3634 buff_lvl_step);
3635 else
3636 Adjustment = 0;
3637 }
3638
3639 cpi->active_worst_quality -= Adjustment;
3640
3641 if(cpi->active_worst_quality < cpi->active_best_quality)
3642 cpi->active_worst_quality = cpi->active_best_quality;
3643 }
3644 }
3645
3646 /* Set an active best quality and if necessary active worst quality
3647 * There is some odd behavior for one pass here that needs attention.
3648 */
3649 if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
3650 {
3651 vp8_clear_system_state();
3652
3653 Q = cpi->active_worst_quality;
3654
3655 if ( cm->frame_type == KEY_FRAME )
3656 {
3657 if ( cpi->pass == 2 )
3658 {
3659 if (cpi->gfu_boost > 600)
3660 cpi->active_best_quality = kf_low_motion_minq[Q];
3661 else
3662 cpi->active_best_quality = kf_high_motion_minq[Q];
3663
3664 /* Special case for key frames forced because we have reached
3665 * the maximum key frame interval. Here force the Q to a range
3666 * based on the ambient Q to reduce the risk of popping
3667 */
3668 if ( cpi->this_key_frame_forced )
3669 {
3670 if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
3671 cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
3672 else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
3673 cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3674 }
3675 }
3676 /* One pass more conservative */
3677 else
3678 cpi->active_best_quality = kf_high_motion_minq[Q];
3679 }
3680
3681 else if (cpi->oxcf.number_of_layers==1 &&
3682 (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame))
3683 {
3684 /* Use the lower of cpi->active_worst_quality and recent
3685 * average Q as basis for GF/ARF Q limit unless last frame was
3686 * a key frame.
3687 */
3688 if ( (cpi->frames_since_key > 1) &&
3689 (cpi->avg_frame_qindex < cpi->active_worst_quality) )
3690 {
3691 Q = cpi->avg_frame_qindex;
3692 }
3693
3694 /* For constrained quality dont allow Q less than the cq level */
3695 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3696 (Q < cpi->cq_target_quality) )
3697 {
3698 Q = cpi->cq_target_quality;
3699 }
3700
3701 if ( cpi->pass == 2 )
3702 {
3703 if ( cpi->gfu_boost > 1000 )
3704 cpi->active_best_quality = gf_low_motion_minq[Q];
3705 else if ( cpi->gfu_boost < 400 )
3706 cpi->active_best_quality = gf_high_motion_minq[Q];
3707 else
3708 cpi->active_best_quality = gf_mid_motion_minq[Q];
3709
3710 /* Constrained quality use slightly lower active best. */
3711 if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
3712 {
3713 cpi->active_best_quality =
3714 cpi->active_best_quality * 15/16;
3715 }
3716 }
3717 /* One pass more conservative */
3718 else
3719 cpi->active_best_quality = gf_high_motion_minq[Q];
3720 }
3721 else
3722 {
3723 cpi->active_best_quality = inter_minq[Q];
3724
3725 /* For the constant/constrained quality mode we dont want
3726 * q to fall below the cq level.
3727 */
3728 if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
3729 (cpi->active_best_quality < cpi->cq_target_quality) )
3730 {
3731 /* If we are strongly undershooting the target rate in the last
3732 * frames then use the user passed in cq value not the auto
3733 * cq value.
3734 */
3735 if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
3736 cpi->active_best_quality = cpi->oxcf.cq_level;
3737 else
3738 cpi->active_best_quality = cpi->cq_target_quality;
3739 }
3740 }
3741
3742 /* If CBR and the buffer is as full then it is reasonable to allow
3743 * higher quality on the frames to prevent bits just going to waste.
3744 */
3745 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3746 {
3747 /* Note that the use of >= here elliminates the risk of a devide
3748 * by 0 error in the else if clause
3749 */
3750 if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
3751 cpi->active_best_quality = cpi->best_quality;
3752
3753 else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
3754 {
3755 int Fraction = (int)
3756 (((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128)
3757 / (cpi->oxcf.maximum_buffer_size -
3758 cpi->oxcf.optimal_buffer_level));
3759 int min_qadjustment = ((cpi->active_best_quality -
3760 cpi->best_quality) * Fraction) / 128;
3761
3762 cpi->active_best_quality -= min_qadjustment;
3763 }
3764 }
3765 }
3766 /* Make sure constrained quality mode limits are adhered to for the first
3767 * few frames of one pass encodes
3768 */
3769 else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
3770 {
3771 if ( (cm->frame_type == KEY_FRAME) ||
3772 cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
3773 {
3774 cpi->active_best_quality = cpi->best_quality;
3775 }
3776 else if (cpi->active_best_quality < cpi->cq_target_quality)
3777 {
3778 cpi->active_best_quality = cpi->cq_target_quality;
3779 }
3780 }
3781
3782 /* Clip the active best and worst quality values to limits */
3783 if (cpi->active_worst_quality > cpi->worst_quality)
3784 cpi->active_worst_quality = cpi->worst_quality;
3785
3786 if (cpi->active_best_quality < cpi->best_quality)
3787 cpi->active_best_quality = cpi->best_quality;
3788
3789 if ( cpi->active_worst_quality < cpi->active_best_quality )
3790 cpi->active_worst_quality = cpi->active_best_quality;
3791
3792 /* Determine initial Q to try */
3793 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3794
3795 #if !(CONFIG_REALTIME_ONLY)
3796
3797 /* Set highest allowed value for Zbin over quant */
3798 if (cm->frame_type == KEY_FRAME)
3799 zbin_oq_high = 0;
3800 else if ((cpi->oxcf.number_of_layers == 1) && ((cm->refresh_alt_ref_frame ||
3801 (cm->refresh_golden_frame && !cpi->source_alt_ref_active))))
3802 {
3803 zbin_oq_high = 16;
3804 }
3805 else
3806 zbin_oq_high = ZBIN_OQ_MAX;
3807 #endif
3808
3809 /* Setup background Q adjustment for error resilient mode.
3810 * For multi-layer encodes only enable this for the base layer.
3811 */
3812 if (cpi->cyclic_refresh_mode_enabled)
3813 {
3814 if (cpi->current_layer==0)
3815 cyclic_background_refresh(cpi, Q, 0);
3816 else
3817 disable_segmentation(cpi);
3818 }
3819
3820 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
3821
3822 #if !(CONFIG_REALTIME_ONLY)
3823 /* Limit Q range for the adaptive loop. */
3824 bottom_index = cpi->active_best_quality;
3825 top_index = cpi->active_worst_quality;
3826 q_low = cpi->active_best_quality;
3827 q_high = cpi->active_worst_quality;
3828 #endif
3829
3830 vp8_save_coding_context(cpi);
3831
3832 loop_count = 0;
3833
3834 scale_and_extend_source(cpi->un_scaled_source, cpi);
3835
3836 #if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
3837
3838 if (cpi->oxcf.noise_sensitivity > 0)
3839 {
3840 unsigned char *src;
3841 int l = 0;
3842
3843 switch (cpi->oxcf.noise_sensitivity)
3844 {
3845 case 1:
3846 l = 20;
3847 break;
3848 case 2:
3849 l = 40;
3850 break;
3851 case 3:
3852 l = 60;
3853 break;
3854 case 4:
3855 l = 80;
3856 break;
3857 case 5:
3858 l = 100;
3859 break;
3860 case 6:
3861 l = 150;
3862 break;
3863 }
3864
3865
3866 if (cm->frame_type == KEY_FRAME)
3867 {
3868 vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1, 0);
3869 }
3870 else
3871 {
3872 vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1, 0);
3873
3874 src = cpi->Source->y_buffer;
3875
3876 if (cpi->Source->y_stride < 0)
3877 {
3878 src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
3879 }
3880 }
3881 }
3882
3883 #endif
3884
3885 #ifdef OUTPUT_YUV_SRC
3886 vp8_write_yuv_frame(cpi->Source);
3887 #endif
3888
3889 do
3890 {
3891 vp8_clear_system_state();
3892
3893 vp8_set_quantizer(cpi, Q);
3894
3895 /* setup skip prob for costing in mode/mv decision */
3896 if (cpi->common.mb_no_coeff_skip)
3897 {
3898 cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
3899
3900 if (cm->frame_type != KEY_FRAME)
3901 {
3902 if (cpi->common.refresh_alt_ref_frame)
3903 {
3904 if (cpi->last_skip_false_probs[2] != 0)
3905 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3906
3907 /*
3908 if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
3909 cpi->prob_skip_false = cpi->last_skip_false_probs[2];
3910 else if (cpi->last_skip_false_probs[2]!=0)
3911 cpi->prob_skip_false = (cpi->last_skip_false_probs[2] + cpi->prob_skip_false ) / 2;
3912 */
3913 }
3914 else if (cpi->common.refresh_golden_frame)
3915 {
3916 if (cpi->last_skip_false_probs[1] != 0)
3917 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3918
3919 /*
3920 if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
3921 cpi->prob_skip_false = cpi->last_skip_false_probs[1];
3922 else if (cpi->last_skip_false_probs[1]!=0)
3923 cpi->prob_skip_false = (cpi->last_skip_false_probs[1] + cpi->prob_skip_false ) / 2;
3924 */
3925 }
3926 else
3927 {
3928 if (cpi->last_skip_false_probs[0] != 0)
3929 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3930
3931 /*
3932 if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
3933 cpi->prob_skip_false = cpi->last_skip_false_probs[0];
3934 else if(cpi->last_skip_false_probs[0]!=0)
3935 cpi->prob_skip_false = (cpi->last_skip_false_probs[0] + cpi->prob_skip_false ) / 2;
3936 */
3937 }
3938
3939 /* as this is for cost estimate, let's make sure it does not
3940 * go extreme eitehr way
3941 */
3942 if (cpi->prob_skip_false < 5)
3943 cpi->prob_skip_false = 5;
3944
3945 if (cpi->prob_skip_false > 250)
3946 cpi->prob_skip_false = 250;
3947
3948 if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref)
3949 cpi->prob_skip_false = 1;
3950 }
3951
3952 #if 0
3953
3954 if (cpi->pass != 1)
3955 {
3956 FILE *f = fopen("skip.stt", "a");
3957 fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
3958 fclose(f);
3959 }
3960
3961 #endif
3962
3963 }
3964
3965 if (cm->frame_type == KEY_FRAME)
3966 {
3967 if(resize_key_frame(cpi))
3968 {
3969 /* If the frame size has changed, need to reset Q, quantizer,
3970 * and background refresh.
3971 */
3972 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
3973 if (cpi->cyclic_refresh_mode_enabled)
3974 {
3975 if (cpi->current_layer==0)
3976 cyclic_background_refresh(cpi, Q, 0);
3977 else
3978 disable_segmentation(cpi);
3979 }
3980 vp8_set_quantizer(cpi, Q);
3981 }
3982
3983 vp8_setup_key_frame(cpi);
3984 }
3985
3986
3987
3988 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
3989 {
3990 if(cpi->oxcf.error_resilient_mode)
3991 cm->refresh_entropy_probs = 0;
3992
3993 if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
3994 {
3995 if (cm->frame_type == KEY_FRAME)
3996 cm->refresh_entropy_probs = 1;
3997 }
3998
3999 if (cm->refresh_entropy_probs == 0)
4000 {
4001 /* save a copy for later refresh */
4002 vpx_memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
4003 }
4004
4005 vp8_update_coef_context(cpi);
4006
4007 vp8_update_coef_probs(cpi);
4008
4009 /* transform / motion compensation build reconstruction frame
4010 * +pack coef partitions
4011 */
4012 vp8_encode_frame(cpi);
4013
4014 /* cpi->projected_frame_size is not needed for RT mode */
4015 }
4016 #else
4017 /* transform / motion compensation build reconstruction frame */
4018 vp8_encode_frame(cpi);
4019
4020 cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
4021 cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
4022 #endif
4023 vp8_clear_system_state();
4024
4025 /* Test to see if the stats generated for this frame indicate that
4026 * we should have coded a key frame (assuming that we didn't)!
4027 */
4028
4029 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME
4030 && cpi->compressor_speed != 2)
4031 {
4032 #if !(CONFIG_REALTIME_ONLY)
4033 if (decide_key_frame(cpi))
4034 {
4035 /* Reset all our sizing numbers and recode */
4036 cm->frame_type = KEY_FRAME;
4037
4038 vp8_pick_frame_size(cpi);
4039
4040 /* Clear the Alt reference frame active flag when we have
4041 * a key frame
4042 */
4043 cpi->source_alt_ref_active = 0;
4044
4045 // Set the loop filter deltas and segmentation map update
4046 setup_features(cpi);
4047
4048 vp8_restore_coding_context(cpi);
4049
4050 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4051
4052 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
4053
4054 /* Limit Q range for the adaptive loop. */
4055 bottom_index = cpi->active_best_quality;
4056 top_index = cpi->active_worst_quality;
4057 q_low = cpi->active_best_quality;
4058 q_high = cpi->active_worst_quality;
4059
4060 loop_count++;
4061 Loop = 1;
4062
4063 continue;
4064 }
4065 #endif
4066 }
4067
4068 vp8_clear_system_state();
4069
4070 if (frame_over_shoot_limit == 0)
4071 frame_over_shoot_limit = 1;
4072
4073 /* Are we are overshooting and up against the limit of active max Q. */
4074 if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
4075 (Q == cpi->active_worst_quality) &&
4076 (cpi->active_worst_quality < cpi->worst_quality) &&
4077 (cpi->projected_frame_size > frame_over_shoot_limit))
4078 {
4079 int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;
4080
4081 /* If so is there any scope for relaxing it */
4082 while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
4083 {
4084 cpi->active_worst_quality++;
4085 /* Assume 1 qstep = about 4% on frame size. */
4086 over_size_percent = (int)(over_size_percent * 0.96);
4087 }
4088 #if !(CONFIG_REALTIME_ONLY)
4089 top_index = cpi->active_worst_quality;
4090 #endif
4091 /* If we have updated the active max Q do not call
4092 * vp8_update_rate_correction_factors() this loop.
4093 */
4094 active_worst_qchanged = 1;
4095 }
4096 else
4097 active_worst_qchanged = 0;
4098
4099 #if !(CONFIG_REALTIME_ONLY)
4100 /* Special case handling for forced key frames */
4101 if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
4102 {
4103 int last_q = Q;
4104 int kf_err = vp8_calc_ss_err(cpi->Source,
4105 &cm->yv12_fb[cm->new_fb_idx]);
4106
4107 /* The key frame is not good enough */
4108 if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
4109 {
4110 /* Lower q_high */
4111 q_high = (Q > q_low) ? (Q - 1) : q_low;
4112
4113 /* Adjust Q */
4114 Q = (q_high + q_low) >> 1;
4115 }
4116 /* The key frame is much better than the previous frame */
4117 else if ( kf_err < (cpi->ambient_err >> 1) )
4118 {
4119 /* Raise q_low */
4120 q_low = (Q < q_high) ? (Q + 1) : q_high;
4121
4122 /* Adjust Q */
4123 Q = (q_high + q_low + 1) >> 1;
4124 }
4125
4126 /* Clamp Q to upper and lower limits: */
4127 if (Q > q_high)
4128 Q = q_high;
4129 else if (Q < q_low)
4130 Q = q_low;
4131
4132 Loop = Q != last_q;
4133 }
4134
4135 /* Is the projected frame size out of range and are we allowed
4136 * to attempt to recode.
4137 */
4138 else if ( recode_loop_test( cpi,
4139 frame_over_shoot_limit, frame_under_shoot_limit,
4140 Q, top_index, bottom_index ) )
4141 {
4142 int last_q = Q;
4143 int Retries = 0;
4144
4145 /* Frame size out of permitted range. Update correction factor
4146 * & compute new Q to try...
4147 */
4148
4149 /* Frame is too large */
4150 if (cpi->projected_frame_size > cpi->this_frame_target)
4151 {
4152 /* Raise Qlow as to at least the current value */
4153 q_low = (Q < q_high) ? (Q + 1) : q_high;
4154
4155 /* If we are using over quant do the same for zbin_oq_low */
4156 if (cpi->mb.zbin_over_quant > 0)
4157 zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
4158 (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
4159
4160 if (undershoot_seen)
4161 {
4162 /* Update rate_correction_factor unless
4163 * cpi->active_worst_quality has changed.
4164 */
4165 if (!active_worst_qchanged)
4166 vp8_update_rate_correction_factors(cpi, 1);
4167
4168 Q = (q_high + q_low + 1) / 2;
4169
4170 /* Adjust cpi->zbin_over_quant (only allowed when Q
4171 * is max)
4172 */
4173 if (Q < MAXQ)
4174 cpi->mb.zbin_over_quant = 0;
4175 else
4176 {
4177 zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
4178 (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
4179 cpi->mb.zbin_over_quant =
4180 (zbin_oq_high + zbin_oq_low) / 2;
4181 }
4182 }
4183 else
4184 {
4185 /* Update rate_correction_factor unless
4186 * cpi->active_worst_quality has changed.
4187 */
4188 if (!active_worst_qchanged)
4189 vp8_update_rate_correction_factors(cpi, 0);
4190
4191 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4192
4193 while (((Q < q_low) ||
4194 (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
4195 (Retries < 10))
4196 {
4197 vp8_update_rate_correction_factors(cpi, 0);
4198 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4199 Retries ++;
4200 }
4201 }
4202
4203 overshoot_seen = 1;
4204 }
4205 /* Frame is too small */
4206 else
4207 {
4208 if (cpi->mb.zbin_over_quant == 0)
4209 /* Lower q_high if not using over quant */
4210 q_high = (Q > q_low) ? (Q - 1) : q_low;
4211 else
4212 /* else lower zbin_oq_high */
4213 zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low) ?
4214 (cpi->mb.zbin_over_quant - 1) : zbin_oq_low;
4215
4216 if (overshoot_seen)
4217 {
4218 /* Update rate_correction_factor unless
4219 * cpi->active_worst_quality has changed.
4220 */
4221 if (!active_worst_qchanged)
4222 vp8_update_rate_correction_factors(cpi, 1);
4223
4224 Q = (q_high + q_low) / 2;
4225
4226 /* Adjust cpi->zbin_over_quant (only allowed when Q
4227 * is max)
4228 */
4229 if (Q < MAXQ)
4230 cpi->mb.zbin_over_quant = 0;
4231 else
4232 cpi->mb.zbin_over_quant =
4233 (zbin_oq_high + zbin_oq_low) / 2;
4234 }
4235 else
4236 {
4237 /* Update rate_correction_factor unless
4238 * cpi->active_worst_quality has changed.
4239 */
4240 if (!active_worst_qchanged)
4241 vp8_update_rate_correction_factors(cpi, 0);
4242
4243 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4244
4245 /* Special case reset for qlow for constrained quality.
4246 * This should only trigger where there is very substantial
4247 * undershoot on a frame and the auto cq level is above
4248 * the user passsed in value.
4249 */
4250 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4251 (Q < q_low) )
4252 {
4253 q_low = Q;
4254 }
4255
4256 while (((Q > q_high) ||
4257 (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
4258 (Retries < 10))
4259 {
4260 vp8_update_rate_correction_factors(cpi, 0);
4261 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4262 Retries ++;
4263 }
4264 }
4265
4266 undershoot_seen = 1;
4267 }
4268
4269 /* Clamp Q to upper and lower limits: */
4270 if (Q > q_high)
4271 Q = q_high;
4272 else if (Q < q_low)
4273 Q = q_low;
4274
4275 /* Clamp cpi->zbin_over_quant */
4276 cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low) ?
4277 zbin_oq_low : (cpi->mb.zbin_over_quant > zbin_oq_high) ?
4278 zbin_oq_high : cpi->mb.zbin_over_quant;
4279
4280 Loop = Q != last_q;
4281 }
4282 else
4283 #endif
4284 Loop = 0;
4285
4286 if (cpi->is_src_frame_alt_ref)
4287 Loop = 0;
4288
4289 if (Loop == 1)
4290 {
4291 vp8_restore_coding_context(cpi);
4292 loop_count++;
4293 #if CONFIG_INTERNAL_STATS
4294 cpi->tot_recode_hits++;
4295 #endif
4296 }
4297 }
4298 while (Loop == 1);
4299
4300 #if 0
4301 /* Experimental code for lagged and one pass
4302 * Update stats used for one pass GF selection
4303 */
4304 {
4305 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
4306 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
4307 cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
4308 }
4309 #endif
4310
4311 /* Special case code to reduce pulsing when key frames are forced at a
4312 * fixed interval. Note the reconstruction error if it is the frame before
4313 * the force key frame
4314 */
4315 if ( cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0) )
4316 {
4317 cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
4318 &cm->yv12_fb[cm->new_fb_idx]);
4319 }
4320
4321 /* This frame's MVs are saved and will be used in next frame's MV predictor.
4322 * Last frame has one more line(add to bottom) and one more column(add to
4323 * right) than cm->mip. The edge elements are initialized to 0.
4324 */
4325 #if CONFIG_MULTI_RES_ENCODING
4326 if(!cpi->oxcf.mr_encoder_id && cm->show_frame)
4327 #else
4328 if(cm->show_frame) /* do not save for altref frame */
4329 #endif
4330 {
4331 int mb_row;
4332 int mb_col;
4333 /* Point to beginning of allocated MODE_INFO arrays. */
4334 MODE_INFO *tmp = cm->mip;
4335
4336 if(cm->frame_type != KEY_FRAME)
4337 {
4338 for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
4339 {
4340 for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
4341 {
4342 if(tmp->mbmi.ref_frame != INTRA_FRAME)
4343 cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;
4344
4345 cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
4346 cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
4347 tmp++;
4348 }
4349 }
4350 }
4351 }
4352
4353 /* Count last ref frame 0,0 usage on current encoded frame. */
4354 {
4355 int mb_row;
4356 int mb_col;
4357 /* Point to beginning of MODE_INFO arrays. */
4358 MODE_INFO *tmp = cm->mi;
4359
4360 cpi->zeromv_count = 0;
4361
4362 if(cm->frame_type != KEY_FRAME)
4363 {
4364 for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
4365 {
4366 for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++)
4367 {
4368 if(tmp->mbmi.mode == ZEROMV)
4369 cpi->zeromv_count++;
4370 tmp++;
4371 }
4372 tmp++;
4373 }
4374 }
4375 }
4376
4377 #if CONFIG_MULTI_RES_ENCODING
4378 vp8_cal_dissimilarity(cpi);
4379 #endif
4380
4381 /* Update the GF useage maps.
4382 * This is done after completing the compression of a frame when all
4383 * modes etc. are finalized but before loop filter
4384 */
4385 if (cpi->oxcf.number_of_layers == 1)
4386 vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
4387
4388 if (cm->frame_type == KEY_FRAME)
4389 cm->refresh_last_frame = 1;
4390
4391 #if 0
4392 {
4393 FILE *f = fopen("gfactive.stt", "a");
4394 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);
4395 fclose(f);
4396 }
4397 #endif
4398
4399 /* For inter frames the current default behavior is that when
4400 * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
4401 * This is purely an encoder decision at present.
4402 */
4403 if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
4404 cm->copy_buffer_to_arf = 2;
4405 else
4406 cm->copy_buffer_to_arf = 0;
4407
4408 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
4409
4410 #if CONFIG_MULTITHREAD
4411 if (cpi->b_multi_threaded)
4412 {
4413 /* start loopfilter in separate thread */
4414 sem_post(&cpi->h_event_start_lpf);
4415 cpi->b_lpf_running = 1;
4416 }
4417 else
4418 #endif
4419 {
4420 vp8_loopfilter_frame(cpi, cm);
4421 }
4422
4423 update_reference_frames(cpi);
4424
4425 #if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
4426 if (cpi->oxcf.error_resilient_mode)
4427 {
4428 cm->refresh_entropy_probs = 0;
4429 }
4430 #endif
4431
4432 #if CONFIG_MULTITHREAD
4433 /* wait that filter_level is picked so that we can continue with stream packing */
4434 if (cpi->b_multi_threaded)
4435 sem_wait(&cpi->h_event_end_lpf);
4436 #endif
4437
4438 /* build the bitstream */
4439 vp8_pack_bitstream(cpi, dest, dest_end, size);
4440
4441 #if CONFIG_MULTITHREAD
4442 /* if PSNR packets are generated we have to wait for the lpf */
4443 if (cpi->b_lpf_running && cpi->b_calculate_psnr)
4444 {
4445 sem_wait(&cpi->h_event_end_lpf);
4446 cpi->b_lpf_running = 0;
4447 }
4448 #endif
4449
4450 /* Move storing frame_type out of the above loop since it is also
4451 * needed in motion search besides loopfilter */
4452 cm->last_frame_type = cm->frame_type;
4453
4454 /* Update rate control heuristics */
4455 cpi->total_byte_count += (*size);
4456 cpi->projected_frame_size = (*size) << 3;
4457
4458 if (cpi->oxcf.number_of_layers > 1)
4459 {
4460 unsigned int i;
4461 for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
4462 cpi->layer_context[i].total_byte_count += (*size);
4463 }
4464
4465 if (!active_worst_qchanged)
4466 vp8_update_rate_correction_factors(cpi, 2);
4467
4468 cpi->last_q[cm->frame_type] = cm->base_qindex;
4469
4470 if (cm->frame_type == KEY_FRAME)
4471 {
4472 vp8_adjust_key_frame_context(cpi);
4473 }
4474
4475 /* Keep a record of ambient average Q. */
4476 if (cm->frame_type != KEY_FRAME)
4477 cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
4478
4479 /* Keep a record from which we can calculate the average Q excluding
4480 * GF updates and key frames
4481 */
4482 if ((cm->frame_type != KEY_FRAME) && ((cpi->oxcf.number_of_layers > 1) ||
4483 (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)))
4484 {
4485 cpi->ni_frames++;
4486
4487 /* Calculate the average Q for normal inter frames (not key or GFU
4488 * frames).
4489 */
4490 if ( cpi->pass == 2 )
4491 {
4492 cpi->ni_tot_qi += Q;
4493 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4494 }
4495 else
4496 {
4497 /* Damp value for first few frames */
4498 if (cpi->ni_frames > 150 )
4499 {
4500 cpi->ni_tot_qi += Q;
4501 cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
4502 }
4503 /* For one pass, early in the clip ... average the current frame Q
4504 * value with the worstq entered by the user as a dampening measure
4505 */
4506 else
4507 {
4508 cpi->ni_tot_qi += Q;
4509 cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
4510 }
4511
4512 /* If the average Q is higher than what was used in the last
4513 * frame (after going through the recode loop to keep the frame
4514 * size within range) then use the last frame value - 1. The -1
4515 * is designed to stop Q and hence the data rate, from
4516 * progressively falling away during difficult sections, but at
4517 * the same time reduce the number of itterations around the
4518 * recode loop.
4519 */
4520 if (Q > cpi->ni_av_qi)
4521 cpi->ni_av_qi = Q - 1;
4522 }
4523 }
4524
4525 /* Update the buffer level variable. */
4526 /* Non-viewable frames are a special case and are treated as pure overhead. */
4527 if ( !cm->show_frame )
4528 cpi->bits_off_target -= cpi->projected_frame_size;
4529 else
4530 cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
4531
4532 /* Clip the buffer level to the maximum specified buffer size */
4533 if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
4534 cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
4535
4536 /* Rolling monitors of whether we are over or underspending used to
4537 * help regulate min and Max Q in two pass.
4538 */
4539 cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
4540 cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
4541 cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
4542 cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;
4543
4544 /* Actual bits spent */
4545 cpi->total_actual_bits += cpi->projected_frame_size;
4546
4547 /* Debug stats */
4548 cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);
4549
4550 cpi->buffer_level = cpi->bits_off_target;
4551
4552 /* Propagate values to higher temporal layers */
4553 if (cpi->oxcf.number_of_layers > 1)
4554 {
4555 unsigned int i;
4556
4557 for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
4558 {
4559 LAYER_CONTEXT *lc = &cpi->layer_context[i];
4560 int bits_off_for_this_layer =
4561 (int)(lc->target_bandwidth / lc->framerate -
4562 cpi->projected_frame_size);
4563
4564 lc->bits_off_target += bits_off_for_this_layer;
4565
4566 /* Clip buffer level to maximum buffer size for the layer */
4567 if (lc->bits_off_target > lc->maximum_buffer_size)
4568 lc->bits_off_target = lc->maximum_buffer_size;
4569
4570 lc->total_actual_bits += cpi->projected_frame_size;
4571 lc->total_target_vs_actual += bits_off_for_this_layer;
4572 lc->buffer_level = lc->bits_off_target;
4573 }
4574 }
4575
4576 /* Update bits left to the kf and gf groups to account for overshoot
4577 * or undershoot on these frames
4578 */
4579 if (cm->frame_type == KEY_FRAME)
4580 {
4581 cpi->twopass.kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4582
4583 if (cpi->twopass.kf_group_bits < 0)
4584 cpi->twopass.kf_group_bits = 0 ;
4585 }
4586 else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
4587 {
4588 cpi->twopass.gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
4589
4590 if (cpi->twopass.gf_group_bits < 0)
4591 cpi->twopass.gf_group_bits = 0 ;
4592 }
4593
4594 if (cm->frame_type != KEY_FRAME)
4595 {
4596 if (cpi->common.refresh_alt_ref_frame)
4597 {
4598 cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
4599 cpi->last_skip_probs_q[2] = cm->base_qindex;
4600 }
4601 else if (cpi->common.refresh_golden_frame)
4602 {
4603 cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
4604 cpi->last_skip_probs_q[1] = cm->base_qindex;
4605 }
4606 else
4607 {
4608 cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
4609 cpi->last_skip_probs_q[0] = cm->base_qindex;
4610
4611 /* update the baseline */
4612 cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
4613
4614 }
4615 }
4616
4617 #if 0 && CONFIG_INTERNAL_STATS
4618 {
4619 FILE *f = fopen("tmp.stt", "a");
4620
4621 vp8_clear_system_state();
4622
4623 if (cpi->twopass.total_left_stats.coded_error != 0.0)
4624 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %10d %6d %6d"
4625 "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f"
4626 "%10.3f %8d\n",
4627 cpi->common.current_video_frame, cpi->this_frame_target,
4628 cpi->projected_frame_size,
4629 (cpi->projected_frame_size - cpi->this_frame_target),
4630 (int)cpi->total_target_vs_actual,
4631 cpi->buffer_level,
4632 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4633 (int)cpi->total_actual_bits, cm->base_qindex,
4634 cpi->active_best_quality, cpi->active_worst_quality,
4635 cpi->ni_av_qi, cpi->cq_target_quality,
4636 cpi->zbin_over_quant,
4637 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4638 cm->frame_type, cpi->gfu_boost,
4639 cpi->twopass.est_max_qcorrection_factor,
4640 (int)cpi->twopass.bits_left,
4641 cpi->twopass.total_left_stats.coded_error,
4642 (double)cpi->twopass.bits_left /
4643 cpi->twopass.total_left_stats.coded_error,
4644 cpi->tot_recode_hits);
4645 else
4646 fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %10d %6d %6d"
4647 "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f"
4648 "%8d\n",
4649 cpi->common.current_video_frame,
4650 cpi->this_frame_target, cpi->projected_frame_size,
4651 (cpi->projected_frame_size - cpi->this_frame_target),
4652 (int)cpi->total_target_vs_actual,
4653 cpi->buffer_level,
4654 (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
4655 (int)cpi->total_actual_bits, cm->base_qindex,
4656 cpi->active_best_quality, cpi->active_worst_quality,
4657 cpi->ni_av_qi, cpi->cq_target_quality,
4658 cpi->zbin_over_quant,
4659 cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
4660 cm->frame_type, cpi->gfu_boost,
4661 cpi->twopass.est_max_qcorrection_factor,
4662 (int)cpi->twopass.bits_left,
4663 cpi->twopass.total_left_stats.coded_error,
4664 cpi->tot_recode_hits);
4665
4666 fclose(f);
4667
4668 {
4669 FILE *fmodes = fopen("Modes.stt", "a");
4670 int i;
4671
4672 fprintf(fmodes, "%6d:%1d:%1d:%1d ",
4673 cpi->common.current_video_frame,
4674 cm->frame_type, cm->refresh_golden_frame,
4675 cm->refresh_alt_ref_frame);
4676
4677 fprintf(fmodes, "\n");
4678
4679 fclose(fmodes);
4680 }
4681 }
4682
4683 #endif
4684
4685 if (cm->refresh_golden_frame == 1)
4686 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
4687 else
4688 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
4689
4690 if (cm->refresh_alt_ref_frame == 1)
4691 cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
4692 else
4693 cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
4694
4695
4696 if (cm->refresh_last_frame & cm->refresh_golden_frame)
4697 /* both refreshed */
4698 cpi->gold_is_last = 1;
4699 else if (cm->refresh_last_frame ^ cm->refresh_golden_frame)
4700 /* 1 refreshed but not the other */
4701 cpi->gold_is_last = 0;
4702
4703 if (cm->refresh_last_frame & cm->refresh_alt_ref_frame)
4704 /* both refreshed */
4705 cpi->alt_is_last = 1;
4706 else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame)
4707 /* 1 refreshed but not the other */
4708 cpi->alt_is_last = 0;
4709
4710 if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame)
4711 /* both refreshed */
4712 cpi->gold_is_alt = 1;
4713 else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame)
4714 /* 1 refreshed but not the other */
4715 cpi->gold_is_alt = 0;
4716
4717 cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
4718
4719 if (cpi->gold_is_last)
4720 cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;
4721
4722 if (cpi->alt_is_last)
4723 cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4724
4725 if (cpi->gold_is_alt)
4726 cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
4727
4728
4729 if (!cpi->oxcf.error_resilient_mode)
4730 {
4731 if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
4732 /* Update the alternate reference frame stats as appropriate. */
4733 update_alt_ref_frame_stats(cpi);
4734 else
4735 /* Update the Golden frame stats as appropriate. */
4736 update_golden_frame_stats(cpi);
4737 }
4738
4739 if (cm->frame_type == KEY_FRAME)
4740 {
4741 /* Tell the caller that the frame was coded as a key frame */
4742 *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
4743
4744 /* As this frame is a key frame the next defaults to an inter frame. */
4745 cm->frame_type = INTER_FRAME;
4746
4747 cpi->last_frame_percent_intra = 100;
4748 }
4749 else
4750 {
4751 *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
4752
4753 cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
4754 }
4755
4756 /* Clear the one shot update flags for segmentation map and mode/ref
4757 * loop filter deltas.
4758 */
4759 cpi->mb.e_mbd.update_mb_segmentation_map = 0;
4760 cpi->mb.e_mbd.update_mb_segmentation_data = 0;
4761 cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
4762
4763
4764 /* Dont increment frame counters if this was an altref buffer update
4765 * not a real frame
4766 */
4767 if (cm->show_frame)
4768 {
4769 cm->current_video_frame++;
4770 cpi->frames_since_key++;
4771 cpi->temporal_pattern_counter++;
4772 }
4773
4774 /* reset to normal state now that we are done. */
4775
4776
4777
4778 #if 0
4779 {
4780 char filename[512];
4781 FILE *recon_file;
4782 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
4783 recon_file = fopen(filename, "wb");
4784 fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
4785 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4786 fclose(recon_file);
4787 }
4788 #endif
4789
4790 /* DEBUG */
4791 /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
4792
4793
4794 }
4795 #if !(CONFIG_REALTIME_ONLY)
4796 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned char * dest_end, unsigned int *frame_flags)
4797 {
4798
4799 if (!cpi->common.refresh_alt_ref_frame)
4800 vp8_second_pass(cpi);
4801
4802 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
4803 cpi->twopass.bits_left -= 8 * *size;
4804
4805 if (!cpi->common.refresh_alt_ref_frame)
4806 {
4807 double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
4808 *cpi->oxcf.two_pass_vbrmin_section / 100);
4809 cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
4810 }
4811 }
4812 #endif
4813
4814 /* For ARM NEON, d8-d15 are callee-saved registers, and need to be saved. */
4815 #if HAVE_NEON
4816 extern void vp8_push_neon(int64_t *store);
4817 extern void vp8_pop_neon(int64_t *store);
4818 #endif
4819
4820
4821 int vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time)
4822 {
4823 #if HAVE_NEON
4824 int64_t store_reg[8];
4825 #if CONFIG_RUNTIME_CPU_DETECT
4826 VP8_COMMON *cm = &cpi->common;
4827 #endif
4828 #endif
4829 struct vpx_usec_timer timer;
4830 int res = 0;
4831
4832 #if HAVE_NEON
4833 #if CONFIG_RUNTIME_CPU_DETECT
4834 if (cm->cpu_caps & HAS_NEON)
4835 #endif
4836 {
4837 vp8_push_neon(store_reg);
4838 }
4839 #endif
4840
4841 vpx_usec_timer_start(&timer);
4842
4843 /* Reinit the lookahead buffer if the frame size changes */
4844 if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height)
4845 {
4846 assert(cpi->oxcf.lag_in_frames < 2);
4847 dealloc_raw_frame_buffers(cpi);
4848 alloc_raw_frame_buffers(cpi);
4849 }
4850
4851 if(vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
4852 frame_flags, cpi->active_map_enabled ? cpi->active_map : NULL))
4853 res = -1;
4854 vpx_usec_timer_mark(&timer);
4855 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
4856
4857 #if HAVE_NEON
4858 #if CONFIG_RUNTIME_CPU_DETECT
4859 if (cm->cpu_caps & HAS_NEON)
4860 #endif
4861 {
4862 vp8_pop_neon(store_reg);
4863 }
4864 #endif
4865
4866 return res;
4867 }
4868
4869
4870 static int frame_is_reference(const VP8_COMP *cpi)
4871 {
4872 const VP8_COMMON *cm = &cpi->common;
4873 const MACROBLOCKD *xd = &cpi->mb.e_mbd;
4874
4875 return cm->frame_type == KEY_FRAME || cm->refresh_last_frame
4876 || cm->refresh_golden_frame || cm->refresh_alt_ref_frame
4877 || cm->copy_buffer_to_gf || cm->copy_buffer_to_arf
4878 || cm->refresh_entropy_probs
4879 || xd->mode_ref_lf_delta_update
4880 || xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
4881 }
4882
4883
4884 int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, unsigned char *dest_end, int64_t *time_stamp, int64_t *time_end, int flush)
4885 {
4886 #if HAVE_NEON
4887 int64_t store_reg[8];
4888 #endif
4889 VP8_COMMON *cm;
4890 struct vpx_usec_timer tsctimer;
4891 struct vpx_usec_timer ticktimer;
4892 struct vpx_usec_timer cmptimer;
4893 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
4894
4895 if (!cpi)
4896 return -1;
4897
4898 cm = &cpi->common;
4899
4900 if (setjmp(cpi->common.error.jmp))
4901 {
4902 cpi->common.error.setjmp = 0;
4903 return VPX_CODEC_CORRUPT_FRAME;
4904 }
4905
4906 cpi->common.error.setjmp = 1;
4907
4908 #if HAVE_NEON
4909 #if CONFIG_RUNTIME_CPU_DETECT
4910 if (cm->cpu_caps & HAS_NEON)
4911 #endif
4912 {
4913 vp8_push_neon(store_reg);
4914 }
4915 #endif
4916
4917 vpx_usec_timer_start(&cmptimer);
4918
4919 cpi->source = NULL;
4920
4921 #if !(CONFIG_REALTIME_ONLY)
4922 /* Should we code an alternate reference frame */
4923 if (cpi->oxcf.error_resilient_mode == 0 &&
4924 cpi->oxcf.play_alternate &&
4925 cpi->source_alt_ref_pending)
4926 {
4927 if ((cpi->source = vp8_lookahead_peek(cpi->lookahead,
4928 cpi->frames_till_gf_update_due,
4929 PEEK_FORWARD)))
4930 {
4931 cpi->alt_ref_source = cpi->source;
4932 if (cpi->oxcf.arnr_max_frames > 0)
4933 {
4934 vp8_temporal_filter_prepare_c(cpi,
4935 cpi->frames_till_gf_update_due);
4936 force_src_buffer = &cpi->alt_ref_buffer;
4937 }
4938 cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
4939 cm->refresh_alt_ref_frame = 1;
4940 cm->refresh_golden_frame = 0;
4941 cm->refresh_last_frame = 0;
4942 cm->show_frame = 0;
4943 /* Clear Pending alt Ref flag. */
4944 cpi->source_alt_ref_pending = 0;
4945 cpi->is_src_frame_alt_ref = 0;
4946 }
4947 }
4948 #endif
4949
4950 if (!cpi->source)
4951 {
4952 /* Read last frame source if we are encoding first pass. */
4953 if (cpi->pass == 1 && cm->current_video_frame > 0)
4954 {
4955 if((cpi->last_source = vp8_lookahead_peek(cpi->lookahead, 1,
4956 PEEK_BACKWARD)) == NULL)
4957 return -1;
4958 }
4959
4960
4961 if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush)))
4962 {
4963 cm->show_frame = 1;
4964
4965 cpi->is_src_frame_alt_ref = cpi->alt_ref_source
4966 && (cpi->source == cpi->alt_ref_source);
4967
4968 if(cpi->is_src_frame_alt_ref)
4969 cpi->alt_ref_source = NULL;
4970 }
4971 }
4972
4973 if (cpi->source)
4974 {
4975 cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
4976 cpi->un_scaled_source = cpi->Source;
4977 *time_stamp = cpi->source->ts_start;
4978 *time_end = cpi->source->ts_end;
4979 *frame_flags = cpi->source->flags;
4980
4981 if (cpi->pass == 1 && cm->current_video_frame > 0)
4982 {
4983 cpi->last_frame_unscaled_source = &cpi->last_source->img;
4984 }
4985 }
4986 else
4987 {
4988 *size = 0;
4989 #if !(CONFIG_REALTIME_ONLY)
4990
4991 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done)
4992 {
4993 vp8_end_first_pass(cpi); /* get last stats packet */
4994 cpi->twopass.first_pass_done = 1;
4995 }
4996
4997 #endif
4998
4999 #if HAVE_NEON
5000 #if CONFIG_RUNTIME_CPU_DETECT
5001 if (cm->cpu_caps & HAS_NEON)
5002 #endif
5003 {
5004 vp8_pop_neon(store_reg);
5005 }
5006 #endif
5007 return -1;
5008 }
5009
5010 if (cpi->source->ts_start < cpi->first_time_stamp_ever)
5011 {
5012 cpi->first_time_stamp_ever = cpi->source->ts_start;
5013 cpi->last_end_time_stamp_seen = cpi->source->ts_start;
5014 }
5015
5016 /* adjust frame rates based on timestamps given */
5017 if (cm->show_frame)
5018 {
5019 int64_t this_duration;
5020 int step = 0;
5021
5022 if (cpi->source->ts_start == cpi->first_time_stamp_ever)
5023 {
5024 this_duration = cpi->source->ts_end - cpi->source->ts_start;
5025 step = 1;
5026 }
5027 else
5028 {
5029 int64_t last_duration;
5030
5031 this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
5032 last_duration = cpi->last_end_time_stamp_seen
5033 - cpi->last_time_stamp_seen;
5034 /* do a step update if the duration changes by 10% */
5035 if (last_duration)
5036 step = (int)(((this_duration - last_duration) *
5037 10 / last_duration));
5038 }
5039
5040 if (this_duration)
5041 {
5042 if (step)
5043 cpi->ref_framerate = 10000000.0 / this_duration;
5044 else
5045 {
5046 double avg_duration, interval;
5047
5048 /* Average this frame's rate into the last second's average
5049 * frame rate. If we haven't seen 1 second yet, then average
5050 * over the whole interval seen.
5051 */
5052 interval = (double)(cpi->source->ts_end -
5053 cpi->first_time_stamp_ever);
5054 if(interval > 10000000.0)
5055 interval = 10000000;
5056
5057 avg_duration = 10000000.0 / cpi->ref_framerate;
5058 avg_duration *= (interval - avg_duration + this_duration);
5059 avg_duration /= interval;
5060
5061 cpi->ref_framerate = 10000000.0 / avg_duration;
5062 }
5063
5064 if (cpi->oxcf.number_of_layers > 1)
5065 {
5066 unsigned int i;
5067
5068 /* Update frame rates for each layer */
5069 for (i=0; i<cpi->oxcf.number_of_layers; i++)
5070 {
5071 LAYER_CONTEXT *lc = &cpi->layer_context[i];
5072 lc->framerate = cpi->ref_framerate /
5073 cpi->oxcf.rate_decimator[i];
5074 }
5075 }
5076 else
5077 vp8_new_framerate(cpi, cpi->ref_framerate);
5078 }
5079
5080 cpi->last_time_stamp_seen = cpi->source->ts_start;
5081 cpi->last_end_time_stamp_seen = cpi->source->ts_end;
5082 }
5083
5084 if (cpi->oxcf.number_of_layers > 1)
5085 {
5086 int layer;
5087
5088 update_layer_contexts (cpi);
5089
5090 /* Restore layer specific context & set frame rate */
5091 layer = cpi->oxcf.layer_id[
5092 cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
5093 restore_layer_context (cpi, layer);
5094 vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
5095 }
5096
5097 if (cpi->compressor_speed == 2)
5098 {
5099 vpx_usec_timer_start(&tsctimer);
5100 vpx_usec_timer_start(&ticktimer);
5101 }
5102
5103 cpi->lf_zeromv_pct = (cpi->zeromv_count * 100)/cm->MBs;
5104
5105 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
5106 {
5107 int i;
5108 const int num_part = (1 << cm->multi_token_partition);
5109 /* the available bytes in dest */
5110 const unsigned long dest_size = dest_end - dest;
5111 const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
5112
5113 unsigned char *dp = dest;
5114
5115 cpi->partition_d[0] = dp;
5116 dp += dest_size/10; /* reserve 1/10 for control partition */
5117 cpi->partition_d_end[0] = dp;
5118
5119 for(i = 0; i < num_part; i++)
5120 {
5121 cpi->partition_d[i + 1] = dp;
5122 dp += tok_part_buff_size;
5123 cpi->partition_d_end[i + 1] = dp;
5124 }
5125 }
5126 #endif
5127
5128 /* start with a 0 size frame */
5129 *size = 0;
5130
5131 /* Clear down mmx registers */
5132 vp8_clear_system_state();
5133
5134 cm->frame_type = INTER_FRAME;
5135 cm->frame_flags = *frame_flags;
5136
5137 #if 0
5138
5139 if (cm->refresh_alt_ref_frame)
5140 {
5141 cm->refresh_golden_frame = 0;
5142 cm->refresh_last_frame = 0;
5143 }
5144 else
5145 {
5146 cm->refresh_golden_frame = 0;
5147 cm->refresh_last_frame = 1;
5148 }
5149
5150 #endif
5151 /* find a free buffer for the new frame */
5152 {
5153 int i = 0;
5154 for(; i < NUM_YV12_BUFFERS; i++)
5155 {
5156 if(!cm->yv12_fb[i].flags)
5157 {
5158 cm->new_fb_idx = i;
5159 break;
5160 }
5161 }
5162
5163 assert(i < NUM_YV12_BUFFERS );
5164 }
5165 #if !(CONFIG_REALTIME_ONLY)
5166
5167 if (cpi->pass == 1)
5168 {
5169 Pass1Encode(cpi, size, dest, frame_flags);
5170 }
5171 else if (cpi->pass == 2)
5172 {
5173 Pass2Encode(cpi, size, dest, dest_end, frame_flags);
5174 }
5175 else
5176 #endif
5177 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
5178
5179 if (cpi->compressor_speed == 2)
5180 {
5181 unsigned int duration, duration2;
5182 vpx_usec_timer_mark(&tsctimer);
5183 vpx_usec_timer_mark(&ticktimer);
5184
5185 duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
5186 duration2 = (unsigned int)((double)duration / 2);
5187
5188 if (cm->frame_type != KEY_FRAME)
5189 {
5190 if (cpi->avg_encode_time == 0)
5191 cpi->avg_encode_time = duration;
5192 else
5193 cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
5194 }
5195
5196 if (duration2)
5197 {
5198 {
5199
5200 if (cpi->avg_pick_mode_time == 0)
5201 cpi->avg_pick_mode_time = duration2;
5202 else
5203 cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
5204 }
5205 }
5206
5207 }
5208
5209 if (cm->refresh_entropy_probs == 0)
5210 {
5211 vpx_memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
5212 }
5213
5214 /* Save the contexts separately for alt ref, gold and last. */
5215 /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
5216 if(cm->refresh_alt_ref_frame)
5217 vpx_memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
5218
5219 if(cm->refresh_golden_frame)
5220 vpx_memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
5221
5222 if(cm->refresh_last_frame)
5223 vpx_memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
5224
5225 /* if its a dropped frame honor the requests on subsequent frames */
5226 if (*size > 0)
5227 {
5228 cpi->droppable = !frame_is_reference(cpi);
5229
5230 /* return to normal state */
5231 cm->refresh_entropy_probs = 1;
5232 cm->refresh_alt_ref_frame = 0;
5233 cm->refresh_golden_frame = 0;
5234 cm->refresh_last_frame = 1;
5235 cm->frame_type = INTER_FRAME;
5236
5237 }
5238
5239 /* Save layer specific state */
5240 if (cpi->oxcf.number_of_layers > 1)
5241 save_layer_context (cpi);
5242
5243 vpx_usec_timer_mark(&cmptimer);
5244 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
5245
5246 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
5247 {
5248 generate_psnr_packet(cpi);
5249 }
5250
5251 #if CONFIG_INTERNAL_STATS
5252
5253 if (cpi->pass != 1)
5254 {
5255 cpi->bytes += *size;
5256
5257 if (cm->show_frame)
5258 {
5259 cpi->common.show_frame_mi = cpi->common.mi;
5260 cpi->count ++;
5261
5262 if (cpi->b_calculate_psnr)
5263 {
5264 uint64_t ye,ue,ve;
5265 double frame_psnr;
5266 YV12_BUFFER_CONFIG *orig = cpi->Source;
5267 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
5268 int y_samples = orig->y_height * orig->y_width ;
5269 int uv_samples = orig->uv_height * orig->uv_width ;
5270 int t_samples = y_samples + 2 * uv_samples;
5271 double sq_error, sq_error2;
5272
5273 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
5274 recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height);
5275
5276 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
5277 recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);
5278
5279 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
5280 recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height);
5281
5282 sq_error = (double)(ye + ue + ve);
5283
5284 frame_psnr = vp8_mse2psnr(t_samples, 255.0, sq_error);
5285
5286 cpi->total_y += vp8_mse2psnr(y_samples, 255.0, (double)ye);
5287 cpi->total_u += vp8_mse2psnr(uv_samples, 255.0, (double)ue);
5288 cpi->total_v += vp8_mse2psnr(uv_samples, 255.0, (double)ve);
5289 cpi->total_sq_error += sq_error;
5290 cpi->total += frame_psnr;
5291 #if CONFIG_POSTPROC
5292 {
5293 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
5294 double frame_psnr2, frame_ssim2 = 0;
5295 double weight = 0;
5296
5297 vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0);
5298 vp8_clear_system_state();
5299
5300 ye = calc_plane_error(orig->y_buffer, orig->y_stride,
5301 pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height);
5302
5303 ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
5304 pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);
5305
5306 ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
5307 pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height);
5308
5309 sq_error2 = (double)(ye + ue + ve);
5310
5311 frame_psnr2 = vp8_mse2psnr(t_samples, 255.0, sq_error2);
5312
5313 cpi->totalp_y += vp8_mse2psnr(y_samples,
5314 255.0, (double)ye);
5315 cpi->totalp_u += vp8_mse2psnr(uv_samples,
5316 255.0, (double)ue);
5317 cpi->totalp_v += vp8_mse2psnr(uv_samples,
5318 255.0, (double)ve);
5319 cpi->total_sq_error2 += sq_error2;
5320 cpi->totalp += frame_psnr2;
5321
5322 frame_ssim2 = vp8_calc_ssim(cpi->Source,
5323 &cm->post_proc_buffer, 1, &weight);
5324
5325 cpi->summed_quality += frame_ssim2 * weight;
5326 cpi->summed_weights += weight;
5327
5328 if (cpi->oxcf.number_of_layers > 1)
5329 {
5330 unsigned int i;
5331
5332 for (i=cpi->current_layer;
5333 i<cpi->oxcf.number_of_layers; i++)
5334 {
5335 cpi->frames_in_layer[i]++;
5336
5337 cpi->bytes_in_layer[i] += *size;
5338 cpi->sum_psnr[i] += frame_psnr;
5339 cpi->sum_psnr_p[i] += frame_psnr2;
5340 cpi->total_error2[i] += sq_error;
5341 cpi->total_error2_p[i] += sq_error2;
5342 cpi->sum_ssim[i] += frame_ssim2 * weight;
5343 cpi->sum_weights[i] += weight;
5344 }
5345 }
5346 }
5347 #endif
5348 }
5349
5350 if (cpi->b_calculate_ssimg)
5351 {
5352 double y, u, v, frame_all;
5353 frame_all = vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
5354 &y, &u, &v);
5355
5356 if (cpi->oxcf.number_of_layers > 1)
5357 {
5358 unsigned int i;
5359
5360 for (i=cpi->current_layer;
5361 i<cpi->oxcf.number_of_layers; i++)
5362 {
5363 if (!cpi->b_calculate_psnr)
5364 cpi->frames_in_layer[i]++;
5365
5366 cpi->total_ssimg_y_in_layer[i] += y;
5367 cpi->total_ssimg_u_in_layer[i] += u;
5368 cpi->total_ssimg_v_in_layer[i] += v;
5369 cpi->total_ssimg_all_in_layer[i] += frame_all;
5370 }
5371 }
5372 else
5373 {
5374 cpi->total_ssimg_y += y;
5375 cpi->total_ssimg_u += u;
5376 cpi->total_ssimg_v += v;
5377 cpi->total_ssimg_all += frame_all;
5378 }
5379 }
5380
5381 }
5382 }
5383
5384 #if 0
5385
5386 if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
5387 {
5388 skiptruecount += cpi->skip_true_count;
5389 skipfalsecount += cpi->skip_false_count;
5390 }
5391
5392 #endif
5393 #if 0
5394
5395 if (cpi->pass != 1)
5396 {
5397 FILE *f = fopen("skip.stt", "a");
5398 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);
5399
5400 if (cpi->is_src_frame_alt_ref == 1)
5401 fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
5402
5403 fclose(f);
5404 }
5405
5406 #endif
5407 #endif
5408
5409 #if HAVE_NEON
5410 #if CONFIG_RUNTIME_CPU_DETECT
5411 if (cm->cpu_caps & HAS_NEON)
5412 #endif
5413 {
5414 vp8_pop_neon(store_reg);
5415 }
5416 #endif
5417
5418 cpi->common.error.setjmp = 0;
5419
5420 return 0;
5421 }
5422
5423 int vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
5424 {
5425 if (cpi->common.refresh_alt_ref_frame)
5426 return -1;
5427 else
5428 {
5429 int ret;
5430
5431 #if CONFIG_MULTITHREAD
5432 if(cpi->b_lpf_running)
5433 {
5434 sem_wait(&cpi->h_event_end_lpf);
5435 cpi->b_lpf_running = 0;
5436 }
5437 #endif
5438
5439 #if CONFIG_POSTPROC
5440 cpi->common.show_frame_mi = cpi->common.mi;
5441 ret = vp8_post_proc_frame(&cpi->common, dest, flags);
5442 #else
5443
5444 if (cpi->common.frame_to_show)
5445 {
5446 *dest = *cpi->common.frame_to_show;
5447 dest->y_width = cpi->common.Width;
5448 dest->y_height = cpi->common.Height;
5449 dest->uv_height = cpi->common.Height / 2;
5450 ret = 0;
5451 }
5452 else
5453 {
5454 ret = -1;
5455 }
5456
5457 #endif
5458 vp8_clear_system_state();
5459 return ret;
5460 }
5461 }
5462
5463 int vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4])
5464 {
5465 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
5466 int internal_delta_q[MAX_MB_SEGMENTS];
5467 const int range = 63;
5468 int i;
5469
5470 // This method is currently incompatible with the cyclic refresh method
5471 if ( cpi->cyclic_refresh_mode_enabled )
5472 return -1;
5473
5474 // Check number of rows and columns match
5475 if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
5476 return -1;
5477
5478 // Range check the delta Q values and convert the external Q range values
5479 // to internal ones.
5480 if ( (abs(delta_q[0]) > range) || (abs(delta_q[1]) > range) ||
5481 (abs(delta_q[2]) > range) || (abs(delta_q[3]) > range) )
5482 return -1;
5483
5484 // Range check the delta lf values
5485 if ( (abs(delta_lf[0]) > range) || (abs(delta_lf[1]) > range) ||
5486 (abs(delta_lf[2]) > range) || (abs(delta_lf[3]) > range) )
5487 return -1;
5488
5489 if (!map)
5490 {
5491 disable_segmentation(cpi);
5492 return 0;
5493 }
5494
5495 // Translate the external delta q values to internal values.
5496 for ( i = 0; i < MAX_MB_SEGMENTS; i++ )
5497 internal_delta_q[i] =
5498 ( delta_q[i] >= 0 ) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];
5499
5500 /* Set the segmentation Map */
5501 set_segmentation_map(cpi, map);
5502
5503 /* Activate segmentation. */
5504 enable_segmentation(cpi);
5505
5506 /* Set up the quant segment data */
5507 feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
5508 feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
5509 feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
5510 feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];
5511
5512 /* Set up the loop segment data s */
5513 feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
5514 feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
5515 feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
5516 feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
5517
5518 cpi->segment_encode_breakout[0] = threshold[0];
5519 cpi->segment_encode_breakout[1] = threshold[1];
5520 cpi->segment_encode_breakout[2] = threshold[2];
5521 cpi->segment_encode_breakout[3] = threshold[3];
5522
5523 /* Initialise the feature data structure */
5524 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
5525
5526 return 0;
5527 }
5528
5529 int vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols)
5530 {
5531 if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols)
5532 {
5533 if (map)
5534 {
5535 vpx_memcpy(cpi->active_map, map, rows * cols);
5536 cpi->active_map_enabled = 1;
5537 }
5538 else
5539 cpi->active_map_enabled = 0;
5540
5541 return 0;
5542 }
5543 else
5544 {
5545 return -1 ;
5546 }
5547 }
5548
5549 int vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
5550 {
5551 if (horiz_mode <= ONETWO)
5552 cpi->common.horiz_scale = horiz_mode;
5553 else
5554 return -1;
5555
5556 if (vert_mode <= ONETWO)
5557 cpi->common.vert_scale = vert_mode;
5558 else
5559 return -1;
5560
5561 return 0;
5562 }
5563
5564
5565
5566 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest)
5567 {
5568 int i, j;
5569 int Total = 0;
5570
5571 unsigned char *src = source->y_buffer;
5572 unsigned char *dst = dest->y_buffer;
5573
5574 /* Loop through the Y plane raw and reconstruction data summing
5575 * (square differences)
5576 */
5577 for (i = 0; i < source->y_height; i += 16)
5578 {
5579 for (j = 0; j < source->y_width; j += 16)
5580 {
5581 unsigned int sse;
5582 Total += vp8_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
5583 }
5584
5585 src += 16 * source->y_stride;
5586 dst += 16 * dest->y_stride;
5587 }
5588
5589 return Total;
5590 }
5591
5592
5593 int vp8_get_quantizer(VP8_COMP *cpi)
5594 {
5595 return cpi->common.base_qindex;
5596 }

mercurial