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