Merge "vpxenc: add --aq-mode flag to control adaptive quantization"
[platform/upstream/libvpx.git] / vp9 / encoder / vp9_onyx_if.c
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
18 #include "vp9/common/vp9_alloccommon.h"
19 #include "vp9/common/vp9_filter.h"
20 #include "vp9/common/vp9_idct.h"
21 #if CONFIG_VP9_POSTPROC
22 #include "vp9/common/vp9_postproc.h"
23 #endif
24 #include "vp9/common/vp9_reconinter.h"
25 #include "vp9/common/vp9_systemdependent.h"
26 #include "vp9/common/vp9_tile_common.h"
27 #include "vp9/encoder/vp9_firstpass.h"
28 #include "vp9/encoder/vp9_mbgraph.h"
29 #include "vp9/encoder/vp9_onyx_int.h"
30 #include "vp9/encoder/vp9_picklpf.h"
31 #include "vp9/encoder/vp9_psnr.h"
32 #include "vp9/encoder/vp9_ratectrl.h"
33 #include "vp9/encoder/vp9_rdopt.h"
34 #include "vp9/encoder/vp9_segmentation.h"
35 #include "vp9/encoder/vp9_temporal_filter.h"
36 #include "vp9/encoder/vp9_vaq.h"
37
38 #include "vpx_ports/vpx_timer.h"
39
40
41 extern void print_tree_update_probs();
42
43 static void set_default_lf_deltas(struct loopfilter *lf);
44
45 #define DEFAULT_INTERP_FILTER SWITCHABLE
46
47 #define SHARP_FILTER_QTHRESH 0          /* Q threshold for 8-tap sharp filter */
48
49 #define ALTREF_HIGH_PRECISION_MV 1      // Whether to use high precision mv
50                                          //  for altref computation.
51 #define HIGH_PRECISION_MV_QTHRESH 200   // Q threshold for high precision
52                                          // mv. Choose a very high value for
53                                          // now so that HIGH_PRECISION is always
54                                          // chosen.
55
56 // Masks for partially or completely disabling split mode
57 #define DISABLE_ALL_SPLIT         0x3F
58 #define DISABLE_ALL_INTER_SPLIT   0x1F
59 #define DISABLE_COMPOUND_SPLIT    0x18
60 #define LAST_AND_INTRA_SPLIT_ONLY 0x1E
61
62 #if CONFIG_INTERNAL_STATS
63 extern double vp9_calc_ssim(YV12_BUFFER_CONFIG *source,
64                             YV12_BUFFER_CONFIG *dest, int lumamask,
65                             double *weight);
66
67
68 extern double vp9_calc_ssimg(YV12_BUFFER_CONFIG *source,
69                              YV12_BUFFER_CONFIG *dest, double *ssim_y,
70                              double *ssim_u, double *ssim_v);
71
72
73 #endif
74
75 // #define OUTPUT_YUV_REC
76
77 #ifdef OUTPUT_YUV_SRC
78 FILE *yuv_file;
79 #endif
80 #ifdef OUTPUT_YUV_REC
81 FILE *yuv_rec_file;
82 #endif
83
84 #if 0
85 FILE *framepsnr;
86 FILE *kf_list;
87 FILE *keyfile;
88 #endif
89
90
91 #ifdef ENTROPY_STATS
92 extern int intra_mode_stats[INTRA_MODES]
93                            [INTRA_MODES]
94                            [INTRA_MODES];
95 #endif
96
97 #ifdef MODE_STATS
98 extern void init_tx_count_stats();
99 extern void write_tx_count_stats();
100 extern void init_switchable_interp_stats();
101 extern void write_switchable_interp_stats();
102 #endif
103
104 #ifdef SPEEDSTATS
105 unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106                                     0, 0, 0};
107 #endif
108
109 #if defined(SECTIONBITS_OUTPUT)
110 extern unsigned __int64 Sectionbits[500];
111 #endif
112
113 extern void vp9_init_quantizer(VP9_COMP *cpi);
114
115 // Tables relating active max Q to active min Q
116 static int kf_low_motion_minq[QINDEX_RANGE];
117 static int kf_high_motion_minq[QINDEX_RANGE];
118 static int gf_low_motion_minq[QINDEX_RANGE];
119 static int gf_high_motion_minq[QINDEX_RANGE];
120 static int inter_minq[QINDEX_RANGE];
121 static int afq_low_motion_minq[QINDEX_RANGE];
122 static int afq_high_motion_minq[QINDEX_RANGE];
123
124 static INLINE void Scale2Ratio(int mode, int *hr, int *hs) {
125   switch (mode) {
126     case NORMAL:
127       *hr = 1;
128       *hs = 1;
129       break;
130     case FOURFIVE:
131       *hr = 4;
132       *hs = 5;
133       break;
134     case THREEFIVE:
135       *hr = 3;
136       *hs = 5;
137     break;
138     case ONETWO:
139       *hr = 1;
140       *hs = 2;
141     break;
142     default:
143       *hr = 1;
144       *hs = 1;
145        assert(0);
146       break;
147   }
148 }
149
150 // Functions to compute the active minq lookup table entries based on a
151 // formulaic approach to facilitate easier adjustment of the Q tables.
152 // The formulae were derived from computing a 3rd order polynomial best
153 // fit to the original data (after plotting real maxq vs minq (not q index))
154 static int calculate_minq_index(double maxq,
155                                 double x3, double x2, double x1, double c) {
156   int i;
157   const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq + c,
158                                 maxq);
159
160   // Special case handling to deal with the step from q2.0
161   // down to lossless mode represented by q 1.0.
162   if (minqtarget <= 2.0)
163     return 0;
164
165   for (i = 0; i < QINDEX_RANGE; i++) {
166     if (minqtarget <= vp9_convert_qindex_to_q(i))
167       return i;
168   }
169
170   return QINDEX_RANGE - 1;
171 }
172
173 static void init_minq_luts(void) {
174   int i;
175
176   for (i = 0; i < QINDEX_RANGE; i++) {
177     const double maxq = vp9_convert_qindex_to_q(i);
178
179
180     kf_low_motion_minq[i] = calculate_minq_index(maxq,
181                                                  0.000001,
182                                                  -0.0004,
183                                                  0.15,
184                                                  0.0);
185     kf_high_motion_minq[i] = calculate_minq_index(maxq,
186                                                   0.000002,
187                                                   -0.0012,
188                                                   0.5,
189                                                   0.0);
190
191     gf_low_motion_minq[i] = calculate_minq_index(maxq,
192                                                  0.0000015,
193                                                  -0.0009,
194                                                  0.32,
195                                                  0.0);
196     gf_high_motion_minq[i] = calculate_minq_index(maxq,
197                                                   0.0000021,
198                                                   -0.00125,
199                                                   0.50,
200                                                   0.0);
201     inter_minq[i] = calculate_minq_index(maxq,
202                                          0.00000271,
203                                          -0.00113,
204                                          0.75,
205                                          0.0);
206     afq_low_motion_minq[i] = calculate_minq_index(maxq,
207                                                   0.0000015,
208                                                   -0.0009,
209                                                   0.33,
210                                                   0.0);
211     afq_high_motion_minq[i] = calculate_minq_index(maxq,
212                                                    0.0000021,
213                                                    -0.00125,
214                                                    0.55,
215                                                    0.0);
216   }
217 }
218
219 static int get_active_quality(int q,
220                               int gfu_boost,
221                               int low,
222                               int high,
223                               int *low_motion_minq,
224                               int *high_motion_minq) {
225   int active_best_quality;
226   if (gfu_boost > high) {
227     active_best_quality = low_motion_minq[q];
228   } else if (gfu_boost < low) {
229     active_best_quality = high_motion_minq[q];
230   } else {
231     const int gap = high - low;
232     const int offset = high - gfu_boost;
233     const int qdiff = high_motion_minq[q] - low_motion_minq[q];
234     const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap;
235     active_best_quality = low_motion_minq[q] + adjustment;
236   }
237   return active_best_quality;
238 }
239
240 static void set_mvcost(VP9_COMP *cpi) {
241   MACROBLOCK *const mb = &cpi->mb;
242   if (cpi->common.allow_high_precision_mv) {
243     mb->mvcost = mb->nmvcost_hp;
244     mb->mvsadcost = mb->nmvsadcost_hp;
245   } else {
246     mb->mvcost = mb->nmvcost;
247     mb->mvsadcost = mb->nmvsadcost;
248   }
249 }
250
251 void vp9_initialize_enc() {
252   static int init_done = 0;
253
254   if (!init_done) {
255     vp9_initialize_common();
256     vp9_tokenize_initialize();
257     vp9_init_quant_tables();
258     vp9_init_me_luts();
259     init_minq_luts();
260     // init_base_skip_probs();
261     init_done = 1;
262   }
263 }
264
265 static void setup_features(VP9_COMMON *cm) {
266   struct loopfilter *const lf = &cm->lf;
267   struct segmentation *const seg = &cm->seg;
268
269   // Set up default state for MB feature flags
270   seg->enabled = 0;
271
272   seg->update_map = 0;
273   seg->update_data = 0;
274   vpx_memset(seg->tree_probs, 255, sizeof(seg->tree_probs));
275
276   vp9_clearall_segfeatures(seg);
277
278   lf->mode_ref_delta_enabled = 0;
279   lf->mode_ref_delta_update = 0;
280   vp9_zero(lf->ref_deltas);
281   vp9_zero(lf->mode_deltas);
282   vp9_zero(lf->last_ref_deltas);
283   vp9_zero(lf->last_mode_deltas);
284
285   set_default_lf_deltas(lf);
286 }
287
288 static void dealloc_compressor_data(VP9_COMP *cpi) {
289   // Delete sementation map
290   vpx_free(cpi->segmentation_map);
291   cpi->segmentation_map = 0;
292   vpx_free(cpi->common.last_frame_seg_map);
293   cpi->common.last_frame_seg_map = 0;
294   vpx_free(cpi->coding_context.last_frame_seg_map_copy);
295   cpi->coding_context.last_frame_seg_map_copy = 0;
296
297   vpx_free(cpi->active_map);
298   cpi->active_map = 0;
299
300   vp9_free_frame_buffers(&cpi->common);
301
302   vp9_free_frame_buffer(&cpi->last_frame_uf);
303   vp9_free_frame_buffer(&cpi->scaled_source);
304   vp9_free_frame_buffer(&cpi->alt_ref_buffer);
305   vp9_lookahead_destroy(cpi->lookahead);
306
307   vpx_free(cpi->tok);
308   cpi->tok = 0;
309
310   // Activity mask based per mb zbin adjustments
311   vpx_free(cpi->mb_activity_map);
312   cpi->mb_activity_map = 0;
313   vpx_free(cpi->mb_norm_activity_map);
314   cpi->mb_norm_activity_map = 0;
315
316   vpx_free(cpi->above_context[0]);
317   cpi->above_context[0] = NULL;
318
319   vpx_free(cpi->above_seg_context);
320   cpi->above_seg_context = NULL;
321 }
322
323 // Computes a q delta (in "q index" terms) to get from a starting q value
324 // to a target value
325 // target q value
326 int vp9_compute_qdelta(VP9_COMP *cpi, double qstart, double qtarget) {
327   int i;
328   int start_index = cpi->worst_quality;
329   int target_index = cpi->worst_quality;
330
331   // Convert the average q value to an index.
332   for (i = cpi->best_quality; i < cpi->worst_quality; i++) {
333     start_index = i;
334     if (vp9_convert_qindex_to_q(i) >= qstart)
335       break;
336   }
337
338   // Convert the q target to an index
339   for (i = cpi->best_quality; i < cpi->worst_quality; i++) {
340     target_index = i;
341     if (vp9_convert_qindex_to_q(i) >= qtarget)
342       break;
343   }
344
345   return target_index - start_index;
346 }
347
348 static void configure_static_seg_features(VP9_COMP *cpi) {
349   VP9_COMMON *cm = &cpi->common;
350   struct segmentation *seg = &cm->seg;
351
352   int high_q = (int)(cpi->avg_q > 48.0);
353   int qi_delta;
354
355   // Disable and clear down for KF
356   if (cm->frame_type == KEY_FRAME) {
357     // Clear down the global segmentation map
358     vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
359     seg->update_map = 0;
360     seg->update_data = 0;
361     cpi->static_mb_pct = 0;
362
363     // Disable segmentation
364     vp9_disable_segmentation((VP9_PTR)cpi);
365
366     // Clear down the segment features.
367     vp9_clearall_segfeatures(seg);
368   } else if (cpi->refresh_alt_ref_frame) {
369     // If this is an alt ref frame
370     // Clear down the global segmentation map
371     vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
372     seg->update_map = 0;
373     seg->update_data = 0;
374     cpi->static_mb_pct = 0;
375
376     // Disable segmentation and individual segment features by default
377     vp9_disable_segmentation((VP9_PTR)cpi);
378     vp9_clearall_segfeatures(seg);
379
380     // Scan frames from current to arf frame.
381     // This function re-enables segmentation if appropriate.
382     vp9_update_mbgraph_stats(cpi);
383
384     // If segmentation was enabled set those features needed for the
385     // arf itself.
386     if (seg->enabled) {
387       seg->update_map = 1;
388       seg->update_data = 1;
389
390       qi_delta = vp9_compute_qdelta(cpi, cpi->avg_q, (cpi->avg_q * 0.875));
391       vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, (qi_delta - 2));
392       vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
393
394       vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
395       vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
396
397       // Where relevant assume segment data is delta data
398       seg->abs_delta = SEGMENT_DELTADATA;
399     }
400   } else if (seg->enabled) {
401     // All other frames if segmentation has been enabled
402
403     // First normal frame in a valid gf or alt ref group
404     if (cpi->frames_since_golden == 0) {
405       // Set up segment features for normal frames in an arf group
406       if (cpi->source_alt_ref_active) {
407         seg->update_map = 0;
408         seg->update_data = 1;
409         seg->abs_delta = SEGMENT_DELTADATA;
410
411         qi_delta = vp9_compute_qdelta(cpi, cpi->avg_q,
412                                       (cpi->avg_q * 1.125));
413         vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, (qi_delta + 2));
414         vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
415
416         vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
417         vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
418
419         // Segment coding disabled for compred testing
420         if (high_q || (cpi->static_mb_pct == 100)) {
421           vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
422           vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
423           vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
424         }
425       } else {
426         // Disable segmentation and clear down features if alt ref
427         // is not active for this group
428
429         vp9_disable_segmentation((VP9_PTR)cpi);
430
431         vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
432
433         seg->update_map = 0;
434         seg->update_data = 0;
435
436         vp9_clearall_segfeatures(seg);
437       }
438     } else if (cpi->is_src_frame_alt_ref) {
439       // Special case where we are coding over the top of a previous
440       // alt ref frame.
441       // Segment coding disabled for compred testing
442
443       // Enable ref frame features for segment 0 as well
444       vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME);
445       vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
446
447       // All mbs should use ALTREF_FRAME
448       vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME);
449       vp9_set_segdata(seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
450       vp9_clear_segdata(seg, 1, SEG_LVL_REF_FRAME);
451       vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
452
453       // Skip all MBs if high Q (0,0 mv and skip coeffs)
454       if (high_q) {
455         vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
456         vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
457       }
458       // Enable data update
459       seg->update_data = 1;
460     } else {
461       // All other frames.
462
463       // No updates.. leave things as they are.
464       seg->update_map = 0;
465       seg->update_data = 0;
466     }
467   }
468 }
469
470 #ifdef ENTROPY_STATS
471 void vp9_update_mode_context_stats(VP9_COMP *cpi) {
472   VP9_COMMON *cm = &cpi->common;
473   int i, j;
474   unsigned int (*inter_mode_counts)[INTER_MODES - 1][2] =
475       cm->fc.inter_mode_counts;
476   int64_t (*mv_ref_stats)[INTER_MODES - 1][2] = cpi->mv_ref_stats;
477   FILE *f;
478
479   // Read the past stats counters
480   f = fopen("mode_context.bin",  "rb");
481   if (!f) {
482     vpx_memset(cpi->mv_ref_stats, 0, sizeof(cpi->mv_ref_stats));
483   } else {
484     fread(cpi->mv_ref_stats, sizeof(cpi->mv_ref_stats), 1, f);
485     fclose(f);
486   }
487
488   // Add in the values for this frame
489   for (i = 0; i < INTER_MODE_CONTEXTS; i++) {
490     for (j = 0; j < INTER_MODES - 1; j++) {
491       mv_ref_stats[i][j][0] += (int64_t)inter_mode_counts[i][j][0];
492       mv_ref_stats[i][j][1] += (int64_t)inter_mode_counts[i][j][1];
493     }
494   }
495
496   // Write back the accumulated stats
497   f = fopen("mode_context.bin",  "wb");
498   fwrite(cpi->mv_ref_stats, sizeof(cpi->mv_ref_stats), 1, f);
499   fclose(f);
500 }
501
502 void print_mode_context(VP9_COMP *cpi) {
503   FILE *f = fopen("vp9_modecont.c", "a");
504   int i, j;
505
506   fprintf(f, "#include \"vp9_entropy.h\"\n");
507   fprintf(
508       f,
509       "const int inter_mode_probs[INTER_MODE_CONTEXTS][INTER_MODES - 1] =");
510   fprintf(f, "{\n");
511   for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
512     fprintf(f, "  {/* %d */ ", j);
513     fprintf(f, "    ");
514     for (i = 0; i < INTER_MODES - 1; i++) {
515       int this_prob;
516       int64_t count = cpi->mv_ref_stats[j][i][0] + cpi->mv_ref_stats[j][i][1];
517       if (count)
518         this_prob = ((cpi->mv_ref_stats[j][i][0] * 256) + (count >> 1)) / count;
519       else
520         this_prob = 128;
521
522       // context probs
523       fprintf(f, "%5d, ", this_prob);
524     }
525     fprintf(f, "  },\n");
526   }
527
528   fprintf(f, "};\n");
529   fclose(f);
530 }
531 #endif  // ENTROPY_STATS
532
533 // DEBUG: Print out the segment id of each MB in the current frame.
534 static void print_seg_map(VP9_COMP *cpi) {
535   VP9_COMMON *cm = &cpi->common;
536   int row, col;
537   int map_index = 0;
538   FILE *statsfile = fopen("segmap.stt", "a");
539
540   fprintf(statsfile, "%10d\n", cm->current_video_frame);
541
542   for (row = 0; row < cpi->common.mi_rows; row++) {
543     for (col = 0; col < cpi->common.mi_cols; col++) {
544       fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
545       map_index++;
546     }
547     fprintf(statsfile, "\n");
548   }
549   fprintf(statsfile, "\n");
550
551   fclose(statsfile);
552 }
553
554 static void update_reference_segmentation_map(VP9_COMP *cpi) {
555   VP9_COMMON *const cm = &cpi->common;
556   int row, col;
557   MODE_INFO **mi_8x8, **mi_8x8_ptr = cm->mi_grid_visible;
558   uint8_t *cache_ptr = cm->last_frame_seg_map, *cache;
559
560   for (row = 0; row < cm->mi_rows; row++) {
561     mi_8x8 = mi_8x8_ptr;
562     cache = cache_ptr;
563     for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++)
564       cache[0] = mi_8x8[0]->mbmi.segment_id;
565     mi_8x8_ptr += cm->mode_info_stride;
566     cache_ptr += cm->mi_cols;
567   }
568 }
569
570 static void set_default_lf_deltas(struct loopfilter *lf) {
571   lf->mode_ref_delta_enabled = 1;
572   lf->mode_ref_delta_update = 1;
573
574   vp9_zero(lf->ref_deltas);
575   vp9_zero(lf->mode_deltas);
576
577   // Test of ref frame deltas
578   lf->ref_deltas[INTRA_FRAME] = 2;
579   lf->ref_deltas[LAST_FRAME] = 0;
580   lf->ref_deltas[GOLDEN_FRAME] = -2;
581   lf->ref_deltas[ALTREF_FRAME] = -2;
582
583   lf->mode_deltas[0] = 0;   // Zero
584   lf->mode_deltas[1] = 0;   // New mv
585 }
586
587 static void set_rd_speed_thresholds(VP9_COMP *cpi, int mode) {
588   SPEED_FEATURES *sf = &cpi->sf;
589   int i;
590
591   // Set baseline threshold values
592   for (i = 0; i < MAX_MODES; ++i)
593     sf->thresh_mult[i] = mode == 0 ? -500 : 0;
594
595   sf->thresh_mult[THR_NEARESTMV] = 0;
596   sf->thresh_mult[THR_NEARESTG] = 0;
597   sf->thresh_mult[THR_NEARESTA] = 0;
598
599   sf->thresh_mult[THR_DC] += 1000;
600
601   sf->thresh_mult[THR_NEWMV] += 1000;
602   sf->thresh_mult[THR_NEWA] += 1000;
603   sf->thresh_mult[THR_NEWG] += 1000;
604
605   sf->thresh_mult[THR_NEARMV] += 1000;
606   sf->thresh_mult[THR_NEARA] += 1000;
607   sf->thresh_mult[THR_COMP_NEARESTLA] += 1000;
608   sf->thresh_mult[THR_COMP_NEARESTGA] += 1000;
609
610   sf->thresh_mult[THR_TM] += 1000;
611
612   sf->thresh_mult[THR_COMP_NEARLA] += 1500;
613   sf->thresh_mult[THR_COMP_NEWLA] += 2000;
614   sf->thresh_mult[THR_NEARG] += 1000;
615   sf->thresh_mult[THR_COMP_NEARGA] += 1500;
616   sf->thresh_mult[THR_COMP_NEWGA] += 2000;
617
618   sf->thresh_mult[THR_ZEROMV] += 2000;
619   sf->thresh_mult[THR_ZEROG] += 2000;
620   sf->thresh_mult[THR_ZEROA] += 2000;
621   sf->thresh_mult[THR_COMP_ZEROLA] += 2500;
622   sf->thresh_mult[THR_COMP_ZEROGA] += 2500;
623
624   sf->thresh_mult[THR_H_PRED] += 2000;
625   sf->thresh_mult[THR_V_PRED] += 2000;
626   sf->thresh_mult[THR_D45_PRED ] += 2500;
627   sf->thresh_mult[THR_D135_PRED] += 2500;
628   sf->thresh_mult[THR_D117_PRED] += 2500;
629   sf->thresh_mult[THR_D153_PRED] += 2500;
630   sf->thresh_mult[THR_D207_PRED] += 2500;
631   sf->thresh_mult[THR_D63_PRED] += 2500;
632
633   /* disable frame modes if flags not set */
634   if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) {
635     sf->thresh_mult[THR_NEWMV    ] = INT_MAX;
636     sf->thresh_mult[THR_NEARESTMV] = INT_MAX;
637     sf->thresh_mult[THR_ZEROMV   ] = INT_MAX;
638     sf->thresh_mult[THR_NEARMV   ] = INT_MAX;
639   }
640   if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) {
641     sf->thresh_mult[THR_NEARESTG ] = INT_MAX;
642     sf->thresh_mult[THR_ZEROG    ] = INT_MAX;
643     sf->thresh_mult[THR_NEARG    ] = INT_MAX;
644     sf->thresh_mult[THR_NEWG     ] = INT_MAX;
645   }
646   if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) {
647     sf->thresh_mult[THR_NEARESTA ] = INT_MAX;
648     sf->thresh_mult[THR_ZEROA    ] = INT_MAX;
649     sf->thresh_mult[THR_NEARA    ] = INT_MAX;
650     sf->thresh_mult[THR_NEWA     ] = INT_MAX;
651   }
652
653   if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
654       (VP9_LAST_FLAG | VP9_ALT_FLAG)) {
655     sf->thresh_mult[THR_COMP_ZEROLA   ] = INT_MAX;
656     sf->thresh_mult[THR_COMP_NEARESTLA] = INT_MAX;
657     sf->thresh_mult[THR_COMP_NEARLA   ] = INT_MAX;
658     sf->thresh_mult[THR_COMP_NEWLA    ] = INT_MAX;
659   }
660   if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
661       (VP9_GOLD_FLAG | VP9_ALT_FLAG)) {
662     sf->thresh_mult[THR_COMP_ZEROGA   ] = INT_MAX;
663     sf->thresh_mult[THR_COMP_NEARESTGA] = INT_MAX;
664     sf->thresh_mult[THR_COMP_NEARGA   ] = INT_MAX;
665     sf->thresh_mult[THR_COMP_NEWGA    ] = INT_MAX;
666   }
667 }
668
669 static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi, int mode) {
670   SPEED_FEATURES *sf = &cpi->sf;
671   int i;
672
673   for (i = 0; i < MAX_REFS; ++i)
674     sf->thresh_mult_sub8x8[i] = mode == 0 ? -500 : 0;
675
676   sf->thresh_mult_sub8x8[THR_LAST] += 2500;
677   sf->thresh_mult_sub8x8[THR_GOLD] += 2500;
678   sf->thresh_mult_sub8x8[THR_ALTR] += 2500;
679   sf->thresh_mult_sub8x8[THR_INTRA] += 2500;
680   sf->thresh_mult_sub8x8[THR_COMP_LA] += 4500;
681   sf->thresh_mult_sub8x8[THR_COMP_GA] += 4500;
682
683   // Check for masked out split cases.
684   for (i = 0; i < MAX_REFS; i++) {
685     if (sf->disable_split_mask & (1 << i))
686       sf->thresh_mult_sub8x8[i] = INT_MAX;
687   }
688
689   // disable mode test if frame flag is not set
690   if (!(cpi->ref_frame_flags & VP9_LAST_FLAG))
691     sf->thresh_mult_sub8x8[THR_LAST] = INT_MAX;
692   if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG))
693     sf->thresh_mult_sub8x8[THR_GOLD] = INT_MAX;
694   if (!(cpi->ref_frame_flags & VP9_ALT_FLAG))
695     sf->thresh_mult_sub8x8[THR_ALTR] = INT_MAX;
696   if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
697       (VP9_LAST_FLAG | VP9_ALT_FLAG))
698     sf->thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX;
699   if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
700       (VP9_GOLD_FLAG | VP9_ALT_FLAG))
701     sf->thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX;
702 }
703
704 void vp9_set_speed_features(VP9_COMP *cpi) {
705   SPEED_FEATURES *sf = &cpi->sf;
706   int mode = cpi->compressor_speed;
707   int speed = cpi->speed;
708   int i;
709
710   // Only modes 0 and 1 supported for now in experimental code basae
711   if (mode > 1)
712     mode = 1;
713
714   for (i = 0; i < MAX_MODES; ++i)
715     cpi->mode_chosen_counts[i] = 0;
716
717   // best quality defaults
718   sf->RD = 1;
719   sf->search_method = NSTEP;
720   sf->auto_filter = 1;
721   sf->recode_loop = 1;
722   sf->subpel_search_method = SUBPEL_TREE;
723   sf->subpel_iters_per_step = 2;
724   sf->optimize_coefficients = !cpi->oxcf.lossless;
725   sf->reduce_first_step_size = 0;
726   sf->auto_mv_step_size = 0;
727   sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
728   sf->comp_inter_joint_search_thresh = BLOCK_4X4;
729   sf->adaptive_rd_thresh = 0;
730   sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF;
731   sf->tx_size_search_method = USE_FULL_RD;
732   sf->use_lp32x32fdct = 0;
733   sf->adaptive_motion_search = 0;
734   sf->use_avoid_tested_higherror = 0;
735   sf->reference_masking = 0;
736   sf->use_one_partition_size_always = 0;
737   sf->less_rectangular_check = 0;
738   sf->use_square_partition_only = 0;
739   sf->auto_min_max_partition_size = 0;
740   sf->max_partition_size = BLOCK_64X64;
741   sf->min_partition_size = BLOCK_4X4;
742   sf->adjust_partitioning_from_last_frame = 0;
743   sf->last_partitioning_redo_frequency = 4;
744   sf->disable_split_mask = 0;
745   sf->mode_search_skip_flags = 0;
746   sf->disable_split_var_thresh = 0;
747   sf->disable_filter_search_var_thresh = 0;
748   for (i = 0; i < TX_SIZES; i++) {
749     sf->intra_y_mode_mask[i] = ALL_INTRA_MODES;
750     sf->intra_uv_mode_mask[i] = ALL_INTRA_MODES;
751   }
752   sf->use_rd_breakout = 0;
753   sf->skip_encode_sb = 0;
754   sf->use_uv_intra_rd_estimate = 0;
755   sf->use_fast_lpf_pick = 0;
756   sf->use_fast_coef_updates = 0;
757   sf->using_small_partition_info = 0;
758   sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set
759
760 #if CONFIG_MULTIPLE_ARF
761   // Switch segmentation off.
762   sf->static_segmentation = 0;
763 #else
764   sf->static_segmentation = 0;
765 #endif
766
767   switch (mode) {
768     case 0:  // This is the best quality mode.
769       break;
770
771     case 1:
772 #if CONFIG_MULTIPLE_ARF
773       // Switch segmentation off.
774       sf->static_segmentation = 0;
775 #else
776       sf->static_segmentation = 0;
777 #endif
778       sf->use_avoid_tested_higherror = 1;
779       sf->adaptive_rd_thresh = 1;
780       sf->recode_loop = (speed < 1);
781
782       if (speed == 1) {
783         sf->use_square_partition_only = !frame_is_intra_only(&cpi->common);
784         sf->less_rectangular_check  = 1;
785         sf->tx_size_search_method = frame_is_intra_only(&cpi->common)
786                                      ? USE_FULL_RD : USE_LARGESTALL;
787
788         if (MIN(cpi->common.width, cpi->common.height) >= 720)
789           sf->disable_split_mask = cpi->common.show_frame ?
790               DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
791         else
792           sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
793
794         sf->use_rd_breakout = 1;
795         sf->adaptive_motion_search = 1;
796         sf->auto_mv_step_size = 1;
797         sf->adaptive_rd_thresh = 2;
798         sf->recode_loop = 2;
799         sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
800         sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
801         sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
802       }
803       if (speed == 2) {
804         sf->use_square_partition_only = !frame_is_intra_only(&cpi->common);
805         sf->less_rectangular_check  = 1;
806         sf->tx_size_search_method = frame_is_intra_only(&cpi->common)
807                                      ? USE_FULL_RD : USE_LARGESTALL;
808
809         if (MIN(cpi->common.width, cpi->common.height) >= 720)
810           sf->disable_split_mask = cpi->common.show_frame ?
811               DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
812         else
813           sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
814
815
816         sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
817                                      FLAG_SKIP_INTRA_BESTINTER |
818                                      FLAG_SKIP_COMP_BESTINTRA |
819                                      FLAG_SKIP_INTRA_LOWVAR;
820
821         sf->use_rd_breakout = 1;
822         sf->adaptive_motion_search = 1;
823         sf->auto_mv_step_size = 1;
824
825         sf->disable_filter_search_var_thresh = 16;
826         sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
827
828         sf->auto_min_max_partition_size = 1;
829         sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
830         sf->adjust_partitioning_from_last_frame = 1;
831         sf->last_partitioning_redo_frequency = 3;
832
833         sf->adaptive_rd_thresh = 2;
834         sf->recode_loop = 2;
835         sf->use_lp32x32fdct = 1;
836         sf->mode_skip_start = 11;
837         sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
838         sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
839         sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
840         sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
841       }
842       if (speed == 3) {
843         sf->use_square_partition_only = 1;
844         sf->tx_size_search_method = USE_LARGESTALL;
845
846         if (MIN(cpi->common.width, cpi->common.height) >= 720)
847           sf->disable_split_mask = DISABLE_ALL_SPLIT;
848         else
849           sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;
850
851         sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
852                                      FLAG_SKIP_INTRA_BESTINTER |
853                                      FLAG_SKIP_COMP_BESTINTRA |
854                                      FLAG_SKIP_INTRA_LOWVAR;
855
856         sf->use_rd_breakout = 1;
857         sf->adaptive_motion_search = 1;
858         sf->auto_mv_step_size = 1;
859
860         sf->disable_filter_search_var_thresh = 16;
861         sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
862
863         sf->auto_min_max_partition_size = 1;
864         sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
865         sf->adjust_partitioning_from_last_frame = 1;
866         sf->last_partitioning_redo_frequency = 3;
867
868         sf->use_uv_intra_rd_estimate = 1;
869         sf->skip_encode_sb = 1;
870         sf->use_lp32x32fdct = 1;
871         sf->subpel_iters_per_step = 1;
872         sf->use_fast_coef_updates = 2;
873
874         sf->adaptive_rd_thresh = 4;
875         sf->mode_skip_start = 6;
876       }
877       if (speed == 4) {
878         sf->use_square_partition_only = 1;
879         sf->tx_size_search_method = USE_LARGESTALL;
880         sf->disable_split_mask = DISABLE_ALL_SPLIT;
881
882         sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
883                                      FLAG_SKIP_INTRA_BESTINTER |
884                                      FLAG_SKIP_COMP_BESTINTRA |
885                                      FLAG_SKIP_COMP_REFMISMATCH |
886                                      FLAG_SKIP_INTRA_LOWVAR |
887                                      FLAG_EARLY_TERMINATE;
888
889         sf->use_rd_breakout = 1;
890         sf->adaptive_motion_search = 1;
891         sf->auto_mv_step_size = 1;
892
893         sf->disable_filter_search_var_thresh = 16;
894         sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
895
896         sf->auto_min_max_partition_size = 1;
897         sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
898         sf->adjust_partitioning_from_last_frame = 1;
899         sf->last_partitioning_redo_frequency = 3;
900
901         sf->use_uv_intra_rd_estimate = 1;
902         sf->skip_encode_sb = 1;
903         sf->use_lp32x32fdct = 1;
904         sf->subpel_iters_per_step = 1;
905         sf->use_fast_coef_updates = 2;
906
907         sf->adaptive_rd_thresh = 4;
908         sf->mode_skip_start = 6;
909
910         /* sf->intra_y_mode_mask = INTRA_DC_ONLY;
911         sf->intra_uv_mode_mask = INTRA_DC_ONLY;
912         sf->search_method = BIGDIA;
913         sf->disable_split_var_thresh = 64;
914         sf->disable_filter_search_var_thresh = 64; */
915       }
916       if (speed == 5) {
917         sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
918         sf->use_one_partition_size_always = 1;
919         sf->always_this_block_size = BLOCK_16X16;
920         sf->tx_size_search_method = frame_is_intra_only(&cpi->common) ?
921                                      USE_FULL_RD : USE_LARGESTALL;
922         sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
923                                      FLAG_SKIP_INTRA_BESTINTER |
924                                      FLAG_SKIP_COMP_BESTINTRA |
925                                      FLAG_SKIP_COMP_REFMISMATCH |
926                                      FLAG_SKIP_INTRA_LOWVAR |
927                                      FLAG_EARLY_TERMINATE;
928         sf->use_rd_breakout = 1;
929         sf->use_lp32x32fdct = 1;
930         sf->optimize_coefficients = 0;
931         sf->auto_mv_step_size = 1;
932         // sf->reduce_first_step_size = 1;
933         // sf->reference_masking = 1;
934
935         sf->disable_split_mask = DISABLE_ALL_SPLIT;
936         sf->search_method = HEX;
937         sf->subpel_iters_per_step = 1;
938         sf->disable_split_var_thresh = 64;
939         sf->disable_filter_search_var_thresh = 96;
940         for (i = 0; i < TX_SIZES; i++) {
941           sf->intra_y_mode_mask[i] = INTRA_DC_ONLY;
942           sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY;
943         }
944         sf->use_fast_coef_updates = 2;
945         sf->adaptive_rd_thresh = 4;
946         sf->mode_skip_start = 6;
947       }
948       break;
949   }; /* switch */
950
951   // Set rd thresholds based on mode and speed setting
952   set_rd_speed_thresholds(cpi, mode);
953   set_rd_speed_thresholds_sub8x8(cpi, mode);
954
955   // Slow quant, dct and trellis not worthwhile for first pass
956   // so make sure they are always turned off.
957   if (cpi->pass == 1) {
958     sf->optimize_coefficients = 0;
959   }
960
961   // No recode for 1 pass.
962   if (cpi->pass == 0) {
963     sf->recode_loop = 0;
964     sf->optimize_coefficients = 0;
965   }
966
967   cpi->mb.fwd_txm4x4 = vp9_fdct4x4;
968   if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
969     cpi->mb.fwd_txm4x4 = vp9_fwht4x4;
970   }
971
972   if (cpi->sf.subpel_search_method == SUBPEL_ITERATIVE) {
973     cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_iterative;
974     cpi->find_fractional_mv_step_comp = vp9_find_best_sub_pixel_comp_iterative;
975   } else if (cpi->sf.subpel_search_method == SUBPEL_TREE) {
976     cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
977     cpi->find_fractional_mv_step_comp = vp9_find_best_sub_pixel_comp_tree;
978   }
979
980   cpi->mb.optimize = cpi->sf.optimize_coefficients == 1 && cpi->pass != 1;
981
982 #ifdef SPEEDSTATS
983   frames_at_speed[cpi->speed]++;
984 #endif
985 }
986
987 static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
988   VP9_COMMON *cm = &cpi->common;
989
990   cpi->lookahead = vp9_lookahead_init(cpi->oxcf.width, cpi->oxcf.height,
991                                       cm->subsampling_x, cm->subsampling_y,
992                                       cpi->oxcf.lag_in_frames);
993   if (!cpi->lookahead)
994     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
995                        "Failed to allocate lag buffers");
996
997   if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer,
998                                cpi->oxcf.width, cpi->oxcf.height,
999                                cm->subsampling_x, cm->subsampling_y,
1000                                VP9BORDERINPIXELS))
1001     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1002                        "Failed to allocate altref buffer");
1003 }
1004
1005 void vp9_alloc_compressor_data(VP9_COMP *cpi) {
1006   VP9_COMMON *cm = &cpi->common;
1007
1008   if (vp9_alloc_frame_buffers(cm, cm->width, cm->height))
1009     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1010                        "Failed to allocate frame buffers");
1011
1012   if (vp9_alloc_frame_buffer(&cpi->last_frame_uf,
1013                              cm->width, cm->height,
1014                              cm->subsampling_x, cm->subsampling_y,
1015                              VP9BORDERINPIXELS))
1016     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1017                        "Failed to allocate last frame buffer");
1018
1019   if (vp9_alloc_frame_buffer(&cpi->scaled_source,
1020                              cm->width, cm->height,
1021                              cm->subsampling_x, cm->subsampling_y,
1022                              VP9BORDERINPIXELS))
1023     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1024                        "Failed to allocate scaled source buffer");
1025
1026   vpx_free(cpi->tok);
1027
1028   {
1029     unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols);
1030
1031     CHECK_MEM_ERROR(cm, cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1032   }
1033
1034   vpx_free(cpi->mb_activity_map);
1035   CHECK_MEM_ERROR(cm, cpi->mb_activity_map,
1036                   vpx_calloc(sizeof(unsigned int),
1037                              cm->mb_rows * cm->mb_cols));
1038
1039   vpx_free(cpi->mb_norm_activity_map);
1040   CHECK_MEM_ERROR(cm, cpi->mb_norm_activity_map,
1041                   vpx_calloc(sizeof(unsigned int),
1042                              cm->mb_rows * cm->mb_cols));
1043
1044   // 2 contexts per 'mi unit', so that we have one context per 4x4 txfm
1045   // block where mi unit size is 8x8.
1046   vpx_free(cpi->above_context[0]);
1047   CHECK_MEM_ERROR(cm, cpi->above_context[0],
1048                   vpx_calloc(2 * mi_cols_aligned_to_sb(cm->mi_cols) *
1049                              MAX_MB_PLANE,
1050                              sizeof(*cpi->above_context[0])));
1051
1052   vpx_free(cpi->above_seg_context);
1053   CHECK_MEM_ERROR(cm, cpi->above_seg_context,
1054                   vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols),
1055                              sizeof(*cpi->above_seg_context)));
1056 }
1057
1058
1059 static void update_frame_size(VP9_COMP *cpi) {
1060   VP9_COMMON *cm = &cpi->common;
1061
1062   vp9_update_frame_size(cm);
1063
1064   // Update size of buffers local to this frame
1065   if (vp9_realloc_frame_buffer(&cpi->last_frame_uf,
1066                                cm->width, cm->height,
1067                                cm->subsampling_x, cm->subsampling_y,
1068                                VP9BORDERINPIXELS))
1069     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1070                        "Failed to reallocate last frame buffer");
1071
1072   if (vp9_realloc_frame_buffer(&cpi->scaled_source,
1073                                cm->width, cm->height,
1074                                cm->subsampling_x, cm->subsampling_y,
1075                                VP9BORDERINPIXELS))
1076     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1077                        "Failed to reallocate scaled source buffer");
1078
1079   {
1080     int y_stride = cpi->scaled_source.y_stride;
1081
1082     if (cpi->sf.search_method == NSTEP) {
1083       vp9_init3smotion_compensation(&cpi->mb, y_stride);
1084     } else if (cpi->sf.search_method == DIAMOND) {
1085       vp9_init_dsmotion_compensation(&cpi->mb, y_stride);
1086     }
1087   }
1088
1089   {
1090     int i;
1091     for (i = 1; i < MAX_MB_PLANE; ++i) {
1092       cpi->above_context[i] = cpi->above_context[0] +
1093                               i * sizeof(*cpi->above_context[0]) * 2 *
1094                               mi_cols_aligned_to_sb(cm->mi_cols);
1095     }
1096   }
1097 }
1098
1099
1100 // Table that converts 0-63 Q range values passed in outside to the Qindex
1101 // range used internally.
1102 static const int q_trans[] = {
1103   0,    4,   8,  12,  16,  20,  24,  28,
1104   32,   36,  40,  44,  48,  52,  56,  60,
1105   64,   68,  72,  76,  80,  84,  88,  92,
1106   96,  100, 104, 108, 112, 116, 120, 124,
1107   128, 132, 136, 140, 144, 148, 152, 156,
1108   160, 164, 168, 172, 176, 180, 184, 188,
1109   192, 196, 200, 204, 208, 212, 216, 220,
1110   224, 228, 232, 236, 240, 244, 249, 255,
1111 };
1112
1113 int vp9_reverse_trans(int x) {
1114   int i;
1115
1116   for (i = 0; i < 64; i++)
1117     if (q_trans[i] >= x)
1118       return i;
1119
1120   return 63;
1121 };
1122 void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
1123   if (framerate < 0.1)
1124     framerate = 30;
1125
1126   cpi->oxcf.framerate = framerate;
1127   cpi->output_framerate = cpi->oxcf.framerate;
1128   cpi->per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth
1129                              / cpi->output_framerate);
1130   cpi->av_per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth
1131                                 / cpi->output_framerate);
1132   cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth *
1133                                    cpi->oxcf.two_pass_vbrmin_section / 100);
1134
1135
1136   cpi->min_frame_bandwidth = MAX(cpi->min_frame_bandwidth, FRAME_OVERHEAD_BITS);
1137
1138   // Set Maximum gf/arf interval
1139   cpi->max_gf_interval = 16;
1140
1141   // Extended interval for genuinely static scenes
1142   cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
1143
1144   // Special conditions when alt ref frame enabled in lagged compress mode
1145   if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames) {
1146     if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1147       cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1148
1149     if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
1150       cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
1151   }
1152
1153   if (cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval)
1154     cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
1155 }
1156
1157 static int64_t rescale(int val, int64_t num, int denom) {
1158   int64_t llnum = num;
1159   int64_t llden = denom;
1160   int64_t llval = val;
1161
1162   return (llval * llnum / llden);
1163 }
1164
1165 static void set_tile_limits(VP9_COMP *cpi) {
1166   VP9_COMMON *const cm = &cpi->common;
1167
1168   int min_log2_tile_cols, max_log2_tile_cols;
1169   vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
1170
1171   cm->log2_tile_cols = clamp(cpi->oxcf.tile_columns,
1172                              min_log2_tile_cols, max_log2_tile_cols);
1173   cm->log2_tile_rows = cpi->oxcf.tile_rows;
1174 }
1175
1176 static void init_config(VP9_PTR ptr, VP9_CONFIG *oxcf) {
1177   VP9_COMP *cpi = (VP9_COMP *)(ptr);
1178   VP9_COMMON *const cm = &cpi->common;
1179   int i;
1180
1181   cpi->oxcf = *oxcf;
1182
1183   cm->version = oxcf->version;
1184
1185   cm->width = oxcf->width;
1186   cm->height = oxcf->height;
1187   cm->subsampling_x = 0;
1188   cm->subsampling_y = 0;
1189   vp9_alloc_compressor_data(cpi);
1190
1191   // change includes all joint functionality
1192   vp9_change_config(ptr, oxcf);
1193
1194   // Initialize active best and worst q and average q values.
1195   cpi->active_worst_quality         = cpi->oxcf.worst_allowed_q;
1196   cpi->active_best_quality          = cpi->oxcf.best_allowed_q;
1197   cpi->avg_frame_qindex             = cpi->oxcf.worst_allowed_q;
1198
1199   // Initialise the starting buffer levels
1200   cpi->buffer_level                 = cpi->oxcf.starting_buffer_level;
1201   cpi->bits_off_target              = cpi->oxcf.starting_buffer_level;
1202
1203   cpi->rolling_target_bits          = cpi->av_per_frame_bandwidth;
1204   cpi->rolling_actual_bits          = cpi->av_per_frame_bandwidth;
1205   cpi->long_rolling_target_bits     = cpi->av_per_frame_bandwidth;
1206   cpi->long_rolling_actual_bits     = cpi->av_per_frame_bandwidth;
1207
1208   cpi->total_actual_bits            = 0;
1209   cpi->total_target_vs_actual       = 0;
1210
1211   cpi->static_mb_pct = 0;
1212
1213   cpi->lst_fb_idx = 0;
1214   cpi->gld_fb_idx = 1;
1215   cpi->alt_fb_idx = 2;
1216
1217   cpi->current_layer = 0;
1218   cpi->use_svc = 0;
1219
1220   set_tile_limits(cpi);
1221
1222   cpi->fixed_divide[0] = 0;
1223   for (i = 1; i < 512; i++)
1224     cpi->fixed_divide[i] = 0x80000 / i;
1225 }
1226
1227
1228 void vp9_change_config(VP9_PTR ptr, VP9_CONFIG *oxcf) {
1229   VP9_COMP *cpi = (VP9_COMP *)(ptr);
1230   VP9_COMMON *const cm = &cpi->common;
1231
1232   if (!cpi || !oxcf)
1233     return;
1234
1235   if (cm->version != oxcf->version) {
1236     cm->version = oxcf->version;
1237   }
1238
1239   cpi->oxcf = *oxcf;
1240
1241   switch (cpi->oxcf.Mode) {
1242       // Real time and one pass deprecated in test code base
1243     case MODE_GOODQUALITY:
1244       cpi->pass = 0;
1245       cpi->compressor_speed = 2;
1246       cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5);
1247       break;
1248
1249     case MODE_FIRSTPASS:
1250       cpi->pass = 1;
1251       cpi->compressor_speed = 1;
1252       break;
1253
1254     case MODE_SECONDPASS:
1255       cpi->pass = 2;
1256       cpi->compressor_speed = 1;
1257       cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5);
1258       break;
1259
1260     case MODE_SECONDPASS_BEST:
1261       cpi->pass = 2;
1262       cpi->compressor_speed = 0;
1263       break;
1264   }
1265
1266   cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
1267   cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
1268   cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
1269
1270   cpi->oxcf.lossless = oxcf->lossless;
1271   cpi->mb.e_mbd.itxm_add = cpi->oxcf.lossless ? vp9_iwht4x4_add
1272                                               : vp9_idct4x4_add;
1273   cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1274
1275   cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
1276
1277   // cpi->use_golden_frame_only = 0;
1278   // cpi->use_last_frame_only = 0;
1279   cpi->refresh_golden_frame = 0;
1280   cpi->refresh_last_frame = 1;
1281   cm->refresh_frame_context = 1;
1282   cm->reset_frame_context = 0;
1283
1284   setup_features(cm);
1285   cpi->common.allow_high_precision_mv = 0;  // Default mv precision
1286   set_mvcost(cpi);
1287
1288   {
1289     int i;
1290
1291     for (i = 0; i < MAX_SEGMENTS; i++)
1292       cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
1293   }
1294
1295   // At the moment the first order values may not be > MAXQ
1296   cpi->oxcf.fixed_q = MIN(cpi->oxcf.fixed_q, MAXQ);
1297
1298   // local file playback mode == really big buffer
1299   if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) {
1300     cpi->oxcf.starting_buffer_level   = 60000;
1301     cpi->oxcf.optimal_buffer_level    = 60000;
1302     cpi->oxcf.maximum_buffer_size     = 240000;
1303   }
1304
1305   // Convert target bandwidth from Kbit/s to Bit/s
1306   cpi->oxcf.target_bandwidth       *= 1000;
1307
1308   cpi->oxcf.starting_buffer_level = rescale(cpi->oxcf.starting_buffer_level,
1309                                             cpi->oxcf.target_bandwidth, 1000);
1310
1311   // Set or reset optimal and maximum buffer levels.
1312   if (cpi->oxcf.optimal_buffer_level == 0)
1313     cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
1314   else
1315     cpi->oxcf.optimal_buffer_level = rescale(cpi->oxcf.optimal_buffer_level,
1316                                              cpi->oxcf.target_bandwidth, 1000);
1317
1318   if (cpi->oxcf.maximum_buffer_size == 0)
1319     cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
1320   else
1321     cpi->oxcf.maximum_buffer_size = rescale(cpi->oxcf.maximum_buffer_size,
1322                                             cpi->oxcf.target_bandwidth, 1000);
1323
1324   // Set up frame rate and related parameters rate control values.
1325   vp9_new_framerate(cpi, cpi->oxcf.framerate);
1326
1327   // Set absolute upper and lower quality limits
1328   cpi->worst_quality = cpi->oxcf.worst_allowed_q;
1329   cpi->best_quality = cpi->oxcf.best_allowed_q;
1330
1331   // active values should only be modified if out of new range
1332   cpi->active_worst_quality = clamp(cpi->active_worst_quality,
1333                                     cpi->oxcf.best_allowed_q,
1334                                     cpi->oxcf.worst_allowed_q);
1335
1336   cpi->active_best_quality = clamp(cpi->active_best_quality,
1337                                    cpi->oxcf.best_allowed_q,
1338                                    cpi->oxcf.worst_allowed_q);
1339
1340   cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
1341
1342   cpi->cq_target_quality = cpi->oxcf.cq_level;
1343
1344   cm->mcomp_filter_type = DEFAULT_INTERP_FILTER;
1345
1346   cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
1347
1348   cm->display_width = cpi->oxcf.width;
1349   cm->display_height = cpi->oxcf.height;
1350
1351   // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
1352   cpi->oxcf.Sharpness = MIN(7, cpi->oxcf.Sharpness);
1353
1354   cpi->common.lf.sharpness_level = cpi->oxcf.Sharpness;
1355
1356   if (cpi->initial_width) {
1357     // Increasing the size of the frame beyond the first seen frame, or some
1358     // otherwise signalled maximum size, is not supported.
1359     // TODO(jkoleszar): exit gracefully.
1360     assert(cm->width <= cpi->initial_width);
1361     assert(cm->height <= cpi->initial_height);
1362   }
1363   update_frame_size(cpi);
1364
1365   if (cpi->oxcf.fixed_q >= 0) {
1366     cpi->last_q[0] = cpi->oxcf.fixed_q;
1367     cpi->last_q[1] = cpi->oxcf.fixed_q;
1368     cpi->last_boosted_qindex = cpi->oxcf.fixed_q;
1369   }
1370
1371   cpi->speed = cpi->oxcf.cpu_used;
1372
1373   if (cpi->oxcf.lag_in_frames == 0) {
1374     // force to allowlag to 0 if lag_in_frames is 0;
1375     cpi->oxcf.allow_lag = 0;
1376   } else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS) {
1377      // Limit on lag buffers as these are not currently dynamically allocated
1378     cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
1379   }
1380
1381   // YX Temp
1382 #if CONFIG_MULTIPLE_ARF
1383   vp9_zero(cpi->alt_ref_source);
1384 #else
1385   cpi->alt_ref_source = NULL;
1386 #endif
1387   cpi->is_src_frame_alt_ref = 0;
1388
1389 #if 0
1390   // Experimental RD Code
1391   cpi->frame_distortion = 0;
1392   cpi->last_frame_distortion = 0;
1393 #endif
1394
1395   set_tile_limits(cpi);
1396 }
1397
1398 #define M_LOG2_E 0.693147180559945309417
1399 #define log2f(x) (log (x) / (float) M_LOG2_E)
1400
1401 static void cal_nmvjointsadcost(int *mvjointsadcost) {
1402   mvjointsadcost[0] = 600;
1403   mvjointsadcost[1] = 300;
1404   mvjointsadcost[2] = 300;
1405   mvjointsadcost[0] = 300;
1406 }
1407
1408 static void cal_nmvsadcosts(int *mvsadcost[2]) {
1409   int i = 1;
1410
1411   mvsadcost[0][0] = 0;
1412   mvsadcost[1][0] = 0;
1413
1414   do {
1415     double z = 256 * (2 * (log2f(8 * i) + .6));
1416     mvsadcost[0][i] = (int)z;
1417     mvsadcost[1][i] = (int)z;
1418     mvsadcost[0][-i] = (int)z;
1419     mvsadcost[1][-i] = (int)z;
1420   } while (++i <= MV_MAX);
1421 }
1422
1423 static void cal_nmvsadcosts_hp(int *mvsadcost[2]) {
1424   int i = 1;
1425
1426   mvsadcost[0][0] = 0;
1427   mvsadcost[1][0] = 0;
1428
1429   do {
1430     double z = 256 * (2 * (log2f(8 * i) + .6));
1431     mvsadcost[0][i] = (int)z;
1432     mvsadcost[1][i] = (int)z;
1433     mvsadcost[0][-i] = (int)z;
1434     mvsadcost[1][-i] = (int)z;
1435   } while (++i <= MV_MAX);
1436 }
1437
1438 static void alloc_mode_context(VP9_COMMON *cm, int num_4x4_blk,
1439                                PICK_MODE_CONTEXT *ctx) {
1440   int num_pix = num_4x4_blk << 4;
1441   int i, k;
1442   ctx->num_4x4_blk = num_4x4_blk;
1443   CHECK_MEM_ERROR(cm, ctx->zcoeff_blk,
1444                   vpx_calloc(num_4x4_blk, sizeof(uint8_t)));
1445   for (i = 0; i < MAX_MB_PLANE; ++i) {
1446     for (k = 0; k < 3; ++k) {
1447       CHECK_MEM_ERROR(cm, ctx->coeff[i][k],
1448                       vpx_memalign(16, num_pix * sizeof(int16_t)));
1449       CHECK_MEM_ERROR(cm, ctx->qcoeff[i][k],
1450                       vpx_memalign(16, num_pix * sizeof(int16_t)));
1451       CHECK_MEM_ERROR(cm, ctx->dqcoeff[i][k],
1452                       vpx_memalign(16, num_pix * sizeof(int16_t)));
1453       CHECK_MEM_ERROR(cm, ctx->eobs[i][k],
1454                       vpx_memalign(16, num_pix * sizeof(uint16_t)));
1455       ctx->coeff_pbuf[i][k]   = ctx->coeff[i][k];
1456       ctx->qcoeff_pbuf[i][k]  = ctx->qcoeff[i][k];
1457       ctx->dqcoeff_pbuf[i][k] = ctx->dqcoeff[i][k];
1458       ctx->eobs_pbuf[i][k]    = ctx->eobs[i][k];
1459     }
1460   }
1461 }
1462
1463 static void free_mode_context(PICK_MODE_CONTEXT *ctx) {
1464   int i, k;
1465   vpx_free(ctx->zcoeff_blk);
1466   ctx->zcoeff_blk = 0;
1467   for (i = 0; i < MAX_MB_PLANE; ++i) {
1468     for (k = 0; k < 3; ++k) {
1469       vpx_free(ctx->coeff[i][k]);
1470       ctx->coeff[i][k] = 0;
1471       vpx_free(ctx->qcoeff[i][k]);
1472       ctx->qcoeff[i][k] = 0;
1473       vpx_free(ctx->dqcoeff[i][k]);
1474       ctx->dqcoeff[i][k] = 0;
1475       vpx_free(ctx->eobs[i][k]);
1476       ctx->eobs[i][k] = 0;
1477     }
1478   }
1479 }
1480
1481 static void init_pick_mode_context(VP9_COMP *cpi) {
1482   int i;
1483   VP9_COMMON *const cm = &cpi->common;
1484   MACROBLOCK *const x  = &cpi->mb;
1485
1486
1487   for (i = 0; i < BLOCK_SIZES; ++i) {
1488     const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
1489     const int num_4x4_h = num_4x4_blocks_high_lookup[i];
1490     const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
1491     if (i < BLOCK_16X16) {
1492       for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1493         for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) {
1494           for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) {
1495             PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1496             alloc_mode_context(cm, num_4x4_blk, ctx);
1497           }
1498         }
1499       }
1500     } else if (i < BLOCK_32X32) {
1501       for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1502         for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) {
1503           PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1504           ctx->num_4x4_blk = num_4x4_blk;
1505           alloc_mode_context(cm, num_4x4_blk, ctx);
1506         }
1507       }
1508     } else if (i < BLOCK_64X64) {
1509       for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) {
1510         PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1511         ctx->num_4x4_blk = num_4x4_blk;
1512         alloc_mode_context(cm, num_4x4_blk, ctx);
1513       }
1514     } else {
1515       PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1516       ctx->num_4x4_blk = num_4x4_blk;
1517       alloc_mode_context(cm, num_4x4_blk, ctx);
1518     }
1519   }
1520 }
1521
1522 static void free_pick_mode_context(MACROBLOCK *x) {
1523   int i;
1524
1525   for (i = 0; i < BLOCK_SIZES; ++i) {
1526     const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
1527     const int num_4x4_h = num_4x4_blocks_high_lookup[i];
1528     const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
1529     if (i < BLOCK_16X16) {
1530       for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1531         for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) {
1532           for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) {
1533             PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1534             free_mode_context(ctx);
1535           }
1536         }
1537       }
1538     } else if (i < BLOCK_32X32) {
1539       for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1540         for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) {
1541           PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1542           free_mode_context(ctx);
1543         }
1544       }
1545     } else if (i < BLOCK_64X64) {
1546       for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) {
1547         PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1548         free_mode_context(ctx);
1549       }
1550     } else {
1551       PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1552       free_mode_context(ctx);
1553     }
1554   }
1555 }
1556
1557 VP9_PTR vp9_create_compressor(VP9_CONFIG *oxcf) {
1558   int i, j;
1559   volatile union {
1560     VP9_COMP *cpi;
1561     VP9_PTR   ptr;
1562   } ctx;
1563
1564   VP9_COMP *cpi;
1565   VP9_COMMON *cm;
1566
1567   cpi = ctx.cpi = vpx_memalign(32, sizeof(VP9_COMP));
1568   // Check that the CPI instance is valid
1569   if (!cpi)
1570     return 0;
1571
1572   cm = &cpi->common;
1573
1574   vp9_zero(*cpi);
1575
1576   if (setjmp(cm->error.jmp)) {
1577     VP9_PTR ptr = ctx.ptr;
1578
1579     ctx.cpi->common.error.setjmp = 0;
1580     vp9_remove_compressor(&ptr);
1581     return 0;
1582   }
1583
1584   cm->error.setjmp = 1;
1585
1586   CHECK_MEM_ERROR(cm, cpi->mb.ss, vpx_calloc(sizeof(search_site),
1587                                              (MAX_MVSEARCH_STEPS * 8) + 1));
1588
1589   vp9_create_common(cm);
1590
1591   init_config((VP9_PTR)cpi, oxcf);
1592
1593   init_pick_mode_context(cpi);
1594
1595   cm->current_video_frame   = 0;
1596   cpi->kf_overspend_bits            = 0;
1597   cpi->kf_bitrate_adjustment        = 0;
1598   cpi->frames_till_gf_update_due    = 0;
1599   cpi->gf_overspend_bits            = 0;
1600   cpi->non_gf_bitrate_adjustment    = 0;
1601
1602   // Set reference frame sign bias for ALTREF frame to 1 (for now)
1603   cm->ref_frame_sign_bias[ALTREF_FRAME] = 1;
1604
1605   cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1606
1607   cpi->gold_is_last = 0;
1608   cpi->alt_is_last  = 0;
1609   cpi->gold_is_alt  = 0;
1610
1611   // Spatial scalability
1612   cpi->number_spatial_layers = oxcf->ss_number_layers;
1613
1614   // Create the encoder segmentation map and set all entries to 0
1615   CHECK_MEM_ERROR(cm, cpi->segmentation_map,
1616                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1617
1618   // And a place holder structure is the coding context
1619   // for use if we want to save and restore it
1620   CHECK_MEM_ERROR(cm, cpi->coding_context.last_frame_seg_map_copy,
1621                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1622
1623   CHECK_MEM_ERROR(cm, cpi->active_map, vpx_calloc(cm->MBs, 1));
1624   vpx_memset(cpi->active_map, 1, cm->MBs);
1625   cpi->active_map_enabled = 0;
1626
1627   for (i = 0; i < (sizeof(cpi->mbgraph_stats) /
1628                    sizeof(cpi->mbgraph_stats[0])); i++) {
1629     CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats,
1630                     vpx_calloc(cm->MBs *
1631                                sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
1632   }
1633
1634 #ifdef ENTROPY_STATS
1635   if (cpi->pass != 1)
1636     init_context_counters();
1637 #endif
1638
1639 #ifdef MODE_STATS
1640   init_tx_count_stats();
1641   init_switchable_interp_stats();
1642 #endif
1643
1644   /*Initialize the feed-forward activity masking.*/
1645   cpi->activity_avg = 90 << 12;
1646
1647   cpi->frames_since_key = 8;  // Sensible default for first frame.
1648   cpi->key_frame_frequency = cpi->oxcf.key_freq;
1649   cpi->this_key_frame_forced = 0;
1650   cpi->next_key_frame_forced = 0;
1651
1652   cpi->source_alt_ref_pending = 0;
1653   cpi->source_alt_ref_active = 0;
1654   cpi->refresh_alt_ref_frame = 0;
1655
1656 #if CONFIG_MULTIPLE_ARF
1657   // Turn multiple ARF usage on/off. This is a quick hack for the initial test
1658   // version. It should eventually be set via the codec API.
1659   cpi->multi_arf_enabled = 1;
1660
1661   if (cpi->multi_arf_enabled) {
1662     cpi->sequence_number = 0;
1663     cpi->frame_coding_order_period = 0;
1664     vp9_zero(cpi->frame_coding_order);
1665     vp9_zero(cpi->arf_buffer_idx);
1666   }
1667 #endif
1668
1669   cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1670 #if CONFIG_INTERNAL_STATS
1671   cpi->b_calculate_ssimg = 0;
1672
1673   cpi->count = 0;
1674   cpi->bytes = 0;
1675
1676   if (cpi->b_calculate_psnr) {
1677     cpi->total_sq_error = 0.0;
1678     cpi->total_sq_error2 = 0.0;
1679     cpi->total_y = 0.0;
1680     cpi->total_u = 0.0;
1681     cpi->total_v = 0.0;
1682     cpi->total = 0.0;
1683     cpi->totalp_y = 0.0;
1684     cpi->totalp_u = 0.0;
1685     cpi->totalp_v = 0.0;
1686     cpi->totalp = 0.0;
1687     cpi->tot_recode_hits = 0;
1688     cpi->summed_quality = 0;
1689     cpi->summed_weights = 0;
1690     cpi->summedp_quality = 0;
1691     cpi->summedp_weights = 0;
1692   }
1693
1694   if (cpi->b_calculate_ssimg) {
1695     cpi->total_ssimg_y = 0;
1696     cpi->total_ssimg_u = 0;
1697     cpi->total_ssimg_v = 0;
1698     cpi->total_ssimg_all = 0;
1699   }
1700
1701 #endif
1702
1703   cpi->first_time_stamp_ever = INT64_MAX;
1704
1705   cpi->frames_till_gf_update_due      = 0;
1706   cpi->key_frame_count              = 1;
1707
1708   cpi->ni_av_qi                     = cpi->oxcf.worst_allowed_q;
1709   cpi->ni_tot_qi                    = 0;
1710   cpi->ni_frames                   = 0;
1711   cpi->tot_q = 0.0;
1712   cpi->avg_q = vp9_convert_qindex_to_q(cpi->oxcf.worst_allowed_q);
1713   cpi->total_byte_count             = 0;
1714
1715   cpi->rate_correction_factor         = 1.0;
1716   cpi->key_frame_rate_correction_factor = 1.0;
1717   cpi->gf_rate_correction_factor  = 1.0;
1718   cpi->twopass.est_max_qcorrection_factor  = 1.0;
1719
1720   cal_nmvjointsadcost(cpi->mb.nmvjointsadcost);
1721   cpi->mb.nmvcost[0] = &cpi->mb.nmvcosts[0][MV_MAX];
1722   cpi->mb.nmvcost[1] = &cpi->mb.nmvcosts[1][MV_MAX];
1723   cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX];
1724   cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX];
1725   cal_nmvsadcosts(cpi->mb.nmvsadcost);
1726
1727   cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX];
1728   cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX];
1729   cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX];
1730   cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX];
1731   cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp);
1732
1733   for (i = 0; i < KEY_FRAME_CONTEXT; i++)
1734     cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
1735
1736 #ifdef OUTPUT_YUV_SRC
1737   yuv_file = fopen("bd.yuv", "ab");
1738 #endif
1739 #ifdef OUTPUT_YUV_REC
1740   yuv_rec_file = fopen("rec.yuv", "wb");
1741 #endif
1742
1743 #if 0
1744   framepsnr = fopen("framepsnr.stt", "a");
1745   kf_list = fopen("kf_list.stt", "w");
1746 #endif
1747
1748   cpi->output_pkt_list = oxcf->output_pkt_list;
1749
1750   cpi->enable_encode_breakout = 1;
1751
1752   if (cpi->pass == 1) {
1753     vp9_init_first_pass(cpi);
1754   } else if (cpi->pass == 2) {
1755     size_t packet_sz = sizeof(FIRSTPASS_STATS);
1756     int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
1757
1758     cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1759     cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1760     cpi->twopass.stats_in_end = (void *)((char *)cpi->twopass.stats_in
1761                                          + (packets - 1) * packet_sz);
1762     vp9_init_second_pass(cpi);
1763   }
1764
1765   vp9_set_speed_features(cpi);
1766
1767   // Default rd threshold factors for mode selection
1768   for (i = 0; i < BLOCK_SIZES; ++i) {
1769     for (j = 0; j < MAX_MODES; ++j)
1770       cpi->rd_thresh_freq_fact[i][j] = 32;
1771     for (j = 0; j < MAX_REFS; ++j)
1772       cpi->rd_thresh_freq_sub8x8[i][j] = 32;
1773   }
1774
1775 #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SVFHH, SVFHV, SVFHHV, \
1776             SDX3F, SDX8F, SDX4DF)\
1777     cpi->fn_ptr[BT].sdf            = SDF; \
1778     cpi->fn_ptr[BT].sdaf           = SDAF; \
1779     cpi->fn_ptr[BT].vf             = VF; \
1780     cpi->fn_ptr[BT].svf            = SVF; \
1781     cpi->fn_ptr[BT].svaf           = SVAF; \
1782     cpi->fn_ptr[BT].svf_halfpix_h  = SVFHH; \
1783     cpi->fn_ptr[BT].svf_halfpix_v  = SVFHV; \
1784     cpi->fn_ptr[BT].svf_halfpix_hv = SVFHHV; \
1785     cpi->fn_ptr[BT].sdx3f          = SDX3F; \
1786     cpi->fn_ptr[BT].sdx8f          = SDX8F; \
1787     cpi->fn_ptr[BT].sdx4df         = SDX4DF;
1788
1789   BFP(BLOCK_32X16, vp9_sad32x16, vp9_sad32x16_avg,
1790       vp9_variance32x16, vp9_sub_pixel_variance32x16,
1791       vp9_sub_pixel_avg_variance32x16, NULL, NULL,
1792       NULL, NULL, NULL,
1793       vp9_sad32x16x4d)
1794
1795   BFP(BLOCK_16X32, vp9_sad16x32, vp9_sad16x32_avg,
1796       vp9_variance16x32, vp9_sub_pixel_variance16x32,
1797       vp9_sub_pixel_avg_variance16x32, NULL, NULL,
1798       NULL, NULL, NULL,
1799       vp9_sad16x32x4d)
1800
1801   BFP(BLOCK_64X32, vp9_sad64x32, vp9_sad64x32_avg,
1802       vp9_variance64x32, vp9_sub_pixel_variance64x32,
1803       vp9_sub_pixel_avg_variance64x32, NULL, NULL,
1804       NULL, NULL, NULL,
1805       vp9_sad64x32x4d)
1806
1807   BFP(BLOCK_32X64, vp9_sad32x64, vp9_sad32x64_avg,
1808       vp9_variance32x64, vp9_sub_pixel_variance32x64,
1809       vp9_sub_pixel_avg_variance32x64, NULL, NULL,
1810       NULL, NULL, NULL,
1811       vp9_sad32x64x4d)
1812
1813   BFP(BLOCK_32X32, vp9_sad32x32, vp9_sad32x32_avg,
1814       vp9_variance32x32, vp9_sub_pixel_variance32x32,
1815       vp9_sub_pixel_avg_variance32x32, vp9_variance_halfpixvar32x32_h,
1816       vp9_variance_halfpixvar32x32_v,
1817       vp9_variance_halfpixvar32x32_hv, vp9_sad32x32x3, vp9_sad32x32x8,
1818       vp9_sad32x32x4d)
1819
1820   BFP(BLOCK_64X64, vp9_sad64x64, vp9_sad64x64_avg,
1821       vp9_variance64x64, vp9_sub_pixel_variance64x64,
1822       vp9_sub_pixel_avg_variance64x64, vp9_variance_halfpixvar64x64_h,
1823       vp9_variance_halfpixvar64x64_v,
1824       vp9_variance_halfpixvar64x64_hv, vp9_sad64x64x3, vp9_sad64x64x8,
1825       vp9_sad64x64x4d)
1826
1827   BFP(BLOCK_16X16, vp9_sad16x16, vp9_sad16x16_avg,
1828       vp9_variance16x16, vp9_sub_pixel_variance16x16,
1829       vp9_sub_pixel_avg_variance16x16, vp9_variance_halfpixvar16x16_h,
1830       vp9_variance_halfpixvar16x16_v,
1831       vp9_variance_halfpixvar16x16_hv, vp9_sad16x16x3, vp9_sad16x16x8,
1832       vp9_sad16x16x4d)
1833
1834   BFP(BLOCK_16X8, vp9_sad16x8, vp9_sad16x8_avg,
1835       vp9_variance16x8, vp9_sub_pixel_variance16x8,
1836       vp9_sub_pixel_avg_variance16x8, NULL, NULL, NULL,
1837       vp9_sad16x8x3, vp9_sad16x8x8, vp9_sad16x8x4d)
1838
1839   BFP(BLOCK_8X16, vp9_sad8x16, vp9_sad8x16_avg,
1840       vp9_variance8x16, vp9_sub_pixel_variance8x16,
1841       vp9_sub_pixel_avg_variance8x16, NULL, NULL, NULL,
1842       vp9_sad8x16x3, vp9_sad8x16x8, vp9_sad8x16x4d)
1843
1844   BFP(BLOCK_8X8, vp9_sad8x8, vp9_sad8x8_avg,
1845       vp9_variance8x8, vp9_sub_pixel_variance8x8,
1846       vp9_sub_pixel_avg_variance8x8, NULL, NULL, NULL,
1847       vp9_sad8x8x3, vp9_sad8x8x8, vp9_sad8x8x4d)
1848
1849   BFP(BLOCK_8X4, vp9_sad8x4, vp9_sad8x4_avg,
1850       vp9_variance8x4, vp9_sub_pixel_variance8x4,
1851       vp9_sub_pixel_avg_variance8x4, NULL, NULL,
1852       NULL, NULL, vp9_sad8x4x8,
1853       vp9_sad8x4x4d)
1854
1855   BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg,
1856       vp9_variance4x8, vp9_sub_pixel_variance4x8,
1857       vp9_sub_pixel_avg_variance4x8, NULL, NULL,
1858       NULL, NULL, vp9_sad4x8x8,
1859       vp9_sad4x8x4d)
1860
1861   BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg,
1862       vp9_variance4x4, vp9_sub_pixel_variance4x4,
1863       vp9_sub_pixel_avg_variance4x4, NULL, NULL, NULL,
1864       vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d)
1865
1866   cpi->full_search_sad = vp9_full_search_sad;
1867   cpi->diamond_search_sad = vp9_diamond_search_sad;
1868   cpi->refining_search_sad = vp9_refining_search_sad;
1869
1870   // make sure frame 1 is okay
1871   cpi->error_bins[0] = cpi->common.MBs;
1872
1873   /* vp9_init_quantizer() is first called here. Add check in
1874    * vp9_frame_init_quantizer() so that vp9_init_quantizer is only
1875    * called later when needed. This will avoid unnecessary calls of
1876    * vp9_init_quantizer() for every frame.
1877    */
1878   vp9_init_quantizer(cpi);
1879
1880   vp9_loop_filter_init(cm);
1881
1882   cpi->common.error.setjmp = 0;
1883
1884   vp9_zero(cpi->y_uv_mode_count);
1885
1886 #ifdef MODE_TEST_HIT_STATS
1887   vp9_zero(cpi->mode_test_hits);
1888 #endif
1889
1890   return (VP9_PTR) cpi;
1891 }
1892
1893 void vp9_remove_compressor(VP9_PTR *ptr) {
1894   VP9_COMP *cpi = (VP9_COMP *)(*ptr);
1895   int i;
1896
1897   if (!cpi)
1898     return;
1899
1900   if (cpi && (cpi->common.current_video_frame > 0)) {
1901     if (cpi->pass == 2) {
1902       vp9_end_second_pass(cpi);
1903     }
1904
1905 #ifdef ENTROPY_STATS
1906     if (cpi->pass != 1) {
1907       print_context_counters();
1908       print_tree_update_probs();
1909       print_mode_context(cpi);
1910     }
1911 #endif
1912
1913 #ifdef MODE_STATS
1914     if (cpi->pass != 1) {
1915       write_tx_count_stats();
1916       write_switchable_interp_stats();
1917     }
1918 #endif
1919
1920 #if CONFIG_INTERNAL_STATS
1921
1922     vp9_clear_system_state();
1923
1924     // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count);
1925     if (cpi->pass != 1) {
1926       FILE *f = fopen("opsnr.stt", "a");
1927       double time_encoded = (cpi->last_end_time_stamp_seen
1928                              - cpi->first_time_stamp_ever) / 10000000.000;
1929       double total_encode_time = (cpi->time_receive_data +
1930                                   cpi->time_compress_data)   / 1000.000;
1931       double dr = (double)cpi->bytes * (double) 8 / (double)1000
1932                   / time_encoded;
1933
1934       if (cpi->b_calculate_psnr) {
1935         YV12_BUFFER_CONFIG *lst_yv12 =
1936             &cpi->common.yv12_fb[cpi->common.ref_frame_map[cpi->lst_fb_idx]];
1937         double samples = 3.0 / 2 * cpi->count *
1938                          lst_yv12->y_width * lst_yv12->y_height;
1939         double total_psnr = vp9_mse2psnr(samples, 255.0, cpi->total_sq_error);
1940         double total_psnr2 = vp9_mse2psnr(samples, 255.0, cpi->total_sq_error2);
1941         double total_ssim = 100 * pow(cpi->summed_quality /
1942                                       cpi->summed_weights, 8.0);
1943         double total_ssimp = 100 * pow(cpi->summedp_quality /
1944                                        cpi->summedp_weights, 8.0);
1945
1946         fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
1947                 "VPXSSIM\tVPSSIMP\t  Time(ms)\n");
1948         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",
1949                 dr, cpi->total / cpi->count, total_psnr,
1950                 cpi->totalp / cpi->count, total_psnr2, total_ssim, total_ssimp,
1951                 total_encode_time);
1952       }
1953
1954       if (cpi->b_calculate_ssimg) {
1955         fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t  Time(ms)\n");
1956         fprintf(f, "%7.2f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
1957                 cpi->total_ssimg_y / cpi->count,
1958                 cpi->total_ssimg_u / cpi->count,
1959                 cpi->total_ssimg_v / cpi->count,
1960                 cpi->total_ssimg_all / cpi->count, total_encode_time);
1961       }
1962
1963       fclose(f);
1964     }
1965
1966 #endif
1967
1968 #ifdef MODE_TEST_HIT_STATS
1969     if (cpi->pass != 1) {
1970       double norm_per_pixel_mode_tests = 0;
1971       double norm_counts[BLOCK_SIZES];
1972       int i;
1973       int sb64_per_frame;
1974       int norm_factors[BLOCK_SIZES] =
1975         {256, 128, 128, 64, 32, 32, 16, 8, 8, 4, 2, 2, 1};
1976       FILE *f = fopen("mode_hit_stats.stt", "a");
1977
1978       // On average, how many mode tests do we do
1979       for (i = 0; i < BLOCK_SIZES; ++i) {
1980         norm_counts[i] = (double)cpi->mode_test_hits[i] /
1981                          (double)norm_factors[i];
1982         norm_per_pixel_mode_tests += norm_counts[i];
1983       }
1984       // Convert to a number per 64x64 and per frame
1985       sb64_per_frame = ((cpi->common.height + 63) / 64) *
1986                        ((cpi->common.width + 63) / 64);
1987       norm_per_pixel_mode_tests =
1988         norm_per_pixel_mode_tests /
1989         (double)(cpi->common.current_video_frame * sb64_per_frame);
1990
1991       fprintf(f, "%6.4f\n", norm_per_pixel_mode_tests);
1992       fclose(f);
1993     }
1994 #endif
1995
1996 #ifdef ENTROPY_STATS
1997     {
1998       int i, j, k;
1999       FILE *fmode = fopen("vp9_modecontext.c", "w");
2000
2001       fprintf(fmode, "\n#include \"vp9_entropymode.h\"\n\n");
2002       fprintf(fmode, "const unsigned int vp9_kf_default_bmode_counts ");
2003       fprintf(fmode, "[INTRA_MODES][INTRA_MODES]"
2004                      "[INTRA_MODES] =\n{\n");
2005
2006       for (i = 0; i < INTRA_MODES; i++) {
2007         fprintf(fmode, "    { // Above Mode :  %d\n", i);
2008
2009         for (j = 0; j < INTRA_MODES; j++) {
2010           fprintf(fmode, "        {");
2011
2012           for (k = 0; k < INTRA_MODES; k++) {
2013             if (!intra_mode_stats[i][j][k])
2014               fprintf(fmode, " %5d, ", 1);
2015             else
2016               fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
2017           }
2018
2019           fprintf(fmode, "}, // left_mode %d\n", j);
2020         }
2021
2022         fprintf(fmode, "    },\n");
2023       }
2024
2025       fprintf(fmode, "};\n");
2026       fclose(fmode);
2027     }
2028 #endif
2029
2030
2031 #if defined(SECTIONBITS_OUTPUT)
2032
2033     if (0) {
2034       int i;
2035       FILE *f = fopen("tokenbits.stt", "a");
2036
2037       for (i = 0; i < 28; i++)
2038         fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
2039
2040       fprintf(f, "\n");
2041       fclose(f);
2042     }
2043
2044 #endif
2045
2046 #if 0
2047     {
2048       printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2049       printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
2050       printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame,
2051              cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000,
2052              cpi->time_compress_data / 1000,
2053              (cpi->time_receive_data + cpi->time_compress_data) / 1000);
2054     }
2055 #endif
2056   }
2057
2058   free_pick_mode_context(&cpi->mb);
2059   dealloc_compressor_data(cpi);
2060   vpx_free(cpi->mb.ss);
2061   vpx_free(cpi->tok);
2062
2063   for (i = 0; i < sizeof(cpi->mbgraph_stats) /
2064                   sizeof(cpi->mbgraph_stats[0]); ++i) {
2065     vpx_free(cpi->mbgraph_stats[i].mb_stats);
2066   }
2067
2068   vp9_remove_common(&cpi->common);
2069   vpx_free(cpi);
2070   *ptr = 0;
2071
2072 #ifdef OUTPUT_YUV_SRC
2073   fclose(yuv_file);
2074 #endif
2075 #ifdef OUTPUT_YUV_REC
2076   fclose(yuv_rec_file);
2077 #endif
2078
2079 #if 0
2080
2081   if (keyfile)
2082     fclose(keyfile);
2083
2084   if (framepsnr)
2085     fclose(framepsnr);
2086
2087   if (kf_list)
2088     fclose(kf_list);
2089
2090 #endif
2091 }
2092
2093
2094 static uint64_t calc_plane_error(uint8_t *orig, int orig_stride,
2095                                  uint8_t *recon, int recon_stride,
2096                                  unsigned int cols, unsigned int rows) {
2097   unsigned int row, col;
2098   uint64_t total_sse = 0;
2099   int diff;
2100
2101   for (row = 0; row + 16 <= rows; row += 16) {
2102     for (col = 0; col + 16 <= cols; col += 16) {
2103       unsigned int sse;
2104
2105       vp9_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse);
2106       total_sse += sse;
2107     }
2108
2109     /* Handle odd-sized width */
2110     if (col < cols) {
2111       unsigned int border_row, border_col;
2112       uint8_t *border_orig = orig;
2113       uint8_t *border_recon = recon;
2114
2115       for (border_row = 0; border_row < 16; border_row++) {
2116         for (border_col = col; border_col < cols; border_col++) {
2117           diff = border_orig[border_col] - border_recon[border_col];
2118           total_sse += diff * diff;
2119         }
2120
2121         border_orig += orig_stride;
2122         border_recon += recon_stride;
2123       }
2124     }
2125
2126     orig += orig_stride * 16;
2127     recon += recon_stride * 16;
2128   }
2129
2130   /* Handle odd-sized height */
2131   for (; row < rows; row++) {
2132     for (col = 0; col < cols; col++) {
2133       diff = orig[col] - recon[col];
2134       total_sse += diff * diff;
2135     }
2136
2137     orig += orig_stride;
2138     recon += recon_stride;
2139   }
2140
2141   return total_sse;
2142 }
2143
2144
2145 static void generate_psnr_packet(VP9_COMP *cpi) {
2146   YV12_BUFFER_CONFIG      *orig = cpi->Source;
2147   YV12_BUFFER_CONFIG      *recon = cpi->common.frame_to_show;
2148   struct vpx_codec_cx_pkt  pkt;
2149   uint64_t                 sse;
2150   int                      i;
2151   unsigned int             width = orig->y_crop_width;
2152   unsigned int             height = orig->y_crop_height;
2153
2154   pkt.kind = VPX_CODEC_PSNR_PKT;
2155   sse = calc_plane_error(orig->y_buffer, orig->y_stride,
2156                          recon->y_buffer, recon->y_stride,
2157                          width, height);
2158   pkt.data.psnr.sse[0] = sse;
2159   pkt.data.psnr.sse[1] = sse;
2160   pkt.data.psnr.samples[0] = width * height;
2161   pkt.data.psnr.samples[1] = width * height;
2162
2163   width = orig->uv_crop_width;
2164   height = orig->uv_crop_height;
2165
2166   sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
2167                          recon->u_buffer, recon->uv_stride,
2168                          width, height);
2169   pkt.data.psnr.sse[0] += sse;
2170   pkt.data.psnr.sse[2] = sse;
2171   pkt.data.psnr.samples[0] += width * height;
2172   pkt.data.psnr.samples[2] = width * height;
2173
2174   sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
2175                          recon->v_buffer, recon->uv_stride,
2176                          width, height);
2177   pkt.data.psnr.sse[0] += sse;
2178   pkt.data.psnr.sse[3] = sse;
2179   pkt.data.psnr.samples[0] += width * height;
2180   pkt.data.psnr.samples[3] = width * height;
2181
2182   for (i = 0; i < 4; i++)
2183     pkt.data.psnr.psnr[i] = vp9_mse2psnr(pkt.data.psnr.samples[i], 255.0,
2184                                          (double)pkt.data.psnr.sse[i]);
2185
2186   vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
2187 }
2188
2189
2190 int vp9_use_as_reference(VP9_PTR ptr, int ref_frame_flags) {
2191   VP9_COMP *cpi = (VP9_COMP *)(ptr);
2192
2193   if (ref_frame_flags > 7)
2194     return -1;
2195
2196   cpi->ref_frame_flags = ref_frame_flags;
2197   return 0;
2198 }
2199 int vp9_update_reference(VP9_PTR ptr, int ref_frame_flags) {
2200   VP9_COMP *cpi = (VP9_COMP *)(ptr);
2201
2202   if (ref_frame_flags > 7)
2203     return -1;
2204
2205   cpi->refresh_golden_frame = 0;
2206   cpi->refresh_alt_ref_frame = 0;
2207   cpi->refresh_last_frame   = 0;
2208
2209   if (ref_frame_flags & VP9_LAST_FLAG)
2210     cpi->refresh_last_frame = 1;
2211
2212   if (ref_frame_flags & VP9_GOLD_FLAG)
2213     cpi->refresh_golden_frame = 1;
2214
2215   if (ref_frame_flags & VP9_ALT_FLAG)
2216     cpi->refresh_alt_ref_frame = 1;
2217
2218   return 0;
2219 }
2220
2221 int vp9_copy_reference_enc(VP9_PTR ptr, VP9_REFFRAME ref_frame_flag,
2222                            YV12_BUFFER_CONFIG *sd) {
2223   VP9_COMP *cpi = (VP9_COMP *)(ptr);
2224   VP9_COMMON *cm = &cpi->common;
2225   int ref_fb_idx;
2226
2227   if (ref_frame_flag == VP9_LAST_FLAG)
2228     ref_fb_idx = cm->ref_frame_map[cpi->lst_fb_idx];
2229   else if (ref_frame_flag == VP9_GOLD_FLAG)
2230     ref_fb_idx = cm->ref_frame_map[cpi->gld_fb_idx];
2231   else if (ref_frame_flag == VP9_ALT_FLAG)
2232     ref_fb_idx = cm->ref_frame_map[cpi->alt_fb_idx];
2233   else
2234     return -1;
2235
2236   vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
2237
2238   return 0;
2239 }
2240
2241 int vp9_get_reference_enc(VP9_PTR ptr, int index, YV12_BUFFER_CONFIG **fb) {
2242   VP9_COMP *cpi = (VP9_COMP *)(ptr);
2243   VP9_COMMON *cm = &cpi->common;
2244
2245   if (index < 0 || index >= NUM_REF_FRAMES)
2246     return -1;
2247
2248   *fb = &cm->yv12_fb[cm->ref_frame_map[index]];
2249   return 0;
2250 }
2251
2252 int vp9_set_reference_enc(VP9_PTR ptr, VP9_REFFRAME ref_frame_flag,
2253                           YV12_BUFFER_CONFIG *sd) {
2254   VP9_COMP *cpi = (VP9_COMP *)(ptr);
2255   VP9_COMMON *cm = &cpi->common;
2256
2257   int ref_fb_idx;
2258
2259   if (ref_frame_flag == VP9_LAST_FLAG)
2260     ref_fb_idx = cm->ref_frame_map[cpi->lst_fb_idx];
2261   else if (ref_frame_flag == VP9_GOLD_FLAG)
2262     ref_fb_idx = cm->ref_frame_map[cpi->gld_fb_idx];
2263   else if (ref_frame_flag == VP9_ALT_FLAG)
2264     ref_fb_idx = cm->ref_frame_map[cpi->alt_fb_idx];
2265   else
2266     return -1;
2267
2268   vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
2269
2270   return 0;
2271 }
2272 int vp9_update_entropy(VP9_PTR comp, int update) {
2273   ((VP9_COMP *)comp)->common.refresh_frame_context = update;
2274   return 0;
2275 }
2276
2277
2278 #ifdef OUTPUT_YUV_SRC
2279 void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s) {
2280   uint8_t *src = s->y_buffer;
2281   int h = s->y_height;
2282
2283   do {
2284     fwrite(src, s->y_width, 1,  yuv_file);
2285     src += s->y_stride;
2286   } while (--h);
2287
2288   src = s->u_buffer;
2289   h = s->uv_height;
2290
2291   do {
2292     fwrite(src, s->uv_width, 1,  yuv_file);
2293     src += s->uv_stride;
2294   } while (--h);
2295
2296   src = s->v_buffer;
2297   h = s->uv_height;
2298
2299   do {
2300     fwrite(src, s->uv_width, 1, yuv_file);
2301     src += s->uv_stride;
2302   } while (--h);
2303 }
2304 #endif
2305
2306 #ifdef OUTPUT_YUV_REC
2307 void vp9_write_yuv_rec_frame(VP9_COMMON *cm) {
2308   YV12_BUFFER_CONFIG *s = cm->frame_to_show;
2309   uint8_t *src = s->y_buffer;
2310   int h = cm->height;
2311
2312   do {
2313     fwrite(src, s->y_width, 1,  yuv_rec_file);
2314     src += s->y_stride;
2315   } while (--h);
2316
2317   src = s->u_buffer;
2318   h = s->uv_height;
2319
2320   do {
2321     fwrite(src, s->uv_width, 1,  yuv_rec_file);
2322     src += s->uv_stride;
2323   } while (--h);
2324
2325   src = s->v_buffer;
2326   h = s->uv_height;
2327
2328   do {
2329     fwrite(src, s->uv_width, 1, yuv_rec_file);
2330     src += s->uv_stride;
2331   } while (--h);
2332
2333 #if CONFIG_ALPHA
2334   if (s->alpha_buffer) {
2335     src = s->alpha_buffer;
2336     h = s->alpha_height;
2337     do {
2338       fwrite(src, s->alpha_width, 1,  yuv_rec_file);
2339       src += s->alpha_stride;
2340     } while (--h);
2341   }
2342 #endif
2343
2344   fflush(yuv_rec_file);
2345 }
2346 #endif
2347
2348 static void scale_and_extend_frame(YV12_BUFFER_CONFIG *src_fb,
2349                                    YV12_BUFFER_CONFIG *dst_fb) {
2350   const int in_w = src_fb->y_crop_width;
2351   const int in_h = src_fb->y_crop_height;
2352   const int out_w = dst_fb->y_crop_width;
2353   const int out_h = dst_fb->y_crop_height;
2354   int x, y, i;
2355
2356   uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer,
2357                       src_fb->alpha_buffer};
2358   int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride,
2359                         src_fb->alpha_stride};
2360
2361   uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer,
2362                       dst_fb->alpha_buffer};
2363   int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride,
2364                         dst_fb->alpha_stride};
2365
2366   for (y = 0; y < out_h; y += 16) {
2367     for (x = 0; x < out_w; x += 16) {
2368       for (i = 0; i < MAX_MB_PLANE; ++i) {
2369         const int factor = i == 0 ? 1 : 2;
2370         const int x_q4 = x * (16 / factor) * in_w / out_w;
2371         const int y_q4 = y * (16 / factor) * in_h / out_h;
2372         const int src_stride = src_strides[i];
2373         const int dst_stride = dst_strides[i];
2374         uint8_t *src = srcs[i] + y / factor * in_h / out_h * src_stride +
2375                                  x / factor * in_w / out_w;
2376         uint8_t *dst = dsts[i] + y / factor * dst_stride + x / factor;
2377
2378         vp9_convolve8(src, src_stride, dst, dst_stride,
2379                       vp9_sub_pel_filters_8[x_q4 & 0xf], 16 * in_w / out_w,
2380                       vp9_sub_pel_filters_8[y_q4 & 0xf], 16 * in_h / out_h,
2381                       16 / factor, 16 / factor);
2382       }
2383     }
2384   }
2385
2386   vp8_yv12_extend_frame_borders(dst_fb);
2387 }
2388
2389
2390 static void update_alt_ref_frame_stats(VP9_COMP *cpi) {
2391   // this frame refreshes means next frames don't unless specified by user
2392   cpi->frames_since_golden = 0;
2393
2394 #if CONFIG_MULTIPLE_ARF
2395   if (!cpi->multi_arf_enabled)
2396 #endif
2397     // Clear the alternate reference update pending flag.
2398     cpi->source_alt_ref_pending = 0;
2399
2400   // Set the alternate reference frame active flag
2401   cpi->source_alt_ref_active = 1;
2402 }
2403 static void update_golden_frame_stats(VP9_COMP *cpi) {
2404   // Update the Golden frame usage counts.
2405   if (cpi->refresh_golden_frame) {
2406     // this frame refreshes means next frames don't unless specified by user
2407     cpi->refresh_golden_frame = 0;
2408     cpi->frames_since_golden = 0;
2409
2410     // ******** Fixed Q test code only ************
2411     // If we are going to use the ALT reference for the next group of frames
2412     // set a flag to say so.
2413     if (cpi->oxcf.fixed_q >= 0 &&
2414         cpi->oxcf.play_alternate && !cpi->refresh_alt_ref_frame) {
2415       cpi->source_alt_ref_pending = 1;
2416       cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2417
2418       // TODO(ivan): For SVC encoder, GF automatic update is disabled by using
2419       // a large GF_interval.
2420       if (cpi->use_svc) {
2421         cpi->frames_till_gf_update_due = INT_MAX;
2422       }
2423     }
2424
2425     if (!cpi->source_alt_ref_pending)
2426       cpi->source_alt_ref_active = 0;
2427
2428     // Decrement count down till next gf
2429     if (cpi->frames_till_gf_update_due > 0)
2430       cpi->frames_till_gf_update_due--;
2431
2432   } else if (!cpi->refresh_alt_ref_frame) {
2433     // Decrement count down till next gf
2434     if (cpi->frames_till_gf_update_due > 0)
2435       cpi->frames_till_gf_update_due--;
2436
2437     if (cpi->frames_till_alt_ref_frame)
2438       cpi->frames_till_alt_ref_frame--;
2439
2440     cpi->frames_since_golden++;
2441   }
2442 }
2443
2444 static int find_fp_qindex() {
2445   int i;
2446
2447   for (i = 0; i < QINDEX_RANGE; i++) {
2448     if (vp9_convert_qindex_to_q(i) >= 30.0) {
2449       break;
2450     }
2451   }
2452
2453   if (i == QINDEX_RANGE)
2454     i--;
2455
2456   return i;
2457 }
2458
2459 static void Pass1Encode(VP9_COMP *cpi, unsigned long *size, unsigned char *dest,
2460                         unsigned int *frame_flags) {
2461   (void) size;
2462   (void) dest;
2463   (void) frame_flags;
2464
2465   vp9_set_quantizer(cpi, find_fp_qindex());
2466   vp9_first_pass(cpi);
2467 }
2468
2469 #define WRITE_RECON_BUFFER 0
2470 #if WRITE_RECON_BUFFER
2471 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame) {
2472   FILE *yframe;
2473   int i;
2474   char filename[255];
2475
2476   snprintf(filename, sizeof(filename), "cx\\y%04d.raw", this_frame);
2477   yframe = fopen(filename, "wb");
2478
2479   for (i = 0; i < frame->y_height; i++)
2480     fwrite(frame->y_buffer + i * frame->y_stride,
2481            frame->y_width, 1, yframe);
2482
2483   fclose(yframe);
2484   snprintf(filename, sizeof(filename), "cx\\u%04d.raw", this_frame);
2485   yframe = fopen(filename, "wb");
2486
2487   for (i = 0; i < frame->uv_height; i++)
2488     fwrite(frame->u_buffer + i * frame->uv_stride,
2489            frame->uv_width, 1, yframe);
2490
2491   fclose(yframe);
2492   snprintf(filename, sizeof(filename), "cx\\v%04d.raw", this_frame);
2493   yframe = fopen(filename, "wb");
2494
2495   for (i = 0; i < frame->uv_height; i++)
2496     fwrite(frame->v_buffer + i * frame->uv_stride,
2497            frame->uv_width, 1, yframe);
2498
2499   fclose(yframe);
2500 }
2501 #endif
2502
2503 static double compute_edge_pixel_proportion(YV12_BUFFER_CONFIG *frame) {
2504 #define EDGE_THRESH 128
2505   int i, j;
2506   int num_edge_pels = 0;
2507   int num_pels = (frame->y_height - 2) * (frame->y_width - 2);
2508   uint8_t *prev = frame->y_buffer + 1;
2509   uint8_t *curr = frame->y_buffer + 1 + frame->y_stride;
2510   uint8_t *next = frame->y_buffer + 1 + 2 * frame->y_stride;
2511   for (i = 1; i < frame->y_height - 1; i++) {
2512     for (j = 1; j < frame->y_width - 1; j++) {
2513       /* Sobel hor and ver gradients */
2514       int v = 2 * (curr[1] - curr[-1]) + (prev[1] - prev[-1]) +
2515               (next[1] - next[-1]);
2516       int h = 2 * (prev[0] - next[0]) + (prev[1] - next[1]) +
2517               (prev[-1] - next[-1]);
2518       h = (h < 0 ? -h : h);
2519       v = (v < 0 ? -v : v);
2520       if (h > EDGE_THRESH || v > EDGE_THRESH)
2521         num_edge_pels++;
2522       curr++;
2523       prev++;
2524       next++;
2525     }
2526     curr += frame->y_stride - frame->y_width + 2;
2527     prev += frame->y_stride - frame->y_width + 2;
2528     next += frame->y_stride - frame->y_width + 2;
2529   }
2530   return (double)num_edge_pels / num_pels;
2531 }
2532
2533 // Function to test for conditions that indicate we should loop
2534 // back and recode a frame.
2535 static int recode_loop_test(VP9_COMP *cpi,
2536                             int high_limit, int low_limit,
2537                             int q, int maxq, int minq) {
2538   int force_recode = 0;
2539   VP9_COMMON *cm = &cpi->common;
2540
2541   // Is frame recode allowed at all
2542   // Yes if either recode mode 1 is selected or mode two is selected
2543   // and the frame is a key frame. golden frame or alt_ref_frame
2544   if ((cpi->sf.recode_loop == 1) ||
2545       ((cpi->sf.recode_loop == 2) &&
2546        ((cm->frame_type == KEY_FRAME) ||
2547         cpi->refresh_golden_frame ||
2548         cpi->refresh_alt_ref_frame))) {
2549     // General over and under shoot tests
2550     if (((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
2551         ((cpi->projected_frame_size < low_limit) && (q > minq))) {
2552       force_recode = 1;
2553     } else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
2554       // Deal with frame undershoot and whether or not we are
2555       // below the automatically set cq level.
2556       if (q > cpi->cq_target_quality &&
2557           cpi->projected_frame_size < ((cpi->this_frame_target * 7) >> 3)) {
2558         force_recode = 1;
2559       } else if (q > cpi->oxcf.cq_level &&
2560                  cpi->projected_frame_size < cpi->min_frame_bandwidth &&
2561                  cpi->active_best_quality > cpi->oxcf.cq_level) {
2562         // Severe undershoot and between auto and user cq level
2563         force_recode = 1;
2564         cpi->active_best_quality = cpi->oxcf.cq_level;
2565       }
2566     }
2567   }
2568
2569   return force_recode;
2570 }
2571
2572 static void update_reference_frames(VP9_COMP * const cpi) {
2573   VP9_COMMON * const cm = &cpi->common;
2574
2575   // At this point the new frame has been encoded.
2576   // If any buffer copy / swapping is signaled it should be done here.
2577   if (cm->frame_type == KEY_FRAME) {
2578     ref_cnt_fb(cm->fb_idx_ref_cnt,
2579                &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
2580     ref_cnt_fb(cm->fb_idx_ref_cnt,
2581                &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
2582   }
2583 #if CONFIG_MULTIPLE_ARF
2584   else if (!cpi->multi_arf_enabled && cpi->refresh_golden_frame &&
2585       !cpi->refresh_alt_ref_frame) {
2586 #else
2587   else if (cpi->refresh_golden_frame && !cpi->refresh_alt_ref_frame &&
2588            !cpi->use_svc) {
2589 #endif
2590     /* Preserve the previously existing golden frame and update the frame in
2591      * the alt ref slot instead. This is highly specific to the current use of
2592      * alt-ref as a forward reference, and this needs to be generalized as
2593      * other uses are implemented (like RTC/temporal scaling)
2594      *
2595      * The update to the buffer in the alt ref slot was signaled in
2596      * vp9_pack_bitstream(), now swap the buffer pointers so that it's treated
2597      * as the golden frame next time.
2598      */
2599     int tmp;
2600
2601     ref_cnt_fb(cm->fb_idx_ref_cnt,
2602                &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
2603
2604     tmp = cpi->alt_fb_idx;
2605     cpi->alt_fb_idx = cpi->gld_fb_idx;
2606     cpi->gld_fb_idx = tmp;
2607   }  else { /* For non key/golden frames */
2608     if (cpi->refresh_alt_ref_frame) {
2609       int arf_idx = cpi->alt_fb_idx;
2610 #if CONFIG_MULTIPLE_ARF
2611       if (cpi->multi_arf_enabled) {
2612         arf_idx = cpi->arf_buffer_idx[cpi->sequence_number + 1];
2613       }
2614 #endif
2615       ref_cnt_fb(cm->fb_idx_ref_cnt,
2616                  &cm->ref_frame_map[arf_idx], cm->new_fb_idx);
2617     }
2618
2619     if (cpi->refresh_golden_frame) {
2620       ref_cnt_fb(cm->fb_idx_ref_cnt,
2621                  &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
2622     }
2623   }
2624
2625   if (cpi->refresh_last_frame) {
2626     ref_cnt_fb(cm->fb_idx_ref_cnt,
2627                &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx);
2628   }
2629 }
2630
2631 static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
2632   MACROBLOCKD *xd = &cpi->mb.e_mbd;
2633   struct loopfilter *lf = &cm->lf;
2634   if (xd->lossless) {
2635       lf->filter_level = 0;
2636   } else {
2637     struct vpx_usec_timer timer;
2638
2639     vp9_clear_system_state();
2640
2641     vpx_usec_timer_start(&timer);
2642
2643     vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.use_fast_lpf_pick);
2644
2645     vpx_usec_timer_mark(&timer);
2646     cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
2647   }
2648
2649   if (lf->filter_level > 0) {
2650     vp9_set_alt_lf_level(cpi, lf->filter_level);
2651     vp9_loop_filter_frame(cm, xd, lf->filter_level, 0, 0);
2652   }
2653
2654   vp9_extend_frame_inner_borders(cm->frame_to_show,
2655                                  cm->subsampling_x, cm->subsampling_y);
2656 }
2657
2658 static void scale_references(VP9_COMP *cpi) {
2659   VP9_COMMON *cm = &cpi->common;
2660   int i;
2661   int refs[ALLOWED_REFS_PER_FRAME] = {cpi->lst_fb_idx, cpi->gld_fb_idx,
2662                                       cpi->alt_fb_idx};
2663
2664   for (i = 0; i < 3; i++) {
2665     YV12_BUFFER_CONFIG *ref = &cm->yv12_fb[cm->ref_frame_map[refs[i]]];
2666
2667     if (ref->y_crop_width != cm->width ||
2668         ref->y_crop_height != cm->height) {
2669       int new_fb = get_free_fb(cm);
2670
2671       vp9_realloc_frame_buffer(&cm->yv12_fb[new_fb],
2672                                cm->width, cm->height,
2673                                cm->subsampling_x, cm->subsampling_y,
2674                                VP9BORDERINPIXELS);
2675       scale_and_extend_frame(ref, &cm->yv12_fb[new_fb]);
2676       cpi->scaled_ref_idx[i] = new_fb;
2677     } else {
2678       cpi->scaled_ref_idx[i] = cm->ref_frame_map[refs[i]];
2679       cm->fb_idx_ref_cnt[cm->ref_frame_map[refs[i]]]++;
2680     }
2681   }
2682 }
2683
2684 static void release_scaled_references(VP9_COMP *cpi) {
2685   VP9_COMMON *cm = &cpi->common;
2686   int i;
2687
2688   for (i = 0; i < 3; i++)
2689     cm->fb_idx_ref_cnt[cpi->scaled_ref_idx[i]]--;
2690 }
2691
2692 static void full_to_model_count(unsigned int *model_count,
2693                                 unsigned int *full_count) {
2694   int n;
2695   model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
2696   model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
2697   model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
2698   for (n = THREE_TOKEN; n < DCT_EOB_TOKEN; ++n)
2699     model_count[TWO_TOKEN] += full_count[n];
2700   model_count[DCT_EOB_MODEL_TOKEN] = full_count[DCT_EOB_TOKEN];
2701 }
2702
2703 static void full_to_model_counts(
2704     vp9_coeff_count_model *model_count, vp9_coeff_count *full_count) {
2705   int i, j, k, l;
2706   for (i = 0; i < BLOCK_TYPES; ++i)
2707     for (j = 0; j < REF_TYPES; ++j)
2708       for (k = 0; k < COEF_BANDS; ++k)
2709         for (l = 0; l < PREV_COEF_CONTEXTS; ++l) {
2710           if (l >= 3 && k == 0)
2711             continue;
2712           full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]);
2713         }
2714 }
2715
2716 #if 0 && CONFIG_INTERNAL_STATS
2717 static void output_frame_level_debug_stats(VP9_COMP *cpi) {
2718   VP9_COMMON *const cm = &cpi->common;
2719   FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w");
2720   int recon_err;
2721
2722   vp9_clear_system_state();  // __asm emms;
2723
2724   recon_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
2725
2726   if (cpi->twopass.total_left_stats.coded_error != 0.0)
2727     fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %10d"
2728         "%7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f"
2729         "%6d %6d %5d %5d %5d %8.2f %10d %10.3f"
2730         "%10.3f %8d %10d %10d %10d\n",
2731         cpi->common.current_video_frame, cpi->this_frame_target,
2732         cpi->projected_frame_size, 0,
2733         (cpi->projected_frame_size - cpi->this_frame_target),
2734         (int)cpi->total_target_vs_actual,
2735         (int)(cpi->oxcf.starting_buffer_level - cpi->bits_off_target),
2736         (int)cpi->total_actual_bits, cm->base_qindex,
2737         vp9_convert_qindex_to_q(cm->base_qindex),
2738         (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0,
2739         vp9_convert_qindex_to_q(cpi->active_best_quality),
2740         vp9_convert_qindex_to_q(cpi->active_worst_quality), cpi->avg_q,
2741         vp9_convert_qindex_to_q(cpi->ni_av_qi),
2742         vp9_convert_qindex_to_q(cpi->cq_target_quality),
2743         cpi->refresh_last_frame, cpi->refresh_golden_frame,
2744         cpi->refresh_alt_ref_frame, cm->frame_type, cpi->gfu_boost,
2745         cpi->twopass.est_max_qcorrection_factor, (int)cpi->twopass.bits_left,
2746         cpi->twopass.total_left_stats.coded_error,
2747         (double)cpi->twopass.bits_left /
2748             (1 + cpi->twopass.total_left_stats.coded_error),
2749         cpi->tot_recode_hits, recon_err, cpi->kf_boost, cpi->kf_zeromotion_pct);
2750
2751   fclose(f);
2752
2753   if (0) {
2754     FILE *const fmodes = fopen("Modes.stt", "a");
2755     int i;
2756
2757     fprintf(fmodes, "%6d:%1d:%1d:%1d ", cpi->common.current_video_frame,
2758             cm->frame_type, cpi->refresh_golden_frame,
2759             cpi->refresh_alt_ref_frame);
2760
2761     for (i = 0; i < MAX_MODES; ++i)
2762       fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
2763     for (i = 0; i < MAX_REFS; ++i)
2764       fprintf(fmodes, "%5d ", cpi->sub8x8_mode_chosen_counts[i]);
2765
2766     fprintf(fmodes, "\n");
2767
2768     fclose(fmodes);
2769   }
2770 }
2771 #endif
2772
2773 static int pick_q_and_adjust_q_bounds(VP9_COMP *cpi,
2774                                       int * bottom_index, int * top_index) {
2775   // Set an active best quality and if necessary active worst quality
2776   int q = cpi->active_worst_quality;
2777   VP9_COMMON *const cm = &cpi->common;
2778
2779   if (frame_is_intra_only(cm)) {
2780 #if !CONFIG_MULTIPLE_ARF
2781     // Handle the special case for key frames forced when we have75 reached
2782     // the maximum key frame interval. Here force the Q to a range
2783     // based on the ambient Q to reduce the risk of popping.
2784     if (cpi->this_key_frame_forced) {
2785       int delta_qindex;
2786       int qindex = cpi->last_boosted_qindex;
2787       double last_boosted_q = vp9_convert_qindex_to_q(qindex);
2788
2789       delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
2790                                         (last_boosted_q * 0.75));
2791
2792       cpi->active_best_quality = MAX(qindex + delta_qindex,
2793                                      cpi->best_quality);
2794     } else {
2795       int high = 5000;
2796       int low = 400;
2797       double q_adj_factor = 1.0;
2798       double q_val;
2799
2800       // Baseline value derived from cpi->active_worst_quality and kf boost
2801       cpi->active_best_quality = get_active_quality(q, cpi->kf_boost,
2802                                                     low, high,
2803                                                     kf_low_motion_minq,
2804                                                     kf_high_motion_minq);
2805
2806       // Allow somewhat lower kf minq with small image formats.
2807       if ((cm->width * cm->height) <= (352 * 288)) {
2808         q_adj_factor -= 0.25;
2809       }
2810
2811       // Make a further adjustment based on the kf zero motion measure.
2812       q_adj_factor += 0.05 - (0.001 * (double)cpi->kf_zeromotion_pct);
2813
2814       // Convert the adjustment factor to a qindex delta
2815       // on active_best_quality.
2816       q_val = vp9_convert_qindex_to_q(cpi->active_best_quality);
2817       cpi->active_best_quality +=
2818           vp9_compute_qdelta(cpi, q_val, (q_val * q_adj_factor));
2819     }
2820 #else
2821     double current_q;
2822     // Force the KF quantizer to be 30% of the active_worst_quality.
2823     current_q = vp9_convert_qindex_to_q(cpi->active_worst_quality);
2824     cpi->active_best_quality = cpi->active_worst_quality
2825         + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
2826 #endif
2827   } else if (!cpi->is_src_frame_alt_ref &&
2828              (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
2829     int high = 2000;
2830     int low = 400;
2831
2832     // Use the lower of cpi->active_worst_quality and recent
2833     // average Q as basis for GF/ARF best Q limit unless last frame was
2834     // a key frame.
2835     if (cpi->frames_since_key > 1 &&
2836         cpi->avg_frame_qindex < cpi->active_worst_quality) {
2837       q = cpi->avg_frame_qindex;
2838     }
2839     // For constrained quality dont allow Q less than the cq level
2840     if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
2841       if (q < cpi->cq_target_quality)
2842         q = cpi->cq_target_quality;
2843       if (cpi->frames_since_key > 1) {
2844         cpi->active_best_quality = get_active_quality(q, cpi->gfu_boost,
2845                                                       low, high,
2846                                                       afq_low_motion_minq,
2847                                                       afq_high_motion_minq);
2848       } else {
2849         cpi->active_best_quality = get_active_quality(q, cpi->gfu_boost,
2850                                                       low, high,
2851                                                       gf_low_motion_minq,
2852                                                       gf_high_motion_minq);
2853       }
2854       // Constrained quality use slightly lower active best.
2855       cpi->active_best_quality = cpi->active_best_quality * 15 / 16;
2856
2857     } else if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
2858       if (!cpi->refresh_alt_ref_frame) {
2859         cpi->active_best_quality = cpi->cq_target_quality;
2860       } else {
2861         if (cpi->frames_since_key > 1) {
2862           cpi->active_best_quality = get_active_quality(q, cpi->gfu_boost,
2863                                                         low, high,
2864                                                         afq_low_motion_minq,
2865                                                         afq_high_motion_minq);
2866         } else {
2867           cpi->active_best_quality = get_active_quality(q, cpi->gfu_boost,
2868                                                         low, high,
2869                                                         gf_low_motion_minq,
2870                                                         gf_high_motion_minq);
2871         }
2872       }
2873     } else {
2874         cpi->active_best_quality = get_active_quality(q, cpi->gfu_boost,
2875                                                       low, high,
2876                                                       gf_low_motion_minq,
2877                                                       gf_high_motion_minq);
2878     }
2879   } else {
2880     if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
2881       cpi->active_best_quality = cpi->cq_target_quality;
2882     } else {
2883       cpi->active_best_quality = inter_minq[q];
2884       // 1-pass: for now, use the average Q for the active_best, if its lower
2885       // than active_worst.
2886       if (cpi->pass == 0 && (cpi->avg_frame_qindex < q))
2887         cpi->active_best_quality = inter_minq[cpi->avg_frame_qindex];
2888
2889       // For the constrained quality mode we don't want
2890       // q to fall below the cq level.
2891       if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
2892           (cpi->active_best_quality < cpi->cq_target_quality)) {
2893         // If we are strongly undershooting the target rate in the last
2894         // frames then use the user passed in cq value not the auto
2895         // cq value.
2896         if (cpi->rolling_actual_bits < cpi->min_frame_bandwidth)
2897           cpi->active_best_quality = cpi->oxcf.cq_level;
2898         else
2899           cpi->active_best_quality = cpi->cq_target_quality;
2900       }
2901     }
2902   }
2903
2904   // Clip the active best and worst quality values to limits
2905   if (cpi->active_worst_quality > cpi->worst_quality)
2906     cpi->active_worst_quality = cpi->worst_quality;
2907
2908   if (cpi->active_best_quality < cpi->best_quality)
2909     cpi->active_best_quality = cpi->best_quality;
2910
2911   if (cpi->active_best_quality > cpi->worst_quality)
2912     cpi->active_best_quality = cpi->worst_quality;
2913
2914   if (cpi->active_worst_quality < cpi->active_best_quality)
2915     cpi->active_worst_quality = cpi->active_best_quality;
2916
2917   // Limit Q range for the adaptive loop.
2918   if (cm->frame_type == KEY_FRAME && !cpi->this_key_frame_forced) {
2919     *top_index =
2920       (cpi->active_worst_quality + cpi->active_best_quality * 3) / 4;
2921     // If this is the first (key) frame in 1-pass, active best is the user
2922     // best-allowed, and leave the top_index to active_worst.
2923     if (cpi->pass == 0 && cpi->common.current_video_frame == 0) {
2924       cpi->active_best_quality = cpi->oxcf.best_allowed_q;
2925       *top_index = cpi->oxcf.worst_allowed_q;
2926     }
2927   } else if (!cpi->is_src_frame_alt_ref &&
2928              (cpi->oxcf.end_usage != USAGE_STREAM_FROM_SERVER) &&
2929              (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
2930     *top_index =
2931       (cpi->active_worst_quality + cpi->active_best_quality) / 2;
2932   } else {
2933     *top_index = cpi->active_worst_quality;
2934   }
2935   *bottom_index = cpi->active_best_quality;
2936
2937   if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
2938     q = cpi->active_best_quality;
2939   // Special case code to try and match quality with forced key frames
2940   } else if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
2941     q = cpi->last_boosted_qindex;
2942   } else {
2943     // Determine initial Q to try.
2944     if (cpi->pass == 0) {
2945       // 1-pass: for now, use per-frame-bw for target size of frame, scaled
2946       // by |x| for key frame.
2947       int scale = (cm->frame_type == KEY_FRAME) ? 5 : 1;
2948       q = vp9_regulate_q(cpi, scale * cpi->av_per_frame_bandwidth);
2949     } else {
2950       q = vp9_regulate_q(cpi, cpi->this_frame_target);
2951     }
2952     if (q > *top_index)
2953       q = *top_index;
2954   }
2955
2956   return q;
2957 }
2958 static void encode_frame_to_data_rate(VP9_COMP *cpi,
2959                                       unsigned long *size,
2960                                       unsigned char *dest,
2961                                       unsigned int *frame_flags) {
2962   VP9_COMMON *const cm = &cpi->common;
2963   TX_SIZE t;
2964   int q;
2965   int frame_over_shoot_limit;
2966   int frame_under_shoot_limit;
2967
2968   int loop = 0;
2969   int loop_count;
2970
2971   int q_low;
2972   int q_high;
2973
2974   int top_index;
2975   int bottom_index;
2976   int active_worst_qchanged = 0;
2977
2978   int overshoot_seen = 0;
2979   int undershoot_seen = 0;
2980
2981   SPEED_FEATURES *const sf = &cpi->sf;
2982   unsigned int max_mv_def = MIN(cpi->common.width, cpi->common.height);
2983   struct segmentation *const seg = &cm->seg;
2984
2985   /* Scale the source buffer, if required. */
2986   if (cm->mi_cols * 8 != cpi->un_scaled_source->y_width ||
2987       cm->mi_rows * 8 != cpi->un_scaled_source->y_height) {
2988     scale_and_extend_frame(cpi->un_scaled_source, &cpi->scaled_source);
2989     cpi->Source = &cpi->scaled_source;
2990   } else {
2991     cpi->Source = cpi->un_scaled_source;
2992   }
2993   scale_references(cpi);
2994
2995   // Clear down mmx registers to allow floating point in what follows.
2996   vp9_clear_system_state();
2997
2998   // For an alt ref frame in 2 pass we skip the call to the second
2999   // pass function that sets the target bandwidth so we must set it here.
3000   if (cpi->refresh_alt_ref_frame) {
3001     // Set a per frame bit target for the alt ref frame.
3002     cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
3003     // Set a per second target bitrate.
3004     cpi->target_bandwidth = (int)(cpi->twopass.gf_bits * cpi->output_framerate);
3005   }
3006
3007   // Clear zbin over-quant value and mode boost values.
3008   cpi->zbin_mode_boost = 0;
3009
3010   // Enable or disable mode based tweaking of the zbin.
3011   // For 2 pass only used where GF/ARF prediction quality
3012   // is above a threshold.
3013   cpi->zbin_mode_boost = 0;
3014   cpi->zbin_mode_boost_enabled = 0;
3015
3016   // Current default encoder behavior for the altref sign bias.
3017   cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = cpi->source_alt_ref_active;
3018
3019   // Check to see if a key frame is signaled.
3020   // For two pass with auto key frame enabled cm->frame_type may already be
3021   // set, but not for one pass.
3022   if ((cm->current_video_frame == 0) ||
3023       (cm->frame_flags & FRAMEFLAGS_KEY) ||
3024       (cpi->oxcf.auto_key && (cpi->frames_since_key %
3025                               cpi->key_frame_frequency == 0))) {
3026     // Set frame type to key frame for the force key frame, if we exceed the
3027     // maximum distance in an automatic keyframe selection or for the first
3028     // frame.
3029     cm->frame_type = KEY_FRAME;
3030   }
3031
3032   // Set default state for segment based loop filter update flags.
3033   cm->lf.mode_ref_delta_update = 0;
3034
3035   // Initialize cpi->mv_step_param to default based on max resolution.
3036   cpi->mv_step_param = vp9_init_search_range(cpi, max_mv_def);
3037   // Initialize cpi->max_mv_magnitude and cpi->mv_step_param if appropriate.
3038   if (sf->auto_mv_step_size) {
3039     if (frame_is_intra_only(&cpi->common)) {
3040       // Initialize max_mv_magnitude for use in the first INTER frame
3041       // after a key/intra-only frame.
3042       cpi->max_mv_magnitude = max_mv_def;
3043     } else {
3044       if (cm->show_frame)
3045         // Allow mv_steps to correspond to twice the max mv magnitude found
3046         // in the previous frame, capped by the default max_mv_magnitude based
3047         // on resolution.
3048         cpi->mv_step_param = vp9_init_search_range(
3049             cpi, MIN(max_mv_def, 2 * cpi->max_mv_magnitude));
3050       cpi->max_mv_magnitude = 0;
3051     }
3052   }
3053
3054   // Set various flags etc to special state if it is a key frame.
3055   if (frame_is_intra_only(cm)) {
3056     vp9_setup_key_frame(cpi);
3057     // Reset the loop filter deltas and segmentation map.
3058     setup_features(cm);
3059
3060     // If segmentation is enabled force a map update for key frames.
3061     if (seg->enabled) {
3062       seg->update_map = 1;
3063       seg->update_data = 1;
3064     }
3065
3066     // The alternate reference frame cannot be active for a key frame.
3067     cpi->source_alt_ref_active = 0;
3068
3069     cm->error_resilient_mode = (cpi->oxcf.error_resilient_mode != 0);
3070     cm->frame_parallel_decoding_mode =
3071       (cpi->oxcf.frame_parallel_decoding_mode != 0);
3072     if (cm->error_resilient_mode) {
3073       cm->frame_parallel_decoding_mode = 1;
3074       cm->reset_frame_context = 0;
3075       cm->refresh_frame_context = 0;
3076     } else if (cm->intra_only) {
3077       // Only reset the current context.
3078       cm->reset_frame_context = 2;
3079     }
3080   }
3081
3082   // Configure experimental use of segmentation for enhanced coding of
3083   // static regions if indicated.
3084   // Only allowed in second pass of two pass (as requires lagged coding)
3085   // and if the relevant speed feature flag is set.
3086   if ((cpi->pass == 2) && (cpi->sf.static_segmentation)) {
3087     configure_static_seg_features(cpi);
3088   }
3089
3090   // Decide how big to make the frame.
3091   vp9_pick_frame_size(cpi);
3092
3093   vp9_clear_system_state();
3094
3095   q = pick_q_and_adjust_q_bounds(cpi, &bottom_index, &top_index);
3096
3097   q_high = top_index;
3098   q_low  = bottom_index;
3099
3100   vp9_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
3101                                 &frame_over_shoot_limit);
3102
3103 #if CONFIG_MULTIPLE_ARF
3104   // Force the quantizer determined by the coding order pattern.
3105   if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
3106       cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
3107     double new_q;
3108     double current_q = vp9_convert_qindex_to_q(cpi->active_worst_quality);
3109     int level = cpi->this_frame_weight;
3110     assert(level >= 0);
3111
3112     // Set quantizer steps at 10% increments.
3113     new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
3114     q = cpi->active_worst_quality + vp9_compute_qdelta(cpi, current_q, new_q);
3115
3116     bottom_index = q;
3117     top_index    = q;
3118     q_low  = q;
3119     q_high = q;
3120
3121     printf("frame:%d q:%d\n", cm->current_video_frame, q);
3122   }
3123 #endif
3124
3125   loop_count = 0;
3126   vp9_zero(cpi->rd_tx_select_threshes);
3127
3128   if (!frame_is_intra_only(cm)) {
3129     cm->mcomp_filter_type = DEFAULT_INTERP_FILTER;
3130     /* TODO: Decide this more intelligently */
3131     cm->allow_high_precision_mv = q < HIGH_PRECISION_MV_QTHRESH;
3132     set_mvcost(cpi);
3133   }
3134
3135 #if CONFIG_VP9_POSTPROC
3136
3137   if (cpi->oxcf.noise_sensitivity > 0) {
3138     int l = 0;
3139
3140     switch (cpi->oxcf.noise_sensitivity) {
3141       case 1:
3142         l = 20;
3143         break;
3144       case 2:
3145         l = 40;
3146         break;
3147       case 3:
3148         l = 60;
3149         break;
3150       case 4:
3151       case 5:
3152         l = 100;
3153         break;
3154       case 6:
3155         l = 150;
3156         break;
3157     }
3158
3159     vp9_denoise(cpi->Source, cpi->Source, l);
3160   }
3161
3162 #endif
3163
3164 #ifdef OUTPUT_YUV_SRC
3165   vp9_write_yuv_frame(cpi->Source);
3166 #endif
3167
3168   do {
3169     vp9_clear_system_state();  // __asm emms;
3170
3171     vp9_set_quantizer(cpi, q);
3172
3173     if (loop_count == 0) {
3174       // Set up entropy context depending on frame type. The decoder mandates
3175       // the use of the default context, index 0, for keyframes and inter
3176       // frames where the error_resilient_mode or intra_only flag is set. For
3177       // other inter-frames the encoder currently uses only two contexts;
3178       // context 1 for ALTREF frames and context 0 for the others.
3179       if (cm->frame_type == KEY_FRAME) {
3180         vp9_setup_key_frame(cpi);
3181       } else {
3182         if (!cm->intra_only && !cm->error_resilient_mode) {
3183           cpi->common.frame_context_idx = cpi->refresh_alt_ref_frame;
3184         }
3185         vp9_setup_inter_frame(cpi);
3186       }
3187     }
3188
3189     if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
3190         vp9_vaq_frame_setup(cpi);
3191     }
3192
3193     // transform / motion compensation build reconstruction frame
3194
3195     vp9_encode_frame(cpi);
3196
3197     // Update the skip mb flag probabilities based on the distribution
3198     // seen in the last encoder iteration.
3199     // update_base_skip_probs(cpi);
3200
3201     vp9_clear_system_state();  // __asm emms;
3202
3203     // Dummy pack of the bitstream using up to date stats to get an
3204     // accurate estimate of output frame size to determine if we need
3205     // to recode.
3206     vp9_save_coding_context(cpi);
3207     cpi->dummy_packing = 1;
3208     vp9_pack_bitstream(cpi, dest, size);
3209     cpi->projected_frame_size = (*size) << 3;
3210     vp9_restore_coding_context(cpi);
3211
3212     if (frame_over_shoot_limit == 0)
3213       frame_over_shoot_limit = 1;
3214     active_worst_qchanged = 0;
3215
3216     if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
3217       loop = 0;
3218     } else {
3219       // Special case handling for forced key frames
3220       if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
3221         int last_q = q;
3222         int kf_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
3223
3224         int high_err_target = cpi->ambient_err;
3225         int low_err_target = cpi->ambient_err >> 1;
3226
3227         // Prevent possible divide by zero error below for perfect KF
3228         kf_err += !kf_err;
3229
3230         // The key frame is not good enough or we can afford
3231         // to make it better without undue risk of popping.
3232         if ((kf_err > high_err_target &&
3233              cpi->projected_frame_size <= frame_over_shoot_limit) ||
3234             (kf_err > low_err_target &&
3235              cpi->projected_frame_size <= frame_under_shoot_limit)) {
3236           // Lower q_high
3237           q_high = q > q_low ? q - 1 : q_low;
3238
3239           // Adjust Q
3240           q = (q * high_err_target) / kf_err;
3241           q = MIN(q, (q_high + q_low) >> 1);
3242         } else if (kf_err < low_err_target &&
3243                    cpi->projected_frame_size >= frame_under_shoot_limit) {
3244           // The key frame is much better than the previous frame
3245           // Raise q_low
3246           q_low = q < q_high ? q + 1 : q_high;
3247
3248           // Adjust Q
3249           q = (q * low_err_target) / kf_err;
3250           q = MIN(q, (q_high + q_low + 1) >> 1);
3251         }
3252
3253         // Clamp Q to upper and lower limits:
3254         q = clamp(q, q_low, q_high);
3255
3256         loop = q != last_q;
3257       } else if (recode_loop_test(
3258           cpi, frame_over_shoot_limit, frame_under_shoot_limit,
3259           q, top_index, bottom_index)) {
3260         // Is the projected frame size out of range and are we allowed
3261         // to attempt to recode.
3262         int last_q = q;
3263         int retries = 0;
3264
3265         // Frame size out of permitted range:
3266         // Update correction factor & compute new Q to try...
3267
3268         // Frame is too large
3269         if (cpi->projected_frame_size > cpi->this_frame_target) {
3270           // Raise Qlow as to at least the current value
3271           q_low = q < q_high ? q + 1 : q_high;
3272
3273           if (undershoot_seen || loop_count > 1) {
3274             // Update rate_correction_factor unless
3275             // cpi->active_worst_quality has changed.
3276             if (!active_worst_qchanged)
3277               vp9_update_rate_correction_factors(cpi, 1);
3278
3279             q = (q_high + q_low + 1) / 2;
3280           } else {
3281             // Update rate_correction_factor unless
3282             // cpi->active_worst_quality has changed.
3283             if (!active_worst_qchanged)
3284               vp9_update_rate_correction_factors(cpi, 0);
3285
3286             q = vp9_regulate_q(cpi, cpi->this_frame_target);
3287
3288             while (q < q_low && retries < 10) {
3289               vp9_update_rate_correction_factors(cpi, 0);
3290               q = vp9_regulate_q(cpi, cpi->this_frame_target);
3291               retries++;
3292             }
3293           }
3294
3295           overshoot_seen = 1;
3296         } else {
3297           // Frame is too small
3298           q_high = q > q_low ? q - 1 : q_low;
3299
3300           if (overshoot_seen || loop_count > 1) {
3301             // Update rate_correction_factor unless
3302             // cpi->active_worst_quality has changed.
3303             if (!active_worst_qchanged)
3304               vp9_update_rate_correction_factors(cpi, 1);
3305
3306             q = (q_high + q_low) / 2;
3307           } else {
3308             // Update rate_correction_factor unless
3309             // cpi->active_worst_quality has changed.
3310             if (!active_worst_qchanged)
3311               vp9_update_rate_correction_factors(cpi, 0);
3312
3313             q = vp9_regulate_q(cpi, cpi->this_frame_target);
3314
3315             // Special case reset for qlow for constrained quality.
3316             // This should only trigger where there is very substantial
3317             // undershoot on a frame and the auto cq level is above
3318             // the user passsed in value.
3319             if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY && q < q_low) {
3320               q_low = q;
3321             }
3322
3323             while (q > q_high && retries < 10) {
3324               vp9_update_rate_correction_factors(cpi, 0);
3325               q = vp9_regulate_q(cpi, cpi->this_frame_target);
3326               retries++;
3327             }
3328           }
3329
3330           undershoot_seen = 1;
3331         }
3332
3333         // Clamp Q to upper and lower limits:
3334         q = clamp(q, q_low, q_high);
3335
3336         loop = q != last_q;
3337       } else {
3338         loop = 0;
3339       }
3340     }
3341
3342     if (cpi->is_src_frame_alt_ref)
3343       loop = 0;
3344
3345     if (loop) {
3346       loop_count++;
3347
3348 #if CONFIG_INTERNAL_STATS
3349       cpi->tot_recode_hits++;
3350 #endif
3351     }
3352   } while (loop);
3353
3354   // Special case code to reduce pulsing when key frames are forced at a
3355   // fixed interval. Note the reconstruction error if it is the frame before
3356   // the force key frame
3357   if (cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0)) {
3358     cpi->ambient_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
3359   }
3360
3361   if (cm->frame_type == KEY_FRAME)
3362     cpi->refresh_last_frame = 1;
3363
3364   cm->frame_to_show = get_frame_new_buffer(cm);
3365
3366 #if WRITE_RECON_BUFFER
3367   if (cm->show_frame)
3368     write_cx_frame_to_file(cm->frame_to_show,
3369                            cm->current_video_frame);
3370   else
3371     write_cx_frame_to_file(cm->frame_to_show,
3372                            cm->current_video_frame + 1000);
3373 #endif
3374
3375   // Pick the loop filter level for the frame.
3376   loopfilter_frame(cpi, cm);
3377
3378 #if WRITE_RECON_BUFFER
3379   if (cm->show_frame)
3380     write_cx_frame_to_file(cm->frame_to_show,
3381                            cm->current_video_frame + 2000);
3382   else
3383     write_cx_frame_to_file(cm->frame_to_show,
3384                            cm->current_video_frame + 3000);
3385 #endif
3386
3387   // build the bitstream
3388   cpi->dummy_packing = 0;
3389   vp9_pack_bitstream(cpi, dest, size);
3390
3391   if (cm->seg.update_map)
3392     update_reference_segmentation_map(cpi);
3393
3394   release_scaled_references(cpi);
3395   update_reference_frames(cpi);
3396
3397   for (t = TX_4X4; t <= TX_32X32; t++)
3398     full_to_model_counts(cpi->common.counts.coef[t],
3399                          cpi->coef_counts[t]);
3400   if (!cpi->common.error_resilient_mode &&
3401       !cpi->common.frame_parallel_decoding_mode) {
3402     vp9_adapt_coef_probs(&cpi->common);
3403   }
3404
3405   if (!frame_is_intra_only(&cpi->common)) {
3406     FRAME_COUNTS *counts = &cpi->common.counts;
3407
3408     vp9_copy(counts->y_mode, cpi->y_mode_count);
3409     vp9_copy(counts->uv_mode, cpi->y_uv_mode_count);
3410     vp9_copy(counts->partition, cpi->partition_count);
3411     vp9_copy(counts->intra_inter, cpi->intra_inter_count);
3412     vp9_copy(counts->comp_inter, cpi->comp_inter_count);
3413     vp9_copy(counts->single_ref, cpi->single_ref_count);
3414     vp9_copy(counts->comp_ref, cpi->comp_ref_count);
3415     counts->mv = cpi->NMVcount;
3416     if (!cpi->common.error_resilient_mode &&
3417         !cpi->common.frame_parallel_decoding_mode) {
3418       vp9_adapt_mode_probs(&cpi->common);
3419       vp9_adapt_mv_probs(&cpi->common, cpi->common.allow_high_precision_mv);
3420     }
3421   }
3422
3423 #ifdef ENTROPY_STATS
3424   vp9_update_mode_context_stats(cpi);
3425 #endif
3426
3427   /* Move storing frame_type out of the above loop since it is also
3428    * needed in motion search besides loopfilter */
3429   cm->last_frame_type = cm->frame_type;
3430
3431   // Update rate control heuristics
3432   cpi->total_byte_count += (*size);
3433   cpi->projected_frame_size = (*size) << 3;
3434
3435   // Post encode loop adjustment of Q prediction.
3436   if (!active_worst_qchanged)
3437     vp9_update_rate_correction_factors(cpi, (cpi->sf.recode_loop ||
3438         cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ? 2 : 0);
3439
3440
3441   cpi->last_q[cm->frame_type] = cm->base_qindex;
3442
3443   // Keep record of last boosted (KF/KF/ARF) Q value.
3444   // If the current frame is coded at a lower Q then we also update it.
3445   // If all mbs in this group are skipped only update if the Q value is
3446   // better than that already stored.
3447   // This is used to help set quality in forced key frames to reduce popping
3448   if ((cm->base_qindex < cpi->last_boosted_qindex) ||
3449       ((cpi->static_mb_pct < 100) &&
3450        ((cm->frame_type == KEY_FRAME) ||
3451         cpi->refresh_alt_ref_frame ||
3452         (cpi->refresh_golden_frame && !cpi->is_src_frame_alt_ref)))) {
3453     cpi->last_boosted_qindex = cm->base_qindex;
3454   }
3455
3456   if (cm->frame_type == KEY_FRAME) {
3457     vp9_adjust_key_frame_context(cpi);
3458   }
3459
3460   // Keep a record of ambient average Q.
3461   if (cm->frame_type != KEY_FRAME)
3462     cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex +
3463                             cm->base_qindex) >> 2;
3464
3465   // Keep a record from which we can calculate the average Q excluding GF
3466   // updates and key frames.
3467   if (cm->frame_type != KEY_FRAME &&
3468       !cpi->refresh_golden_frame &&
3469       !cpi->refresh_alt_ref_frame) {
3470     cpi->ni_frames++;
3471     cpi->tot_q += vp9_convert_qindex_to_q(q);
3472     cpi->avg_q = cpi->tot_q / (double)cpi->ni_frames;
3473
3474     // Calculate the average Q for normal inter frames (not key or GFU frames).
3475     cpi->ni_tot_qi += q;
3476     cpi->ni_av_qi = cpi->ni_tot_qi / cpi->ni_frames;
3477   }
3478
3479   // Update the buffer level variable.
3480   // Non-viewable frames are a special case and are treated as pure overhead.
3481   if (!cm->show_frame)
3482     cpi->bits_off_target -= cpi->projected_frame_size;
3483   else
3484     cpi->bits_off_target += cpi->av_per_frame_bandwidth -
3485                             cpi->projected_frame_size;
3486
3487   // Clip the buffer level at the maximum buffer size
3488   if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
3489     cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
3490
3491   // Rolling monitors of whether we are over or underspending used to help
3492   // regulate min and Max Q in two pass.
3493   if (cm->frame_type != KEY_FRAME) {
3494     cpi->rolling_target_bits =
3495       ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
3496     cpi->rolling_actual_bits =
3497       ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
3498     cpi->long_rolling_target_bits =
3499       ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
3500     cpi->long_rolling_actual_bits =
3501       ((cpi->long_rolling_actual_bits * 31) +
3502        cpi->projected_frame_size + 16) / 32;
3503   }
3504
3505   // Actual bits spent
3506   cpi->total_actual_bits += cpi->projected_frame_size;
3507
3508   // Debug stats
3509   cpi->total_target_vs_actual += (cpi->this_frame_target -
3510                                   cpi->projected_frame_size);
3511
3512   cpi->buffer_level = cpi->bits_off_target;
3513
3514 #ifndef DISABLE_RC_LONG_TERM_MEM
3515   // Update bits left to the kf and gf groups to account for overshoot or
3516   // undershoot on these frames
3517   if (cm->frame_type == KEY_FRAME) {
3518     cpi->twopass.kf_group_bits += cpi->this_frame_target -
3519                                   cpi->projected_frame_size;
3520
3521     cpi->twopass.kf_group_bits = MAX(cpi->twopass.kf_group_bits, 0);
3522   } else if (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) {
3523     cpi->twopass.gf_group_bits += cpi->this_frame_target -
3524                                   cpi->projected_frame_size;
3525
3526     cpi->twopass.gf_group_bits = MAX(cpi->twopass.gf_group_bits, 0);
3527   }
3528 #endif
3529
3530 #if 0
3531   output_frame_level_debug_stats(cpi);
3532 #endif
3533   if (cpi->refresh_golden_frame == 1)
3534     cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
3535   else
3536     cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
3537
3538   if (cpi->refresh_alt_ref_frame == 1)
3539     cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
3540   else
3541     cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
3542
3543
3544   if (cpi->refresh_last_frame & cpi->refresh_golden_frame)
3545     cpi->gold_is_last = 1;
3546   else if (cpi->refresh_last_frame ^ cpi->refresh_golden_frame)
3547     cpi->gold_is_last = 0;
3548
3549   if (cpi->refresh_last_frame & cpi->refresh_alt_ref_frame)
3550     cpi->alt_is_last = 1;
3551   else if (cpi->refresh_last_frame ^ cpi->refresh_alt_ref_frame)
3552     cpi->alt_is_last = 0;
3553
3554   if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame)
3555     cpi->gold_is_alt = 1;
3556   else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame)
3557     cpi->gold_is_alt = 0;
3558
3559   cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
3560
3561   if (cpi->gold_is_last)
3562     cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
3563
3564   if (cpi->alt_is_last)
3565     cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
3566
3567   if (cpi->gold_is_alt)
3568     cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
3569
3570   if (cpi->oxcf.play_alternate && cpi->refresh_alt_ref_frame
3571       && (cm->frame_type != KEY_FRAME))
3572     // Update the alternate reference frame stats as appropriate.
3573     update_alt_ref_frame_stats(cpi);
3574   else
3575     // Update the Golden frame stats as appropriate.
3576     update_golden_frame_stats(cpi);
3577
3578   if (cm->frame_type == KEY_FRAME) {
3579     // Tell the caller that the frame was coded as a key frame
3580     *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
3581
3582 #if CONFIG_MULTIPLE_ARF
3583     // Reset the sequence number.
3584     if (cpi->multi_arf_enabled) {
3585       cpi->sequence_number = 0;
3586       cpi->frame_coding_order_period = cpi->new_frame_coding_order_period;
3587       cpi->new_frame_coding_order_period = -1;
3588     }
3589 #endif
3590
3591     // As this frame is a key frame the next defaults to an inter frame.
3592     cm->frame_type = INTER_FRAME;
3593   } else {
3594     *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
3595
3596 #if CONFIG_MULTIPLE_ARF
3597     /* Increment position in the coded frame sequence. */
3598     if (cpi->multi_arf_enabled) {
3599       ++cpi->sequence_number;
3600       if (cpi->sequence_number >= cpi->frame_coding_order_period) {
3601         cpi->sequence_number = 0;
3602         cpi->frame_coding_order_period = cpi->new_frame_coding_order_period;
3603         cpi->new_frame_coding_order_period = -1;
3604       }
3605       cpi->this_frame_weight = cpi->arf_weight[cpi->sequence_number];
3606       assert(cpi->this_frame_weight >= 0);
3607     }
3608 #endif
3609   }
3610
3611   // Clear the one shot update flags for segmentation map and mode/ref loop
3612   // filter deltas.
3613   cm->seg.update_map = 0;
3614   cm->seg.update_data = 0;
3615   cm->lf.mode_ref_delta_update = 0;
3616
3617   // keep track of the last coded dimensions
3618   cm->last_width = cm->width;
3619   cm->last_height = cm->height;
3620
3621   // reset to normal state now that we are done.
3622   cm->last_show_frame = cm->show_frame;
3623   if (cm->show_frame) {
3624     // current mip will be the prev_mip for the next frame
3625     MODE_INFO *temp = cm->prev_mip;
3626     MODE_INFO **temp2 = cm->prev_mi_grid_base;
3627     cm->prev_mip = cm->mip;
3628     cm->mip = temp;
3629     cm->prev_mi_grid_base = cm->mi_grid_base;
3630     cm->mi_grid_base = temp2;
3631
3632     // update the upper left visible macroblock ptrs
3633     cm->mi = cm->mip + cm->mode_info_stride + 1;
3634     cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1;
3635
3636     cpi->mb.e_mbd.mi_8x8 = cm->mi_grid_visible;
3637     cpi->mb.e_mbd.mi_8x8[0] = cm->mi;
3638
3639     // Don't increment frame counters if this was an altref buffer
3640     // update not a real frame
3641     ++cm->current_video_frame;
3642     ++cpi->frames_since_key;
3643   }
3644   // restore prev_mi
3645   cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1;
3646   cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1;
3647 }
3648
3649 static void Pass2Encode(VP9_COMP *cpi, unsigned long *size,
3650                         unsigned char *dest, unsigned int *frame_flags) {
3651   cpi->enable_encode_breakout = 1;
3652
3653   if (!cpi->refresh_alt_ref_frame)
3654     vp9_second_pass(cpi);
3655
3656   encode_frame_to_data_rate(cpi, size, dest, frame_flags);
3657   // vp9_print_modes_and_motion_vectors(&cpi->common, "encode.stt");
3658 #ifdef DISABLE_RC_LONG_TERM_MEM
3659   cpi->twopass.bits_left -=  cpi->this_frame_target;
3660 #else
3661   cpi->twopass.bits_left -= 8 * *size;
3662 #endif
3663
3664   if (!cpi->refresh_alt_ref_frame) {
3665     double lower_bounds_min_rate = FRAME_OVERHEAD_BITS * cpi->oxcf.framerate;
3666     double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
3667                                         * cpi->oxcf.two_pass_vbrmin_section
3668                                         / 100);
3669
3670     if (two_pass_min_rate < lower_bounds_min_rate)
3671       two_pass_min_rate = lower_bounds_min_rate;
3672
3673     cpi->twopass.bits_left += (int64_t)(two_pass_min_rate
3674                               / cpi->oxcf.framerate);
3675   }
3676 }
3677
3678 static void check_initial_width(VP9_COMP *cpi, YV12_BUFFER_CONFIG *sd) {
3679   VP9_COMMON            *cm = &cpi->common;
3680   if (!cpi->initial_width) {
3681     // TODO(jkoleszar): Support 1/4 subsampling?
3682     cm->subsampling_x = (sd != NULL) && sd->uv_width < sd->y_width;
3683     cm->subsampling_y = (sd != NULL) && sd->uv_height < sd->y_height;
3684     alloc_raw_frame_buffers(cpi);
3685
3686     cpi->initial_width = cm->width;
3687     cpi->initial_height = cm->height;
3688   }
3689 }
3690
3691
3692 int vp9_receive_raw_frame(VP9_PTR ptr, unsigned int frame_flags,
3693                           YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
3694                           int64_t end_time) {
3695   VP9_COMP              *cpi = (VP9_COMP *) ptr;
3696   struct vpx_usec_timer  timer;
3697   int                    res = 0;
3698
3699   check_initial_width(cpi, sd);
3700   vpx_usec_timer_start(&timer);
3701   if (vp9_lookahead_push(cpi->lookahead, sd, time_stamp, end_time, frame_flags,
3702                          cpi->active_map_enabled ? cpi->active_map : NULL))
3703     res = -1;
3704   vpx_usec_timer_mark(&timer);
3705   cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
3706
3707   return res;
3708 }
3709
3710
3711 static int frame_is_reference(const VP9_COMP *cpi) {
3712   const VP9_COMMON *cm = &cpi->common;
3713
3714   return cm->frame_type == KEY_FRAME ||
3715          cpi->refresh_last_frame ||
3716          cpi->refresh_golden_frame ||
3717          cpi->refresh_alt_ref_frame ||
3718          cm->refresh_frame_context ||
3719          cm->lf.mode_ref_delta_update ||
3720          cm->seg.update_map ||
3721          cm->seg.update_data;
3722 }
3723
3724 #if CONFIG_MULTIPLE_ARF
3725 int is_next_frame_arf(VP9_COMP *cpi) {
3726   // Negative entry in frame_coding_order indicates an ARF at this position.
3727   return cpi->frame_coding_order[cpi->sequence_number + 1] < 0 ? 1 : 0;
3728 }
3729 #endif
3730
3731 int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
3732                             unsigned long *size, unsigned char *dest,
3733                             int64_t *time_stamp, int64_t *time_end, int flush) {
3734   VP9_COMP *cpi = (VP9_COMP *) ptr;
3735   VP9_COMMON *cm = &cpi->common;
3736   struct vpx_usec_timer  cmptimer;
3737   YV12_BUFFER_CONFIG    *force_src_buffer = NULL;
3738   int i;
3739   // FILE *fp_out = fopen("enc_frame_type.txt", "a");
3740
3741   if (!cpi)
3742     return -1;
3743
3744   vpx_usec_timer_start(&cmptimer);
3745
3746   cpi->source = NULL;
3747
3748   cpi->common.allow_high_precision_mv = ALTREF_HIGH_PRECISION_MV;
3749   set_mvcost(cpi);
3750
3751   // Should we code an alternate reference frame.
3752   if (cpi->oxcf.play_alternate && cpi->source_alt_ref_pending) {
3753     int frames_to_arf;
3754
3755 #if CONFIG_MULTIPLE_ARF
3756     assert(!cpi->multi_arf_enabled ||
3757            cpi->frame_coding_order[cpi->sequence_number] < 0);
3758
3759     if (cpi->multi_arf_enabled && (cpi->pass == 2))
3760       frames_to_arf = (-cpi->frame_coding_order[cpi->sequence_number])
3761         - cpi->next_frame_in_order;
3762     else
3763 #endif
3764       frames_to_arf = cpi->frames_till_gf_update_due;
3765
3766     assert(frames_to_arf < cpi->twopass.frames_to_key);
3767
3768     if ((cpi->source = vp9_lookahead_peek(cpi->lookahead, frames_to_arf))) {
3769 #if CONFIG_MULTIPLE_ARF
3770       cpi->alt_ref_source[cpi->arf_buffered] = cpi->source;
3771 #else
3772       cpi->alt_ref_source = cpi->source;
3773 #endif
3774
3775       if (cpi->oxcf.arnr_max_frames > 0) {
3776         // Produce the filtered ARF frame.
3777         // TODO(agrange) merge these two functions.
3778         configure_arnr_filter(cpi, cm->current_video_frame + frames_to_arf,
3779                               cpi->gfu_boost);
3780         vp9_temporal_filter_prepare(cpi, frames_to_arf);
3781         vp9_extend_frame_borders(&cpi->alt_ref_buffer,
3782                                  cm->subsampling_x, cm->subsampling_y);
3783         force_src_buffer = &cpi->alt_ref_buffer;
3784       }
3785
3786       cm->show_frame = 0;
3787       cpi->refresh_alt_ref_frame = 1;
3788       cpi->refresh_golden_frame = 0;
3789       cpi->refresh_last_frame = 0;
3790       cpi->is_src_frame_alt_ref = 0;
3791
3792       // TODO(agrange) This needs to vary depending on where the next ARF is.
3793       cpi->frames_till_alt_ref_frame = frames_to_arf;
3794
3795 #if CONFIG_MULTIPLE_ARF
3796       if (!cpi->multi_arf_enabled)
3797 #endif
3798         cpi->source_alt_ref_pending = 0;   // Clear Pending altf Ref flag.
3799     }
3800   }
3801
3802   if (!cpi->source) {
3803 #if CONFIG_MULTIPLE_ARF
3804     int i;
3805 #endif
3806     if ((cpi->source = vp9_lookahead_pop(cpi->lookahead, flush))) {
3807       cm->show_frame = 1;
3808       cm->intra_only = 0;
3809
3810 #if CONFIG_MULTIPLE_ARF
3811       // Is this frame the ARF overlay.
3812       cpi->is_src_frame_alt_ref = 0;
3813       for (i = 0; i < cpi->arf_buffered; ++i) {
3814         if (cpi->source == cpi->alt_ref_source[i]) {
3815           cpi->is_src_frame_alt_ref = 1;
3816           cpi->refresh_golden_frame = 1;
3817           break;
3818         }
3819       }
3820 #else
3821       cpi->is_src_frame_alt_ref = cpi->alt_ref_source
3822                                   && (cpi->source == cpi->alt_ref_source);
3823 #endif
3824       if (cpi->is_src_frame_alt_ref) {
3825         // Current frame is an ARF overlay frame.
3826 #if CONFIG_MULTIPLE_ARF
3827         cpi->alt_ref_source[i] = NULL;
3828 #else
3829         cpi->alt_ref_source = NULL;
3830 #endif
3831         // Don't refresh the last buffer for an ARF overlay frame. It will
3832         // become the GF so preserve last as an alternative prediction option.
3833         cpi->refresh_last_frame = 0;
3834       }
3835 #if CONFIG_MULTIPLE_ARF
3836       ++cpi->next_frame_in_order;
3837 #endif
3838     }
3839   }
3840
3841   if (cpi->source) {
3842     cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer
3843                                                            : &cpi->source->img;
3844     *time_stamp = cpi->source->ts_start;
3845     *time_end = cpi->source->ts_end;
3846     *frame_flags = cpi->source->flags;
3847
3848     // fprintf(fp_out, "   Frame:%d", cm->current_video_frame);
3849 #if CONFIG_MULTIPLE_ARF
3850     if (cpi->multi_arf_enabled) {
3851       // fprintf(fp_out, "   seq_no:%d  this_frame_weight:%d",
3852       //         cpi->sequence_number, cpi->this_frame_weight);
3853     } else {
3854       // fprintf(fp_out, "\n");
3855     }
3856 #else
3857     // fprintf(fp_out, "\n");
3858 #endif
3859
3860 #if CONFIG_MULTIPLE_ARF
3861     if ((cm->frame_type != KEY_FRAME) && (cpi->pass == 2))
3862       cpi->source_alt_ref_pending = is_next_frame_arf(cpi);
3863 #endif
3864   } else {
3865     *size = 0;
3866     if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
3867       vp9_end_first_pass(cpi);    /* get last stats packet */
3868       cpi->twopass.first_pass_done = 1;
3869     }
3870
3871     // fclose(fp_out);
3872     return -1;
3873   }
3874
3875   if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
3876     cpi->first_time_stamp_ever = cpi->source->ts_start;
3877     cpi->last_end_time_stamp_seen = cpi->source->ts_start;
3878   }
3879
3880   // adjust frame rates based on timestamps given
3881   if (!cpi->refresh_alt_ref_frame) {
3882     int64_t this_duration;
3883     int step = 0;
3884
3885     if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
3886       this_duration = cpi->source->ts_end - cpi->source->ts_start;
3887       step = 1;
3888     } else {
3889       int64_t last_duration = cpi->last_end_time_stamp_seen
3890                                 - cpi->last_time_stamp_seen;
3891
3892       this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
3893
3894       // do a step update if the duration changes by 10%
3895       if (last_duration)
3896         step = (int)((this_duration - last_duration) * 10 / last_duration);
3897     }
3898
3899     if (this_duration) {
3900       if (step) {
3901         vp9_new_framerate(cpi, 10000000.0 / this_duration);
3902       } else {
3903         // Average this frame's rate into the last second's average
3904         // frame rate. If we haven't seen 1 second yet, then average
3905         // over the whole interval seen.
3906         const double interval = MIN((double)(cpi->source->ts_end
3907                                      - cpi->first_time_stamp_ever), 10000000.0);
3908         double avg_duration = 10000000.0 / cpi->oxcf.framerate;
3909         avg_duration *= (interval - avg_duration + this_duration);
3910         avg_duration /= interval;
3911
3912         vp9_new_framerate(cpi, 10000000.0 / avg_duration);
3913       }
3914     }
3915
3916     cpi->last_time_stamp_seen = cpi->source->ts_start;
3917     cpi->last_end_time_stamp_seen = cpi->source->ts_end;
3918   }
3919
3920   // start with a 0 size frame
3921   *size = 0;
3922
3923   // Clear down mmx registers
3924   vp9_clear_system_state();  // __asm emms;
3925
3926   /* find a free buffer for the new frame, releasing the reference previously
3927    * held.
3928    */
3929   cm->fb_idx_ref_cnt[cm->new_fb_idx]--;
3930   cm->new_fb_idx = get_free_fb(cm);
3931
3932 #if CONFIG_MULTIPLE_ARF
3933   /* Set up the correct ARF frame. */
3934   if (cpi->refresh_alt_ref_frame) {
3935     ++cpi->arf_buffered;
3936   }
3937   if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
3938       (cpi->pass == 2)) {
3939     cpi->alt_fb_idx = cpi->arf_buffer_idx[cpi->sequence_number];
3940   }
3941 #endif
3942
3943   /* Get the mapping of L/G/A to the reference buffer pool */
3944   cm->active_ref_idx[0] = cm->ref_frame_map[cpi->lst_fb_idx];
3945   cm->active_ref_idx[1] = cm->ref_frame_map[cpi->gld_fb_idx];
3946   cm->active_ref_idx[2] = cm->ref_frame_map[cpi->alt_fb_idx];
3947
3948 #if 0  // CONFIG_MULTIPLE_ARF
3949   if (cpi->multi_arf_enabled) {
3950     fprintf(fp_out, "      idx(%d, %d, %d, %d) active(%d, %d, %d)",
3951         cpi->lst_fb_idx, cpi->gld_fb_idx, cpi->alt_fb_idx, cm->new_fb_idx,
3952         cm->active_ref_idx[0], cm->active_ref_idx[1], cm->active_ref_idx[2]);
3953     if (cpi->refresh_alt_ref_frame)
3954       fprintf(fp_out, "  type:ARF");
3955     if (cpi->is_src_frame_alt_ref)
3956       fprintf(fp_out, "  type:OVERLAY[%d]", cpi->alt_fb_idx);
3957     fprintf(fp_out, "\n");
3958   }
3959 #endif
3960
3961   cm->frame_type = INTER_FRAME;
3962   cm->frame_flags = *frame_flags;
3963
3964   // Reset the frame pointers to the current frame size
3965   vp9_realloc_frame_buffer(get_frame_new_buffer(cm),
3966                            cm->width, cm->height,
3967                            cm->subsampling_x, cm->subsampling_y,
3968                            VP9BORDERINPIXELS);
3969
3970   // Calculate scaling factors for each of the 3 available references
3971   for (i = 0; i < ALLOWED_REFS_PER_FRAME; ++i)
3972     vp9_setup_scale_factors(cm, i);
3973
3974   vp9_setup_interp_filters(&cpi->mb.e_mbd, DEFAULT_INTERP_FILTER, cm);
3975
3976   if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
3977       vp9_vaq_init();
3978   }
3979
3980   if (cpi->pass == 1) {
3981     Pass1Encode(cpi, size, dest, frame_flags);
3982   } else if (cpi->pass == 2) {
3983     Pass2Encode(cpi, size, dest, frame_flags);
3984   } else {
3985     encode_frame_to_data_rate(cpi, size, dest, frame_flags);
3986   }
3987
3988   if (cm->refresh_frame_context)
3989     cm->frame_contexts[cm->frame_context_idx] = cm->fc;
3990
3991   if (*size > 0) {
3992     // if its a dropped frame honor the requests on subsequent frames
3993     cpi->droppable = !frame_is_reference(cpi);
3994
3995     // return to normal state
3996     cm->reset_frame_context = 0;
3997     cm->refresh_frame_context = 1;
3998     cpi->refresh_alt_ref_frame = 0;
3999     cpi->refresh_golden_frame = 0;
4000     cpi->refresh_last_frame = 1;
4001     cm->frame_type = INTER_FRAME;
4002   }
4003
4004   vpx_usec_timer_mark(&cmptimer);
4005   cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
4006
4007   if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
4008     generate_psnr_packet(cpi);
4009
4010 #if CONFIG_INTERNAL_STATS
4011
4012   if (cpi->pass != 1) {
4013     cpi->bytes += *size;
4014
4015     if (cm->show_frame) {
4016       cpi->count++;
4017
4018       if (cpi->b_calculate_psnr) {
4019         double ye, ue, ve;
4020         double frame_psnr;
4021         YV12_BUFFER_CONFIG      *orig = cpi->Source;
4022         YV12_BUFFER_CONFIG      *recon = cpi->common.frame_to_show;
4023         YV12_BUFFER_CONFIG      *pp = &cm->post_proc_buffer;
4024         int y_samples = orig->y_height * orig->y_width;
4025         int uv_samples = orig->uv_height * orig->uv_width;
4026         int t_samples = y_samples + 2 * uv_samples;
4027         double sq_error;
4028
4029         ye = (double)calc_plane_error(orig->y_buffer, orig->y_stride,
4030                               recon->y_buffer, recon->y_stride,
4031                               orig->y_crop_width, orig->y_crop_height);
4032
4033         ue = (double)calc_plane_error(orig->u_buffer, orig->uv_stride,
4034                               recon->u_buffer, recon->uv_stride,
4035                               orig->uv_crop_width, orig->uv_crop_height);
4036
4037         ve = (double)calc_plane_error(orig->v_buffer, orig->uv_stride,
4038                               recon->v_buffer, recon->uv_stride,
4039                               orig->uv_crop_width, orig->uv_crop_height);
4040
4041         sq_error = ye + ue + ve;
4042
4043         frame_psnr = vp9_mse2psnr(t_samples, 255.0, sq_error);
4044
4045         cpi->total_y += vp9_mse2psnr(y_samples, 255.0, ye);
4046         cpi->total_u += vp9_mse2psnr(uv_samples, 255.0, ue);
4047         cpi->total_v += vp9_mse2psnr(uv_samples, 255.0, ve);
4048         cpi->total_sq_error += sq_error;
4049         cpi->total  += frame_psnr;
4050         {
4051           double frame_psnr2, frame_ssim2 = 0;
4052           double weight = 0;
4053 #if CONFIG_VP9_POSTPROC
4054           vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer,
4055                       cm->lf.filter_level * 10 / 6);
4056 #endif
4057           vp9_clear_system_state();
4058
4059           ye = (double)calc_plane_error(orig->y_buffer, orig->y_stride,
4060                                 pp->y_buffer, pp->y_stride,
4061                                 orig->y_crop_width, orig->y_crop_height);
4062
4063           ue = (double)calc_plane_error(orig->u_buffer, orig->uv_stride,
4064                                 pp->u_buffer, pp->uv_stride,
4065                                 orig->uv_crop_width, orig->uv_crop_height);
4066
4067           ve = (double)calc_plane_error(orig->v_buffer, orig->uv_stride,
4068                                 pp->v_buffer, pp->uv_stride,
4069                                 orig->uv_crop_width, orig->uv_crop_height);
4070
4071           sq_error = ye + ue + ve;
4072
4073           frame_psnr2 = vp9_mse2psnr(t_samples, 255.0, sq_error);
4074
4075           cpi->totalp_y += vp9_mse2psnr(y_samples, 255.0, ye);
4076           cpi->totalp_u += vp9_mse2psnr(uv_samples, 255.0, ue);
4077           cpi->totalp_v += vp9_mse2psnr(uv_samples, 255.0, ve);
4078           cpi->total_sq_error2 += sq_error;
4079           cpi->totalp  += frame_psnr2;
4080
4081           frame_ssim2 = vp9_calc_ssim(cpi->Source,
4082                                       recon, 1, &weight);
4083
4084           cpi->summed_quality += frame_ssim2 * weight;
4085           cpi->summed_weights += weight;
4086
4087           frame_ssim2 = vp9_calc_ssim(cpi->Source,
4088                                       &cm->post_proc_buffer, 1, &weight);
4089
4090           cpi->summedp_quality += frame_ssim2 * weight;
4091           cpi->summedp_weights += weight;
4092 #if 0
4093           {
4094             FILE *f = fopen("q_used.stt", "a");
4095             fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
4096                     cpi->common.current_video_frame, y2, u2, v2,
4097                     frame_psnr2, frame_ssim2);
4098             fclose(f);
4099           }
4100 #endif
4101         }
4102       }
4103
4104       if (cpi->b_calculate_ssimg) {
4105         double y, u, v, frame_all;
4106         frame_all =  vp9_calc_ssimg(cpi->Source, cm->frame_to_show,
4107                                     &y, &u, &v);
4108         cpi->total_ssimg_y += y;
4109         cpi->total_ssimg_u += u;
4110         cpi->total_ssimg_v += v;
4111         cpi->total_ssimg_all += frame_all;
4112       }
4113     }
4114   }
4115
4116 #endif
4117   // fclose(fp_out);
4118   return 0;
4119 }
4120
4121 int vp9_get_preview_raw_frame(VP9_PTR comp, YV12_BUFFER_CONFIG *dest,
4122                               vp9_ppflags_t *flags) {
4123   VP9_COMP *cpi = (VP9_COMP *) comp;
4124
4125   if (!cpi->common.show_frame) {
4126     return -1;
4127   } else {
4128     int ret;
4129 #if CONFIG_VP9_POSTPROC
4130     ret = vp9_post_proc_frame(&cpi->common, dest, flags);
4131 #else
4132
4133     if (cpi->common.frame_to_show) {
4134       *dest = *cpi->common.frame_to_show;
4135       dest->y_width = cpi->common.width;
4136       dest->y_height = cpi->common.height;
4137       dest->uv_height = cpi->common.height / 2;
4138       ret = 0;
4139     } else {
4140       ret = -1;
4141     }
4142
4143 #endif  // !CONFIG_VP9_POSTPROC
4144     vp9_clear_system_state();
4145     return ret;
4146   }
4147 }
4148
4149 int vp9_set_roimap(VP9_PTR comp, unsigned char *map, unsigned int rows,
4150                    unsigned int cols, int delta_q[MAX_SEGMENTS],
4151                    int delta_lf[MAX_SEGMENTS],
4152                    unsigned int threshold[MAX_SEGMENTS]) {
4153   VP9_COMP *cpi = (VP9_COMP *) comp;
4154   signed char feature_data[SEG_LVL_MAX][MAX_SEGMENTS];
4155   struct segmentation *seg = &cpi->common.seg;
4156   int i;
4157
4158   if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
4159     return -1;
4160
4161   if (!map) {
4162     vp9_disable_segmentation((VP9_PTR)cpi);
4163     return 0;
4164   }
4165
4166   // Set the segmentation Map
4167   vp9_set_segmentation_map((VP9_PTR)cpi, map);
4168
4169   // Activate segmentation.
4170   vp9_enable_segmentation((VP9_PTR)cpi);
4171
4172   // Set up the quant, LF and breakout threshold segment data
4173   for (i = 0; i < MAX_SEGMENTS; i++) {
4174     feature_data[SEG_LVL_ALT_Q][i] = delta_q[i];
4175     feature_data[SEG_LVL_ALT_LF][i] = delta_lf[i];
4176     cpi->segment_encode_breakout[i] = threshold[i];
4177   }
4178
4179   // Enable the loop and quant changes in the feature mask
4180   for (i = 0; i < MAX_SEGMENTS; i++) {
4181     if (delta_q[i])
4182       vp9_enable_segfeature(seg, i, SEG_LVL_ALT_Q);
4183     else
4184       vp9_disable_segfeature(seg, i, SEG_LVL_ALT_Q);
4185
4186     if (delta_lf[i])
4187       vp9_enable_segfeature(seg, i, SEG_LVL_ALT_LF);
4188     else
4189       vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF);
4190   }
4191
4192   // Initialize the feature data structure
4193   // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1
4194   vp9_set_segment_data((VP9_PTR)cpi, &feature_data[0][0], SEGMENT_DELTADATA);
4195
4196   return 0;
4197 }
4198
4199 int vp9_set_active_map(VP9_PTR comp, unsigned char *map,
4200                        unsigned int rows, unsigned int cols) {
4201   VP9_COMP *cpi = (VP9_COMP *) comp;
4202
4203   if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) {
4204     if (map) {
4205       vpx_memcpy(cpi->active_map, map, rows * cols);
4206       cpi->active_map_enabled = 1;
4207     } else {
4208       cpi->active_map_enabled = 0;
4209     }
4210
4211     return 0;
4212   } else {
4213     // cpi->active_map_enabled = 0;
4214     return -1;
4215   }
4216 }
4217
4218 int vp9_set_internal_size(VP9_PTR comp,
4219                           VPX_SCALING horiz_mode, VPX_SCALING vert_mode) {
4220   VP9_COMP *cpi = (VP9_COMP *) comp;
4221   VP9_COMMON *cm = &cpi->common;
4222   int hr = 0, hs = 0, vr = 0, vs = 0;
4223
4224   if (horiz_mode > ONETWO || vert_mode > ONETWO)
4225     return -1;
4226
4227   Scale2Ratio(horiz_mode, &hr, &hs);
4228   Scale2Ratio(vert_mode, &vr, &vs);
4229
4230   // always go to the next whole number
4231   cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs;
4232   cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs;
4233
4234   assert(cm->width <= cpi->initial_width);
4235   assert(cm->height <= cpi->initial_height);
4236   update_frame_size(cpi);
4237   return 0;
4238 }
4239
4240 int vp9_set_size_literal(VP9_PTR comp, unsigned int width,
4241                          unsigned int height) {
4242   VP9_COMP *cpi = (VP9_COMP *)comp;
4243   VP9_COMMON *cm = &cpi->common;
4244
4245   check_initial_width(cpi, NULL);
4246
4247   if (width) {
4248     cm->width = width;
4249     if (cm->width * 5 < cpi->initial_width) {
4250       cm->width = cpi->initial_width / 5 + 1;
4251       printf("Warning: Desired width too small, changed to %d \n", cm->width);
4252     }
4253     if (cm->width > cpi->initial_width) {
4254       cm->width = cpi->initial_width;
4255       printf("Warning: Desired width too large, changed to %d \n", cm->width);
4256     }
4257   }
4258
4259   if (height) {
4260     cm->height = height;
4261     if (cm->height * 5 < cpi->initial_height) {
4262       cm->height = cpi->initial_height / 5 + 1;
4263       printf("Warning: Desired height too small, changed to %d \n", cm->height);
4264     }
4265     if (cm->height > cpi->initial_height) {
4266       cm->height = cpi->initial_height;
4267       printf("Warning: Desired height too large, changed to %d \n", cm->height);
4268     }
4269   }
4270
4271   assert(cm->width <= cpi->initial_width);
4272   assert(cm->height <= cpi->initial_height);
4273   update_frame_size(cpi);
4274   return 0;
4275 }
4276
4277 void vp9_set_svc(VP9_PTR comp, int use_svc) {
4278   VP9_COMP *cpi = (VP9_COMP *)comp;
4279   cpi->use_svc = use_svc;
4280   return;
4281 }
4282
4283 int vp9_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest) {
4284   int i, j;
4285   int total = 0;
4286
4287   uint8_t *src = source->y_buffer;
4288   uint8_t *dst = dest->y_buffer;
4289
4290   // Loop through the Y plane raw and reconstruction data summing
4291   // (square differences)
4292   for (i = 0; i < source->y_height; i += 16) {
4293     for (j = 0; j < source->y_width; j += 16) {
4294       unsigned int sse;
4295       total += vp9_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride,
4296                             &sse);
4297     }
4298
4299     src += 16 * source->y_stride;
4300     dst += 16 * dest->y_stride;
4301   }
4302
4303   return total;
4304 }
4305
4306
4307 int vp9_get_quantizer(VP9_PTR c) {
4308   return ((VP9_COMP *)c)->common.base_qindex;
4309 }