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 #include <math.h>
12 #include <stdio.h>
13 #include <limits.h>
14
15 #include "./vpx_config.h"
16 #include "./vpx_scale_rtcd.h"
17 #include "vpx/internal/vpx_psnr.h"
18 #include "vpx_ports/vpx_timer.h"
19
20 #include "vp9/common/vp9_alloccommon.h"
21 #include "vp9/common/vp9_filter.h"
22 #include "vp9/common/vp9_idct.h"
23 #if CONFIG_VP9_POSTPROC
24 #include "vp9/common/vp9_postproc.h"
25 #endif
26 #include "vp9/common/vp9_reconinter.h"
27 #include "vp9/common/vp9_systemdependent.h"
28 #include "vp9/common/vp9_tile_common.h"
29
30 #include "vp9/encoder/vp9_aq_complexity.h"
31 #include "vp9/encoder/vp9_aq_cyclicrefresh.h"
32 #include "vp9/encoder/vp9_aq_variance.h"
33 #include "vp9/encoder/vp9_bitstream.h"
34 #include "vp9/encoder/vp9_encodeframe.h"
35 #include "vp9/encoder/vp9_encodemv.h"
36 #include "vp9/encoder/vp9_firstpass.h"
37 #include "vp9/encoder/vp9_mbgraph.h"
38 #include "vp9/encoder/vp9_onyx_int.h"
39 #include "vp9/encoder/vp9_picklpf.h"
40 #include "vp9/encoder/vp9_ratectrl.h"
41 #include "vp9/encoder/vp9_rdopt.h"
42 #include "vp9/encoder/vp9_segmentation.h"
43 #include "vp9/encoder/vp9_speed_features.h"
44 #include "vp9/encoder/vp9_temporal_filter.h"
45 #include "vp9/encoder/vp9_resize.h"
46 #include "vp9/encoder/vp9_svc_layercontext.h"
47
48 void vp9_coef_tree_initialize();
49
50 #define DEFAULT_INTERP_FILTER SWITCHABLE
51
52 #define SHARP_FILTER_QTHRESH 0 /* Q threshold for 8-tap sharp filter */
53
54 #define ALTREF_HIGH_PRECISION_MV 1 // Whether to use high precision mv
55 // for altref computation.
56 #define HIGH_PRECISION_MV_QTHRESH 200 // Q threshold for high precision
57 // mv. Choose a very high value for
58 // now so that HIGH_PRECISION is always
59 // chosen.
60
61 // Max rate target for 1080P and below encodes under normal circumstances
62 // (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB
63 #define MAX_MB_RATE 250
64 #define MAXRATE_1080P 2025000
65
66 #if CONFIG_INTERNAL_STATS
67 extern double vp9_calc_ssim(YV12_BUFFER_CONFIG *source,
68 YV12_BUFFER_CONFIG *dest, int lumamask,
69 double *weight);
70
71
72 extern double vp9_calc_ssimg(YV12_BUFFER_CONFIG *source,
73 YV12_BUFFER_CONFIG *dest, double *ssim_y,
74 double *ssim_u, double *ssim_v);
75
76
77 #endif
78
79 // #define OUTPUT_YUV_REC
80
81 #ifdef OUTPUT_YUV_SRC
82 FILE *yuv_file;
83 #endif
84 #ifdef OUTPUT_YUV_REC
85 FILE *yuv_rec_file;
86 #endif
87
88 #if 0
89 FILE *framepsnr;
90 FILE *kf_list;
91 FILE *keyfile;
92 #endif
93
94 void vp9_init_quantizer(VP9_COMP *cpi);
95
Scale2Ratio(VPX_SCALING mode,int * hr,int * hs)96 static INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) {
97 switch (mode) {
98 case NORMAL:
99 *hr = 1;
100 *hs = 1;
101 break;
102 case FOURFIVE:
103 *hr = 4;
104 *hs = 5;
105 break;
106 case THREEFIVE:
107 *hr = 3;
108 *hs = 5;
109 break;
110 case ONETWO:
111 *hr = 1;
112 *hs = 2;
113 break;
114 default:
115 *hr = 1;
116 *hs = 1;
117 assert(0);
118 break;
119 }
120 }
121
set_high_precision_mv(VP9_COMP * cpi,int allow_high_precision_mv)122 static void set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
123 MACROBLOCK *const mb = &cpi->mb;
124 cpi->common.allow_high_precision_mv = allow_high_precision_mv;
125 if (cpi->common.allow_high_precision_mv) {
126 mb->mvcost = mb->nmvcost_hp;
127 mb->mvsadcost = mb->nmvsadcost_hp;
128 } else {
129 mb->mvcost = mb->nmvcost;
130 mb->mvsadcost = mb->nmvsadcost;
131 }
132 }
133
setup_key_frame(VP9_COMP * cpi)134 static void setup_key_frame(VP9_COMP *cpi) {
135 vp9_setup_past_independence(&cpi->common);
136
137 // All buffers are implicitly updated on key frames.
138 cpi->refresh_golden_frame = 1;
139 cpi->refresh_alt_ref_frame = 1;
140 }
141
setup_inter_frame(VP9_COMMON * cm)142 static void setup_inter_frame(VP9_COMMON *cm) {
143 if (cm->error_resilient_mode || cm->intra_only)
144 vp9_setup_past_independence(cm);
145
146 assert(cm->frame_context_idx < FRAME_CONTEXTS);
147 cm->fc = cm->frame_contexts[cm->frame_context_idx];
148 }
149
vp9_initialize_enc()150 void vp9_initialize_enc() {
151 static int init_done = 0;
152
153 if (!init_done) {
154 vp9_init_neighbors();
155 vp9_init_quant_tables();
156
157 vp9_coef_tree_initialize();
158 vp9_tokenize_initialize();
159 vp9_init_me_luts();
160 vp9_rc_init_minq_luts();
161 vp9_entropy_mv_init();
162 vp9_entropy_mode_init();
163 init_done = 1;
164 }
165 }
166
dealloc_compressor_data(VP9_COMP * cpi)167 static void dealloc_compressor_data(VP9_COMP *cpi) {
168 VP9_COMMON *const cm = &cpi->common;
169 int i;
170
171 // Delete sementation map
172 vpx_free(cpi->segmentation_map);
173 cpi->segmentation_map = NULL;
174 vpx_free(cm->last_frame_seg_map);
175 cm->last_frame_seg_map = NULL;
176 vpx_free(cpi->coding_context.last_frame_seg_map_copy);
177 cpi->coding_context.last_frame_seg_map_copy = NULL;
178
179 vpx_free(cpi->complexity_map);
180 cpi->complexity_map = NULL;
181
182 vp9_cyclic_refresh_free(cpi->cyclic_refresh);
183 cpi->cyclic_refresh = NULL;
184
185 vpx_free(cpi->active_map);
186 cpi->active_map = NULL;
187
188 vp9_free_frame_buffers(cm);
189
190 vp9_free_frame_buffer(&cpi->last_frame_uf);
191 vp9_free_frame_buffer(&cpi->scaled_source);
192 vp9_free_frame_buffer(&cpi->scaled_last_source);
193 vp9_free_frame_buffer(&cpi->alt_ref_buffer);
194 vp9_lookahead_destroy(cpi->lookahead);
195
196 vpx_free(cpi->tok);
197 cpi->tok = 0;
198
199 // Activity mask based per mb zbin adjustments
200 vpx_free(cpi->mb_activity_map);
201 cpi->mb_activity_map = 0;
202 vpx_free(cpi->mb_norm_activity_map);
203 cpi->mb_norm_activity_map = 0;
204
205 for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
206 LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i];
207 vpx_free(lc->rc_twopass_stats_in.buf);
208 lc->rc_twopass_stats_in.buf = NULL;
209 lc->rc_twopass_stats_in.sz = 0;
210 }
211 }
212
213 // Computes a q delta (in "q index" terms) to get from a starting q value
214 // to a target q value
vp9_compute_qdelta(const VP9_COMP * cpi,double qstart,double qtarget)215 int vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget) {
216 const RATE_CONTROL *const rc = &cpi->rc;
217 int start_index = rc->worst_quality;
218 int target_index = rc->worst_quality;
219 int i;
220
221 // Convert the average q value to an index.
222 for (i = rc->best_quality; i < rc->worst_quality; ++i) {
223 start_index = i;
224 if (vp9_convert_qindex_to_q(i) >= qstart)
225 break;
226 }
227
228 // Convert the q target to an index
229 for (i = rc->best_quality; i < rc->worst_quality; ++i) {
230 target_index = i;
231 if (vp9_convert_qindex_to_q(i) >= qtarget)
232 break;
233 }
234
235 return target_index - start_index;
236 }
237
238 // Computes a q delta (in "q index" terms) to get from a starting q value
239 // to a value that should equate to the given rate ratio.
vp9_compute_qdelta_by_rate(VP9_COMP * cpi,int qindex,double rate_target_ratio)240 int vp9_compute_qdelta_by_rate(VP9_COMP *cpi, int qindex,
241 double rate_target_ratio) {
242 const FRAME_TYPE frame_type = cpi->common.frame_type;
243 const RATE_CONTROL *const rc = &cpi->rc;
244 int target_index = rc->worst_quality;
245 int i;
246
247 // Look up the current projected bits per block for the base index
248 const int base_bits_per_mb = vp9_rc_bits_per_mb(frame_type, qindex, 1.0);
249
250 // Find the target bits per mb based on the base value and given ratio.
251 const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb);
252
253 // Convert the q target to an index
254 for (i = rc->best_quality; i < rc->worst_quality; ++i) {
255 target_index = i;
256 if (vp9_rc_bits_per_mb(frame_type, i, 1.0) <= target_bits_per_mb )
257 break;
258 }
259
260 return target_index - qindex;
261 }
262
configure_static_seg_features(VP9_COMP * cpi)263 static void configure_static_seg_features(VP9_COMP *cpi) {
264 VP9_COMMON *const cm = &cpi->common;
265 const RATE_CONTROL *const rc = &cpi->rc;
266 struct segmentation *const seg = &cm->seg;
267
268 int high_q = (int)(rc->avg_q > 48.0);
269 int qi_delta;
270
271 // Disable and clear down for KF
272 if (cm->frame_type == KEY_FRAME) {
273 // Clear down the global segmentation map
274 vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
275 seg->update_map = 0;
276 seg->update_data = 0;
277 cpi->static_mb_pct = 0;
278
279 // Disable segmentation
280 vp9_disable_segmentation(seg);
281
282 // Clear down the segment features.
283 vp9_clearall_segfeatures(seg);
284 } else if (cpi->refresh_alt_ref_frame) {
285 // If this is an alt ref frame
286 // Clear down the global segmentation map
287 vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
288 seg->update_map = 0;
289 seg->update_data = 0;
290 cpi->static_mb_pct = 0;
291
292 // Disable segmentation and individual segment features by default
293 vp9_disable_segmentation(seg);
294 vp9_clearall_segfeatures(seg);
295
296 // Scan frames from current to arf frame.
297 // This function re-enables segmentation if appropriate.
298 vp9_update_mbgraph_stats(cpi);
299
300 // If segmentation was enabled set those features needed for the
301 // arf itself.
302 if (seg->enabled) {
303 seg->update_map = 1;
304 seg->update_data = 1;
305
306 qi_delta = vp9_compute_qdelta(cpi, rc->avg_q, rc->avg_q * 0.875);
307 vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2);
308 vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
309
310 vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
311 vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
312
313 // Where relevant assume segment data is delta data
314 seg->abs_delta = SEGMENT_DELTADATA;
315 }
316 } else if (seg->enabled) {
317 // All other frames if segmentation has been enabled
318
319 // First normal frame in a valid gf or alt ref group
320 if (rc->frames_since_golden == 0) {
321 // Set up segment features for normal frames in an arf group
322 if (rc->source_alt_ref_active) {
323 seg->update_map = 0;
324 seg->update_data = 1;
325 seg->abs_delta = SEGMENT_DELTADATA;
326
327 qi_delta = vp9_compute_qdelta(cpi, rc->avg_q, rc->avg_q * 1.125);
328 vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2);
329 vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
330
331 vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
332 vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
333
334 // Segment coding disabled for compred testing
335 if (high_q || (cpi->static_mb_pct == 100)) {
336 vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
337 vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
338 vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
339 }
340 } else {
341 // Disable segmentation and clear down features if alt ref
342 // is not active for this group
343
344 vp9_disable_segmentation(seg);
345
346 vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
347
348 seg->update_map = 0;
349 seg->update_data = 0;
350
351 vp9_clearall_segfeatures(seg);
352 }
353 } else if (rc->is_src_frame_alt_ref) {
354 // Special case where we are coding over the top of a previous
355 // alt ref frame.
356 // Segment coding disabled for compred testing
357
358 // Enable ref frame features for segment 0 as well
359 vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME);
360 vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
361
362 // All mbs should use ALTREF_FRAME
363 vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME);
364 vp9_set_segdata(seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
365 vp9_clear_segdata(seg, 1, SEG_LVL_REF_FRAME);
366 vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
367
368 // Skip all MBs if high Q (0,0 mv and skip coeffs)
369 if (high_q) {
370 vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
371 vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
372 }
373 // Enable data update
374 seg->update_data = 1;
375 } else {
376 // All other frames.
377
378 // No updates.. leave things as they are.
379 seg->update_map = 0;
380 seg->update_data = 0;
381 }
382 }
383 }
384
385 // DEBUG: Print out the segment id of each MB in the current frame.
print_seg_map(VP9_COMP * cpi)386 static void print_seg_map(VP9_COMP *cpi) {
387 VP9_COMMON *cm = &cpi->common;
388 int row, col;
389 int map_index = 0;
390 FILE *statsfile = fopen("segmap.stt", "a");
391
392 fprintf(statsfile, "%10d\n", cm->current_video_frame);
393
394 for (row = 0; row < cpi->common.mi_rows; row++) {
395 for (col = 0; col < cpi->common.mi_cols; col++) {
396 fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
397 map_index++;
398 }
399 fprintf(statsfile, "\n");
400 }
401 fprintf(statsfile, "\n");
402
403 fclose(statsfile);
404 }
405
update_reference_segmentation_map(VP9_COMP * cpi)406 static void update_reference_segmentation_map(VP9_COMP *cpi) {
407 VP9_COMMON *const cm = &cpi->common;
408 MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible;
409 uint8_t *cache_ptr = cm->last_frame_seg_map;
410 int row, col;
411
412 for (row = 0; row < cm->mi_rows; row++) {
413 MODE_INFO **mi_8x8 = mi_8x8_ptr;
414 uint8_t *cache = cache_ptr;
415 for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++)
416 cache[0] = mi_8x8[0]->mbmi.segment_id;
417 mi_8x8_ptr += cm->mi_stride;
418 cache_ptr += cm->mi_cols;
419 }
420 }
is_slowest_mode(int mode)421 static int is_slowest_mode(int mode) {
422 return (mode == MODE_SECONDPASS_BEST || mode == MODE_BESTQUALITY);
423 }
424
set_rd_speed_thresholds(VP9_COMP * cpi)425 static void set_rd_speed_thresholds(VP9_COMP *cpi) {
426 int i;
427
428 // Set baseline threshold values
429 for (i = 0; i < MAX_MODES; ++i)
430 cpi->rd_thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0;
431
432 cpi->rd_thresh_mult[THR_NEARESTMV] = 0;
433 cpi->rd_thresh_mult[THR_NEARESTG] = 0;
434 cpi->rd_thresh_mult[THR_NEARESTA] = 0;
435
436 cpi->rd_thresh_mult[THR_DC] += 1000;
437
438 cpi->rd_thresh_mult[THR_NEWMV] += 1000;
439 cpi->rd_thresh_mult[THR_NEWA] += 1000;
440 cpi->rd_thresh_mult[THR_NEWG] += 1000;
441
442 cpi->rd_thresh_mult[THR_NEARMV] += 1000;
443 cpi->rd_thresh_mult[THR_NEARA] += 1000;
444 cpi->rd_thresh_mult[THR_COMP_NEARESTLA] += 1000;
445 cpi->rd_thresh_mult[THR_COMP_NEARESTGA] += 1000;
446
447 cpi->rd_thresh_mult[THR_TM] += 1000;
448
449 cpi->rd_thresh_mult[THR_COMP_NEARLA] += 1500;
450 cpi->rd_thresh_mult[THR_COMP_NEWLA] += 2000;
451 cpi->rd_thresh_mult[THR_NEARG] += 1000;
452 cpi->rd_thresh_mult[THR_COMP_NEARGA] += 1500;
453 cpi->rd_thresh_mult[THR_COMP_NEWGA] += 2000;
454
455 cpi->rd_thresh_mult[THR_ZEROMV] += 2000;
456 cpi->rd_thresh_mult[THR_ZEROG] += 2000;
457 cpi->rd_thresh_mult[THR_ZEROA] += 2000;
458 cpi->rd_thresh_mult[THR_COMP_ZEROLA] += 2500;
459 cpi->rd_thresh_mult[THR_COMP_ZEROGA] += 2500;
460
461 cpi->rd_thresh_mult[THR_H_PRED] += 2000;
462 cpi->rd_thresh_mult[THR_V_PRED] += 2000;
463 cpi->rd_thresh_mult[THR_D45_PRED ] += 2500;
464 cpi->rd_thresh_mult[THR_D135_PRED] += 2500;
465 cpi->rd_thresh_mult[THR_D117_PRED] += 2500;
466 cpi->rd_thresh_mult[THR_D153_PRED] += 2500;
467 cpi->rd_thresh_mult[THR_D207_PRED] += 2500;
468 cpi->rd_thresh_mult[THR_D63_PRED] += 2500;
469
470 /* disable frame modes if flags not set */
471 if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) {
472 cpi->rd_thresh_mult[THR_NEWMV ] = INT_MAX;
473 cpi->rd_thresh_mult[THR_NEARESTMV] = INT_MAX;
474 cpi->rd_thresh_mult[THR_ZEROMV ] = INT_MAX;
475 cpi->rd_thresh_mult[THR_NEARMV ] = INT_MAX;
476 }
477 if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) {
478 cpi->rd_thresh_mult[THR_NEARESTG ] = INT_MAX;
479 cpi->rd_thresh_mult[THR_ZEROG ] = INT_MAX;
480 cpi->rd_thresh_mult[THR_NEARG ] = INT_MAX;
481 cpi->rd_thresh_mult[THR_NEWG ] = INT_MAX;
482 }
483 if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) {
484 cpi->rd_thresh_mult[THR_NEARESTA ] = INT_MAX;
485 cpi->rd_thresh_mult[THR_ZEROA ] = INT_MAX;
486 cpi->rd_thresh_mult[THR_NEARA ] = INT_MAX;
487 cpi->rd_thresh_mult[THR_NEWA ] = INT_MAX;
488 }
489
490 if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
491 (VP9_LAST_FLAG | VP9_ALT_FLAG)) {
492 cpi->rd_thresh_mult[THR_COMP_ZEROLA ] = INT_MAX;
493 cpi->rd_thresh_mult[THR_COMP_NEARESTLA] = INT_MAX;
494 cpi->rd_thresh_mult[THR_COMP_NEARLA ] = INT_MAX;
495 cpi->rd_thresh_mult[THR_COMP_NEWLA ] = INT_MAX;
496 }
497 if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
498 (VP9_GOLD_FLAG | VP9_ALT_FLAG)) {
499 cpi->rd_thresh_mult[THR_COMP_ZEROGA ] = INT_MAX;
500 cpi->rd_thresh_mult[THR_COMP_NEARESTGA] = INT_MAX;
501 cpi->rd_thresh_mult[THR_COMP_NEARGA ] = INT_MAX;
502 cpi->rd_thresh_mult[THR_COMP_NEWGA ] = INT_MAX;
503 }
504 }
505
set_rd_speed_thresholds_sub8x8(VP9_COMP * cpi)506 static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
507 const SPEED_FEATURES *const sf = &cpi->sf;
508 int i;
509
510 for (i = 0; i < MAX_REFS; ++i)
511 cpi->rd_thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0;
512
513 cpi->rd_thresh_mult_sub8x8[THR_LAST] += 2500;
514 cpi->rd_thresh_mult_sub8x8[THR_GOLD] += 2500;
515 cpi->rd_thresh_mult_sub8x8[THR_ALTR] += 2500;
516 cpi->rd_thresh_mult_sub8x8[THR_INTRA] += 2500;
517 cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] += 4500;
518 cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] += 4500;
519
520 // Check for masked out split cases.
521 for (i = 0; i < MAX_REFS; i++)
522 if (sf->disable_split_mask & (1 << i))
523 cpi->rd_thresh_mult_sub8x8[i] = INT_MAX;
524
525 // disable mode test if frame flag is not set
526 if (!(cpi->ref_frame_flags & VP9_LAST_FLAG))
527 cpi->rd_thresh_mult_sub8x8[THR_LAST] = INT_MAX;
528 if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG))
529 cpi->rd_thresh_mult_sub8x8[THR_GOLD] = INT_MAX;
530 if (!(cpi->ref_frame_flags & VP9_ALT_FLAG))
531 cpi->rd_thresh_mult_sub8x8[THR_ALTR] = INT_MAX;
532 if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
533 (VP9_LAST_FLAG | VP9_ALT_FLAG))
534 cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX;
535 if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
536 (VP9_GOLD_FLAG | VP9_ALT_FLAG))
537 cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX;
538 }
539
set_speed_features(VP9_COMP * cpi)540 static void set_speed_features(VP9_COMP *cpi) {
541 #if CONFIG_INTERNAL_STATS
542 int i;
543 for (i = 0; i < MAX_MODES; ++i)
544 cpi->mode_chosen_counts[i] = 0;
545 #endif
546
547 vp9_set_speed_features(cpi);
548
549 // Set rd thresholds based on mode and speed setting
550 set_rd_speed_thresholds(cpi);
551 set_rd_speed_thresholds_sub8x8(cpi);
552
553 cpi->mb.fwd_txm4x4 = vp9_fdct4x4;
554 if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
555 cpi->mb.fwd_txm4x4 = vp9_fwht4x4;
556 }
557 }
558
alloc_raw_frame_buffers(VP9_COMP * cpi)559 static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
560 VP9_COMMON *cm = &cpi->common;
561 const VP9_CONFIG *oxcf = &cpi->oxcf;
562
563 cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height,
564 cm->subsampling_x, cm->subsampling_y,
565 oxcf->lag_in_frames);
566 if (!cpi->lookahead)
567 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
568 "Failed to allocate lag buffers");
569
570 if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer,
571 oxcf->width, oxcf->height,
572 cm->subsampling_x, cm->subsampling_y,
573 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
574 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
575 "Failed to allocate altref buffer");
576 }
577
vp9_alloc_compressor_data(VP9_COMP * cpi)578 void vp9_alloc_compressor_data(VP9_COMP *cpi) {
579 VP9_COMMON *cm = &cpi->common;
580
581 if (vp9_alloc_frame_buffers(cm, cm->width, cm->height))
582 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
583 "Failed to allocate frame buffers");
584
585 if (vp9_alloc_frame_buffer(&cpi->last_frame_uf,
586 cm->width, cm->height,
587 cm->subsampling_x, cm->subsampling_y,
588 VP9_ENC_BORDER_IN_PIXELS))
589 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
590 "Failed to allocate last frame buffer");
591
592 if (vp9_alloc_frame_buffer(&cpi->scaled_source,
593 cm->width, cm->height,
594 cm->subsampling_x, cm->subsampling_y,
595 VP9_ENC_BORDER_IN_PIXELS))
596 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
597 "Failed to allocate scaled source buffer");
598
599 if (vp9_alloc_frame_buffer(&cpi->scaled_last_source,
600 cm->width, cm->height,
601 cm->subsampling_x, cm->subsampling_y,
602 VP9_ENC_BORDER_IN_PIXELS))
603 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
604 "Failed to allocate scaled last source buffer");
605
606 vpx_free(cpi->tok);
607
608 {
609 unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols);
610
611 CHECK_MEM_ERROR(cm, cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
612 }
613
614 vpx_free(cpi->mb_activity_map);
615 CHECK_MEM_ERROR(cm, cpi->mb_activity_map,
616 vpx_calloc(sizeof(unsigned int),
617 cm->mb_rows * cm->mb_cols));
618
619 vpx_free(cpi->mb_norm_activity_map);
620 CHECK_MEM_ERROR(cm, cpi->mb_norm_activity_map,
621 vpx_calloc(sizeof(unsigned int),
622 cm->mb_rows * cm->mb_cols));
623 }
624
625
update_frame_size(VP9_COMP * cpi)626 static void update_frame_size(VP9_COMP *cpi) {
627 VP9_COMMON *const cm = &cpi->common;
628 MACROBLOCKD *const xd = &cpi->mb.e_mbd;
629
630 vp9_update_frame_size(cm);
631
632 // Update size of buffers local to this frame
633 if (vp9_realloc_frame_buffer(&cpi->last_frame_uf,
634 cm->width, cm->height,
635 cm->subsampling_x, cm->subsampling_y,
636 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
637 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
638 "Failed to reallocate last frame buffer");
639
640 if (vp9_realloc_frame_buffer(&cpi->scaled_source,
641 cm->width, cm->height,
642 cm->subsampling_x, cm->subsampling_y,
643 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
644 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
645 "Failed to reallocate scaled source buffer");
646
647 if (vp9_realloc_frame_buffer(&cpi->scaled_last_source,
648 cm->width, cm->height,
649 cm->subsampling_x, cm->subsampling_y,
650 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
651 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
652 "Failed to reallocate scaled last source buffer");
653
654 {
655 int y_stride = cpi->scaled_source.y_stride;
656
657 if (cpi->sf.search_method == NSTEP) {
658 vp9_init3smotion_compensation(&cpi->mb, y_stride);
659 } else if (cpi->sf.search_method == DIAMOND) {
660 vp9_init_dsmotion_compensation(&cpi->mb, y_stride);
661 }
662 }
663
664 init_macroblockd(cm, xd);
665 }
666
667 // Table that converts 0-63 Q range values passed in outside to the Qindex
668 // range used internally.
669 const int q_trans[] = {
670 0, 4, 8, 12, 16, 20, 24, 28,
671 32, 36, 40, 44, 48, 52, 56, 60,
672 64, 68, 72, 76, 80, 84, 88, 92,
673 96, 100, 104, 108, 112, 116, 120, 124,
674 128, 132, 136, 140, 144, 148, 152, 156,
675 160, 164, 168, 172, 176, 180, 184, 188,
676 192, 196, 200, 204, 208, 212, 216, 220,
677 224, 228, 232, 236, 240, 244, 249, 255,
678 };
679
vp9_reverse_trans(int x)680 int vp9_reverse_trans(int x) {
681 int i;
682
683 for (i = 0; i < 64; i++)
684 if (q_trans[i] >= x)
685 return i;
686
687 return 63;
688 };
689
vp9_new_framerate(VP9_COMP * cpi,double framerate)690 void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
691 VP9_COMMON *const cm = &cpi->common;
692 RATE_CONTROL *const rc = &cpi->rc;
693 VP9_CONFIG *const oxcf = &cpi->oxcf;
694 int vbr_max_bits;
695
696 oxcf->framerate = framerate < 0.1 ? 30 : framerate;
697 cpi->output_framerate = cpi->oxcf.framerate;
698 rc->av_per_frame_bandwidth = (int)(oxcf->target_bandwidth /
699 cpi->output_framerate);
700 rc->min_frame_bandwidth = (int)(rc->av_per_frame_bandwidth *
701 oxcf->two_pass_vbrmin_section / 100);
702
703 rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS);
704
705 // A maximum bitrate for a frame is defined.
706 // The baseline for this aligns with HW implementations that
707 // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits
708 // per 16x16 MB (averaged over a frame). However this limit is extended if
709 // a very high rate is given on the command line or the the rate cannnot
710 // be acheived because of a user specificed max q (e.g. when the user
711 // specifies lossless encode.
712 //
713 vbr_max_bits = (int)(((int64_t)rc->av_per_frame_bandwidth *
714 oxcf->two_pass_vbrmax_section) / 100);
715 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P),
716 vbr_max_bits);
717
718 // Set Maximum gf/arf interval
719 rc->max_gf_interval = 16;
720
721 // Extended interval for genuinely static scenes
722 rc->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
723
724 // Special conditions when alt ref frame enabled in lagged compress mode
725 if (oxcf->play_alternate && oxcf->lag_in_frames) {
726 if (rc->max_gf_interval > oxcf->lag_in_frames - 1)
727 rc->max_gf_interval = oxcf->lag_in_frames - 1;
728
729 if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1)
730 rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1;
731 }
732
733 if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
734 rc->max_gf_interval = rc->static_scene_max_gf_interval;
735 }
736
vp9_rescale(int64_t val,int64_t num,int denom)737 int64_t vp9_rescale(int64_t val, int64_t num, int denom) {
738 int64_t llnum = num;
739 int64_t llden = denom;
740 int64_t llval = val;
741
742 return (llval * llnum / llden);
743 }
744
set_tile_limits(VP9_COMP * cpi)745 static void set_tile_limits(VP9_COMP *cpi) {
746 VP9_COMMON *const cm = &cpi->common;
747
748 int min_log2_tile_cols, max_log2_tile_cols;
749 vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
750
751 cm->log2_tile_cols = clamp(cpi->oxcf.tile_columns,
752 min_log2_tile_cols, max_log2_tile_cols);
753 cm->log2_tile_rows = cpi->oxcf.tile_rows;
754 }
755
init_rate_control(const VP9_CONFIG * oxcf,int pass,RATE_CONTROL * rc)756 static void init_rate_control(const VP9_CONFIG *oxcf, int pass,
757 RATE_CONTROL *rc) {
758 if (pass == 0 && oxcf->end_usage == USAGE_STREAM_FROM_SERVER) {
759 rc->avg_frame_qindex[0] = oxcf->worst_allowed_q;
760 rc->avg_frame_qindex[1] = oxcf->worst_allowed_q;
761 rc->avg_frame_qindex[2] = oxcf->worst_allowed_q;
762 } else {
763 rc->avg_frame_qindex[0] = (oxcf->worst_allowed_q +
764 oxcf->best_allowed_q) / 2;
765 rc->avg_frame_qindex[1] = (oxcf->worst_allowed_q +
766 oxcf->best_allowed_q) / 2;
767 rc->avg_frame_qindex[2] = (oxcf->worst_allowed_q +
768 oxcf->best_allowed_q) / 2;
769 }
770
771 rc->last_q[0] = oxcf->best_allowed_q;
772 rc->last_q[1] = oxcf->best_allowed_q;
773 rc->last_q[2] = oxcf->best_allowed_q;
774
775 rc->buffer_level = oxcf->starting_buffer_level;
776 rc->bits_off_target = oxcf->starting_buffer_level;
777
778 rc->rolling_target_bits = rc->av_per_frame_bandwidth;
779 rc->rolling_actual_bits = rc->av_per_frame_bandwidth;
780 rc->long_rolling_target_bits = rc->av_per_frame_bandwidth;
781 rc->long_rolling_actual_bits = rc->av_per_frame_bandwidth;
782
783 rc->total_actual_bits = 0;
784 rc->total_target_vs_actual = 0;
785 }
786
init_config(struct VP9_COMP * cpi,VP9_CONFIG * oxcf)787 static void init_config(struct VP9_COMP *cpi, VP9_CONFIG *oxcf) {
788 VP9_COMMON *const cm = &cpi->common;
789 int i;
790
791 cpi->oxcf = *oxcf;
792
793 cm->version = oxcf->version;
794
795 cm->width = oxcf->width;
796 cm->height = oxcf->height;
797 cm->subsampling_x = 0;
798 cm->subsampling_y = 0;
799 vp9_alloc_compressor_data(cpi);
800
801 // Spatial scalability.
802 cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
803 // Temporal scalability.
804 cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
805
806 if ((cpi->svc.number_temporal_layers > 1 &&
807 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
808 (cpi->svc.number_spatial_layers > 1 &&
809 cpi->oxcf.mode == MODE_SECONDPASS_BEST)) {
810 vp9_init_layer_context(cpi);
811 }
812
813 // change includes all joint functionality
814 vp9_change_config(cpi, oxcf);
815
816 cpi->static_mb_pct = 0;
817
818 cpi->lst_fb_idx = 0;
819 cpi->gld_fb_idx = 1;
820 cpi->alt_fb_idx = 2;
821
822 set_tile_limits(cpi);
823
824 cpi->fixed_divide[0] = 0;
825 for (i = 1; i < 512; i++)
826 cpi->fixed_divide[i] = 0x80000 / i;
827 }
828
vp9_change_config(struct VP9_COMP * cpi,const VP9_CONFIG * oxcf)829 void vp9_change_config(struct VP9_COMP *cpi, const VP9_CONFIG *oxcf) {
830 VP9_COMMON *const cm = &cpi->common;
831 RATE_CONTROL *const rc = &cpi->rc;
832
833 if (cm->version != oxcf->version)
834 cm->version = oxcf->version;
835
836 cpi->oxcf = *oxcf;
837
838 if (cpi->oxcf.cpu_used == -6)
839 cpi->oxcf.play_alternate = 0;
840
841 switch (cpi->oxcf.mode) {
842 // Real time and one pass deprecated in test code base
843 case MODE_GOODQUALITY:
844 cpi->pass = 0;
845 cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5);
846 break;
847
848 case MODE_BESTQUALITY:
849 cpi->pass = 0;
850 break;
851
852 case MODE_FIRSTPASS:
853 cpi->pass = 1;
854 break;
855
856 case MODE_SECONDPASS:
857 cpi->pass = 2;
858 cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5);
859 break;
860
861 case MODE_SECONDPASS_BEST:
862 cpi->pass = 2;
863 break;
864
865 case MODE_REALTIME:
866 cpi->pass = 0;
867 break;
868 }
869
870 cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
871 cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
872 cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
873
874 cpi->oxcf.lossless = oxcf->lossless;
875 if (cpi->oxcf.lossless) {
876 // In lossless mode, make sure right quantizer range and correct transform
877 // is set.
878 cpi->oxcf.worst_allowed_q = 0;
879 cpi->oxcf.best_allowed_q = 0;
880 cpi->mb.e_mbd.itxm_add = vp9_iwht4x4_add;
881 } else {
882 cpi->mb.e_mbd.itxm_add = vp9_idct4x4_add;
883 }
884 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
885 cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
886
887 cpi->refresh_golden_frame = 0;
888 cpi->refresh_last_frame = 1;
889 cm->refresh_frame_context = 1;
890 cm->reset_frame_context = 0;
891
892 vp9_reset_segment_features(&cm->seg);
893 set_high_precision_mv(cpi, 0);
894
895 {
896 int i;
897
898 for (i = 0; i < MAX_SEGMENTS; i++)
899 cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
900 }
901 cpi->encode_breakout = cpi->oxcf.encode_breakout;
902
903 // local file playback mode == really big buffer
904 if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) {
905 cpi->oxcf.starting_buffer_level = 60000;
906 cpi->oxcf.optimal_buffer_level = 60000;
907 cpi->oxcf.maximum_buffer_size = 240000;
908 }
909
910 // Convert target bandwidth from Kbit/s to Bit/s
911 cpi->oxcf.target_bandwidth *= 1000;
912
913 cpi->oxcf.starting_buffer_level =
914 vp9_rescale(cpi->oxcf.starting_buffer_level,
915 cpi->oxcf.target_bandwidth, 1000);
916
917 // Set or reset optimal and maximum buffer levels.
918 if (cpi->oxcf.optimal_buffer_level == 0)
919 cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
920 else
921 cpi->oxcf.optimal_buffer_level =
922 vp9_rescale(cpi->oxcf.optimal_buffer_level,
923 cpi->oxcf.target_bandwidth, 1000);
924
925 if (cpi->oxcf.maximum_buffer_size == 0)
926 cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
927 else
928 cpi->oxcf.maximum_buffer_size =
929 vp9_rescale(cpi->oxcf.maximum_buffer_size,
930 cpi->oxcf.target_bandwidth, 1000);
931 // Under a configuration change, where maximum_buffer_size may change,
932 // keep buffer level clipped to the maximum allowed buffer size.
933 rc->bits_off_target = MIN(rc->bits_off_target, cpi->oxcf.maximum_buffer_size);
934 rc->buffer_level = MIN(rc->buffer_level, cpi->oxcf.maximum_buffer_size);
935
936 // Set up frame rate and related parameters rate control values.
937 vp9_new_framerate(cpi, cpi->oxcf.framerate);
938
939 // Set absolute upper and lower quality limits
940 rc->worst_quality = cpi->oxcf.worst_allowed_q;
941 rc->best_quality = cpi->oxcf.best_allowed_q;
942
943 // active values should only be modified if out of new range
944
945 cpi->cq_target_quality = cpi->oxcf.cq_level;
946
947 cm->interp_filter = DEFAULT_INTERP_FILTER;
948
949 cm->display_width = cpi->oxcf.width;
950 cm->display_height = cpi->oxcf.height;
951
952 // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
953 cpi->oxcf.sharpness = MIN(7, cpi->oxcf.sharpness);
954
955 cpi->common.lf.sharpness_level = cpi->oxcf.sharpness;
956
957 if (cpi->initial_width) {
958 // Increasing the size of the frame beyond the first seen frame, or some
959 // otherwise signaled maximum size, is not supported.
960 // TODO(jkoleszar): exit gracefully.
961 assert(cm->width <= cpi->initial_width);
962 assert(cm->height <= cpi->initial_height);
963 }
964 update_frame_size(cpi);
965
966 if ((cpi->svc.number_temporal_layers > 1 &&
967 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
968 (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) {
969 vp9_update_layer_context_change_config(cpi,
970 (int)cpi->oxcf.target_bandwidth);
971 }
972
973 cpi->speed = abs(cpi->oxcf.cpu_used);
974
975 // Limit on lag buffers as these are not currently dynamically allocated.
976 if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
977 cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
978
979 #if CONFIG_MULTIPLE_ARF
980 vp9_zero(cpi->alt_ref_source);
981 #else
982 cpi->alt_ref_source = NULL;
983 #endif
984 rc->is_src_frame_alt_ref = 0;
985
986 #if 0
987 // Experimental RD Code
988 cpi->frame_distortion = 0;
989 cpi->last_frame_distortion = 0;
990 #endif
991
992 set_tile_limits(cpi);
993
994 cpi->ext_refresh_frame_flags_pending = 0;
995 cpi->ext_refresh_frame_context_pending = 0;
996 }
997
998 #define M_LOG2_E 0.693147180559945309417
999 #define log2f(x) (log (x) / (float) M_LOG2_E)
1000
cal_nmvjointsadcost(int * mvjointsadcost)1001 static void cal_nmvjointsadcost(int *mvjointsadcost) {
1002 mvjointsadcost[0] = 600;
1003 mvjointsadcost[1] = 300;
1004 mvjointsadcost[2] = 300;
1005 mvjointsadcost[3] = 300;
1006 }
1007
cal_nmvsadcosts(int * mvsadcost[2])1008 static void cal_nmvsadcosts(int *mvsadcost[2]) {
1009 int i = 1;
1010
1011 mvsadcost[0][0] = 0;
1012 mvsadcost[1][0] = 0;
1013
1014 do {
1015 double z = 256 * (2 * (log2f(8 * i) + .6));
1016 mvsadcost[0][i] = (int)z;
1017 mvsadcost[1][i] = (int)z;
1018 mvsadcost[0][-i] = (int)z;
1019 mvsadcost[1][-i] = (int)z;
1020 } while (++i <= MV_MAX);
1021 }
1022
cal_nmvsadcosts_hp(int * mvsadcost[2])1023 static void cal_nmvsadcosts_hp(int *mvsadcost[2]) {
1024 int i = 1;
1025
1026 mvsadcost[0][0] = 0;
1027 mvsadcost[1][0] = 0;
1028
1029 do {
1030 double z = 256 * (2 * (log2f(8 * i) + .6));
1031 mvsadcost[0][i] = (int)z;
1032 mvsadcost[1][i] = (int)z;
1033 mvsadcost[0][-i] = (int)z;
1034 mvsadcost[1][-i] = (int)z;
1035 } while (++i <= MV_MAX);
1036 }
1037
alloc_mode_context(VP9_COMMON * cm,int num_4x4_blk,PICK_MODE_CONTEXT * ctx)1038 static void alloc_mode_context(VP9_COMMON *cm, int num_4x4_blk,
1039 PICK_MODE_CONTEXT *ctx) {
1040 int num_pix = num_4x4_blk << 4;
1041 int i, k;
1042 ctx->num_4x4_blk = num_4x4_blk;
1043
1044 CHECK_MEM_ERROR(cm, ctx->zcoeff_blk,
1045 vpx_calloc(num_4x4_blk, sizeof(uint8_t)));
1046 for (i = 0; i < MAX_MB_PLANE; ++i) {
1047 for (k = 0; k < 3; ++k) {
1048 CHECK_MEM_ERROR(cm, ctx->coeff[i][k],
1049 vpx_memalign(16, num_pix * sizeof(int16_t)));
1050 CHECK_MEM_ERROR(cm, ctx->qcoeff[i][k],
1051 vpx_memalign(16, num_pix * sizeof(int16_t)));
1052 CHECK_MEM_ERROR(cm, ctx->dqcoeff[i][k],
1053 vpx_memalign(16, num_pix * sizeof(int16_t)));
1054 CHECK_MEM_ERROR(cm, ctx->eobs[i][k],
1055 vpx_memalign(16, num_pix * sizeof(uint16_t)));
1056 ctx->coeff_pbuf[i][k] = ctx->coeff[i][k];
1057 ctx->qcoeff_pbuf[i][k] = ctx->qcoeff[i][k];
1058 ctx->dqcoeff_pbuf[i][k] = ctx->dqcoeff[i][k];
1059 ctx->eobs_pbuf[i][k] = ctx->eobs[i][k];
1060 }
1061 }
1062 }
1063
free_mode_context(PICK_MODE_CONTEXT * ctx)1064 static void free_mode_context(PICK_MODE_CONTEXT *ctx) {
1065 int i, k;
1066 vpx_free(ctx->zcoeff_blk);
1067 ctx->zcoeff_blk = 0;
1068 for (i = 0; i < MAX_MB_PLANE; ++i) {
1069 for (k = 0; k < 3; ++k) {
1070 vpx_free(ctx->coeff[i][k]);
1071 ctx->coeff[i][k] = 0;
1072 vpx_free(ctx->qcoeff[i][k]);
1073 ctx->qcoeff[i][k] = 0;
1074 vpx_free(ctx->dqcoeff[i][k]);
1075 ctx->dqcoeff[i][k] = 0;
1076 vpx_free(ctx->eobs[i][k]);
1077 ctx->eobs[i][k] = 0;
1078 }
1079 }
1080 }
1081
init_pick_mode_context(VP9_COMP * cpi)1082 static void init_pick_mode_context(VP9_COMP *cpi) {
1083 int i;
1084 VP9_COMMON *const cm = &cpi->common;
1085 MACROBLOCK *const x = &cpi->mb;
1086
1087 for (i = 0; i < BLOCK_SIZES; ++i) {
1088 const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
1089 const int num_4x4_h = num_4x4_blocks_high_lookup[i];
1090 const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
1091 if (i < BLOCK_16X16) {
1092 for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1093 for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) {
1094 for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) {
1095 PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1096 alloc_mode_context(cm, num_4x4_blk, ctx);
1097 }
1098 }
1099 }
1100 } else if (i < BLOCK_32X32) {
1101 for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1102 for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) {
1103 PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1104 ctx->num_4x4_blk = num_4x4_blk;
1105 alloc_mode_context(cm, num_4x4_blk, ctx);
1106 }
1107 }
1108 } else if (i < BLOCK_64X64) {
1109 for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) {
1110 PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1111 ctx->num_4x4_blk = num_4x4_blk;
1112 alloc_mode_context(cm, num_4x4_blk, ctx);
1113 }
1114 } else {
1115 PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1116 ctx->num_4x4_blk = num_4x4_blk;
1117 alloc_mode_context(cm, num_4x4_blk, ctx);
1118 }
1119 }
1120 }
1121
free_pick_mode_context(MACROBLOCK * x)1122 static void free_pick_mode_context(MACROBLOCK *x) {
1123 int i;
1124
1125 for (i = 0; i < BLOCK_SIZES; ++i) {
1126 const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
1127 const int num_4x4_h = num_4x4_blocks_high_lookup[i];
1128 const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
1129 if (i < BLOCK_16X16) {
1130 for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1131 for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) {
1132 for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) {
1133 PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1134 free_mode_context(ctx);
1135 }
1136 }
1137 }
1138 } else if (i < BLOCK_32X32) {
1139 for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1140 for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) {
1141 PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1142 free_mode_context(ctx);
1143 }
1144 }
1145 } else if (i < BLOCK_64X64) {
1146 for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) {
1147 PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1148 free_mode_context(ctx);
1149 }
1150 } else {
1151 PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1152 free_mode_context(ctx);
1153 }
1154 }
1155 }
1156
vp9_create_compressor(VP9_CONFIG * oxcf)1157 VP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf) {
1158 int i, j;
1159 VP9_COMP *const cpi = vpx_memalign(32, sizeof(VP9_COMP));
1160 VP9_COMMON *const cm = cpi != NULL ? &cpi->common : NULL;
1161 RATE_CONTROL *const rc = cpi != NULL ? &cpi->rc : NULL;
1162
1163 if (!cm)
1164 return NULL;
1165
1166 vp9_zero(*cpi);
1167
1168 if (setjmp(cm->error.jmp)) {
1169 cm->error.setjmp = 0;
1170 vp9_remove_compressor(cpi);
1171 return 0;
1172 }
1173
1174 cm->error.setjmp = 1;
1175
1176 CHECK_MEM_ERROR(cm, cpi->mb.ss, vpx_calloc(sizeof(search_site),
1177 (MAX_MVSEARCH_STEPS * 8) + 1));
1178
1179 vp9_rtcd();
1180
1181 cpi->use_svc = 0;
1182
1183 init_config(cpi, oxcf);
1184 init_rate_control(&cpi->oxcf, cpi->pass, &cpi->rc);
1185 init_pick_mode_context(cpi);
1186
1187 cm->current_video_frame = 0;
1188
1189 // Set reference frame sign bias for ALTREF frame to 1 (for now)
1190 cm->ref_frame_sign_bias[ALTREF_FRAME] = 1;
1191
1192 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1193
1194 cpi->gold_is_last = 0;
1195 cpi->alt_is_last = 0;
1196 cpi->gold_is_alt = 0;
1197
1198 // Create the encoder segmentation map and set all entries to 0
1199 CHECK_MEM_ERROR(cm, cpi->segmentation_map,
1200 vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1201
1202 // Create a complexity map used for rd adjustment
1203 CHECK_MEM_ERROR(cm, cpi->complexity_map,
1204 vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1205
1206 // Create a map used for cyclic background refresh.
1207 CHECK_MEM_ERROR(cm, cpi->cyclic_refresh,
1208 vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols));
1209
1210 // And a place holder structure is the coding context
1211 // for use if we want to save and restore it
1212 CHECK_MEM_ERROR(cm, cpi->coding_context.last_frame_seg_map_copy,
1213 vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1214
1215 CHECK_MEM_ERROR(cm, cpi->active_map, vpx_calloc(cm->MBs, 1));
1216 vpx_memset(cpi->active_map, 1, cm->MBs);
1217 cpi->active_map_enabled = 0;
1218
1219 for (i = 0; i < (sizeof(cpi->mbgraph_stats) /
1220 sizeof(cpi->mbgraph_stats[0])); i++) {
1221 CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats,
1222 vpx_calloc(cm->MBs *
1223 sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
1224 }
1225
1226 /*Initialize the feed-forward activity masking.*/
1227 cpi->activity_avg = 90 << 12;
1228 cpi->key_frame_frequency = cpi->oxcf.key_freq;
1229
1230 rc->frames_since_key = 8; // Sensible default for first frame.
1231 rc->this_key_frame_forced = 0;
1232 rc->next_key_frame_forced = 0;
1233
1234 rc->source_alt_ref_pending = 0;
1235 rc->source_alt_ref_active = 0;
1236 cpi->refresh_alt_ref_frame = 0;
1237
1238 #if CONFIG_MULTIPLE_ARF
1239 // Turn multiple ARF usage on/off. This is a quick hack for the initial test
1240 // version. It should eventually be set via the codec API.
1241 cpi->multi_arf_enabled = 1;
1242
1243 if (cpi->multi_arf_enabled) {
1244 cpi->sequence_number = 0;
1245 cpi->frame_coding_order_period = 0;
1246 vp9_zero(cpi->frame_coding_order);
1247 vp9_zero(cpi->arf_buffer_idx);
1248 }
1249 #endif
1250
1251 cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1252 #if CONFIG_INTERNAL_STATS
1253 cpi->b_calculate_ssimg = 0;
1254
1255 cpi->count = 0;
1256 cpi->bytes = 0;
1257
1258 if (cpi->b_calculate_psnr) {
1259 cpi->total_y = 0.0;
1260 cpi->total_u = 0.0;
1261 cpi->total_v = 0.0;
1262 cpi->total = 0.0;
1263 cpi->total_sq_error = 0;
1264 cpi->total_samples = 0;
1265
1266 cpi->totalp_y = 0.0;
1267 cpi->totalp_u = 0.0;
1268 cpi->totalp_v = 0.0;
1269 cpi->totalp = 0.0;
1270 cpi->totalp_sq_error = 0;
1271 cpi->totalp_samples = 0;
1272
1273 cpi->tot_recode_hits = 0;
1274 cpi->summed_quality = 0;
1275 cpi->summed_weights = 0;
1276 cpi->summedp_quality = 0;
1277 cpi->summedp_weights = 0;
1278 }
1279
1280 if (cpi->b_calculate_ssimg) {
1281 cpi->total_ssimg_y = 0;
1282 cpi->total_ssimg_u = 0;
1283 cpi->total_ssimg_v = 0;
1284 cpi->total_ssimg_all = 0;
1285 }
1286
1287 #endif
1288
1289 cpi->first_time_stamp_ever = INT64_MAX;
1290
1291 rc->frames_till_gf_update_due = 0;
1292
1293 rc->ni_av_qi = cpi->oxcf.worst_allowed_q;
1294 rc->ni_tot_qi = 0;
1295 rc->ni_frames = 0;
1296 rc->tot_q = 0.0;
1297 rc->avg_q = vp9_convert_qindex_to_q(cpi->oxcf.worst_allowed_q);
1298
1299 rc->rate_correction_factor = 1.0;
1300 rc->key_frame_rate_correction_factor = 1.0;
1301 rc->gf_rate_correction_factor = 1.0;
1302
1303 cal_nmvjointsadcost(cpi->mb.nmvjointsadcost);
1304 cpi->mb.nmvcost[0] = &cpi->mb.nmvcosts[0][MV_MAX];
1305 cpi->mb.nmvcost[1] = &cpi->mb.nmvcosts[1][MV_MAX];
1306 cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX];
1307 cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX];
1308 cal_nmvsadcosts(cpi->mb.nmvsadcost);
1309
1310 cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX];
1311 cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX];
1312 cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX];
1313 cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX];
1314 cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp);
1315
1316 #ifdef OUTPUT_YUV_SRC
1317 yuv_file = fopen("bd.yuv", "ab");
1318 #endif
1319 #ifdef OUTPUT_YUV_REC
1320 yuv_rec_file = fopen("rec.yuv", "wb");
1321 #endif
1322
1323 #if 0
1324 framepsnr = fopen("framepsnr.stt", "a");
1325 kf_list = fopen("kf_list.stt", "w");
1326 #endif
1327
1328 cpi->output_pkt_list = oxcf->output_pkt_list;
1329
1330 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
1331
1332 if (cpi->pass == 1) {
1333 vp9_init_first_pass(cpi);
1334 } else if (cpi->pass == 2) {
1335 const size_t packet_sz = sizeof(FIRSTPASS_STATS);
1336 const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
1337
1338 if (cpi->svc.number_spatial_layers > 1
1339 && cpi->svc.number_temporal_layers == 1) {
1340 FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf;
1341 FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = {0};
1342 int i;
1343
1344 for (i = 0; i < oxcf->ss_number_layers; ++i) {
1345 FIRSTPASS_STATS *const last_packet_for_layer =
1346 &stats[packets - oxcf->ss_number_layers + i];
1347 const int layer_id = (int)last_packet_for_layer->spatial_layer_id;
1348 const int packets_in_layer = (int)last_packet_for_layer->count + 1;
1349 if (layer_id >= 0 && layer_id < oxcf->ss_number_layers) {
1350 LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer_id];
1351
1352 vpx_free(lc->rc_twopass_stats_in.buf);
1353
1354 lc->rc_twopass_stats_in.sz = packets_in_layer * packet_sz;
1355 CHECK_MEM_ERROR(cm, lc->rc_twopass_stats_in.buf,
1356 vpx_malloc(lc->rc_twopass_stats_in.sz));
1357 lc->twopass.stats_in_start = lc->rc_twopass_stats_in.buf;
1358 lc->twopass.stats_in = lc->twopass.stats_in_start;
1359 lc->twopass.stats_in_end = lc->twopass.stats_in_start
1360 + packets_in_layer - 1;
1361 stats_copy[layer_id] = lc->rc_twopass_stats_in.buf;
1362 }
1363 }
1364
1365 for (i = 0; i < packets; ++i) {
1366 const int layer_id = (int)stats[i].spatial_layer_id;
1367 if (layer_id >= 0 && layer_id < oxcf->ss_number_layers
1368 && stats_copy[layer_id] != NULL) {
1369 *stats_copy[layer_id] = stats[i];
1370 ++stats_copy[layer_id];
1371 }
1372 }
1373
1374 vp9_init_second_pass_spatial_svc(cpi);
1375 } else {
1376 cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1377 cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1378 cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1];
1379
1380 vp9_init_second_pass(cpi);
1381 }
1382 }
1383
1384 set_speed_features(cpi);
1385
1386 // Default rd threshold factors for mode selection
1387 for (i = 0; i < BLOCK_SIZES; ++i) {
1388 for (j = 0; j < MAX_MODES; ++j)
1389 cpi->rd_thresh_freq_fact[i][j] = 32;
1390 for (j = 0; j < MAX_REFS; ++j)
1391 cpi->rd_thresh_freq_sub8x8[i][j] = 32;
1392 }
1393
1394 #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SVFHH, SVFHV, SVFHHV, \
1395 SDX3F, SDX8F, SDX4DF)\
1396 cpi->fn_ptr[BT].sdf = SDF; \
1397 cpi->fn_ptr[BT].sdaf = SDAF; \
1398 cpi->fn_ptr[BT].vf = VF; \
1399 cpi->fn_ptr[BT].svf = SVF; \
1400 cpi->fn_ptr[BT].svaf = SVAF; \
1401 cpi->fn_ptr[BT].svf_halfpix_h = SVFHH; \
1402 cpi->fn_ptr[BT].svf_halfpix_v = SVFHV; \
1403 cpi->fn_ptr[BT].svf_halfpix_hv = SVFHHV; \
1404 cpi->fn_ptr[BT].sdx3f = SDX3F; \
1405 cpi->fn_ptr[BT].sdx8f = SDX8F; \
1406 cpi->fn_ptr[BT].sdx4df = SDX4DF;
1407
1408 BFP(BLOCK_32X16, vp9_sad32x16, vp9_sad32x16_avg,
1409 vp9_variance32x16, vp9_sub_pixel_variance32x16,
1410 vp9_sub_pixel_avg_variance32x16, NULL, NULL,
1411 NULL, NULL, NULL,
1412 vp9_sad32x16x4d)
1413
1414 BFP(BLOCK_16X32, vp9_sad16x32, vp9_sad16x32_avg,
1415 vp9_variance16x32, vp9_sub_pixel_variance16x32,
1416 vp9_sub_pixel_avg_variance16x32, NULL, NULL,
1417 NULL, NULL, NULL,
1418 vp9_sad16x32x4d)
1419
1420 BFP(BLOCK_64X32, vp9_sad64x32, vp9_sad64x32_avg,
1421 vp9_variance64x32, vp9_sub_pixel_variance64x32,
1422 vp9_sub_pixel_avg_variance64x32, NULL, NULL,
1423 NULL, NULL, NULL,
1424 vp9_sad64x32x4d)
1425
1426 BFP(BLOCK_32X64, vp9_sad32x64, vp9_sad32x64_avg,
1427 vp9_variance32x64, vp9_sub_pixel_variance32x64,
1428 vp9_sub_pixel_avg_variance32x64, NULL, NULL,
1429 NULL, NULL, NULL,
1430 vp9_sad32x64x4d)
1431
1432 BFP(BLOCK_32X32, vp9_sad32x32, vp9_sad32x32_avg,
1433 vp9_variance32x32, vp9_sub_pixel_variance32x32,
1434 vp9_sub_pixel_avg_variance32x32, vp9_variance_halfpixvar32x32_h,
1435 vp9_variance_halfpixvar32x32_v,
1436 vp9_variance_halfpixvar32x32_hv, vp9_sad32x32x3, vp9_sad32x32x8,
1437 vp9_sad32x32x4d)
1438
1439 BFP(BLOCK_64X64, vp9_sad64x64, vp9_sad64x64_avg,
1440 vp9_variance64x64, vp9_sub_pixel_variance64x64,
1441 vp9_sub_pixel_avg_variance64x64, vp9_variance_halfpixvar64x64_h,
1442 vp9_variance_halfpixvar64x64_v,
1443 vp9_variance_halfpixvar64x64_hv, vp9_sad64x64x3, vp9_sad64x64x8,
1444 vp9_sad64x64x4d)
1445
1446 BFP(BLOCK_16X16, vp9_sad16x16, vp9_sad16x16_avg,
1447 vp9_variance16x16, vp9_sub_pixel_variance16x16,
1448 vp9_sub_pixel_avg_variance16x16, vp9_variance_halfpixvar16x16_h,
1449 vp9_variance_halfpixvar16x16_v,
1450 vp9_variance_halfpixvar16x16_hv, vp9_sad16x16x3, vp9_sad16x16x8,
1451 vp9_sad16x16x4d)
1452
1453 BFP(BLOCK_16X8, vp9_sad16x8, vp9_sad16x8_avg,
1454 vp9_variance16x8, vp9_sub_pixel_variance16x8,
1455 vp9_sub_pixel_avg_variance16x8, NULL, NULL, NULL,
1456 vp9_sad16x8x3, vp9_sad16x8x8, vp9_sad16x8x4d)
1457
1458 BFP(BLOCK_8X16, vp9_sad8x16, vp9_sad8x16_avg,
1459 vp9_variance8x16, vp9_sub_pixel_variance8x16,
1460 vp9_sub_pixel_avg_variance8x16, NULL, NULL, NULL,
1461 vp9_sad8x16x3, vp9_sad8x16x8, vp9_sad8x16x4d)
1462
1463 BFP(BLOCK_8X8, vp9_sad8x8, vp9_sad8x8_avg,
1464 vp9_variance8x8, vp9_sub_pixel_variance8x8,
1465 vp9_sub_pixel_avg_variance8x8, NULL, NULL, NULL,
1466 vp9_sad8x8x3, vp9_sad8x8x8, vp9_sad8x8x4d)
1467
1468 BFP(BLOCK_8X4, vp9_sad8x4, vp9_sad8x4_avg,
1469 vp9_variance8x4, vp9_sub_pixel_variance8x4,
1470 vp9_sub_pixel_avg_variance8x4, NULL, NULL,
1471 NULL, NULL, vp9_sad8x4x8,
1472 vp9_sad8x4x4d)
1473
1474 BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg,
1475 vp9_variance4x8, vp9_sub_pixel_variance4x8,
1476 vp9_sub_pixel_avg_variance4x8, NULL, NULL,
1477 NULL, NULL, vp9_sad4x8x8,
1478 vp9_sad4x8x4d)
1479
1480 BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg,
1481 vp9_variance4x4, vp9_sub_pixel_variance4x4,
1482 vp9_sub_pixel_avg_variance4x4, NULL, NULL, NULL,
1483 vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d)
1484
1485 cpi->full_search_sad = vp9_full_search_sad;
1486 cpi->diamond_search_sad = vp9_diamond_search_sad;
1487 cpi->refining_search_sad = vp9_refining_search_sad;
1488
1489 /* vp9_init_quantizer() is first called here. Add check in
1490 * vp9_frame_init_quantizer() so that vp9_init_quantizer is only
1491 * called later when needed. This will avoid unnecessary calls of
1492 * vp9_init_quantizer() for every frame.
1493 */
1494 vp9_init_quantizer(cpi);
1495
1496 vp9_loop_filter_init(cm);
1497
1498 cm->error.setjmp = 0;
1499
1500 vp9_zero(cpi->common.counts.uv_mode);
1501
1502 #ifdef MODE_TEST_HIT_STATS
1503 vp9_zero(cpi->mode_test_hits);
1504 #endif
1505
1506 return cpi;
1507 }
1508
vp9_remove_compressor(VP9_COMP * cpi)1509 void vp9_remove_compressor(VP9_COMP *cpi) {
1510 int i;
1511
1512 if (!cpi)
1513 return;
1514
1515 if (cpi && (cpi->common.current_video_frame > 0)) {
1516 #if CONFIG_INTERNAL_STATS
1517
1518 vp9_clear_system_state();
1519
1520 // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count);
1521 if (cpi->pass != 1) {
1522 FILE *f = fopen("opsnr.stt", "a");
1523 double time_encoded = (cpi->last_end_time_stamp_seen
1524 - cpi->first_time_stamp_ever) / 10000000.000;
1525 double total_encode_time = (cpi->time_receive_data +
1526 cpi->time_compress_data) / 1000.000;
1527 double dr = (double)cpi->bytes * (double) 8 / (double)1000
1528 / time_encoded;
1529
1530 if (cpi->b_calculate_psnr) {
1531 const double total_psnr =
1532 vpx_sse_to_psnr((double)cpi->total_samples, 255.0,
1533 (double)cpi->total_sq_error);
1534 const double totalp_psnr =
1535 vpx_sse_to_psnr((double)cpi->totalp_samples, 255.0,
1536 (double)cpi->totalp_sq_error);
1537 const double total_ssim = 100 * pow(cpi->summed_quality /
1538 cpi->summed_weights, 8.0);
1539 const double totalp_ssim = 100 * pow(cpi->summedp_quality /
1540 cpi->summedp_weights, 8.0);
1541
1542 fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
1543 "VPXSSIM\tVPSSIMP\t Time(ms)\n");
1544 fprintf(f, "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n",
1545 dr, cpi->total / cpi->count, total_psnr,
1546 cpi->totalp / cpi->count, totalp_psnr, total_ssim, totalp_ssim,
1547 total_encode_time);
1548 }
1549
1550 if (cpi->b_calculate_ssimg) {
1551 fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t Time(ms)\n");
1552 fprintf(f, "%7.2f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
1553 cpi->total_ssimg_y / cpi->count,
1554 cpi->total_ssimg_u / cpi->count,
1555 cpi->total_ssimg_v / cpi->count,
1556 cpi->total_ssimg_all / cpi->count, total_encode_time);
1557 }
1558
1559 fclose(f);
1560 }
1561
1562 #endif
1563
1564 #ifdef MODE_TEST_HIT_STATS
1565 if (cpi->pass != 1) {
1566 double norm_per_pixel_mode_tests = 0;
1567 double norm_counts[BLOCK_SIZES];
1568 int i;
1569 int sb64_per_frame;
1570 int norm_factors[BLOCK_SIZES] =
1571 {256, 128, 128, 64, 32, 32, 16, 8, 8, 4, 2, 2, 1};
1572 FILE *f = fopen("mode_hit_stats.stt", "a");
1573
1574 // On average, how many mode tests do we do
1575 for (i = 0; i < BLOCK_SIZES; ++i) {
1576 norm_counts[i] = (double)cpi->mode_test_hits[i] /
1577 (double)norm_factors[i];
1578 norm_per_pixel_mode_tests += norm_counts[i];
1579 }
1580 // Convert to a number per 64x64 and per frame
1581 sb64_per_frame = ((cpi->common.height + 63) / 64) *
1582 ((cpi->common.width + 63) / 64);
1583 norm_per_pixel_mode_tests =
1584 norm_per_pixel_mode_tests /
1585 (double)(cpi->common.current_video_frame * sb64_per_frame);
1586
1587 fprintf(f, "%6.4f\n", norm_per_pixel_mode_tests);
1588 fclose(f);
1589 }
1590 #endif
1591
1592 #if 0
1593 {
1594 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
1595 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
1596 printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame,
1597 cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000,
1598 cpi->time_compress_data / 1000,
1599 (cpi->time_receive_data + cpi->time_compress_data) / 1000);
1600 }
1601 #endif
1602 }
1603
1604 free_pick_mode_context(&cpi->mb);
1605 dealloc_compressor_data(cpi);
1606 vpx_free(cpi->mb.ss);
1607 vpx_free(cpi->tok);
1608
1609 for (i = 0; i < sizeof(cpi->mbgraph_stats) /
1610 sizeof(cpi->mbgraph_stats[0]); ++i) {
1611 vpx_free(cpi->mbgraph_stats[i].mb_stats);
1612 }
1613
1614 vp9_remove_common(&cpi->common);
1615 vpx_free(cpi);
1616
1617 #ifdef OUTPUT_YUV_SRC
1618 fclose(yuv_file);
1619 #endif
1620 #ifdef OUTPUT_YUV_REC
1621 fclose(yuv_rec_file);
1622 #endif
1623
1624 #if 0
1625
1626 if (keyfile)
1627 fclose(keyfile);
1628
1629 if (framepsnr)
1630 fclose(framepsnr);
1631
1632 if (kf_list)
1633 fclose(kf_list);
1634
1635 #endif
1636 }
1637
1638
calc_plane_error(const uint8_t * orig,int orig_stride,const uint8_t * recon,int recon_stride,unsigned int cols,unsigned int rows)1639 static uint64_t calc_plane_error(const uint8_t *orig, int orig_stride,
1640 const uint8_t *recon, int recon_stride,
1641 unsigned int cols, unsigned int rows) {
1642 unsigned int row, col;
1643 uint64_t total_sse = 0;
1644 int diff;
1645
1646 for (row = 0; row + 16 <= rows; row += 16) {
1647 for (col = 0; col + 16 <= cols; col += 16) {
1648 unsigned int sse;
1649
1650 vp9_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse);
1651 total_sse += sse;
1652 }
1653
1654 /* Handle odd-sized width */
1655 if (col < cols) {
1656 unsigned int border_row, border_col;
1657 const uint8_t *border_orig = orig;
1658 const uint8_t *border_recon = recon;
1659
1660 for (border_row = 0; border_row < 16; border_row++) {
1661 for (border_col = col; border_col < cols; border_col++) {
1662 diff = border_orig[border_col] - border_recon[border_col];
1663 total_sse += diff * diff;
1664 }
1665
1666 border_orig += orig_stride;
1667 border_recon += recon_stride;
1668 }
1669 }
1670
1671 orig += orig_stride * 16;
1672 recon += recon_stride * 16;
1673 }
1674
1675 /* Handle odd-sized height */
1676 for (; row < rows; row++) {
1677 for (col = 0; col < cols; col++) {
1678 diff = orig[col] - recon[col];
1679 total_sse += diff * diff;
1680 }
1681
1682 orig += orig_stride;
1683 recon += recon_stride;
1684 }
1685
1686 return total_sse;
1687 }
1688
1689 typedef struct {
1690 double psnr[4]; // total/y/u/v
1691 uint64_t sse[4]; // total/y/u/v
1692 uint32_t samples[4]; // total/y/u/v
1693 } PSNR_STATS;
1694
calc_psnr(const YV12_BUFFER_CONFIG * a,const YV12_BUFFER_CONFIG * b,PSNR_STATS * psnr)1695 static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b,
1696 PSNR_STATS *psnr) {
1697 const int widths[3] = {a->y_width, a->uv_width, a->uv_width };
1698 const int heights[3] = {a->y_height, a->uv_height, a->uv_height};
1699 const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer };
1700 const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride};
1701 const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer };
1702 const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride};
1703 int i;
1704 uint64_t total_sse = 0;
1705 uint32_t total_samples = 0;
1706
1707 for (i = 0; i < 3; ++i) {
1708 const int w = widths[i];
1709 const int h = heights[i];
1710 const uint32_t samples = w * h;
1711 const uint64_t sse = calc_plane_error(a_planes[i], a_strides[i],
1712 b_planes[i], b_strides[i],
1713 w, h);
1714 psnr->sse[1 + i] = sse;
1715 psnr->samples[1 + i] = samples;
1716 psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, 255.0, (double)sse);
1717
1718 total_sse += sse;
1719 total_samples += samples;
1720 }
1721
1722 psnr->sse[0] = total_sse;
1723 psnr->samples[0] = total_samples;
1724 psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, 255.0,
1725 (double)total_sse);
1726 }
1727
generate_psnr_packet(VP9_COMP * cpi)1728 static void generate_psnr_packet(VP9_COMP *cpi) {
1729 struct vpx_codec_cx_pkt pkt;
1730 int i;
1731 PSNR_STATS psnr;
1732 calc_psnr(cpi->Source, cpi->common.frame_to_show, &psnr);
1733 for (i = 0; i < 4; ++i) {
1734 pkt.data.psnr.samples[i] = psnr.samples[i];
1735 pkt.data.psnr.sse[i] = psnr.sse[i];
1736 pkt.data.psnr.psnr[i] = psnr.psnr[i];
1737 }
1738 pkt.kind = VPX_CODEC_PSNR_PKT;
1739 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
1740 }
1741
vp9_use_as_reference(VP9_COMP * cpi,int ref_frame_flags)1742 int vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags) {
1743 if (ref_frame_flags > 7)
1744 return -1;
1745
1746 cpi->ref_frame_flags = ref_frame_flags;
1747 return 0;
1748 }
1749
vp9_update_reference(VP9_COMP * cpi,int ref_frame_flags)1750 void vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags) {
1751 cpi->ext_refresh_golden_frame = (ref_frame_flags & VP9_GOLD_FLAG) != 0;
1752 cpi->ext_refresh_alt_ref_frame = (ref_frame_flags & VP9_ALT_FLAG) != 0;
1753 cpi->ext_refresh_last_frame = (ref_frame_flags & VP9_LAST_FLAG) != 0;
1754 cpi->ext_refresh_frame_flags_pending = 1;
1755 }
1756
get_vp9_ref_frame_buffer(VP9_COMP * cpi,VP9_REFFRAME ref_frame_flag)1757 static YV12_BUFFER_CONFIG *get_vp9_ref_frame_buffer(VP9_COMP *cpi,
1758 VP9_REFFRAME ref_frame_flag) {
1759 MV_REFERENCE_FRAME ref_frame = NONE;
1760 if (ref_frame_flag == VP9_LAST_FLAG)
1761 ref_frame = LAST_FRAME;
1762 else if (ref_frame_flag == VP9_GOLD_FLAG)
1763 ref_frame = GOLDEN_FRAME;
1764 else if (ref_frame_flag == VP9_ALT_FLAG)
1765 ref_frame = ALTREF_FRAME;
1766
1767 return ref_frame == NONE ? NULL : get_ref_frame_buffer(cpi, ref_frame);
1768 }
1769
vp9_copy_reference_enc(VP9_COMP * cpi,VP9_REFFRAME ref_frame_flag,YV12_BUFFER_CONFIG * sd)1770 int vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
1771 YV12_BUFFER_CONFIG *sd) {
1772 YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
1773 if (cfg) {
1774 vp8_yv12_copy_frame(cfg, sd);
1775 return 0;
1776 } else {
1777 return -1;
1778 }
1779 }
1780
vp9_get_reference_enc(VP9_COMP * cpi,int index,YV12_BUFFER_CONFIG ** fb)1781 int vp9_get_reference_enc(VP9_COMP *cpi, int index, YV12_BUFFER_CONFIG **fb) {
1782 VP9_COMMON *cm = &cpi->common;
1783
1784 if (index < 0 || index >= REF_FRAMES)
1785 return -1;
1786
1787 *fb = &cm->frame_bufs[cm->ref_frame_map[index]].buf;
1788 return 0;
1789 }
1790
vp9_set_reference_enc(VP9_COMP * cpi,VP9_REFFRAME ref_frame_flag,YV12_BUFFER_CONFIG * sd)1791 int vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
1792 YV12_BUFFER_CONFIG *sd) {
1793 YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
1794 if (cfg) {
1795 vp8_yv12_copy_frame(sd, cfg);
1796 return 0;
1797 } else {
1798 return -1;
1799 }
1800 }
1801
vp9_update_entropy(VP9_COMP * cpi,int update)1802 int vp9_update_entropy(VP9_COMP * cpi, int update) {
1803 cpi->ext_refresh_frame_context = update;
1804 cpi->ext_refresh_frame_context_pending = 1;
1805 return 0;
1806 }
1807
1808
1809 #ifdef OUTPUT_YUV_SRC
vp9_write_yuv_frame(YV12_BUFFER_CONFIG * s)1810 void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s) {
1811 uint8_t *src = s->y_buffer;
1812 int h = s->y_height;
1813
1814 do {
1815 fwrite(src, s->y_width, 1, yuv_file);
1816 src += s->y_stride;
1817 } while (--h);
1818
1819 src = s->u_buffer;
1820 h = s->uv_height;
1821
1822 do {
1823 fwrite(src, s->uv_width, 1, yuv_file);
1824 src += s->uv_stride;
1825 } while (--h);
1826
1827 src = s->v_buffer;
1828 h = s->uv_height;
1829
1830 do {
1831 fwrite(src, s->uv_width, 1, yuv_file);
1832 src += s->uv_stride;
1833 } while (--h);
1834 }
1835 #endif
1836
1837 #ifdef OUTPUT_YUV_REC
vp9_write_yuv_rec_frame(VP9_COMMON * cm)1838 void vp9_write_yuv_rec_frame(VP9_COMMON *cm) {
1839 YV12_BUFFER_CONFIG *s = cm->frame_to_show;
1840 uint8_t *src = s->y_buffer;
1841 int h = cm->height;
1842
1843 do {
1844 fwrite(src, s->y_width, 1, yuv_rec_file);
1845 src += s->y_stride;
1846 } while (--h);
1847
1848 src = s->u_buffer;
1849 h = s->uv_height;
1850
1851 do {
1852 fwrite(src, s->uv_width, 1, yuv_rec_file);
1853 src += s->uv_stride;
1854 } while (--h);
1855
1856 src = s->v_buffer;
1857 h = s->uv_height;
1858
1859 do {
1860 fwrite(src, s->uv_width, 1, yuv_rec_file);
1861 src += s->uv_stride;
1862 } while (--h);
1863
1864 #if CONFIG_ALPHA
1865 if (s->alpha_buffer) {
1866 src = s->alpha_buffer;
1867 h = s->alpha_height;
1868 do {
1869 fwrite(src, s->alpha_width, 1, yuv_rec_file);
1870 src += s->alpha_stride;
1871 } while (--h);
1872 }
1873 #endif
1874
1875 fflush(yuv_rec_file);
1876 }
1877 #endif
1878
scale_and_extend_frame_nonnormative(YV12_BUFFER_CONFIG * src_fb,YV12_BUFFER_CONFIG * dst_fb)1879 static void scale_and_extend_frame_nonnormative(YV12_BUFFER_CONFIG *src_fb,
1880 YV12_BUFFER_CONFIG *dst_fb) {
1881 const int in_w = src_fb->y_crop_width;
1882 const int in_h = src_fb->y_crop_height;
1883 const int out_w = dst_fb->y_crop_width;
1884 const int out_h = dst_fb->y_crop_height;
1885 const int in_w_uv = src_fb->uv_crop_width;
1886 const int in_h_uv = src_fb->uv_crop_height;
1887 const int out_w_uv = dst_fb->uv_crop_width;
1888 const int out_h_uv = dst_fb->uv_crop_height;
1889 int i;
1890
1891 uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer,
1892 src_fb->alpha_buffer};
1893 int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride,
1894 src_fb->alpha_stride};
1895
1896 uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer,
1897 dst_fb->alpha_buffer};
1898 int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride,
1899 dst_fb->alpha_stride};
1900
1901 for (i = 0; i < MAX_MB_PLANE; ++i) {
1902 if (i == 0 || i == 3) {
1903 // Y and alpha planes
1904 vp9_resize_plane(srcs[i], in_h, in_w, src_strides[i],
1905 dsts[i], out_h, out_w, dst_strides[i]);
1906 } else {
1907 // Chroma planes
1908 vp9_resize_plane(srcs[i], in_h_uv, in_w_uv, src_strides[i],
1909 dsts[i], out_h_uv, out_w_uv, dst_strides[i]);
1910 }
1911 }
1912 vp8_yv12_extend_frame_borders(dst_fb);
1913 }
1914
scale_and_extend_frame(YV12_BUFFER_CONFIG * src_fb,YV12_BUFFER_CONFIG * dst_fb)1915 static void scale_and_extend_frame(YV12_BUFFER_CONFIG *src_fb,
1916 YV12_BUFFER_CONFIG *dst_fb) {
1917 const int in_w = src_fb->y_crop_width;
1918 const int in_h = src_fb->y_crop_height;
1919 const int out_w = dst_fb->y_crop_width;
1920 const int out_h = dst_fb->y_crop_height;
1921 int x, y, i;
1922
1923 uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer,
1924 src_fb->alpha_buffer};
1925 int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride,
1926 src_fb->alpha_stride};
1927
1928 uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer,
1929 dst_fb->alpha_buffer};
1930 int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride,
1931 dst_fb->alpha_stride};
1932
1933 for (y = 0; y < out_h; y += 16) {
1934 for (x = 0; x < out_w; x += 16) {
1935 for (i = 0; i < MAX_MB_PLANE; ++i) {
1936 const int factor = (i == 0 || i == 3 ? 1 : 2);
1937 const int x_q4 = x * (16 / factor) * in_w / out_w;
1938 const int y_q4 = y * (16 / factor) * in_h / out_h;
1939 const int src_stride = src_strides[i];
1940 const int dst_stride = dst_strides[i];
1941 uint8_t *src = srcs[i] + y / factor * in_h / out_h * src_stride +
1942 x / factor * in_w / out_w;
1943 uint8_t *dst = dsts[i] + y / factor * dst_stride + x / factor;
1944
1945 vp9_convolve8(src, src_stride, dst, dst_stride,
1946 vp9_sub_pel_filters_8[x_q4 & 0xf], 16 * in_w / out_w,
1947 vp9_sub_pel_filters_8[y_q4 & 0xf], 16 * in_h / out_h,
1948 16 / factor, 16 / factor);
1949 }
1950 }
1951 }
1952
1953 vp8_yv12_extend_frame_borders(dst_fb);
1954 }
1955
find_fp_qindex()1956 static int find_fp_qindex() {
1957 int i;
1958
1959 for (i = 0; i < QINDEX_RANGE; i++) {
1960 if (vp9_convert_qindex_to_q(i) >= 30.0) {
1961 break;
1962 }
1963 }
1964
1965 if (i == QINDEX_RANGE)
1966 i--;
1967
1968 return i;
1969 }
1970
1971 #define WRITE_RECON_BUFFER 0
1972 #if WRITE_RECON_BUFFER
write_cx_frame_to_file(YV12_BUFFER_CONFIG * frame,int this_frame)1973 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame) {
1974 FILE *yframe;
1975 int i;
1976 char filename[255];
1977
1978 snprintf(filename, sizeof(filename), "cx\\y%04d.raw", this_frame);
1979 yframe = fopen(filename, "wb");
1980
1981 for (i = 0; i < frame->y_height; i++)
1982 fwrite(frame->y_buffer + i * frame->y_stride,
1983 frame->y_width, 1, yframe);
1984
1985 fclose(yframe);
1986 snprintf(filename, sizeof(filename), "cx\\u%04d.raw", this_frame);
1987 yframe = fopen(filename, "wb");
1988
1989 for (i = 0; i < frame->uv_height; i++)
1990 fwrite(frame->u_buffer + i * frame->uv_stride,
1991 frame->uv_width, 1, yframe);
1992
1993 fclose(yframe);
1994 snprintf(filename, sizeof(filename), "cx\\v%04d.raw", this_frame);
1995 yframe = fopen(filename, "wb");
1996
1997 for (i = 0; i < frame->uv_height; i++)
1998 fwrite(frame->v_buffer + i * frame->uv_stride,
1999 frame->uv_width, 1, yframe);
2000
2001 fclose(yframe);
2002 }
2003 #endif
2004
2005 // Function to test for conditions that indicate we should loop
2006 // back and recode a frame.
recode_loop_test(const VP9_COMP * cpi,int high_limit,int low_limit,int q,int maxq,int minq)2007 static int recode_loop_test(const VP9_COMP *cpi,
2008 int high_limit, int low_limit,
2009 int q, int maxq, int minq) {
2010 const VP9_COMMON *const cm = &cpi->common;
2011 const RATE_CONTROL *const rc = &cpi->rc;
2012 int force_recode = 0;
2013
2014 // Special case trap if maximum allowed frame size exceeded.
2015 if (rc->projected_frame_size > rc->max_frame_bandwidth) {
2016 force_recode = 1;
2017
2018 // Is frame recode allowed.
2019 // Yes if either recode mode 1 is selected or mode 2 is selected
2020 // and the frame is a key frame, golden frame or alt_ref_frame
2021 } else if ((cpi->sf.recode_loop == ALLOW_RECODE) ||
2022 ((cpi->sf.recode_loop == ALLOW_RECODE_KFARFGF) &&
2023 (cm->frame_type == KEY_FRAME ||
2024 cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) {
2025 // General over and under shoot tests
2026 if ((rc->projected_frame_size > high_limit && q < maxq) ||
2027 (rc->projected_frame_size < low_limit && q > minq)) {
2028 force_recode = 1;
2029 } else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
2030 // Deal with frame undershoot and whether or not we are
2031 // below the automatically set cq level.
2032 if (q > cpi->cq_target_quality &&
2033 rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) {
2034 force_recode = 1;
2035 }
2036 }
2037 }
2038 return force_recode;
2039 }
2040
vp9_update_reference_frames(VP9_COMP * cpi)2041 void vp9_update_reference_frames(VP9_COMP *cpi) {
2042 VP9_COMMON * const cm = &cpi->common;
2043
2044 // At this point the new frame has been encoded.
2045 // If any buffer copy / swapping is signaled it should be done here.
2046 if (cm->frame_type == KEY_FRAME) {
2047 ref_cnt_fb(cm->frame_bufs,
2048 &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
2049 ref_cnt_fb(cm->frame_bufs,
2050 &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
2051 }
2052 #if CONFIG_MULTIPLE_ARF
2053 else if (!cpi->multi_arf_enabled && cpi->refresh_golden_frame &&
2054 !cpi->refresh_alt_ref_frame) {
2055 #else
2056 else if (cpi->refresh_golden_frame && !cpi->refresh_alt_ref_frame &&
2057 !cpi->use_svc) {
2058 #endif
2059 /* Preserve the previously existing golden frame and update the frame in
2060 * the alt ref slot instead. This is highly specific to the current use of
2061 * alt-ref as a forward reference, and this needs to be generalized as
2062 * other uses are implemented (like RTC/temporal scaling)
2063 *
2064 * The update to the buffer in the alt ref slot was signaled in
2065 * vp9_pack_bitstream(), now swap the buffer pointers so that it's treated
2066 * as the golden frame next time.
2067 */
2068 int tmp;
2069
2070 ref_cnt_fb(cm->frame_bufs,
2071 &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
2072
2073 tmp = cpi->alt_fb_idx;
2074 cpi->alt_fb_idx = cpi->gld_fb_idx;
2075 cpi->gld_fb_idx = tmp;
2076 } else { /* For non key/golden frames */
2077 if (cpi->refresh_alt_ref_frame) {
2078 int arf_idx = cpi->alt_fb_idx;
2079 #if CONFIG_MULTIPLE_ARF
2080 if (cpi->multi_arf_enabled) {
2081 arf_idx = cpi->arf_buffer_idx[cpi->sequence_number + 1];
2082 }
2083 #endif
2084 ref_cnt_fb(cm->frame_bufs,
2085 &cm->ref_frame_map[arf_idx], cm->new_fb_idx);
2086 }
2087
2088 if (cpi->refresh_golden_frame) {
2089 ref_cnt_fb(cm->frame_bufs,
2090 &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
2091 }
2092 }
2093
2094 if (cpi->refresh_last_frame) {
2095 ref_cnt_fb(cm->frame_bufs,
2096 &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx);
2097 }
2098 }
2099
2100 static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
2101 MACROBLOCKD *xd = &cpi->mb.e_mbd;
2102 struct loopfilter *lf = &cm->lf;
2103 if (xd->lossless) {
2104 lf->filter_level = 0;
2105 } else {
2106 struct vpx_usec_timer timer;
2107
2108 vp9_clear_system_state();
2109
2110 vpx_usec_timer_start(&timer);
2111
2112 vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
2113
2114 vpx_usec_timer_mark(&timer);
2115 cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
2116 }
2117
2118 if (lf->filter_level > 0) {
2119 vp9_loop_filter_frame(cm, xd, lf->filter_level, 0, 0);
2120 }
2121
2122 vp9_extend_frame_inner_borders(cm->frame_to_show);
2123 }
2124
2125 void vp9_scale_references(VP9_COMP *cpi) {
2126 VP9_COMMON *cm = &cpi->common;
2127 MV_REFERENCE_FRAME ref_frame;
2128
2129 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
2130 const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
2131 YV12_BUFFER_CONFIG *const ref = &cm->frame_bufs[idx].buf;
2132
2133 if (ref->y_crop_width != cm->width ||
2134 ref->y_crop_height != cm->height) {
2135 const int new_fb = get_free_fb(cm);
2136 vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf,
2137 cm->width, cm->height,
2138 cm->subsampling_x, cm->subsampling_y,
2139 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
2140 scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf);
2141 cpi->scaled_ref_idx[ref_frame - 1] = new_fb;
2142 } else {
2143 cpi->scaled_ref_idx[ref_frame - 1] = idx;
2144 cm->frame_bufs[idx].ref_count++;
2145 }
2146 }
2147 }
2148
2149 static void release_scaled_references(VP9_COMP *cpi) {
2150 VP9_COMMON *cm = &cpi->common;
2151 int i;
2152
2153 for (i = 0; i < 3; i++)
2154 cm->frame_bufs[cpi->scaled_ref_idx[i]].ref_count--;
2155 }
2156
2157 static void full_to_model_count(unsigned int *model_count,
2158 unsigned int *full_count) {
2159 int n;
2160 model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
2161 model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
2162 model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
2163 for (n = THREE_TOKEN; n < EOB_TOKEN; ++n)
2164 model_count[TWO_TOKEN] += full_count[n];
2165 model_count[EOB_MODEL_TOKEN] = full_count[EOB_TOKEN];
2166 }
2167
2168 static void full_to_model_counts(vp9_coeff_count_model *model_count,
2169 vp9_coeff_count *full_count) {
2170 int i, j, k, l;
2171
2172 for (i = 0; i < PLANE_TYPES; ++i)
2173 for (j = 0; j < REF_TYPES; ++j)
2174 for (k = 0; k < COEF_BANDS; ++k)
2175 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l)
2176 full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]);
2177 }
2178
2179 #if 0 && CONFIG_INTERNAL_STATS
2180 static void output_frame_level_debug_stats(VP9_COMP *cpi) {
2181 VP9_COMMON *const cm = &cpi->common;
2182 FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w");
2183 int recon_err;
2184
2185 vp9_clear_system_state();
2186
2187 recon_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
2188
2189 if (cpi->twopass.total_left_stats.coded_error != 0.0)
2190 fprintf(f, "%10u %10d %10d %10d %10d %10d "
2191 "%10"PRId64" %10"PRId64" %10d "
2192 "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf"
2193 "%6d %6d %5d %5d %5d "
2194 "%10"PRId64" %10.3lf"
2195 "%10lf %8u %10d %10d %10d\n",
2196 cpi->common.current_video_frame, cpi->rc.this_frame_target,
2197 cpi->rc.projected_frame_size,
2198 cpi->rc.projected_frame_size / cpi->common.MBs,
2199 (cpi->rc.projected_frame_size - cpi->rc.this_frame_target),
2200 cpi->rc.total_target_vs_actual,
2201 (cpi->oxcf.starting_buffer_level - cpi->rc.bits_off_target),
2202 cpi->rc.total_actual_bits, cm->base_qindex,
2203 vp9_convert_qindex_to_q(cm->base_qindex),
2204 (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0,
2205 cpi->rc.avg_q,
2206 vp9_convert_qindex_to_q(cpi->rc.ni_av_qi),
2207 vp9_convert_qindex_to_q(cpi->cq_target_quality),
2208 cpi->refresh_last_frame, cpi->refresh_golden_frame,
2209 cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost,
2210 cpi->twopass.bits_left,
2211 cpi->twopass.total_left_stats.coded_error,
2212 cpi->twopass.bits_left /
2213 (1 + cpi->twopass.total_left_stats.coded_error),
2214 cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
2215 cpi->twopass.kf_zeromotion_pct);
2216
2217 fclose(f);
2218
2219 if (0) {
2220 FILE *const fmodes = fopen("Modes.stt", "a");
2221 int i;
2222
2223 fprintf(fmodes, "%6d:%1d:%1d:%1d ", cpi->common.current_video_frame,
2224 cm->frame_type, cpi->refresh_golden_frame,
2225 cpi->refresh_alt_ref_frame);
2226
2227 for (i = 0; i < MAX_MODES; ++i)
2228 fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
2229
2230 fprintf(fmodes, "\n");
2231
2232 fclose(fmodes);
2233 }
2234 }
2235 #endif
2236
2237 static void encode_without_recode_loop(VP9_COMP *cpi,
2238 size_t *size,
2239 uint8_t *dest,
2240 int q) {
2241 VP9_COMMON *const cm = &cpi->common;
2242 vp9_clear_system_state();
2243 vp9_set_quantizer(cm, q);
2244
2245 // Set up entropy context depending on frame type. The decoder mandates
2246 // the use of the default context, index 0, for keyframes and inter
2247 // frames where the error_resilient_mode or intra_only flag is set. For
2248 // other inter-frames the encoder currently uses only two contexts;
2249 // context 1 for ALTREF frames and context 0 for the others.
2250 if (cm->frame_type == KEY_FRAME) {
2251 setup_key_frame(cpi);
2252 } else {
2253 if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc)
2254 cm->frame_context_idx = cpi->refresh_alt_ref_frame;
2255
2256 setup_inter_frame(cm);
2257 }
2258 // Variance adaptive and in frame q adjustment experiments are mutually
2259 // exclusive.
2260 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
2261 vp9_vaq_frame_setup(cpi);
2262 } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
2263 vp9_setup_in_frame_q_adj(cpi);
2264 } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
2265 vp9_cyclic_refresh_setup(cpi);
2266 }
2267 // transform / motion compensation build reconstruction frame
2268 vp9_encode_frame(cpi);
2269
2270 // Update the skip mb flag probabilities based on the distribution
2271 // seen in the last encoder iteration.
2272 // update_base_skip_probs(cpi);
2273 vp9_clear_system_state();
2274 }
2275
2276 static void encode_with_recode_loop(VP9_COMP *cpi,
2277 size_t *size,
2278 uint8_t *dest,
2279 int q,
2280 int bottom_index,
2281 int top_index) {
2282 VP9_COMMON *const cm = &cpi->common;
2283 RATE_CONTROL *const rc = &cpi->rc;
2284 int loop_count = 0;
2285 int loop = 0;
2286 int overshoot_seen = 0;
2287 int undershoot_seen = 0;
2288 int q_low = bottom_index, q_high = top_index;
2289 int frame_over_shoot_limit;
2290 int frame_under_shoot_limit;
2291
2292 // Decide frame size bounds
2293 vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target,
2294 &frame_under_shoot_limit,
2295 &frame_over_shoot_limit);
2296
2297 do {
2298 vp9_clear_system_state();
2299
2300 vp9_set_quantizer(cm, q);
2301
2302 if (loop_count == 0) {
2303 // Set up entropy context depending on frame type. The decoder mandates
2304 // the use of the default context, index 0, for keyframes and inter
2305 // frames where the error_resilient_mode or intra_only flag is set. For
2306 // other inter-frames the encoder currently uses only two contexts;
2307 // context 1 for ALTREF frames and context 0 for the others.
2308 if (cm->frame_type == KEY_FRAME) {
2309 setup_key_frame(cpi);
2310 } else {
2311 if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc)
2312 cpi->common.frame_context_idx = cpi->refresh_alt_ref_frame;
2313
2314 setup_inter_frame(cm);
2315 }
2316 }
2317
2318 // Variance adaptive and in frame q adjustment experiments are mutually
2319 // exclusive.
2320 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
2321 vp9_vaq_frame_setup(cpi);
2322 } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
2323 vp9_setup_in_frame_q_adj(cpi);
2324 }
2325
2326 // transform / motion compensation build reconstruction frame
2327 vp9_encode_frame(cpi);
2328
2329 // Update the skip mb flag probabilities based on the distribution
2330 // seen in the last encoder iteration.
2331 // update_base_skip_probs(cpi);
2332
2333 vp9_clear_system_state();
2334
2335 // Dummy pack of the bitstream using up to date stats to get an
2336 // accurate estimate of output frame size to determine if we need
2337 // to recode.
2338 if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) {
2339 vp9_save_coding_context(cpi);
2340 cpi->dummy_packing = 1;
2341 if (!cpi->sf.use_nonrd_pick_mode)
2342 vp9_pack_bitstream(cpi, dest, size);
2343
2344 rc->projected_frame_size = (int)(*size) << 3;
2345 vp9_restore_coding_context(cpi);
2346
2347 if (frame_over_shoot_limit == 0)
2348 frame_over_shoot_limit = 1;
2349 }
2350
2351 if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
2352 loop = 0;
2353 } else {
2354 if ((cm->frame_type == KEY_FRAME) &&
2355 rc->this_key_frame_forced &&
2356 (rc->projected_frame_size < rc->max_frame_bandwidth)) {
2357 int last_q = q;
2358 int kf_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
2359
2360 int high_err_target = cpi->ambient_err;
2361 int low_err_target = cpi->ambient_err >> 1;
2362
2363 // Prevent possible divide by zero error below for perfect KF
2364 kf_err += !kf_err;
2365
2366 // The key frame is not good enough or we can afford
2367 // to make it better without undue risk of popping.
2368 if ((kf_err > high_err_target &&
2369 rc->projected_frame_size <= frame_over_shoot_limit) ||
2370 (kf_err > low_err_target &&
2371 rc->projected_frame_size <= frame_under_shoot_limit)) {
2372 // Lower q_high
2373 q_high = q > q_low ? q - 1 : q_low;
2374
2375 // Adjust Q
2376 q = (q * high_err_target) / kf_err;
2377 q = MIN(q, (q_high + q_low) >> 1);
2378 } else if (kf_err < low_err_target &&
2379 rc->projected_frame_size >= frame_under_shoot_limit) {
2380 // The key frame is much better than the previous frame
2381 // Raise q_low
2382 q_low = q < q_high ? q + 1 : q_high;
2383
2384 // Adjust Q
2385 q = (q * low_err_target) / kf_err;
2386 q = MIN(q, (q_high + q_low + 1) >> 1);
2387 }
2388
2389 // Clamp Q to upper and lower limits:
2390 q = clamp(q, q_low, q_high);
2391
2392 loop = q != last_q;
2393 } else if (recode_loop_test(
2394 cpi, frame_over_shoot_limit, frame_under_shoot_limit,
2395 q, MAX(q_high, top_index), bottom_index)) {
2396 // Is the projected frame size out of range and are we allowed
2397 // to attempt to recode.
2398 int last_q = q;
2399 int retries = 0;
2400
2401 // Frame size out of permitted range:
2402 // Update correction factor & compute new Q to try...
2403
2404 // Frame is too large
2405 if (rc->projected_frame_size > rc->this_frame_target) {
2406 // Special case if the projected size is > the max allowed.
2407 if (rc->projected_frame_size >= rc->max_frame_bandwidth)
2408 q_high = rc->worst_quality;
2409
2410 // Raise Qlow as to at least the current value
2411 q_low = q < q_high ? q + 1 : q_high;
2412
2413 if (undershoot_seen || loop_count > 1) {
2414 // Update rate_correction_factor unless
2415 vp9_rc_update_rate_correction_factors(cpi, 1);
2416
2417 q = (q_high + q_low + 1) / 2;
2418 } else {
2419 // Update rate_correction_factor unless
2420 vp9_rc_update_rate_correction_factors(cpi, 0);
2421
2422 q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2423 bottom_index, MAX(q_high, top_index));
2424
2425 while (q < q_low && retries < 10) {
2426 vp9_rc_update_rate_correction_factors(cpi, 0);
2427 q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2428 bottom_index, MAX(q_high, top_index));
2429 retries++;
2430 }
2431 }
2432
2433 overshoot_seen = 1;
2434 } else {
2435 // Frame is too small
2436 q_high = q > q_low ? q - 1 : q_low;
2437
2438 if (overshoot_seen || loop_count > 1) {
2439 vp9_rc_update_rate_correction_factors(cpi, 1);
2440 q = (q_high + q_low) / 2;
2441 } else {
2442 vp9_rc_update_rate_correction_factors(cpi, 0);
2443 q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2444 bottom_index, top_index);
2445 // Special case reset for qlow for constrained quality.
2446 // This should only trigger where there is very substantial
2447 // undershoot on a frame and the auto cq level is above
2448 // the user passsed in value.
2449 if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
2450 q < q_low) {
2451 q_low = q;
2452 }
2453
2454 while (q > q_high && retries < 10) {
2455 vp9_rc_update_rate_correction_factors(cpi, 0);
2456 q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2457 bottom_index, top_index);
2458 retries++;
2459 }
2460 }
2461
2462 undershoot_seen = 1;
2463 }
2464
2465 // Clamp Q to upper and lower limits:
2466 q = clamp(q, q_low, q_high);
2467
2468 loop = q != last_q;
2469 } else {
2470 loop = 0;
2471 }
2472 }
2473
2474 // Special case for overlay frame.
2475 if (rc->is_src_frame_alt_ref &&
2476 rc->projected_frame_size < rc->max_frame_bandwidth)
2477 loop = 0;
2478
2479 if (loop) {
2480 loop_count++;
2481
2482 #if CONFIG_INTERNAL_STATS
2483 cpi->tot_recode_hits++;
2484 #endif
2485 }
2486 } while (loop);
2487 }
2488
2489 static void get_ref_frame_flags(VP9_COMP *cpi) {
2490 if (cpi->refresh_last_frame & cpi->refresh_golden_frame)
2491 cpi->gold_is_last = 1;
2492 else if (cpi->refresh_last_frame ^ cpi->refresh_golden_frame)
2493 cpi->gold_is_last = 0;
2494
2495 if (cpi->refresh_last_frame & cpi->refresh_alt_ref_frame)
2496 cpi->alt_is_last = 1;
2497 else if (cpi->refresh_last_frame ^ cpi->refresh_alt_ref_frame)
2498 cpi->alt_is_last = 0;
2499
2500 if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame)
2501 cpi->gold_is_alt = 1;
2502 else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame)
2503 cpi->gold_is_alt = 0;
2504
2505 cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
2506
2507 if (cpi->gold_is_last)
2508 cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
2509
2510 if (cpi->rc.frames_till_gf_update_due == INT_MAX)
2511 cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
2512
2513 if (cpi->alt_is_last)
2514 cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
2515
2516 if (cpi->gold_is_alt)
2517 cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
2518 }
2519
2520 static void set_ext_overrides(VP9_COMP *cpi) {
2521 // Overrides the defaults with the externally supplied values with
2522 // vp9_update_reference() and vp9_update_entropy() calls
2523 // Note: The overrides are valid only for the next frame passed
2524 // to encode_frame_to_data_rate() function
2525 if (cpi->ext_refresh_frame_context_pending) {
2526 cpi->common.refresh_frame_context = cpi->ext_refresh_frame_context;
2527 cpi->ext_refresh_frame_context_pending = 0;
2528 }
2529 if (cpi->ext_refresh_frame_flags_pending) {
2530 cpi->refresh_last_frame = cpi->ext_refresh_last_frame;
2531 cpi->refresh_golden_frame = cpi->ext_refresh_golden_frame;
2532 cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame;
2533 cpi->ext_refresh_frame_flags_pending = 0;
2534 }
2535 }
2536
2537 static void encode_frame_to_data_rate(VP9_COMP *cpi,
2538 size_t *size,
2539 uint8_t *dest,
2540 unsigned int *frame_flags) {
2541 VP9_COMMON *const cm = &cpi->common;
2542 TX_SIZE t;
2543 int q;
2544 int top_index;
2545 int bottom_index;
2546
2547 const SPEED_FEATURES *const sf = &cpi->sf;
2548 const unsigned int max_mv_def = MIN(cm->width, cm->height);
2549 struct segmentation *const seg = &cm->seg;
2550
2551 set_ext_overrides(cpi);
2552
2553 /* Scale the source buffer, if required. */
2554 if (cm->mi_cols * MI_SIZE != cpi->un_scaled_source->y_width ||
2555 cm->mi_rows * MI_SIZE != cpi->un_scaled_source->y_height) {
2556 scale_and_extend_frame_nonnormative(cpi->un_scaled_source,
2557 &cpi->scaled_source);
2558 cpi->Source = &cpi->scaled_source;
2559 } else {
2560 cpi->Source = cpi->un_scaled_source;
2561 }
2562
2563 // Scale the last source buffer, if required.
2564 if (cpi->unscaled_last_source != NULL) {
2565 if (cm->mi_cols * MI_SIZE != cpi->unscaled_last_source->y_width ||
2566 cm->mi_rows * MI_SIZE != cpi->unscaled_last_source->y_height) {
2567 scale_and_extend_frame_nonnormative(cpi->unscaled_last_source,
2568 &cpi->scaled_last_source);
2569 cpi->Last_Source = &cpi->scaled_last_source;
2570 } else {
2571 cpi->Last_Source = cpi->unscaled_last_source;
2572 }
2573 }
2574
2575 vp9_scale_references(cpi);
2576
2577 vp9_clear_system_state();
2578
2579 // Enable or disable mode based tweaking of the zbin.
2580 // For 2 pass only used where GF/ARF prediction quality
2581 // is above a threshold.
2582 cpi->zbin_mode_boost = 0;
2583 cpi->zbin_mode_boost_enabled = 0;
2584
2585 // Current default encoder behavior for the altref sign bias.
2586 cm->ref_frame_sign_bias[ALTREF_FRAME] = cpi->rc.source_alt_ref_active;
2587
2588 // Set default state for segment based loop filter update flags.
2589 cm->lf.mode_ref_delta_update = 0;
2590
2591 // Initialize cpi->mv_step_param to default based on max resolution.
2592 cpi->mv_step_param = vp9_init_search_range(cpi, max_mv_def);
2593 // Initialize cpi->max_mv_magnitude and cpi->mv_step_param if appropriate.
2594 if (sf->auto_mv_step_size) {
2595 if (frame_is_intra_only(cm)) {
2596 // Initialize max_mv_magnitude for use in the first INTER frame
2597 // after a key/intra-only frame.
2598 cpi->max_mv_magnitude = max_mv_def;
2599 } else {
2600 if (cm->show_frame)
2601 // Allow mv_steps to correspond to twice the max mv magnitude found
2602 // in the previous frame, capped by the default max_mv_magnitude based
2603 // on resolution.
2604 cpi->mv_step_param = vp9_init_search_range(cpi, MIN(max_mv_def, 2 *
2605 cpi->max_mv_magnitude));
2606 cpi->max_mv_magnitude = 0;
2607 }
2608 }
2609
2610 // Set various flags etc to special state if it is a key frame.
2611 if (frame_is_intra_only(cm)) {
2612 setup_key_frame(cpi);
2613 // Reset the loop filter deltas and segmentation map.
2614 vp9_reset_segment_features(&cm->seg);
2615
2616 // If segmentation is enabled force a map update for key frames.
2617 if (seg->enabled) {
2618 seg->update_map = 1;
2619 seg->update_data = 1;
2620 }
2621
2622 // The alternate reference frame cannot be active for a key frame.
2623 cpi->rc.source_alt_ref_active = 0;
2624
2625 cm->error_resilient_mode = (cpi->oxcf.error_resilient_mode != 0);
2626 cm->frame_parallel_decoding_mode =
2627 (cpi->oxcf.frame_parallel_decoding_mode != 0);
2628
2629 // By default, encoder assumes decoder can use prev_mi.
2630 cm->coding_use_prev_mi = 1;
2631 if (cm->error_resilient_mode) {
2632 cm->coding_use_prev_mi = 0;
2633 cm->frame_parallel_decoding_mode = 1;
2634 cm->reset_frame_context = 0;
2635 cm->refresh_frame_context = 0;
2636 } else if (cm->intra_only) {
2637 // Only reset the current context.
2638 cm->reset_frame_context = 2;
2639 }
2640 }
2641
2642 // Configure experimental use of segmentation for enhanced coding of
2643 // static regions if indicated.
2644 // Only allowed in second pass of two pass (as requires lagged coding)
2645 // and if the relevant speed feature flag is set.
2646 if (cpi->pass == 2 && cpi->sf.static_segmentation)
2647 configure_static_seg_features(cpi);
2648
2649 // For 1 pass CBR, check if we are dropping this frame.
2650 // Never drop on key frame.
2651 if (cpi->pass == 0 &&
2652 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
2653 cm->frame_type != KEY_FRAME) {
2654 if (vp9_rc_drop_frame(cpi)) {
2655 vp9_rc_postencode_update_drop_frame(cpi);
2656 ++cm->current_video_frame;
2657 return;
2658 }
2659 }
2660
2661 vp9_clear_system_state();
2662
2663 vp9_zero(cpi->rd_tx_select_threshes);
2664
2665 #if CONFIG_VP9_POSTPROC
2666 if (cpi->oxcf.noise_sensitivity > 0) {
2667 int l = 0;
2668 switch (cpi->oxcf.noise_sensitivity) {
2669 case 1:
2670 l = 20;
2671 break;
2672 case 2:
2673 l = 40;
2674 break;
2675 case 3:
2676 l = 60;
2677 break;
2678 case 4:
2679 case 5:
2680 l = 100;
2681 break;
2682 case 6:
2683 l = 150;
2684 break;
2685 }
2686 vp9_denoise(cpi->Source, cpi->Source, l);
2687 }
2688 #endif
2689
2690 #ifdef OUTPUT_YUV_SRC
2691 vp9_write_yuv_frame(cpi->Source);
2692 #endif
2693
2694 set_speed_features(cpi);
2695
2696 // Decide q and q bounds.
2697 q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index);
2698
2699 if (!frame_is_intra_only(cm)) {
2700 cm->interp_filter = DEFAULT_INTERP_FILTER;
2701 /* TODO: Decide this more intelligently */
2702 set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH);
2703 }
2704
2705 if (cpi->sf.recode_loop == DISALLOW_RECODE) {
2706 encode_without_recode_loop(cpi, size, dest, q);
2707 } else {
2708 encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index);
2709 }
2710
2711 // Special case code to reduce pulsing when key frames are forced at a
2712 // fixed interval. Note the reconstruction error if it is the frame before
2713 // the force key frame
2714 if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
2715 cpi->ambient_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
2716 }
2717
2718 // If the encoder forced a KEY_FRAME decision
2719 if (cm->frame_type == KEY_FRAME)
2720 cpi->refresh_last_frame = 1;
2721
2722 cm->frame_to_show = get_frame_new_buffer(cm);
2723
2724 #if WRITE_RECON_BUFFER
2725 if (cm->show_frame)
2726 write_cx_frame_to_file(cm->frame_to_show,
2727 cm->current_video_frame);
2728 else
2729 write_cx_frame_to_file(cm->frame_to_show,
2730 cm->current_video_frame + 1000);
2731 #endif
2732
2733 // Pick the loop filter level for the frame.
2734 loopfilter_frame(cpi, cm);
2735
2736 #if WRITE_RECON_BUFFER
2737 if (cm->show_frame)
2738 write_cx_frame_to_file(cm->frame_to_show,
2739 cm->current_video_frame + 2000);
2740 else
2741 write_cx_frame_to_file(cm->frame_to_show,
2742 cm->current_video_frame + 3000);
2743 #endif
2744
2745 // build the bitstream
2746 cpi->dummy_packing = 0;
2747 vp9_pack_bitstream(cpi, dest, size);
2748
2749 if (cm->seg.update_map)
2750 update_reference_segmentation_map(cpi);
2751
2752 release_scaled_references(cpi);
2753 vp9_update_reference_frames(cpi);
2754
2755 for (t = TX_4X4; t <= TX_32X32; t++)
2756 full_to_model_counts(cm->counts.coef[t], cpi->coef_counts[t]);
2757
2758 if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode)
2759 vp9_adapt_coef_probs(cm);
2760
2761 if (!frame_is_intra_only(cm)) {
2762 if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) {
2763 vp9_adapt_mode_probs(cm);
2764 vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv);
2765 }
2766 }
2767
2768 #if 0
2769 output_frame_level_debug_stats(cpi);
2770 #endif
2771 if (cpi->refresh_golden_frame == 1)
2772 cm->frame_flags |= FRAMEFLAGS_GOLDEN;
2773 else
2774 cm->frame_flags &= ~FRAMEFLAGS_GOLDEN;
2775
2776 if (cpi->refresh_alt_ref_frame == 1)
2777 cm->frame_flags |= FRAMEFLAGS_ALTREF;
2778 else
2779 cm->frame_flags &= ~FRAMEFLAGS_ALTREF;
2780
2781 get_ref_frame_flags(cpi);
2782
2783 vp9_rc_postencode_update(cpi, *size);
2784
2785 if (cm->frame_type == KEY_FRAME) {
2786 // Tell the caller that the frame was coded as a key frame
2787 *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
2788
2789 #if CONFIG_MULTIPLE_ARF
2790 // Reset the sequence number.
2791 if (cpi->multi_arf_enabled) {
2792 cpi->sequence_number = 0;
2793 cpi->frame_coding_order_period = cpi->new_frame_coding_order_period;
2794 cpi->new_frame_coding_order_period = -1;
2795 }
2796 #endif
2797 } else {
2798 *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
2799
2800 #if CONFIG_MULTIPLE_ARF
2801 /* Increment position in the coded frame sequence. */
2802 if (cpi->multi_arf_enabled) {
2803 ++cpi->sequence_number;
2804 if (cpi->sequence_number >= cpi->frame_coding_order_period) {
2805 cpi->sequence_number = 0;
2806 cpi->frame_coding_order_period = cpi->new_frame_coding_order_period;
2807 cpi->new_frame_coding_order_period = -1;
2808 }
2809 cpi->this_frame_weight = cpi->arf_weight[cpi->sequence_number];
2810 assert(cpi->this_frame_weight >= 0);
2811 }
2812 #endif
2813 }
2814
2815 // Clear the one shot update flags for segmentation map and mode/ref loop
2816 // filter deltas.
2817 cm->seg.update_map = 0;
2818 cm->seg.update_data = 0;
2819 cm->lf.mode_ref_delta_update = 0;
2820
2821 // keep track of the last coded dimensions
2822 cm->last_width = cm->width;
2823 cm->last_height = cm->height;
2824
2825 // reset to normal state now that we are done.
2826 if (!cm->show_existing_frame)
2827 cm->last_show_frame = cm->show_frame;
2828
2829 if (cm->show_frame) {
2830 vp9_swap_mi_and_prev_mi(cm);
2831
2832 // Don't increment frame counters if this was an altref buffer
2833 // update not a real frame
2834 ++cm->current_video_frame;
2835 if (cpi->use_svc) {
2836 LAYER_CONTEXT *lc;
2837 if (cpi->svc.number_temporal_layers > 1) {
2838 lc = &cpi->svc.layer_context[cpi->svc.temporal_layer_id];
2839 } else {
2840 lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id];
2841 }
2842 ++lc->current_video_frame_in_layer;
2843 }
2844 }
2845
2846 // restore prev_mi
2847 cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
2848 cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
2849 }
2850
2851 static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2852 unsigned int *frame_flags) {
2853 vp9_rc_get_svc_params(cpi);
2854 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2855 }
2856
2857 static void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2858 unsigned int *frame_flags) {
2859 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
2860 vp9_rc_get_one_pass_cbr_params(cpi);
2861 } else {
2862 vp9_rc_get_one_pass_vbr_params(cpi);
2863 }
2864 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2865 }
2866
2867 static void Pass1Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2868 unsigned int *frame_flags) {
2869 (void) size;
2870 (void) dest;
2871 (void) frame_flags;
2872
2873 vp9_rc_get_first_pass_params(cpi);
2874 vp9_set_quantizer(&cpi->common, find_fp_qindex());
2875 vp9_first_pass(cpi);
2876 }
2877
2878 static void Pass2Encode(VP9_COMP *cpi, size_t *size,
2879 uint8_t *dest, unsigned int *frame_flags) {
2880 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
2881
2882 vp9_rc_get_second_pass_params(cpi);
2883 encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2884
2885 vp9_twopass_postencode_update(cpi);
2886 }
2887
2888 static void check_initial_width(VP9_COMP *cpi, int subsampling_x,
2889 int subsampling_y) {
2890 VP9_COMMON *const cm = &cpi->common;
2891
2892 if (!cpi->initial_width) {
2893 cm->subsampling_x = subsampling_x;
2894 cm->subsampling_y = subsampling_y;
2895 alloc_raw_frame_buffers(cpi);
2896 cpi->initial_width = cm->width;
2897 cpi->initial_height = cm->height;
2898 }
2899 }
2900
2901
2902 int vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags,
2903 YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
2904 int64_t end_time) {
2905 VP9_COMMON *cm = &cpi->common;
2906 struct vpx_usec_timer timer;
2907 int res = 0;
2908 const int subsampling_x = sd->uv_width < sd->y_width;
2909 const int subsampling_y = sd->uv_height < sd->y_height;
2910
2911 check_initial_width(cpi, subsampling_x, subsampling_y);
2912 vpx_usec_timer_start(&timer);
2913 if (vp9_lookahead_push(cpi->lookahead,
2914 sd, time_stamp, end_time, frame_flags))
2915 res = -1;
2916 vpx_usec_timer_mark(&timer);
2917 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
2918
2919 if (cm->version == 0 && (subsampling_x != 1 || subsampling_y != 1)) {
2920 vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
2921 "Non-4:2:0 color space requires profile >= 1");
2922 res = -1;
2923 }
2924
2925 return res;
2926 }
2927
2928
2929 static int frame_is_reference(const VP9_COMP *cpi) {
2930 const VP9_COMMON *cm = &cpi->common;
2931
2932 return cm->frame_type == KEY_FRAME ||
2933 cpi->refresh_last_frame ||
2934 cpi->refresh_golden_frame ||
2935 cpi->refresh_alt_ref_frame ||
2936 cm->refresh_frame_context ||
2937 cm->lf.mode_ref_delta_update ||
2938 cm->seg.update_map ||
2939 cm->seg.update_data;
2940 }
2941
2942 #if CONFIG_MULTIPLE_ARF
2943 int is_next_frame_arf(VP9_COMP *cpi) {
2944 // Negative entry in frame_coding_order indicates an ARF at this position.
2945 return cpi->frame_coding_order[cpi->sequence_number + 1] < 0 ? 1 : 0;
2946 }
2947 #endif
2948
2949 void adjust_frame_rate(VP9_COMP *cpi) {
2950 int64_t this_duration;
2951 int step = 0;
2952
2953 if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
2954 this_duration = cpi->source->ts_end - cpi->source->ts_start;
2955 step = 1;
2956 } else {
2957 int64_t last_duration = cpi->last_end_time_stamp_seen
2958 - cpi->last_time_stamp_seen;
2959
2960 this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
2961
2962 // do a step update if the duration changes by 10%
2963 if (last_duration)
2964 step = (int)((this_duration - last_duration) * 10 / last_duration);
2965 }
2966
2967 if (this_duration) {
2968 if (step) {
2969 vp9_new_framerate(cpi, 10000000.0 / this_duration);
2970 } else {
2971 // Average this frame's rate into the last second's average
2972 // frame rate. If we haven't seen 1 second yet, then average
2973 // over the whole interval seen.
2974 const double interval = MIN((double)(cpi->source->ts_end
2975 - cpi->first_time_stamp_ever), 10000000.0);
2976 double avg_duration = 10000000.0 / cpi->oxcf.framerate;
2977 avg_duration *= (interval - avg_duration + this_duration);
2978 avg_duration /= interval;
2979
2980 vp9_new_framerate(cpi, 10000000.0 / avg_duration);
2981 }
2982 }
2983 cpi->last_time_stamp_seen = cpi->source->ts_start;
2984 cpi->last_end_time_stamp_seen = cpi->source->ts_end;
2985 }
2986
2987 int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
2988 size_t *size, uint8_t *dest,
2989 int64_t *time_stamp, int64_t *time_end, int flush) {
2990 VP9_COMMON *const cm = &cpi->common;
2991 MACROBLOCKD *const xd = &cpi->mb.e_mbd;
2992 RATE_CONTROL *const rc = &cpi->rc;
2993 struct vpx_usec_timer cmptimer;
2994 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
2995 MV_REFERENCE_FRAME ref_frame;
2996
2997 if (!cpi)
2998 return -1;
2999
3000 if (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2) {
3001 vp9_restore_layer_context(cpi);
3002 }
3003
3004 vpx_usec_timer_start(&cmptimer);
3005
3006 cpi->source = NULL;
3007 cpi->last_source = NULL;
3008
3009 set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV);
3010
3011 // Normal defaults
3012 cm->reset_frame_context = 0;
3013 cm->refresh_frame_context = 1;
3014 cpi->refresh_last_frame = 1;
3015 cpi->refresh_golden_frame = 0;
3016 cpi->refresh_alt_ref_frame = 0;
3017
3018 // Should we code an alternate reference frame.
3019 if (cpi->oxcf.play_alternate && rc->source_alt_ref_pending) {
3020 int frames_to_arf;
3021
3022 #if CONFIG_MULTIPLE_ARF
3023 assert(!cpi->multi_arf_enabled ||
3024 cpi->frame_coding_order[cpi->sequence_number] < 0);
3025
3026 if (cpi->multi_arf_enabled && (cpi->pass == 2))
3027 frames_to_arf = (-cpi->frame_coding_order[cpi->sequence_number])
3028 - cpi->next_frame_in_order;
3029 else
3030 #endif
3031 frames_to_arf = rc->frames_till_gf_update_due;
3032
3033 assert(frames_to_arf <= rc->frames_to_key);
3034
3035 if ((cpi->source = vp9_lookahead_peek(cpi->lookahead, frames_to_arf))) {
3036 #if CONFIG_MULTIPLE_ARF
3037 cpi->alt_ref_source[cpi->arf_buffered] = cpi->source;
3038 #else
3039 cpi->alt_ref_source = cpi->source;
3040 #endif
3041
3042 if (cpi->oxcf.arnr_max_frames > 0) {
3043 // Produce the filtered ARF frame.
3044 // TODO(agrange) merge these two functions.
3045 vp9_configure_arnr_filter(cpi, frames_to_arf, rc->gfu_boost);
3046 vp9_temporal_filter_prepare(cpi, frames_to_arf);
3047 vp9_extend_frame_borders(&cpi->alt_ref_buffer);
3048 force_src_buffer = &cpi->alt_ref_buffer;
3049 }
3050
3051 cm->show_frame = 0;
3052 cpi->refresh_alt_ref_frame = 1;
3053 cpi->refresh_golden_frame = 0;
3054 cpi->refresh_last_frame = 0;
3055 rc->is_src_frame_alt_ref = 0;
3056
3057 #if CONFIG_MULTIPLE_ARF
3058 if (!cpi->multi_arf_enabled)
3059 #endif
3060 rc->source_alt_ref_pending = 0;
3061 } else {
3062 rc->source_alt_ref_pending = 0;
3063 }
3064 }
3065
3066 if (!cpi->source) {
3067 #if CONFIG_MULTIPLE_ARF
3068 int i;
3069 #endif
3070
3071 // Get last frame source.
3072 if (cm->current_video_frame > 0) {
3073 if ((cpi->last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL)
3074 return -1;
3075 }
3076
3077 if ((cpi->source = vp9_lookahead_pop(cpi->lookahead, flush))) {
3078 cm->show_frame = 1;
3079 cm->intra_only = 0;
3080
3081 #if CONFIG_MULTIPLE_ARF
3082 // Is this frame the ARF overlay.
3083 rc->is_src_frame_alt_ref = 0;
3084 for (i = 0; i < cpi->arf_buffered; ++i) {
3085 if (cpi->source == cpi->alt_ref_source[i]) {
3086 rc->is_src_frame_alt_ref = 1;
3087 cpi->refresh_golden_frame = 1;
3088 break;
3089 }
3090 }
3091 #else
3092 rc->is_src_frame_alt_ref = cpi->alt_ref_source &&
3093 (cpi->source == cpi->alt_ref_source);
3094 #endif
3095 if (rc->is_src_frame_alt_ref) {
3096 // Current frame is an ARF overlay frame.
3097 #if CONFIG_MULTIPLE_ARF
3098 cpi->alt_ref_source[i] = NULL;
3099 #else
3100 cpi->alt_ref_source = NULL;
3101 #endif
3102 // Don't refresh the last buffer for an ARF overlay frame. It will
3103 // become the GF so preserve last as an alternative prediction option.
3104 cpi->refresh_last_frame = 0;
3105 }
3106 #if CONFIG_MULTIPLE_ARF
3107 ++cpi->next_frame_in_order;
3108 #endif
3109 }
3110 }
3111
3112 if (cpi->source) {
3113 cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer
3114 : &cpi->source->img;
3115
3116 if (cpi->last_source != NULL) {
3117 cpi->unscaled_last_source = &cpi->last_source->img;
3118 } else {
3119 cpi->unscaled_last_source = NULL;
3120 }
3121
3122 *time_stamp = cpi->source->ts_start;
3123 *time_end = cpi->source->ts_end;
3124 *frame_flags = cpi->source->flags;
3125
3126 #if CONFIG_MULTIPLE_ARF
3127 if (cm->frame_type != KEY_FRAME && cpi->pass == 2)
3128 rc->source_alt_ref_pending = is_next_frame_arf(cpi);
3129 #endif
3130 } else {
3131 *size = 0;
3132 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
3133 vp9_end_first_pass(cpi); /* get last stats packet */
3134 cpi->twopass.first_pass_done = 1;
3135 }
3136 return -1;
3137 }
3138
3139 if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
3140 cpi->first_time_stamp_ever = cpi->source->ts_start;
3141 cpi->last_end_time_stamp_seen = cpi->source->ts_start;
3142 }
3143
3144 // adjust frame rates based on timestamps given
3145 if (cm->show_frame) {
3146 adjust_frame_rate(cpi);
3147 }
3148
3149 if (cpi->svc.number_temporal_layers > 1 &&
3150 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
3151 vp9_update_temporal_layer_framerate(cpi);
3152 vp9_restore_layer_context(cpi);
3153 }
3154
3155 // start with a 0 size frame
3156 *size = 0;
3157
3158 // Clear down mmx registers
3159 vp9_clear_system_state();
3160
3161 /* find a free buffer for the new frame, releasing the reference previously
3162 * held.
3163 */
3164 cm->frame_bufs[cm->new_fb_idx].ref_count--;
3165 cm->new_fb_idx = get_free_fb(cm);
3166
3167 #if CONFIG_MULTIPLE_ARF
3168 /* Set up the correct ARF frame. */
3169 if (cpi->refresh_alt_ref_frame) {
3170 ++cpi->arf_buffered;
3171 }
3172 if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
3173 (cpi->pass == 2)) {
3174 cpi->alt_fb_idx = cpi->arf_buffer_idx[cpi->sequence_number];
3175 }
3176 #endif
3177
3178 cm->frame_flags = *frame_flags;
3179
3180 // Reset the frame pointers to the current frame size
3181 vp9_realloc_frame_buffer(get_frame_new_buffer(cm),
3182 cm->width, cm->height,
3183 cm->subsampling_x, cm->subsampling_y,
3184 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
3185
3186 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
3187 const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
3188 YV12_BUFFER_CONFIG *const buf = &cm->frame_bufs[idx].buf;
3189 RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
3190 ref_buf->buf = buf;
3191 ref_buf->idx = idx;
3192 vp9_setup_scale_factors_for_frame(&ref_buf->sf,
3193 buf->y_crop_width, buf->y_crop_height,
3194 cm->width, cm->height);
3195
3196 if (vp9_is_scaled(&ref_buf->sf))
3197 vp9_extend_frame_borders(buf);
3198 }
3199
3200 set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
3201
3202 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
3203 vp9_vaq_init();
3204 }
3205
3206 if (cpi->pass == 1 &&
3207 (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
3208 Pass1Encode(cpi, size, dest, frame_flags);
3209 } else if (cpi->pass == 2 &&
3210 (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
3211 Pass2Encode(cpi, size, dest, frame_flags);
3212 } else if (cpi->use_svc) {
3213 SvcEncode(cpi, size, dest, frame_flags);
3214 } else {
3215 // One pass encode
3216 Pass0Encode(cpi, size, dest, frame_flags);
3217 }
3218
3219 if (cm->refresh_frame_context)
3220 cm->frame_contexts[cm->frame_context_idx] = cm->fc;
3221
3222 // Frame was dropped, release scaled references.
3223 if (*size == 0) {
3224 release_scaled_references(cpi);
3225 }
3226
3227 if (*size > 0) {
3228 cpi->droppable = !frame_is_reference(cpi);
3229 }
3230
3231 // Save layer specific state.
3232 if ((cpi->svc.number_temporal_layers > 1 &&
3233 cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
3234 (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) {
3235 vp9_save_layer_context(cpi);
3236 }
3237
3238 vpx_usec_timer_mark(&cmptimer);
3239 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
3240
3241 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
3242 generate_psnr_packet(cpi);
3243
3244 #if CONFIG_INTERNAL_STATS
3245
3246 if (cpi->pass != 1) {
3247 cpi->bytes += (int)(*size);
3248
3249 if (cm->show_frame) {
3250 cpi->count++;
3251
3252 if (cpi->b_calculate_psnr) {
3253 YV12_BUFFER_CONFIG *orig = cpi->Source;
3254 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
3255 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
3256 PSNR_STATS psnr;
3257 calc_psnr(orig, recon, &psnr);
3258
3259 cpi->total += psnr.psnr[0];
3260 cpi->total_y += psnr.psnr[1];
3261 cpi->total_u += psnr.psnr[2];
3262 cpi->total_v += psnr.psnr[3];
3263 cpi->total_sq_error += psnr.sse[0];
3264 cpi->total_samples += psnr.samples[0];
3265
3266 {
3267 PSNR_STATS psnr2;
3268 double frame_ssim2 = 0, weight = 0;
3269 #if CONFIG_VP9_POSTPROC
3270 vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer,
3271 cm->lf.filter_level * 10 / 6);
3272 #endif
3273 vp9_clear_system_state();
3274
3275 calc_psnr(orig, pp, &psnr2);
3276
3277 cpi->totalp += psnr2.psnr[0];
3278 cpi->totalp_y += psnr2.psnr[1];
3279 cpi->totalp_u += psnr2.psnr[2];
3280 cpi->totalp_v += psnr2.psnr[3];
3281 cpi->totalp_sq_error += psnr2.sse[0];
3282 cpi->totalp_samples += psnr2.samples[0];
3283
3284 frame_ssim2 = vp9_calc_ssim(orig, recon, 1, &weight);
3285
3286 cpi->summed_quality += frame_ssim2 * weight;
3287 cpi->summed_weights += weight;
3288
3289 frame_ssim2 = vp9_calc_ssim(orig, &cm->post_proc_buffer, 1, &weight);
3290
3291 cpi->summedp_quality += frame_ssim2 * weight;
3292 cpi->summedp_weights += weight;
3293 #if 0
3294 {
3295 FILE *f = fopen("q_used.stt", "a");
3296 fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
3297 cpi->common.current_video_frame, y2, u2, v2,
3298 frame_psnr2, frame_ssim2);
3299 fclose(f);
3300 }
3301 #endif
3302 }
3303 }
3304
3305 if (cpi->b_calculate_ssimg) {
3306 double y, u, v, frame_all;
3307 frame_all = vp9_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, &v);
3308 cpi->total_ssimg_y += y;
3309 cpi->total_ssimg_u += u;
3310 cpi->total_ssimg_v += v;
3311 cpi->total_ssimg_all += frame_all;
3312 }
3313 }
3314 }
3315
3316 #endif
3317 return 0;
3318 }
3319
3320 int vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest,
3321 vp9_ppflags_t *flags) {
3322 VP9_COMMON *cm = &cpi->common;
3323
3324 if (!cm->show_frame) {
3325 return -1;
3326 } else {
3327 int ret;
3328 #if CONFIG_VP9_POSTPROC
3329 ret = vp9_post_proc_frame(cm, dest, flags);
3330 #else
3331
3332 if (cm->frame_to_show) {
3333 *dest = *cm->frame_to_show;
3334 dest->y_width = cm->width;
3335 dest->y_height = cm->height;
3336 dest->uv_width = cm->width >> cm->subsampling_x;
3337 dest->uv_height = cm->height >> cm->subsampling_y;
3338 ret = 0;
3339 } else {
3340 ret = -1;
3341 }
3342
3343 #endif // !CONFIG_VP9_POSTPROC
3344 vp9_clear_system_state();
3345 return ret;
3346 }
3347 }
3348
3349 int vp9_set_roimap(VP9_COMP *cpi, unsigned char *map, unsigned int rows,
3350 unsigned int cols, int delta_q[MAX_SEGMENTS],
3351 int delta_lf[MAX_SEGMENTS],
3352 unsigned int threshold[MAX_SEGMENTS]) {
3353 signed char feature_data[SEG_LVL_MAX][MAX_SEGMENTS];
3354 struct segmentation *seg = &cpi->common.seg;
3355 int i;
3356
3357 if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
3358 return -1;
3359
3360 if (!map) {
3361 vp9_disable_segmentation(seg);
3362 return 0;
3363 }
3364
3365 // Set the segmentation Map
3366 vp9_set_segmentation_map(cpi, map);
3367
3368 // Activate segmentation.
3369 vp9_enable_segmentation(seg);
3370
3371 // Set up the quant, LF and breakout threshold segment data
3372 for (i = 0; i < MAX_SEGMENTS; i++) {
3373 feature_data[SEG_LVL_ALT_Q][i] = delta_q[i];
3374 feature_data[SEG_LVL_ALT_LF][i] = delta_lf[i];
3375 cpi->segment_encode_breakout[i] = threshold[i];
3376 }
3377
3378 // Enable the loop and quant changes in the feature mask
3379 for (i = 0; i < MAX_SEGMENTS; i++) {
3380 if (delta_q[i])
3381 vp9_enable_segfeature(seg, i, SEG_LVL_ALT_Q);
3382 else
3383 vp9_disable_segfeature(seg, i, SEG_LVL_ALT_Q);
3384
3385 if (delta_lf[i])
3386 vp9_enable_segfeature(seg, i, SEG_LVL_ALT_LF);
3387 else
3388 vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF);
3389 }
3390
3391 // Initialize the feature data structure
3392 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
3393 vp9_set_segment_data(seg, &feature_data[0][0], SEGMENT_DELTADATA);
3394
3395 return 0;
3396 }
3397
3398 int vp9_set_active_map(VP9_COMP *cpi, unsigned char *map,
3399 unsigned int rows, unsigned int cols) {
3400 if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) {
3401 if (map) {
3402 vpx_memcpy(cpi->active_map, map, rows * cols);
3403 cpi->active_map_enabled = 1;
3404 } else {
3405 cpi->active_map_enabled = 0;
3406 }
3407
3408 return 0;
3409 } else {
3410 // cpi->active_map_enabled = 0;
3411 return -1;
3412 }
3413 }
3414
3415 int vp9_set_internal_size(VP9_COMP *cpi,
3416 VPX_SCALING horiz_mode, VPX_SCALING vert_mode) {
3417 VP9_COMMON *cm = &cpi->common;
3418 int hr = 0, hs = 0, vr = 0, vs = 0;
3419
3420 if (horiz_mode > ONETWO || vert_mode > ONETWO)
3421 return -1;
3422
3423 Scale2Ratio(horiz_mode, &hr, &hs);
3424 Scale2Ratio(vert_mode, &vr, &vs);
3425
3426 // always go to the next whole number
3427 cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs;
3428 cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs;
3429
3430 assert(cm->width <= cpi->initial_width);
3431 assert(cm->height <= cpi->initial_height);
3432 update_frame_size(cpi);
3433 return 0;
3434 }
3435
3436 int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width,
3437 unsigned int height) {
3438 VP9_COMMON *cm = &cpi->common;
3439
3440 check_initial_width(cpi, 1, 1);
3441
3442 if (width) {
3443 cm->width = width;
3444 if (cm->width * 5 < cpi->initial_width) {
3445 cm->width = cpi->initial_width / 5 + 1;
3446 printf("Warning: Desired width too small, changed to %d\n", cm->width);
3447 }
3448 if (cm->width > cpi->initial_width) {
3449 cm->width = cpi->initial_width;
3450 printf("Warning: Desired width too large, changed to %d\n", cm->width);
3451 }
3452 }
3453
3454 if (height) {
3455 cm->height = height;
3456 if (cm->height * 5 < cpi->initial_height) {
3457 cm->height = cpi->initial_height / 5 + 1;
3458 printf("Warning: Desired height too small, changed to %d\n", cm->height);
3459 }
3460 if (cm->height > cpi->initial_height) {
3461 cm->height = cpi->initial_height;
3462 printf("Warning: Desired height too large, changed to %d\n", cm->height);
3463 }
3464 }
3465
3466 assert(cm->width <= cpi->initial_width);
3467 assert(cm->height <= cpi->initial_height);
3468 update_frame_size(cpi);
3469 return 0;
3470 }
3471
3472 void vp9_set_svc(VP9_COMP *cpi, int use_svc) {
3473 cpi->use_svc = use_svc;
3474 return;
3475 }
3476
3477 int vp9_calc_ss_err(const YV12_BUFFER_CONFIG *source,
3478 const YV12_BUFFER_CONFIG *reference) {
3479 int i, j;
3480 int total = 0;
3481
3482 const uint8_t *src = source->y_buffer;
3483 const uint8_t *ref = reference->y_buffer;
3484
3485 // Loop through the Y plane raw and reconstruction data summing
3486 // (square differences)
3487 for (i = 0; i < source->y_height; i += 16) {
3488 for (j = 0; j < source->y_width; j += 16) {
3489 unsigned int sse;
3490 total += vp9_mse16x16(src + j, source->y_stride,
3491 ref + j, reference->y_stride, &sse);
3492 }
3493
3494 src += 16 * source->y_stride;
3495 ref += 16 * reference->y_stride;
3496 }
3497
3498 return total;
3499 }
3500
3501
3502 int vp9_get_quantizer(VP9_COMP *cpi) {
3503 return cpi->common.base_qindex;
3504 }
3505