|
1 /* |
|
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
|
3 * |
|
4 * Use of this source code is governed by a BSD-style license |
|
5 * that can be found in the LICENSE file in the root of the source |
|
6 * tree. An additional intellectual property rights grant can be found |
|
7 * in the file PATENTS. All contributing project authors may |
|
8 * be found in the AUTHORS file in the root of the source tree. |
|
9 */ |
|
10 |
|
11 #include <math.h> |
|
12 #include <limits.h> |
|
13 #include <stdio.h> |
|
14 |
|
15 #include "./vpx_scale_rtcd.h" |
|
16 #include "block.h" |
|
17 #include "onyx_int.h" |
|
18 #include "vp8/common/variance.h" |
|
19 #include "encodeintra.h" |
|
20 #include "vp8/common/setupintrarecon.h" |
|
21 #include "vp8/common/systemdependent.h" |
|
22 #include "mcomp.h" |
|
23 #include "firstpass.h" |
|
24 #include "vpx_scale/vpx_scale.h" |
|
25 #include "encodemb.h" |
|
26 #include "vp8/common/extend.h" |
|
27 #include "vpx_mem/vpx_mem.h" |
|
28 #include "vp8/common/swapyv12buffer.h" |
|
29 #include "rdopt.h" |
|
30 #include "vp8/common/quant_common.h" |
|
31 #include "encodemv.h" |
|
32 #include "encodeframe.h" |
|
33 |
|
34 /* #define OUTPUT_FPF 1 */ |
|
35 |
|
36 extern void vp8cx_frame_init_quantizer(VP8_COMP *cpi); |
|
37 extern void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv); |
|
38 extern void vp8_alloc_compressor_data(VP8_COMP *cpi); |
|
39 |
|
40 #define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q] |
|
41 extern int vp8_kf_boost_qadjustment[QINDEX_RANGE]; |
|
42 |
|
43 extern const int vp8_gf_boost_qadjustment[QINDEX_RANGE]; |
|
44 |
|
45 #define IIFACTOR 1.5 |
|
46 #define IIKFACTOR1 1.40 |
|
47 #define IIKFACTOR2 1.5 |
|
48 #define RMAX 14.0 |
|
49 #define GF_RMAX 48.0 |
|
50 |
|
51 #define KF_MB_INTRA_MIN 300 |
|
52 #define GF_MB_INTRA_MIN 200 |
|
53 |
|
54 #define DOUBLE_DIVIDE_CHECK(X) ((X)<0?(X)-.000001:(X)+.000001) |
|
55 |
|
56 #define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0 |
|
57 #define POW2 (double)cpi->oxcf.two_pass_vbrbias/100.0 |
|
58 |
|
59 #define NEW_BOOST 1 |
|
60 |
|
61 static int vscale_lookup[7] = {0, 1, 1, 2, 2, 3, 3}; |
|
62 static int hscale_lookup[7] = {0, 0, 1, 1, 2, 2, 3}; |
|
63 |
|
64 |
|
65 static const int cq_level[QINDEX_RANGE] = |
|
66 { |
|
67 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9, |
|
68 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20, |
|
69 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31, |
|
70 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43, |
|
71 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56, |
|
72 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70, |
|
73 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85, |
|
74 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100 |
|
75 }; |
|
76 |
|
77 static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame); |
|
78 |
|
79 /* Resets the first pass file to the given position using a relative seek |
|
80 * from the current position |
|
81 */ |
|
82 static void reset_fpf_position(VP8_COMP *cpi, FIRSTPASS_STATS *Position) |
|
83 { |
|
84 cpi->twopass.stats_in = Position; |
|
85 } |
|
86 |
|
87 static int lookup_next_frame_stats(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame) |
|
88 { |
|
89 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) |
|
90 return EOF; |
|
91 |
|
92 *next_frame = *cpi->twopass.stats_in; |
|
93 return 1; |
|
94 } |
|
95 |
|
96 /* Read frame stats at an offset from the current position */ |
|
97 static int read_frame_stats( VP8_COMP *cpi, |
|
98 FIRSTPASS_STATS *frame_stats, |
|
99 int offset ) |
|
100 { |
|
101 FIRSTPASS_STATS * fps_ptr = cpi->twopass.stats_in; |
|
102 |
|
103 /* Check legality of offset */ |
|
104 if ( offset >= 0 ) |
|
105 { |
|
106 if ( &fps_ptr[offset] >= cpi->twopass.stats_in_end ) |
|
107 return EOF; |
|
108 } |
|
109 else if ( offset < 0 ) |
|
110 { |
|
111 if ( &fps_ptr[offset] < cpi->twopass.stats_in_start ) |
|
112 return EOF; |
|
113 } |
|
114 |
|
115 *frame_stats = fps_ptr[offset]; |
|
116 return 1; |
|
117 } |
|
118 |
|
119 static int input_stats(VP8_COMP *cpi, FIRSTPASS_STATS *fps) |
|
120 { |
|
121 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) |
|
122 return EOF; |
|
123 |
|
124 *fps = *cpi->twopass.stats_in; |
|
125 cpi->twopass.stats_in = |
|
126 (void*)((char *)cpi->twopass.stats_in + sizeof(FIRSTPASS_STATS)); |
|
127 return 1; |
|
128 } |
|
129 |
|
130 static void output_stats(const VP8_COMP *cpi, |
|
131 struct vpx_codec_pkt_list *pktlist, |
|
132 FIRSTPASS_STATS *stats) |
|
133 { |
|
134 struct vpx_codec_cx_pkt pkt; |
|
135 pkt.kind = VPX_CODEC_STATS_PKT; |
|
136 pkt.data.twopass_stats.buf = stats; |
|
137 pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS); |
|
138 vpx_codec_pkt_list_add(pktlist, &pkt); |
|
139 |
|
140 /* TEMP debug code */ |
|
141 #if OUTPUT_FPF |
|
142 |
|
143 { |
|
144 FILE *fpfile; |
|
145 fpfile = fopen("firstpass.stt", "a"); |
|
146 |
|
147 fprintf(fpfile, "%12.0f %12.0f %12.0f %12.4f %12.4f %12.4f %12.4f" |
|
148 " %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f" |
|
149 " %12.0f %12.0f %12.4f\n", |
|
150 stats->frame, |
|
151 stats->intra_error, |
|
152 stats->coded_error, |
|
153 stats->ssim_weighted_pred_err, |
|
154 stats->pcnt_inter, |
|
155 stats->pcnt_motion, |
|
156 stats->pcnt_second_ref, |
|
157 stats->pcnt_neutral, |
|
158 stats->MVr, |
|
159 stats->mvr_abs, |
|
160 stats->MVc, |
|
161 stats->mvc_abs, |
|
162 stats->MVrv, |
|
163 stats->MVcv, |
|
164 stats->mv_in_out_count, |
|
165 stats->new_mv_count, |
|
166 stats->count, |
|
167 stats->duration); |
|
168 fclose(fpfile); |
|
169 } |
|
170 #endif |
|
171 } |
|
172 |
|
173 static void zero_stats(FIRSTPASS_STATS *section) |
|
174 { |
|
175 section->frame = 0.0; |
|
176 section->intra_error = 0.0; |
|
177 section->coded_error = 0.0; |
|
178 section->ssim_weighted_pred_err = 0.0; |
|
179 section->pcnt_inter = 0.0; |
|
180 section->pcnt_motion = 0.0; |
|
181 section->pcnt_second_ref = 0.0; |
|
182 section->pcnt_neutral = 0.0; |
|
183 section->MVr = 0.0; |
|
184 section->mvr_abs = 0.0; |
|
185 section->MVc = 0.0; |
|
186 section->mvc_abs = 0.0; |
|
187 section->MVrv = 0.0; |
|
188 section->MVcv = 0.0; |
|
189 section->mv_in_out_count = 0.0; |
|
190 section->new_mv_count = 0.0; |
|
191 section->count = 0.0; |
|
192 section->duration = 1.0; |
|
193 } |
|
194 |
|
195 static void accumulate_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) |
|
196 { |
|
197 section->frame += frame->frame; |
|
198 section->intra_error += frame->intra_error; |
|
199 section->coded_error += frame->coded_error; |
|
200 section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err; |
|
201 section->pcnt_inter += frame->pcnt_inter; |
|
202 section->pcnt_motion += frame->pcnt_motion; |
|
203 section->pcnt_second_ref += frame->pcnt_second_ref; |
|
204 section->pcnt_neutral += frame->pcnt_neutral; |
|
205 section->MVr += frame->MVr; |
|
206 section->mvr_abs += frame->mvr_abs; |
|
207 section->MVc += frame->MVc; |
|
208 section->mvc_abs += frame->mvc_abs; |
|
209 section->MVrv += frame->MVrv; |
|
210 section->MVcv += frame->MVcv; |
|
211 section->mv_in_out_count += frame->mv_in_out_count; |
|
212 section->new_mv_count += frame->new_mv_count; |
|
213 section->count += frame->count; |
|
214 section->duration += frame->duration; |
|
215 } |
|
216 |
|
217 static void subtract_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) |
|
218 { |
|
219 section->frame -= frame->frame; |
|
220 section->intra_error -= frame->intra_error; |
|
221 section->coded_error -= frame->coded_error; |
|
222 section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err; |
|
223 section->pcnt_inter -= frame->pcnt_inter; |
|
224 section->pcnt_motion -= frame->pcnt_motion; |
|
225 section->pcnt_second_ref -= frame->pcnt_second_ref; |
|
226 section->pcnt_neutral -= frame->pcnt_neutral; |
|
227 section->MVr -= frame->MVr; |
|
228 section->mvr_abs -= frame->mvr_abs; |
|
229 section->MVc -= frame->MVc; |
|
230 section->mvc_abs -= frame->mvc_abs; |
|
231 section->MVrv -= frame->MVrv; |
|
232 section->MVcv -= frame->MVcv; |
|
233 section->mv_in_out_count -= frame->mv_in_out_count; |
|
234 section->new_mv_count -= frame->new_mv_count; |
|
235 section->count -= frame->count; |
|
236 section->duration -= frame->duration; |
|
237 } |
|
238 |
|
239 static void avg_stats(FIRSTPASS_STATS *section) |
|
240 { |
|
241 if (section->count < 1.0) |
|
242 return; |
|
243 |
|
244 section->intra_error /= section->count; |
|
245 section->coded_error /= section->count; |
|
246 section->ssim_weighted_pred_err /= section->count; |
|
247 section->pcnt_inter /= section->count; |
|
248 section->pcnt_second_ref /= section->count; |
|
249 section->pcnt_neutral /= section->count; |
|
250 section->pcnt_motion /= section->count; |
|
251 section->MVr /= section->count; |
|
252 section->mvr_abs /= section->count; |
|
253 section->MVc /= section->count; |
|
254 section->mvc_abs /= section->count; |
|
255 section->MVrv /= section->count; |
|
256 section->MVcv /= section->count; |
|
257 section->mv_in_out_count /= section->count; |
|
258 section->duration /= section->count; |
|
259 } |
|
260 |
|
261 /* Calculate a modified Error used in distributing bits between easier |
|
262 * and harder frames |
|
263 */ |
|
264 static double calculate_modified_err(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) |
|
265 { |
|
266 double av_err = ( cpi->twopass.total_stats.ssim_weighted_pred_err / |
|
267 cpi->twopass.total_stats.count ); |
|
268 double this_err = this_frame->ssim_weighted_pred_err; |
|
269 double modified_err; |
|
270 |
|
271 if (this_err > av_err) |
|
272 modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW1); |
|
273 else |
|
274 modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW2); |
|
275 |
|
276 return modified_err; |
|
277 } |
|
278 |
|
279 static const double weight_table[256] = { |
|
280 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, |
|
281 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, |
|
282 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, |
|
283 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, |
|
284 0.020000, 0.031250, 0.062500, 0.093750, 0.125000, 0.156250, 0.187500, 0.218750, |
|
285 0.250000, 0.281250, 0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750, |
|
286 0.500000, 0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750, |
|
287 0.750000, 0.781250, 0.812500, 0.843750, 0.875000, 0.906250, 0.937500, 0.968750, |
|
288 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
289 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
290 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
291 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
292 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
293 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
294 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
295 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
296 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
297 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
298 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
299 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
300 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
301 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
302 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
303 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
304 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
305 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
306 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
307 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
308 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
309 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
310 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, |
|
311 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 |
|
312 }; |
|
313 |
|
314 static double simple_weight(YV12_BUFFER_CONFIG *source) |
|
315 { |
|
316 int i, j; |
|
317 |
|
318 unsigned char *src = source->y_buffer; |
|
319 double sum_weights = 0.0; |
|
320 |
|
321 /* Loop throught the Y plane raw examining levels and creating a weight |
|
322 * for the image |
|
323 */ |
|
324 i = source->y_height; |
|
325 do |
|
326 { |
|
327 j = source->y_width; |
|
328 do |
|
329 { |
|
330 sum_weights += weight_table[ *src]; |
|
331 src++; |
|
332 }while(--j); |
|
333 src -= source->y_width; |
|
334 src += source->y_stride; |
|
335 }while(--i); |
|
336 |
|
337 sum_weights /= (source->y_height * source->y_width); |
|
338 |
|
339 return sum_weights; |
|
340 } |
|
341 |
|
342 |
|
343 /* This function returns the current per frame maximum bitrate target */ |
|
344 static int frame_max_bits(VP8_COMP *cpi) |
|
345 { |
|
346 /* Max allocation for a single frame based on the max section guidelines |
|
347 * passed in and how many bits are left |
|
348 */ |
|
349 int max_bits; |
|
350 |
|
351 /* For CBR we need to also consider buffer fullness. |
|
352 * If we are running below the optimal level then we need to gradually |
|
353 * tighten up on max_bits. |
|
354 */ |
|
355 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
|
356 { |
|
357 double buffer_fullness_ratio = (double)cpi->buffer_level / DOUBLE_DIVIDE_CHECK((double)cpi->oxcf.optimal_buffer_level); |
|
358 |
|
359 /* For CBR base this on the target average bits per frame plus the |
|
360 * maximum sedction rate passed in by the user |
|
361 */ |
|
362 max_bits = (int)(cpi->av_per_frame_bandwidth * ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0)); |
|
363 |
|
364 /* If our buffer is below the optimum level */ |
|
365 if (buffer_fullness_ratio < 1.0) |
|
366 { |
|
367 /* The lower of max_bits / 4 or cpi->av_per_frame_bandwidth / 4. */ |
|
368 int min_max_bits = ((cpi->av_per_frame_bandwidth >> 2) < (max_bits >> 2)) ? cpi->av_per_frame_bandwidth >> 2 : max_bits >> 2; |
|
369 |
|
370 max_bits = (int)(max_bits * buffer_fullness_ratio); |
|
371 |
|
372 /* Lowest value we will set ... which should allow the buffer to |
|
373 * refill. |
|
374 */ |
|
375 if (max_bits < min_max_bits) |
|
376 max_bits = min_max_bits; |
|
377 } |
|
378 } |
|
379 /* VBR */ |
|
380 else |
|
381 { |
|
382 /* For VBR base this on the bits and frames left plus the |
|
383 * two_pass_vbrmax_section rate passed in by the user |
|
384 */ |
|
385 max_bits = (int)(((double)cpi->twopass.bits_left / (cpi->twopass.total_stats.count - (double)cpi->common.current_video_frame)) * ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0)); |
|
386 } |
|
387 |
|
388 /* Trap case where we are out of bits */ |
|
389 if (max_bits < 0) |
|
390 max_bits = 0; |
|
391 |
|
392 return max_bits; |
|
393 } |
|
394 |
|
395 void vp8_init_first_pass(VP8_COMP *cpi) |
|
396 { |
|
397 zero_stats(&cpi->twopass.total_stats); |
|
398 } |
|
399 |
|
400 void vp8_end_first_pass(VP8_COMP *cpi) |
|
401 { |
|
402 output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats); |
|
403 } |
|
404 |
|
405 static void zz_motion_search( VP8_COMP *cpi, MACROBLOCK * x, |
|
406 YV12_BUFFER_CONFIG * raw_buffer, |
|
407 int * raw_motion_err, |
|
408 YV12_BUFFER_CONFIG * recon_buffer, |
|
409 int * best_motion_err, int recon_yoffset) |
|
410 { |
|
411 MACROBLOCKD * const xd = & x->e_mbd; |
|
412 BLOCK *b = &x->block[0]; |
|
413 BLOCKD *d = &x->e_mbd.block[0]; |
|
414 |
|
415 unsigned char *src_ptr = (*(b->base_src) + b->src); |
|
416 int src_stride = b->src_stride; |
|
417 unsigned char *raw_ptr; |
|
418 int raw_stride = raw_buffer->y_stride; |
|
419 unsigned char *ref_ptr; |
|
420 int ref_stride = x->e_mbd.pre.y_stride; |
|
421 |
|
422 /* Set up pointers for this macro block raw buffer */ |
|
423 raw_ptr = (unsigned char *)(raw_buffer->y_buffer + recon_yoffset |
|
424 + d->offset); |
|
425 vp8_mse16x16 ( src_ptr, src_stride, raw_ptr, raw_stride, |
|
426 (unsigned int *)(raw_motion_err)); |
|
427 |
|
428 /* Set up pointers for this macro block recon buffer */ |
|
429 xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset; |
|
430 ref_ptr = (unsigned char *)(xd->pre.y_buffer + d->offset ); |
|
431 vp8_mse16x16 ( src_ptr, src_stride, ref_ptr, ref_stride, |
|
432 (unsigned int *)(best_motion_err)); |
|
433 } |
|
434 |
|
435 static void first_pass_motion_search(VP8_COMP *cpi, MACROBLOCK *x, |
|
436 int_mv *ref_mv, MV *best_mv, |
|
437 YV12_BUFFER_CONFIG *recon_buffer, |
|
438 int *best_motion_err, int recon_yoffset ) |
|
439 { |
|
440 MACROBLOCKD *const xd = & x->e_mbd; |
|
441 BLOCK *b = &x->block[0]; |
|
442 BLOCKD *d = &x->e_mbd.block[0]; |
|
443 int num00; |
|
444 |
|
445 int_mv tmp_mv; |
|
446 int_mv ref_mv_full; |
|
447 |
|
448 int tmp_err; |
|
449 int step_param = 3; /* Dont search over full range for first pass */ |
|
450 int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; |
|
451 int n; |
|
452 vp8_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[BLOCK_16X16]; |
|
453 int new_mv_mode_penalty = 256; |
|
454 |
|
455 /* override the default variance function to use MSE */ |
|
456 v_fn_ptr.vf = vp8_mse16x16; |
|
457 |
|
458 /* Set up pointers for this macro block recon buffer */ |
|
459 xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset; |
|
460 |
|
461 /* Initial step/diamond search centred on best mv */ |
|
462 tmp_mv.as_int = 0; |
|
463 ref_mv_full.as_mv.col = ref_mv->as_mv.col>>3; |
|
464 ref_mv_full.as_mv.row = ref_mv->as_mv.row>>3; |
|
465 tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, step_param, |
|
466 x->sadperbit16, &num00, &v_fn_ptr, |
|
467 x->mvcost, ref_mv); |
|
468 if ( tmp_err < INT_MAX-new_mv_mode_penalty ) |
|
469 tmp_err += new_mv_mode_penalty; |
|
470 |
|
471 if (tmp_err < *best_motion_err) |
|
472 { |
|
473 *best_motion_err = tmp_err; |
|
474 best_mv->row = tmp_mv.as_mv.row; |
|
475 best_mv->col = tmp_mv.as_mv.col; |
|
476 } |
|
477 |
|
478 /* Further step/diamond searches as necessary */ |
|
479 n = num00; |
|
480 num00 = 0; |
|
481 |
|
482 while (n < further_steps) |
|
483 { |
|
484 n++; |
|
485 |
|
486 if (num00) |
|
487 num00--; |
|
488 else |
|
489 { |
|
490 tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, |
|
491 step_param + n, x->sadperbit16, |
|
492 &num00, &v_fn_ptr, x->mvcost, |
|
493 ref_mv); |
|
494 if ( tmp_err < INT_MAX-new_mv_mode_penalty ) |
|
495 tmp_err += new_mv_mode_penalty; |
|
496 |
|
497 if (tmp_err < *best_motion_err) |
|
498 { |
|
499 *best_motion_err = tmp_err; |
|
500 best_mv->row = tmp_mv.as_mv.row; |
|
501 best_mv->col = tmp_mv.as_mv.col; |
|
502 } |
|
503 } |
|
504 } |
|
505 } |
|
506 |
|
507 void vp8_first_pass(VP8_COMP *cpi) |
|
508 { |
|
509 int mb_row, mb_col; |
|
510 MACROBLOCK *const x = & cpi->mb; |
|
511 VP8_COMMON *const cm = & cpi->common; |
|
512 MACROBLOCKD *const xd = & x->e_mbd; |
|
513 |
|
514 int recon_yoffset, recon_uvoffset; |
|
515 YV12_BUFFER_CONFIG *lst_yv12 = &cm->yv12_fb[cm->lst_fb_idx]; |
|
516 YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx]; |
|
517 YV12_BUFFER_CONFIG *gld_yv12 = &cm->yv12_fb[cm->gld_fb_idx]; |
|
518 int recon_y_stride = lst_yv12->y_stride; |
|
519 int recon_uv_stride = lst_yv12->uv_stride; |
|
520 int64_t intra_error = 0; |
|
521 int64_t coded_error = 0; |
|
522 |
|
523 int sum_mvr = 0, sum_mvc = 0; |
|
524 int sum_mvr_abs = 0, sum_mvc_abs = 0; |
|
525 int sum_mvrs = 0, sum_mvcs = 0; |
|
526 int mvcount = 0; |
|
527 int intercount = 0; |
|
528 int second_ref_count = 0; |
|
529 int intrapenalty = 256; |
|
530 int neutral_count = 0; |
|
531 int new_mv_count = 0; |
|
532 int sum_in_vectors = 0; |
|
533 uint32_t lastmv_as_int = 0; |
|
534 |
|
535 int_mv zero_ref_mv; |
|
536 |
|
537 zero_ref_mv.as_int = 0; |
|
538 |
|
539 vp8_clear_system_state(); |
|
540 |
|
541 x->src = * cpi->Source; |
|
542 xd->pre = *lst_yv12; |
|
543 xd->dst = *new_yv12; |
|
544 |
|
545 x->partition_info = x->pi; |
|
546 |
|
547 xd->mode_info_context = cm->mi; |
|
548 |
|
549 if(!cm->use_bilinear_mc_filter) |
|
550 { |
|
551 xd->subpixel_predict = vp8_sixtap_predict4x4; |
|
552 xd->subpixel_predict8x4 = vp8_sixtap_predict8x4; |
|
553 xd->subpixel_predict8x8 = vp8_sixtap_predict8x8; |
|
554 xd->subpixel_predict16x16 = vp8_sixtap_predict16x16; |
|
555 } |
|
556 else |
|
557 { |
|
558 xd->subpixel_predict = vp8_bilinear_predict4x4; |
|
559 xd->subpixel_predict8x4 = vp8_bilinear_predict8x4; |
|
560 xd->subpixel_predict8x8 = vp8_bilinear_predict8x8; |
|
561 xd->subpixel_predict16x16 = vp8_bilinear_predict16x16; |
|
562 } |
|
563 |
|
564 vp8_build_block_offsets(x); |
|
565 |
|
566 /* set up frame new frame for intra coded blocks */ |
|
567 vp8_setup_intra_recon(new_yv12); |
|
568 vp8cx_frame_init_quantizer(cpi); |
|
569 |
|
570 /* Initialise the MV cost table to the defaults */ |
|
571 { |
|
572 int flag[2] = {1, 1}; |
|
573 vp8_initialize_rd_consts(cpi, x, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q)); |
|
574 vpx_memcpy(cm->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context)); |
|
575 vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cm->fc.mvc, flag); |
|
576 } |
|
577 |
|
578 /* for each macroblock row in image */ |
|
579 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) |
|
580 { |
|
581 int_mv best_ref_mv; |
|
582 |
|
583 best_ref_mv.as_int = 0; |
|
584 |
|
585 /* reset above block coeffs */ |
|
586 xd->up_available = (mb_row != 0); |
|
587 recon_yoffset = (mb_row * recon_y_stride * 16); |
|
588 recon_uvoffset = (mb_row * recon_uv_stride * 8); |
|
589 |
|
590 /* Set up limit values for motion vectors to prevent them extending |
|
591 * outside the UMV borders |
|
592 */ |
|
593 x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16)); |
|
594 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16); |
|
595 |
|
596 |
|
597 /* for each macroblock col in image */ |
|
598 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) |
|
599 { |
|
600 int this_error; |
|
601 int gf_motion_error = INT_MAX; |
|
602 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); |
|
603 |
|
604 xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset; |
|
605 xd->dst.u_buffer = new_yv12->u_buffer + recon_uvoffset; |
|
606 xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset; |
|
607 xd->left_available = (mb_col != 0); |
|
608 |
|
609 /* Copy current mb to a buffer */ |
|
610 vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16); |
|
611 |
|
612 /* do intra 16x16 prediction */ |
|
613 this_error = vp8_encode_intra(cpi, x, use_dc_pred); |
|
614 |
|
615 /* "intrapenalty" below deals with situations where the intra |
|
616 * and inter error scores are very low (eg a plain black frame) |
|
617 * We do not have special cases in first pass for 0,0 and |
|
618 * nearest etc so all inter modes carry an overhead cost |
|
619 * estimate fot the mv. When the error score is very low this |
|
620 * causes us to pick all or lots of INTRA modes and throw lots |
|
621 * of key frames. This penalty adds a cost matching that of a |
|
622 * 0,0 mv to the intra case. |
|
623 */ |
|
624 this_error += intrapenalty; |
|
625 |
|
626 /* Cumulative intra error total */ |
|
627 intra_error += (int64_t)this_error; |
|
628 |
|
629 /* Set up limit values for motion vectors to prevent them |
|
630 * extending outside the UMV borders |
|
631 */ |
|
632 x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16)); |
|
633 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16); |
|
634 |
|
635 /* Other than for the first frame do a motion search */ |
|
636 if (cm->current_video_frame > 0) |
|
637 { |
|
638 BLOCKD *d = &x->e_mbd.block[0]; |
|
639 MV tmp_mv = {0, 0}; |
|
640 int tmp_err; |
|
641 int motion_error = INT_MAX; |
|
642 int raw_motion_error = INT_MAX; |
|
643 |
|
644 /* Simple 0,0 motion with no mv overhead */ |
|
645 zz_motion_search( cpi, x, cpi->last_frame_unscaled_source, |
|
646 &raw_motion_error, lst_yv12, &motion_error, |
|
647 recon_yoffset ); |
|
648 d->bmi.mv.as_mv.row = 0; |
|
649 d->bmi.mv.as_mv.col = 0; |
|
650 |
|
651 if (raw_motion_error < cpi->oxcf.encode_breakout) |
|
652 goto skip_motion_search; |
|
653 |
|
654 /* Test last reference frame using the previous best mv as the |
|
655 * starting point (best reference) for the search |
|
656 */ |
|
657 first_pass_motion_search(cpi, x, &best_ref_mv, |
|
658 &d->bmi.mv.as_mv, lst_yv12, |
|
659 &motion_error, recon_yoffset); |
|
660 |
|
661 /* If the current best reference mv is not centred on 0,0 |
|
662 * then do a 0,0 based search as well |
|
663 */ |
|
664 if (best_ref_mv.as_int) |
|
665 { |
|
666 tmp_err = INT_MAX; |
|
667 first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, |
|
668 lst_yv12, &tmp_err, recon_yoffset); |
|
669 |
|
670 if ( tmp_err < motion_error ) |
|
671 { |
|
672 motion_error = tmp_err; |
|
673 d->bmi.mv.as_mv.row = tmp_mv.row; |
|
674 d->bmi.mv.as_mv.col = tmp_mv.col; |
|
675 } |
|
676 } |
|
677 |
|
678 /* Experimental search in a second reference frame ((0,0) |
|
679 * based only) |
|
680 */ |
|
681 if (cm->current_video_frame > 1) |
|
682 { |
|
683 first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, gld_yv12, &gf_motion_error, recon_yoffset); |
|
684 |
|
685 if ((gf_motion_error < motion_error) && (gf_motion_error < this_error)) |
|
686 { |
|
687 second_ref_count++; |
|
688 } |
|
689 |
|
690 /* Reset to last frame as reference buffer */ |
|
691 xd->pre.y_buffer = lst_yv12->y_buffer + recon_yoffset; |
|
692 xd->pre.u_buffer = lst_yv12->u_buffer + recon_uvoffset; |
|
693 xd->pre.v_buffer = lst_yv12->v_buffer + recon_uvoffset; |
|
694 } |
|
695 |
|
696 skip_motion_search: |
|
697 /* Intra assumed best */ |
|
698 best_ref_mv.as_int = 0; |
|
699 |
|
700 if (motion_error <= this_error) |
|
701 { |
|
702 /* Keep a count of cases where the inter and intra were |
|
703 * very close and very low. This helps with scene cut |
|
704 * detection for example in cropped clips with black bars |
|
705 * at the sides or top and bottom. |
|
706 */ |
|
707 if( (((this_error-intrapenalty) * 9) <= |
|
708 (motion_error*10)) && |
|
709 (this_error < (2*intrapenalty)) ) |
|
710 { |
|
711 neutral_count++; |
|
712 } |
|
713 |
|
714 d->bmi.mv.as_mv.row *= 8; |
|
715 d->bmi.mv.as_mv.col *= 8; |
|
716 this_error = motion_error; |
|
717 vp8_set_mbmode_and_mvs(x, NEWMV, &d->bmi.mv); |
|
718 vp8_encode_inter16x16y(x); |
|
719 sum_mvr += d->bmi.mv.as_mv.row; |
|
720 sum_mvr_abs += abs(d->bmi.mv.as_mv.row); |
|
721 sum_mvc += d->bmi.mv.as_mv.col; |
|
722 sum_mvc_abs += abs(d->bmi.mv.as_mv.col); |
|
723 sum_mvrs += d->bmi.mv.as_mv.row * d->bmi.mv.as_mv.row; |
|
724 sum_mvcs += d->bmi.mv.as_mv.col * d->bmi.mv.as_mv.col; |
|
725 intercount++; |
|
726 |
|
727 best_ref_mv.as_int = d->bmi.mv.as_int; |
|
728 |
|
729 /* Was the vector non-zero */ |
|
730 if (d->bmi.mv.as_int) |
|
731 { |
|
732 mvcount++; |
|
733 |
|
734 /* Was it different from the last non zero vector */ |
|
735 if ( d->bmi.mv.as_int != lastmv_as_int ) |
|
736 new_mv_count++; |
|
737 lastmv_as_int = d->bmi.mv.as_int; |
|
738 |
|
739 /* Does the Row vector point inwards or outwards */ |
|
740 if (mb_row < cm->mb_rows / 2) |
|
741 { |
|
742 if (d->bmi.mv.as_mv.row > 0) |
|
743 sum_in_vectors--; |
|
744 else if (d->bmi.mv.as_mv.row < 0) |
|
745 sum_in_vectors++; |
|
746 } |
|
747 else if (mb_row > cm->mb_rows / 2) |
|
748 { |
|
749 if (d->bmi.mv.as_mv.row > 0) |
|
750 sum_in_vectors++; |
|
751 else if (d->bmi.mv.as_mv.row < 0) |
|
752 sum_in_vectors--; |
|
753 } |
|
754 |
|
755 /* Does the Row vector point inwards or outwards */ |
|
756 if (mb_col < cm->mb_cols / 2) |
|
757 { |
|
758 if (d->bmi.mv.as_mv.col > 0) |
|
759 sum_in_vectors--; |
|
760 else if (d->bmi.mv.as_mv.col < 0) |
|
761 sum_in_vectors++; |
|
762 } |
|
763 else if (mb_col > cm->mb_cols / 2) |
|
764 { |
|
765 if (d->bmi.mv.as_mv.col > 0) |
|
766 sum_in_vectors++; |
|
767 else if (d->bmi.mv.as_mv.col < 0) |
|
768 sum_in_vectors--; |
|
769 } |
|
770 } |
|
771 } |
|
772 } |
|
773 |
|
774 coded_error += (int64_t)this_error; |
|
775 |
|
776 /* adjust to the next column of macroblocks */ |
|
777 x->src.y_buffer += 16; |
|
778 x->src.u_buffer += 8; |
|
779 x->src.v_buffer += 8; |
|
780 |
|
781 recon_yoffset += 16; |
|
782 recon_uvoffset += 8; |
|
783 } |
|
784 |
|
785 /* adjust to the next row of mbs */ |
|
786 x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols; |
|
787 x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols; |
|
788 x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols; |
|
789 |
|
790 /* extend the recon for intra prediction */ |
|
791 vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); |
|
792 vp8_clear_system_state(); |
|
793 } |
|
794 |
|
795 vp8_clear_system_state(); |
|
796 { |
|
797 double weight = 0.0; |
|
798 |
|
799 FIRSTPASS_STATS fps; |
|
800 |
|
801 fps.frame = cm->current_video_frame ; |
|
802 fps.intra_error = (double)(intra_error >> 8); |
|
803 fps.coded_error = (double)(coded_error >> 8); |
|
804 weight = simple_weight(cpi->Source); |
|
805 |
|
806 |
|
807 if (weight < 0.1) |
|
808 weight = 0.1; |
|
809 |
|
810 fps.ssim_weighted_pred_err = fps.coded_error * weight; |
|
811 |
|
812 fps.pcnt_inter = 0.0; |
|
813 fps.pcnt_motion = 0.0; |
|
814 fps.MVr = 0.0; |
|
815 fps.mvr_abs = 0.0; |
|
816 fps.MVc = 0.0; |
|
817 fps.mvc_abs = 0.0; |
|
818 fps.MVrv = 0.0; |
|
819 fps.MVcv = 0.0; |
|
820 fps.mv_in_out_count = 0.0; |
|
821 fps.new_mv_count = 0.0; |
|
822 fps.count = 1.0; |
|
823 |
|
824 fps.pcnt_inter = 1.0 * (double)intercount / cm->MBs; |
|
825 fps.pcnt_second_ref = 1.0 * (double)second_ref_count / cm->MBs; |
|
826 fps.pcnt_neutral = 1.0 * (double)neutral_count / cm->MBs; |
|
827 |
|
828 if (mvcount > 0) |
|
829 { |
|
830 fps.MVr = (double)sum_mvr / (double)mvcount; |
|
831 fps.mvr_abs = (double)sum_mvr_abs / (double)mvcount; |
|
832 fps.MVc = (double)sum_mvc / (double)mvcount; |
|
833 fps.mvc_abs = (double)sum_mvc_abs / (double)mvcount; |
|
834 fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / (double)mvcount)) / (double)mvcount; |
|
835 fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / (double)mvcount)) / (double)mvcount; |
|
836 fps.mv_in_out_count = (double)sum_in_vectors / (double)(mvcount * 2); |
|
837 fps.new_mv_count = new_mv_count; |
|
838 |
|
839 fps.pcnt_motion = 1.0 * (double)mvcount / cpi->common.MBs; |
|
840 } |
|
841 |
|
842 /* TODO: handle the case when duration is set to 0, or something less |
|
843 * than the full time between subsequent cpi->source_time_stamps |
|
844 */ |
|
845 fps.duration = (double)(cpi->source->ts_end |
|
846 - cpi->source->ts_start); |
|
847 |
|
848 /* don't want to do output stats with a stack variable! */ |
|
849 memcpy(&cpi->twopass.this_frame_stats, |
|
850 &fps, |
|
851 sizeof(FIRSTPASS_STATS)); |
|
852 output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.this_frame_stats); |
|
853 accumulate_stats(&cpi->twopass.total_stats, &fps); |
|
854 } |
|
855 |
|
856 /* Copy the previous Last Frame into the GF buffer if specific |
|
857 * conditions for doing so are met |
|
858 */ |
|
859 if ((cm->current_video_frame > 0) && |
|
860 (cpi->twopass.this_frame_stats.pcnt_inter > 0.20) && |
|
861 ((cpi->twopass.this_frame_stats.intra_error / |
|
862 DOUBLE_DIVIDE_CHECK(cpi->twopass.this_frame_stats.coded_error)) > |
|
863 2.0)) |
|
864 { |
|
865 vp8_yv12_copy_frame(lst_yv12, gld_yv12); |
|
866 } |
|
867 |
|
868 /* swap frame pointers so last frame refers to the frame we just |
|
869 * compressed |
|
870 */ |
|
871 vp8_swap_yv12_buffer(lst_yv12, new_yv12); |
|
872 vp8_yv12_extend_frame_borders(lst_yv12); |
|
873 |
|
874 /* Special case for the first frame. Copy into the GF buffer as a |
|
875 * second reference. |
|
876 */ |
|
877 if (cm->current_video_frame == 0) |
|
878 { |
|
879 vp8_yv12_copy_frame(lst_yv12, gld_yv12); |
|
880 } |
|
881 |
|
882 |
|
883 /* use this to see what the first pass reconstruction looks like */ |
|
884 if (0) |
|
885 { |
|
886 char filename[512]; |
|
887 FILE *recon_file; |
|
888 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame); |
|
889 |
|
890 if (cm->current_video_frame == 0) |
|
891 recon_file = fopen(filename, "wb"); |
|
892 else |
|
893 recon_file = fopen(filename, "ab"); |
|
894 |
|
895 (void) fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, |
|
896 recon_file); |
|
897 fclose(recon_file); |
|
898 } |
|
899 |
|
900 cm->current_video_frame++; |
|
901 |
|
902 } |
|
903 extern const int vp8_bits_per_mb[2][QINDEX_RANGE]; |
|
904 |
|
905 /* Estimate a cost per mb attributable to overheads such as the coding of |
|
906 * modes and motion vectors. |
|
907 * Currently simplistic in its assumptions for testing. |
|
908 */ |
|
909 |
|
910 static double bitcost( double prob ) |
|
911 { |
|
912 if (prob > 0.000122) |
|
913 return -log(prob) / log(2.0); |
|
914 else |
|
915 return 13.0; |
|
916 } |
|
917 static int64_t estimate_modemvcost(VP8_COMP *cpi, |
|
918 FIRSTPASS_STATS * fpstats) |
|
919 { |
|
920 int mv_cost; |
|
921 int64_t mode_cost; |
|
922 |
|
923 double av_pct_inter = fpstats->pcnt_inter / fpstats->count; |
|
924 double av_pct_motion = fpstats->pcnt_motion / fpstats->count; |
|
925 double av_intra = (1.0 - av_pct_inter); |
|
926 |
|
927 double zz_cost; |
|
928 double motion_cost; |
|
929 double intra_cost; |
|
930 |
|
931 zz_cost = bitcost(av_pct_inter - av_pct_motion); |
|
932 motion_cost = bitcost(av_pct_motion); |
|
933 intra_cost = bitcost(av_intra); |
|
934 |
|
935 /* Estimate of extra bits per mv overhead for mbs |
|
936 * << 9 is the normalization to the (bits * 512) used in vp8_bits_per_mb |
|
937 */ |
|
938 mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9; |
|
939 |
|
940 /* Crude estimate of overhead cost from modes |
|
941 * << 9 is the normalization to (bits * 512) used in vp8_bits_per_mb |
|
942 */ |
|
943 mode_cost =((((av_pct_inter - av_pct_motion) * zz_cost) + |
|
944 (av_pct_motion * motion_cost) + |
|
945 (av_intra * intra_cost)) * cpi->common.MBs) * 512; |
|
946 |
|
947 return mv_cost + mode_cost; |
|
948 } |
|
949 |
|
950 static double calc_correction_factor( double err_per_mb, |
|
951 double err_devisor, |
|
952 double pt_low, |
|
953 double pt_high, |
|
954 int Q ) |
|
955 { |
|
956 double power_term; |
|
957 double error_term = err_per_mb / err_devisor; |
|
958 double correction_factor; |
|
959 |
|
960 /* Adjustment based on Q to power term. */ |
|
961 power_term = pt_low + (Q * 0.01); |
|
962 power_term = (power_term > pt_high) ? pt_high : power_term; |
|
963 |
|
964 /* Adjustments to error term */ |
|
965 /* TBD */ |
|
966 |
|
967 /* Calculate correction factor */ |
|
968 correction_factor = pow(error_term, power_term); |
|
969 |
|
970 /* Clip range */ |
|
971 correction_factor = |
|
972 (correction_factor < 0.05) |
|
973 ? 0.05 : (correction_factor > 5.0) ? 5.0 : correction_factor; |
|
974 |
|
975 return correction_factor; |
|
976 } |
|
977 |
|
978 static int estimate_max_q(VP8_COMP *cpi, |
|
979 FIRSTPASS_STATS * fpstats, |
|
980 int section_target_bandwitdh, |
|
981 int overhead_bits ) |
|
982 { |
|
983 int Q; |
|
984 int num_mbs = cpi->common.MBs; |
|
985 int target_norm_bits_per_mb; |
|
986 |
|
987 double section_err = (fpstats->coded_error / fpstats->count); |
|
988 double err_per_mb = section_err / num_mbs; |
|
989 double err_correction_factor; |
|
990 double speed_correction = 1.0; |
|
991 int overhead_bits_per_mb; |
|
992 |
|
993 if (section_target_bandwitdh <= 0) |
|
994 return cpi->twopass.maxq_max_limit; /* Highest value allowed */ |
|
995 |
|
996 target_norm_bits_per_mb = |
|
997 (section_target_bandwitdh < (1 << 20)) |
|
998 ? (512 * section_target_bandwitdh) / num_mbs |
|
999 : 512 * (section_target_bandwitdh / num_mbs); |
|
1000 |
|
1001 /* Calculate a corrective factor based on a rolling ratio of bits spent |
|
1002 * vs target bits |
|
1003 */ |
|
1004 if ((cpi->rolling_target_bits > 0) && |
|
1005 (cpi->active_worst_quality < cpi->worst_quality)) |
|
1006 { |
|
1007 double rolling_ratio; |
|
1008 |
|
1009 rolling_ratio = (double)cpi->rolling_actual_bits / |
|
1010 (double)cpi->rolling_target_bits; |
|
1011 |
|
1012 if (rolling_ratio < 0.95) |
|
1013 cpi->twopass.est_max_qcorrection_factor -= 0.005; |
|
1014 else if (rolling_ratio > 1.05) |
|
1015 cpi->twopass.est_max_qcorrection_factor += 0.005; |
|
1016 |
|
1017 cpi->twopass.est_max_qcorrection_factor = |
|
1018 (cpi->twopass.est_max_qcorrection_factor < 0.1) |
|
1019 ? 0.1 |
|
1020 : (cpi->twopass.est_max_qcorrection_factor > 10.0) |
|
1021 ? 10.0 : cpi->twopass.est_max_qcorrection_factor; |
|
1022 } |
|
1023 |
|
1024 /* Corrections for higher compression speed settings |
|
1025 * (reduced compression expected) |
|
1026 */ |
|
1027 if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) |
|
1028 { |
|
1029 if (cpi->oxcf.cpu_used <= 5) |
|
1030 speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04); |
|
1031 else |
|
1032 speed_correction = 1.25; |
|
1033 } |
|
1034 |
|
1035 /* Estimate of overhead bits per mb */ |
|
1036 /* Correction to overhead bits for min allowed Q. */ |
|
1037 overhead_bits_per_mb = overhead_bits / num_mbs; |
|
1038 overhead_bits_per_mb = (int)(overhead_bits_per_mb * |
|
1039 pow( 0.98, (double)cpi->twopass.maxq_min_limit )); |
|
1040 |
|
1041 /* Try and pick a max Q that will be high enough to encode the |
|
1042 * content at the given rate. |
|
1043 */ |
|
1044 for (Q = cpi->twopass.maxq_min_limit; Q < cpi->twopass.maxq_max_limit; Q++) |
|
1045 { |
|
1046 int bits_per_mb_at_this_q; |
|
1047 |
|
1048 /* Error per MB based correction factor */ |
|
1049 err_correction_factor = |
|
1050 calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q); |
|
1051 |
|
1052 bits_per_mb_at_this_q = |
|
1053 vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb; |
|
1054 |
|
1055 bits_per_mb_at_this_q = (int)(.5 + err_correction_factor |
|
1056 * speed_correction * cpi->twopass.est_max_qcorrection_factor |
|
1057 * cpi->twopass.section_max_qfactor |
|
1058 * (double)bits_per_mb_at_this_q); |
|
1059 |
|
1060 /* Mode and motion overhead */ |
|
1061 /* As Q rises in real encode loop rd code will force overhead down |
|
1062 * We make a crude adjustment for this here as *.98 per Q step. |
|
1063 */ |
|
1064 overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98); |
|
1065 |
|
1066 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) |
|
1067 break; |
|
1068 } |
|
1069 |
|
1070 /* Restriction on active max q for constrained quality mode. */ |
|
1071 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) && |
|
1072 (Q < cpi->cq_target_quality) ) |
|
1073 { |
|
1074 Q = cpi->cq_target_quality; |
|
1075 } |
|
1076 |
|
1077 /* Adjust maxq_min_limit and maxq_max_limit limits based on |
|
1078 * average q observed in clip for non kf/gf.arf frames |
|
1079 * Give average a chance to settle though. |
|
1080 */ |
|
1081 if ( (cpi->ni_frames > |
|
1082 ((int)cpi->twopass.total_stats.count >> 8)) && |
|
1083 (cpi->ni_frames > 150) ) |
|
1084 { |
|
1085 cpi->twopass.maxq_max_limit = ((cpi->ni_av_qi + 32) < cpi->worst_quality) |
|
1086 ? (cpi->ni_av_qi + 32) : cpi->worst_quality; |
|
1087 cpi->twopass.maxq_min_limit = ((cpi->ni_av_qi - 32) > cpi->best_quality) |
|
1088 ? (cpi->ni_av_qi - 32) : cpi->best_quality; |
|
1089 } |
|
1090 |
|
1091 return Q; |
|
1092 } |
|
1093 |
|
1094 /* For cq mode estimate a cq level that matches the observed |
|
1095 * complexity and data rate. |
|
1096 */ |
|
1097 static int estimate_cq( VP8_COMP *cpi, |
|
1098 FIRSTPASS_STATS * fpstats, |
|
1099 int section_target_bandwitdh, |
|
1100 int overhead_bits ) |
|
1101 { |
|
1102 int Q; |
|
1103 int num_mbs = cpi->common.MBs; |
|
1104 int target_norm_bits_per_mb; |
|
1105 |
|
1106 double section_err = (fpstats->coded_error / fpstats->count); |
|
1107 double err_per_mb = section_err / num_mbs; |
|
1108 double err_correction_factor; |
|
1109 double speed_correction = 1.0; |
|
1110 double clip_iiratio; |
|
1111 double clip_iifactor; |
|
1112 int overhead_bits_per_mb; |
|
1113 |
|
1114 if (0) |
|
1115 { |
|
1116 FILE *f = fopen("epmp.stt", "a"); |
|
1117 fprintf(f, "%10.2f\n", err_per_mb ); |
|
1118 fclose(f); |
|
1119 } |
|
1120 |
|
1121 target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20)) |
|
1122 ? (512 * section_target_bandwitdh) / num_mbs |
|
1123 : 512 * (section_target_bandwitdh / num_mbs); |
|
1124 |
|
1125 /* Estimate of overhead bits per mb */ |
|
1126 overhead_bits_per_mb = overhead_bits / num_mbs; |
|
1127 |
|
1128 /* Corrections for higher compression speed settings |
|
1129 * (reduced compression expected) |
|
1130 */ |
|
1131 if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) |
|
1132 { |
|
1133 if (cpi->oxcf.cpu_used <= 5) |
|
1134 speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04); |
|
1135 else |
|
1136 speed_correction = 1.25; |
|
1137 } |
|
1138 |
|
1139 /* II ratio correction factor for clip as a whole */ |
|
1140 clip_iiratio = cpi->twopass.total_stats.intra_error / |
|
1141 DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.coded_error); |
|
1142 clip_iifactor = 1.0 - ((clip_iiratio - 10.0) * 0.025); |
|
1143 if (clip_iifactor < 0.80) |
|
1144 clip_iifactor = 0.80; |
|
1145 |
|
1146 /* Try and pick a Q that can encode the content at the given rate. */ |
|
1147 for (Q = 0; Q < MAXQ; Q++) |
|
1148 { |
|
1149 int bits_per_mb_at_this_q; |
|
1150 |
|
1151 /* Error per MB based correction factor */ |
|
1152 err_correction_factor = |
|
1153 calc_correction_factor(err_per_mb, 100.0, 0.40, 0.90, Q); |
|
1154 |
|
1155 bits_per_mb_at_this_q = |
|
1156 vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb; |
|
1157 |
|
1158 bits_per_mb_at_this_q = |
|
1159 (int)( .5 + err_correction_factor * |
|
1160 speed_correction * |
|
1161 clip_iifactor * |
|
1162 (double)bits_per_mb_at_this_q); |
|
1163 |
|
1164 /* Mode and motion overhead */ |
|
1165 /* As Q rises in real encode loop rd code will force overhead down |
|
1166 * We make a crude adjustment for this here as *.98 per Q step. |
|
1167 */ |
|
1168 overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98); |
|
1169 |
|
1170 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) |
|
1171 break; |
|
1172 } |
|
1173 |
|
1174 /* Clip value to range "best allowed to (worst allowed - 1)" */ |
|
1175 Q = cq_level[Q]; |
|
1176 if ( Q >= cpi->worst_quality ) |
|
1177 Q = cpi->worst_quality - 1; |
|
1178 if ( Q < cpi->best_quality ) |
|
1179 Q = cpi->best_quality; |
|
1180 |
|
1181 return Q; |
|
1182 } |
|
1183 |
|
1184 static int estimate_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh) |
|
1185 { |
|
1186 int Q; |
|
1187 int num_mbs = cpi->common.MBs; |
|
1188 int target_norm_bits_per_mb; |
|
1189 |
|
1190 double err_per_mb = section_err / num_mbs; |
|
1191 double err_correction_factor; |
|
1192 double speed_correction = 1.0; |
|
1193 |
|
1194 target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20)) ? (512 * section_target_bandwitdh) / num_mbs : 512 * (section_target_bandwitdh / num_mbs); |
|
1195 |
|
1196 /* Corrections for higher compression speed settings |
|
1197 * (reduced compression expected) |
|
1198 */ |
|
1199 if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) |
|
1200 { |
|
1201 if (cpi->oxcf.cpu_used <= 5) |
|
1202 speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04); |
|
1203 else |
|
1204 speed_correction = 1.25; |
|
1205 } |
|
1206 |
|
1207 /* Try and pick a Q that can encode the content at the given rate. */ |
|
1208 for (Q = 0; Q < MAXQ; Q++) |
|
1209 { |
|
1210 int bits_per_mb_at_this_q; |
|
1211 |
|
1212 /* Error per MB based correction factor */ |
|
1213 err_correction_factor = |
|
1214 calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q); |
|
1215 |
|
1216 bits_per_mb_at_this_q = |
|
1217 (int)( .5 + ( err_correction_factor * |
|
1218 speed_correction * |
|
1219 cpi->twopass.est_max_qcorrection_factor * |
|
1220 (double)vp8_bits_per_mb[INTER_FRAME][Q] / 1.0 ) ); |
|
1221 |
|
1222 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) |
|
1223 break; |
|
1224 } |
|
1225 |
|
1226 return Q; |
|
1227 } |
|
1228 |
|
1229 /* Estimate a worst case Q for a KF group */ |
|
1230 static int estimate_kf_group_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh, double group_iiratio) |
|
1231 { |
|
1232 int Q; |
|
1233 int num_mbs = cpi->common.MBs; |
|
1234 int target_norm_bits_per_mb = (512 * section_target_bandwitdh) / num_mbs; |
|
1235 int bits_per_mb_at_this_q; |
|
1236 |
|
1237 double err_per_mb = section_err / num_mbs; |
|
1238 double err_correction_factor; |
|
1239 double speed_correction = 1.0; |
|
1240 double current_spend_ratio = 1.0; |
|
1241 |
|
1242 double pow_highq = (POW1 < 0.6) ? POW1 + 0.3 : 0.90; |
|
1243 double pow_lowq = (POW1 < 0.7) ? POW1 + 0.1 : 0.80; |
|
1244 |
|
1245 double iiratio_correction_factor = 1.0; |
|
1246 |
|
1247 double combined_correction_factor; |
|
1248 |
|
1249 /* Trap special case where the target is <= 0 */ |
|
1250 if (target_norm_bits_per_mb <= 0) |
|
1251 return MAXQ * 2; |
|
1252 |
|
1253 /* Calculate a corrective factor based on a rolling ratio of bits spent |
|
1254 * vs target bits |
|
1255 * This is clamped to the range 0.1 to 10.0 |
|
1256 */ |
|
1257 if (cpi->long_rolling_target_bits <= 0) |
|
1258 current_spend_ratio = 10.0; |
|
1259 else |
|
1260 { |
|
1261 current_spend_ratio = (double)cpi->long_rolling_actual_bits / (double)cpi->long_rolling_target_bits; |
|
1262 current_spend_ratio = (current_spend_ratio > 10.0) ? 10.0 : (current_spend_ratio < 0.1) ? 0.1 : current_spend_ratio; |
|
1263 } |
|
1264 |
|
1265 /* Calculate a correction factor based on the quality of prediction in |
|
1266 * the sequence as indicated by intra_inter error score ratio (IIRatio) |
|
1267 * The idea here is to favour subsampling in the hardest sections vs |
|
1268 * the easyest. |
|
1269 */ |
|
1270 iiratio_correction_factor = 1.0 - ((group_iiratio - 6.0) * 0.1); |
|
1271 |
|
1272 if (iiratio_correction_factor < 0.5) |
|
1273 iiratio_correction_factor = 0.5; |
|
1274 |
|
1275 /* Corrections for higher compression speed settings |
|
1276 * (reduced compression expected) |
|
1277 */ |
|
1278 if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) |
|
1279 { |
|
1280 if (cpi->oxcf.cpu_used <= 5) |
|
1281 speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04); |
|
1282 else |
|
1283 speed_correction = 1.25; |
|
1284 } |
|
1285 |
|
1286 /* Combine the various factors calculated above */ |
|
1287 combined_correction_factor = speed_correction * iiratio_correction_factor * current_spend_ratio; |
|
1288 |
|
1289 /* Try and pick a Q that should be high enough to encode the content at |
|
1290 * the given rate. |
|
1291 */ |
|
1292 for (Q = 0; Q < MAXQ; Q++) |
|
1293 { |
|
1294 /* Error per MB based correction factor */ |
|
1295 err_correction_factor = |
|
1296 calc_correction_factor(err_per_mb, 150.0, pow_lowq, pow_highq, Q); |
|
1297 |
|
1298 bits_per_mb_at_this_q = |
|
1299 (int)(.5 + ( err_correction_factor * |
|
1300 combined_correction_factor * |
|
1301 (double)vp8_bits_per_mb[INTER_FRAME][Q]) ); |
|
1302 |
|
1303 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) |
|
1304 break; |
|
1305 } |
|
1306 |
|
1307 /* If we could not hit the target even at Max Q then estimate what Q |
|
1308 * would have been required |
|
1309 */ |
|
1310 while ((bits_per_mb_at_this_q > target_norm_bits_per_mb) && (Q < (MAXQ * 2))) |
|
1311 { |
|
1312 |
|
1313 bits_per_mb_at_this_q = (int)(0.96 * bits_per_mb_at_this_q); |
|
1314 Q++; |
|
1315 } |
|
1316 |
|
1317 if (0) |
|
1318 { |
|
1319 FILE *f = fopen("estkf_q.stt", "a"); |
|
1320 fprintf(f, "%8d %8d %8d %8.2f %8.3f %8.2f %8.3f %8.3f %8.3f %8d\n", cpi->common.current_video_frame, bits_per_mb_at_this_q, |
|
1321 target_norm_bits_per_mb, err_per_mb, err_correction_factor, |
|
1322 current_spend_ratio, group_iiratio, iiratio_correction_factor, |
|
1323 (double)cpi->buffer_level / (double)cpi->oxcf.optimal_buffer_level, Q); |
|
1324 fclose(f); |
|
1325 } |
|
1326 |
|
1327 return Q; |
|
1328 } |
|
1329 |
|
1330 extern void vp8_new_framerate(VP8_COMP *cpi, double framerate); |
|
1331 |
|
1332 void vp8_init_second_pass(VP8_COMP *cpi) |
|
1333 { |
|
1334 FIRSTPASS_STATS this_frame; |
|
1335 FIRSTPASS_STATS *start_pos; |
|
1336 |
|
1337 double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100); |
|
1338 |
|
1339 zero_stats(&cpi->twopass.total_stats); |
|
1340 zero_stats(&cpi->twopass.total_left_stats); |
|
1341 |
|
1342 if (!cpi->twopass.stats_in_end) |
|
1343 return; |
|
1344 |
|
1345 cpi->twopass.total_stats = *cpi->twopass.stats_in_end; |
|
1346 cpi->twopass.total_left_stats = cpi->twopass.total_stats; |
|
1347 |
|
1348 /* each frame can have a different duration, as the frame rate in the |
|
1349 * source isn't guaranteed to be constant. The frame rate prior to |
|
1350 * the first frame encoded in the second pass is a guess. However the |
|
1351 * sum duration is not. Its calculated based on the actual durations of |
|
1352 * all frames from the first pass. |
|
1353 */ |
|
1354 vp8_new_framerate(cpi, 10000000.0 * cpi->twopass.total_stats.count / cpi->twopass.total_stats.duration); |
|
1355 |
|
1356 cpi->output_framerate = cpi->framerate; |
|
1357 cpi->twopass.bits_left = (int64_t)(cpi->twopass.total_stats.duration * cpi->oxcf.target_bandwidth / 10000000.0) ; |
|
1358 cpi->twopass.bits_left -= (int64_t)(cpi->twopass.total_stats.duration * two_pass_min_rate / 10000000.0); |
|
1359 |
|
1360 /* Calculate a minimum intra value to be used in determining the IIratio |
|
1361 * scores used in the second pass. We have this minimum to make sure |
|
1362 * that clips that are static but "low complexity" in the intra domain |
|
1363 * are still boosted appropriately for KF/GF/ARF |
|
1364 */ |
|
1365 cpi->twopass.kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; |
|
1366 cpi->twopass.gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; |
|
1367 |
|
1368 /* Scan the first pass file and calculate an average Intra / Inter error |
|
1369 * score ratio for the sequence |
|
1370 */ |
|
1371 { |
|
1372 double sum_iiratio = 0.0; |
|
1373 double IIRatio; |
|
1374 |
|
1375 start_pos = cpi->twopass.stats_in; /* Note starting "file" position */ |
|
1376 |
|
1377 while (input_stats(cpi, &this_frame) != EOF) |
|
1378 { |
|
1379 IIRatio = this_frame.intra_error / DOUBLE_DIVIDE_CHECK(this_frame.coded_error); |
|
1380 IIRatio = (IIRatio < 1.0) ? 1.0 : (IIRatio > 20.0) ? 20.0 : IIRatio; |
|
1381 sum_iiratio += IIRatio; |
|
1382 } |
|
1383 |
|
1384 cpi->twopass.avg_iiratio = sum_iiratio / DOUBLE_DIVIDE_CHECK((double)cpi->twopass.total_stats.count); |
|
1385 |
|
1386 /* Reset file position */ |
|
1387 reset_fpf_position(cpi, start_pos); |
|
1388 } |
|
1389 |
|
1390 /* Scan the first pass file and calculate a modified total error based |
|
1391 * upon the bias/power function used to allocate bits |
|
1392 */ |
|
1393 { |
|
1394 start_pos = cpi->twopass.stats_in; /* Note starting "file" position */ |
|
1395 |
|
1396 cpi->twopass.modified_error_total = 0.0; |
|
1397 cpi->twopass.modified_error_used = 0.0; |
|
1398 |
|
1399 while (input_stats(cpi, &this_frame) != EOF) |
|
1400 { |
|
1401 cpi->twopass.modified_error_total += calculate_modified_err(cpi, &this_frame); |
|
1402 } |
|
1403 cpi->twopass.modified_error_left = cpi->twopass.modified_error_total; |
|
1404 |
|
1405 reset_fpf_position(cpi, start_pos); /* Reset file position */ |
|
1406 |
|
1407 } |
|
1408 } |
|
1409 |
|
1410 void vp8_end_second_pass(VP8_COMP *cpi) |
|
1411 { |
|
1412 } |
|
1413 |
|
1414 /* This function gives and estimate of how badly we believe the prediction |
|
1415 * quality is decaying from frame to frame. |
|
1416 */ |
|
1417 static double get_prediction_decay_rate(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame) |
|
1418 { |
|
1419 double prediction_decay_rate; |
|
1420 double motion_decay; |
|
1421 double motion_pct = next_frame->pcnt_motion; |
|
1422 |
|
1423 /* Initial basis is the % mbs inter coded */ |
|
1424 prediction_decay_rate = next_frame->pcnt_inter; |
|
1425 |
|
1426 /* High % motion -> somewhat higher decay rate */ |
|
1427 motion_decay = (1.0 - (motion_pct / 20.0)); |
|
1428 if (motion_decay < prediction_decay_rate) |
|
1429 prediction_decay_rate = motion_decay; |
|
1430 |
|
1431 /* Adjustment to decay rate based on speed of motion */ |
|
1432 { |
|
1433 double this_mv_rabs; |
|
1434 double this_mv_cabs; |
|
1435 double distance_factor; |
|
1436 |
|
1437 this_mv_rabs = fabs(next_frame->mvr_abs * motion_pct); |
|
1438 this_mv_cabs = fabs(next_frame->mvc_abs * motion_pct); |
|
1439 |
|
1440 distance_factor = sqrt((this_mv_rabs * this_mv_rabs) + |
|
1441 (this_mv_cabs * this_mv_cabs)) / 250.0; |
|
1442 distance_factor = ((distance_factor > 1.0) |
|
1443 ? 0.0 : (1.0 - distance_factor)); |
|
1444 if (distance_factor < prediction_decay_rate) |
|
1445 prediction_decay_rate = distance_factor; |
|
1446 } |
|
1447 |
|
1448 return prediction_decay_rate; |
|
1449 } |
|
1450 |
|
1451 /* Function to test for a condition where a complex transition is followed |
|
1452 * by a static section. For example in slide shows where there is a fade |
|
1453 * between slides. This is to help with more optimal kf and gf positioning. |
|
1454 */ |
|
1455 static int detect_transition_to_still( |
|
1456 VP8_COMP *cpi, |
|
1457 int frame_interval, |
|
1458 int still_interval, |
|
1459 double loop_decay_rate, |
|
1460 double decay_accumulator ) |
|
1461 { |
|
1462 int trans_to_still = 0; |
|
1463 |
|
1464 /* Break clause to detect very still sections after motion |
|
1465 * For example a static image after a fade or other transition |
|
1466 * instead of a clean scene cut. |
|
1467 */ |
|
1468 if ( (frame_interval > MIN_GF_INTERVAL) && |
|
1469 (loop_decay_rate >= 0.999) && |
|
1470 (decay_accumulator < 0.9) ) |
|
1471 { |
|
1472 int j; |
|
1473 FIRSTPASS_STATS * position = cpi->twopass.stats_in; |
|
1474 FIRSTPASS_STATS tmp_next_frame; |
|
1475 double decay_rate; |
|
1476 |
|
1477 /* Look ahead a few frames to see if static condition persists... */ |
|
1478 for ( j = 0; j < still_interval; j++ ) |
|
1479 { |
|
1480 if (EOF == input_stats(cpi, &tmp_next_frame)) |
|
1481 break; |
|
1482 |
|
1483 decay_rate = get_prediction_decay_rate(cpi, &tmp_next_frame); |
|
1484 if ( decay_rate < 0.999 ) |
|
1485 break; |
|
1486 } |
|
1487 /* Reset file position */ |
|
1488 reset_fpf_position(cpi, position); |
|
1489 |
|
1490 /* Only if it does do we signal a transition to still */ |
|
1491 if ( j == still_interval ) |
|
1492 trans_to_still = 1; |
|
1493 } |
|
1494 |
|
1495 return trans_to_still; |
|
1496 } |
|
1497 |
|
1498 /* This function detects a flash through the high relative pcnt_second_ref |
|
1499 * score in the frame following a flash frame. The offset passed in should |
|
1500 * reflect this |
|
1501 */ |
|
1502 static int detect_flash( VP8_COMP *cpi, int offset ) |
|
1503 { |
|
1504 FIRSTPASS_STATS next_frame; |
|
1505 |
|
1506 int flash_detected = 0; |
|
1507 |
|
1508 /* Read the frame data. */ |
|
1509 /* The return is 0 (no flash detected) if not a valid frame */ |
|
1510 if ( read_frame_stats(cpi, &next_frame, offset) != EOF ) |
|
1511 { |
|
1512 /* What we are looking for here is a situation where there is a |
|
1513 * brief break in prediction (such as a flash) but subsequent frames |
|
1514 * are reasonably well predicted by an earlier (pre flash) frame. |
|
1515 * The recovery after a flash is indicated by a high pcnt_second_ref |
|
1516 * comapred to pcnt_inter. |
|
1517 */ |
|
1518 if ( (next_frame.pcnt_second_ref > next_frame.pcnt_inter) && |
|
1519 (next_frame.pcnt_second_ref >= 0.5 ) ) |
|
1520 { |
|
1521 flash_detected = 1; |
|
1522 |
|
1523 /*if (1) |
|
1524 { |
|
1525 FILE *f = fopen("flash.stt", "a"); |
|
1526 fprintf(f, "%8.0f %6.2f %6.2f\n", |
|
1527 next_frame.frame, |
|
1528 next_frame.pcnt_inter, |
|
1529 next_frame.pcnt_second_ref); |
|
1530 fclose(f); |
|
1531 }*/ |
|
1532 } |
|
1533 } |
|
1534 |
|
1535 return flash_detected; |
|
1536 } |
|
1537 |
|
1538 /* Update the motion related elements to the GF arf boost calculation */ |
|
1539 static void accumulate_frame_motion_stats( |
|
1540 VP8_COMP *cpi, |
|
1541 FIRSTPASS_STATS * this_frame, |
|
1542 double * this_frame_mv_in_out, |
|
1543 double * mv_in_out_accumulator, |
|
1544 double * abs_mv_in_out_accumulator, |
|
1545 double * mv_ratio_accumulator ) |
|
1546 { |
|
1547 double this_frame_mvr_ratio; |
|
1548 double this_frame_mvc_ratio; |
|
1549 double motion_pct; |
|
1550 |
|
1551 /* Accumulate motion stats. */ |
|
1552 motion_pct = this_frame->pcnt_motion; |
|
1553 |
|
1554 /* Accumulate Motion In/Out of frame stats */ |
|
1555 *this_frame_mv_in_out = this_frame->mv_in_out_count * motion_pct; |
|
1556 *mv_in_out_accumulator += this_frame->mv_in_out_count * motion_pct; |
|
1557 *abs_mv_in_out_accumulator += |
|
1558 fabs(this_frame->mv_in_out_count * motion_pct); |
|
1559 |
|
1560 /* Accumulate a measure of how uniform (or conversely how random) |
|
1561 * the motion field is. (A ratio of absmv / mv) |
|
1562 */ |
|
1563 if (motion_pct > 0.05) |
|
1564 { |
|
1565 this_frame_mvr_ratio = fabs(this_frame->mvr_abs) / |
|
1566 DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVr)); |
|
1567 |
|
1568 this_frame_mvc_ratio = fabs(this_frame->mvc_abs) / |
|
1569 DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVc)); |
|
1570 |
|
1571 *mv_ratio_accumulator += |
|
1572 (this_frame_mvr_ratio < this_frame->mvr_abs) |
|
1573 ? (this_frame_mvr_ratio * motion_pct) |
|
1574 : this_frame->mvr_abs * motion_pct; |
|
1575 |
|
1576 *mv_ratio_accumulator += |
|
1577 (this_frame_mvc_ratio < this_frame->mvc_abs) |
|
1578 ? (this_frame_mvc_ratio * motion_pct) |
|
1579 : this_frame->mvc_abs * motion_pct; |
|
1580 |
|
1581 } |
|
1582 } |
|
1583 |
|
1584 /* Calculate a baseline boost number for the current frame. */ |
|
1585 static double calc_frame_boost( |
|
1586 VP8_COMP *cpi, |
|
1587 FIRSTPASS_STATS * this_frame, |
|
1588 double this_frame_mv_in_out ) |
|
1589 { |
|
1590 double frame_boost; |
|
1591 |
|
1592 /* Underlying boost factor is based on inter intra error ratio */ |
|
1593 if (this_frame->intra_error > cpi->twopass.gf_intra_err_min) |
|
1594 frame_boost = (IIFACTOR * this_frame->intra_error / |
|
1595 DOUBLE_DIVIDE_CHECK(this_frame->coded_error)); |
|
1596 else |
|
1597 frame_boost = (IIFACTOR * cpi->twopass.gf_intra_err_min / |
|
1598 DOUBLE_DIVIDE_CHECK(this_frame->coded_error)); |
|
1599 |
|
1600 /* Increase boost for frames where new data coming into frame |
|
1601 * (eg zoom out). Slightly reduce boost if there is a net balance |
|
1602 * of motion out of the frame (zoom in). |
|
1603 * The range for this_frame_mv_in_out is -1.0 to +1.0 |
|
1604 */ |
|
1605 if (this_frame_mv_in_out > 0.0) |
|
1606 frame_boost += frame_boost * (this_frame_mv_in_out * 2.0); |
|
1607 /* In extreme case boost is halved */ |
|
1608 else |
|
1609 frame_boost += frame_boost * (this_frame_mv_in_out / 2.0); |
|
1610 |
|
1611 /* Clip to maximum */ |
|
1612 if (frame_boost > GF_RMAX) |
|
1613 frame_boost = GF_RMAX; |
|
1614 |
|
1615 return frame_boost; |
|
1616 } |
|
1617 |
|
1618 #if NEW_BOOST |
|
1619 static int calc_arf_boost( |
|
1620 VP8_COMP *cpi, |
|
1621 int offset, |
|
1622 int f_frames, |
|
1623 int b_frames, |
|
1624 int *f_boost, |
|
1625 int *b_boost ) |
|
1626 { |
|
1627 FIRSTPASS_STATS this_frame; |
|
1628 |
|
1629 int i; |
|
1630 double boost_score = 0.0; |
|
1631 double mv_ratio_accumulator = 0.0; |
|
1632 double decay_accumulator = 1.0; |
|
1633 double this_frame_mv_in_out = 0.0; |
|
1634 double mv_in_out_accumulator = 0.0; |
|
1635 double abs_mv_in_out_accumulator = 0.0; |
|
1636 double r; |
|
1637 int flash_detected = 0; |
|
1638 |
|
1639 /* Search forward from the proposed arf/next gf position */ |
|
1640 for ( i = 0; i < f_frames; i++ ) |
|
1641 { |
|
1642 if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF ) |
|
1643 break; |
|
1644 |
|
1645 /* Update the motion related elements to the boost calculation */ |
|
1646 accumulate_frame_motion_stats( cpi, &this_frame, |
|
1647 &this_frame_mv_in_out, &mv_in_out_accumulator, |
|
1648 &abs_mv_in_out_accumulator, &mv_ratio_accumulator ); |
|
1649 |
|
1650 /* Calculate the baseline boost number for this frame */ |
|
1651 r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out ); |
|
1652 |
|
1653 /* We want to discount the the flash frame itself and the recovery |
|
1654 * frame that follows as both will have poor scores. |
|
1655 */ |
|
1656 flash_detected = detect_flash(cpi, (i+offset)) || |
|
1657 detect_flash(cpi, (i+offset+1)); |
|
1658 |
|
1659 /* Cumulative effect of prediction quality decay */ |
|
1660 if ( !flash_detected ) |
|
1661 { |
|
1662 decay_accumulator = |
|
1663 decay_accumulator * |
|
1664 get_prediction_decay_rate(cpi, &this_frame); |
|
1665 decay_accumulator = |
|
1666 decay_accumulator < 0.1 ? 0.1 : decay_accumulator; |
|
1667 } |
|
1668 boost_score += (decay_accumulator * r); |
|
1669 |
|
1670 /* Break out conditions. */ |
|
1671 if ( (!flash_detected) && |
|
1672 ((mv_ratio_accumulator > 100.0) || |
|
1673 (abs_mv_in_out_accumulator > 3.0) || |
|
1674 (mv_in_out_accumulator < -2.0) ) ) |
|
1675 { |
|
1676 break; |
|
1677 } |
|
1678 } |
|
1679 |
|
1680 *f_boost = (int)(boost_score * 100.0) >> 4; |
|
1681 |
|
1682 /* Reset for backward looking loop */ |
|
1683 boost_score = 0.0; |
|
1684 mv_ratio_accumulator = 0.0; |
|
1685 decay_accumulator = 1.0; |
|
1686 this_frame_mv_in_out = 0.0; |
|
1687 mv_in_out_accumulator = 0.0; |
|
1688 abs_mv_in_out_accumulator = 0.0; |
|
1689 |
|
1690 /* Search forward from the proposed arf/next gf position */ |
|
1691 for ( i = -1; i >= -b_frames; i-- ) |
|
1692 { |
|
1693 if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF ) |
|
1694 break; |
|
1695 |
|
1696 /* Update the motion related elements to the boost calculation */ |
|
1697 accumulate_frame_motion_stats( cpi, &this_frame, |
|
1698 &this_frame_mv_in_out, &mv_in_out_accumulator, |
|
1699 &abs_mv_in_out_accumulator, &mv_ratio_accumulator ); |
|
1700 |
|
1701 /* Calculate the baseline boost number for this frame */ |
|
1702 r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out ); |
|
1703 |
|
1704 /* We want to discount the the flash frame itself and the recovery |
|
1705 * frame that follows as both will have poor scores. |
|
1706 */ |
|
1707 flash_detected = detect_flash(cpi, (i+offset)) || |
|
1708 detect_flash(cpi, (i+offset+1)); |
|
1709 |
|
1710 /* Cumulative effect of prediction quality decay */ |
|
1711 if ( !flash_detected ) |
|
1712 { |
|
1713 decay_accumulator = |
|
1714 decay_accumulator * |
|
1715 get_prediction_decay_rate(cpi, &this_frame); |
|
1716 decay_accumulator = |
|
1717 decay_accumulator < 0.1 ? 0.1 : decay_accumulator; |
|
1718 } |
|
1719 |
|
1720 boost_score += (decay_accumulator * r); |
|
1721 |
|
1722 /* Break out conditions. */ |
|
1723 if ( (!flash_detected) && |
|
1724 ((mv_ratio_accumulator > 100.0) || |
|
1725 (abs_mv_in_out_accumulator > 3.0) || |
|
1726 (mv_in_out_accumulator < -2.0) ) ) |
|
1727 { |
|
1728 break; |
|
1729 } |
|
1730 } |
|
1731 *b_boost = (int)(boost_score * 100.0) >> 4; |
|
1732 |
|
1733 return (*f_boost + *b_boost); |
|
1734 } |
|
1735 #endif |
|
1736 |
|
1737 /* Analyse and define a gf/arf group . */ |
|
1738 static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) |
|
1739 { |
|
1740 FIRSTPASS_STATS next_frame; |
|
1741 FIRSTPASS_STATS *start_pos; |
|
1742 int i; |
|
1743 double r; |
|
1744 double boost_score = 0.0; |
|
1745 double old_boost_score = 0.0; |
|
1746 double gf_group_err = 0.0; |
|
1747 double gf_first_frame_err = 0.0; |
|
1748 double mod_frame_err = 0.0; |
|
1749 |
|
1750 double mv_ratio_accumulator = 0.0; |
|
1751 double decay_accumulator = 1.0; |
|
1752 |
|
1753 double loop_decay_rate = 1.00; /* Starting decay rate */ |
|
1754 |
|
1755 double this_frame_mv_in_out = 0.0; |
|
1756 double mv_in_out_accumulator = 0.0; |
|
1757 double abs_mv_in_out_accumulator = 0.0; |
|
1758 double mod_err_per_mb_accumulator = 0.0; |
|
1759 |
|
1760 int max_bits = frame_max_bits(cpi); /* Max for a single frame */ |
|
1761 |
|
1762 unsigned int allow_alt_ref = |
|
1763 cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames; |
|
1764 |
|
1765 int alt_boost = 0; |
|
1766 int f_boost = 0; |
|
1767 int b_boost = 0; |
|
1768 int flash_detected; |
|
1769 |
|
1770 cpi->twopass.gf_group_bits = 0; |
|
1771 cpi->twopass.gf_decay_rate = 0; |
|
1772 |
|
1773 vp8_clear_system_state(); |
|
1774 |
|
1775 start_pos = cpi->twopass.stats_in; |
|
1776 |
|
1777 vpx_memset(&next_frame, 0, sizeof(next_frame)); /* assure clean */ |
|
1778 |
|
1779 /* Load stats for the current frame. */ |
|
1780 mod_frame_err = calculate_modified_err(cpi, this_frame); |
|
1781 |
|
1782 /* Note the error of the frame at the start of the group (this will be |
|
1783 * the GF frame error if we code a normal gf |
|
1784 */ |
|
1785 gf_first_frame_err = mod_frame_err; |
|
1786 |
|
1787 /* Special treatment if the current frame is a key frame (which is also |
|
1788 * a gf). If it is then its error score (and hence bit allocation) need |
|
1789 * to be subtracted out from the calculation for the GF group |
|
1790 */ |
|
1791 if (cpi->common.frame_type == KEY_FRAME) |
|
1792 gf_group_err -= gf_first_frame_err; |
|
1793 |
|
1794 /* Scan forward to try and work out how many frames the next gf group |
|
1795 * should contain and what level of boost is appropriate for the GF |
|
1796 * or ARF that will be coded with the group |
|
1797 */ |
|
1798 i = 0; |
|
1799 |
|
1800 while (((i < cpi->twopass.static_scene_max_gf_interval) || |
|
1801 ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)) && |
|
1802 (i < cpi->twopass.frames_to_key)) |
|
1803 { |
|
1804 i++; |
|
1805 |
|
1806 /* Accumulate error score of frames in this gf group */ |
|
1807 mod_frame_err = calculate_modified_err(cpi, this_frame); |
|
1808 |
|
1809 gf_group_err += mod_frame_err; |
|
1810 |
|
1811 mod_err_per_mb_accumulator += |
|
1812 mod_frame_err / DOUBLE_DIVIDE_CHECK((double)cpi->common.MBs); |
|
1813 |
|
1814 if (EOF == input_stats(cpi, &next_frame)) |
|
1815 break; |
|
1816 |
|
1817 /* Test for the case where there is a brief flash but the prediction |
|
1818 * quality back to an earlier frame is then restored. |
|
1819 */ |
|
1820 flash_detected = detect_flash(cpi, 0); |
|
1821 |
|
1822 /* Update the motion related elements to the boost calculation */ |
|
1823 accumulate_frame_motion_stats( cpi, &next_frame, |
|
1824 &this_frame_mv_in_out, &mv_in_out_accumulator, |
|
1825 &abs_mv_in_out_accumulator, &mv_ratio_accumulator ); |
|
1826 |
|
1827 /* Calculate a baseline boost number for this frame */ |
|
1828 r = calc_frame_boost( cpi, &next_frame, this_frame_mv_in_out ); |
|
1829 |
|
1830 /* Cumulative effect of prediction quality decay */ |
|
1831 if ( !flash_detected ) |
|
1832 { |
|
1833 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); |
|
1834 decay_accumulator = decay_accumulator * loop_decay_rate; |
|
1835 decay_accumulator = |
|
1836 decay_accumulator < 0.1 ? 0.1 : decay_accumulator; |
|
1837 } |
|
1838 boost_score += (decay_accumulator * r); |
|
1839 |
|
1840 /* Break clause to detect very still sections after motion |
|
1841 * For example a staic image after a fade or other transition. |
|
1842 */ |
|
1843 if ( detect_transition_to_still( cpi, i, 5, |
|
1844 loop_decay_rate, |
|
1845 decay_accumulator ) ) |
|
1846 { |
|
1847 allow_alt_ref = 0; |
|
1848 boost_score = old_boost_score; |
|
1849 break; |
|
1850 } |
|
1851 |
|
1852 /* Break out conditions. */ |
|
1853 if ( |
|
1854 /* Break at cpi->max_gf_interval unless almost totally static */ |
|
1855 (i >= cpi->max_gf_interval && (decay_accumulator < 0.995)) || |
|
1856 ( |
|
1857 /* Dont break out with a very short interval */ |
|
1858 (i > MIN_GF_INTERVAL) && |
|
1859 /* Dont break out very close to a key frame */ |
|
1860 ((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) && |
|
1861 ((boost_score > 20.0) || (next_frame.pcnt_inter < 0.75)) && |
|
1862 (!flash_detected) && |
|
1863 ((mv_ratio_accumulator > 100.0) || |
|
1864 (abs_mv_in_out_accumulator > 3.0) || |
|
1865 (mv_in_out_accumulator < -2.0) || |
|
1866 ((boost_score - old_boost_score) < 2.0)) |
|
1867 ) ) |
|
1868 { |
|
1869 boost_score = old_boost_score; |
|
1870 break; |
|
1871 } |
|
1872 |
|
1873 vpx_memcpy(this_frame, &next_frame, sizeof(*this_frame)); |
|
1874 |
|
1875 old_boost_score = boost_score; |
|
1876 } |
|
1877 |
|
1878 cpi->twopass.gf_decay_rate = |
|
1879 (i > 0) ? (int)(100.0 * (1.0 - decay_accumulator)) / i : 0; |
|
1880 |
|
1881 /* When using CBR apply additional buffer related upper limits */ |
|
1882 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
|
1883 { |
|
1884 double max_boost; |
|
1885 |
|
1886 /* For cbr apply buffer related limits */ |
|
1887 if (cpi->drop_frames_allowed) |
|
1888 { |
|
1889 int64_t df_buffer_level = cpi->oxcf.drop_frames_water_mark * |
|
1890 (cpi->oxcf.optimal_buffer_level / 100); |
|
1891 |
|
1892 if (cpi->buffer_level > df_buffer_level) |
|
1893 max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth); |
|
1894 else |
|
1895 max_boost = 0.0; |
|
1896 } |
|
1897 else if (cpi->buffer_level > 0) |
|
1898 { |
|
1899 max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth); |
|
1900 } |
|
1901 else |
|
1902 { |
|
1903 max_boost = 0.0; |
|
1904 } |
|
1905 |
|
1906 if (boost_score > max_boost) |
|
1907 boost_score = max_boost; |
|
1908 } |
|
1909 |
|
1910 /* Dont allow conventional gf too near the next kf */ |
|
1911 if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL) |
|
1912 { |
|
1913 while (i < cpi->twopass.frames_to_key) |
|
1914 { |
|
1915 i++; |
|
1916 |
|
1917 if (EOF == input_stats(cpi, this_frame)) |
|
1918 break; |
|
1919 |
|
1920 if (i < cpi->twopass.frames_to_key) |
|
1921 { |
|
1922 mod_frame_err = calculate_modified_err(cpi, this_frame); |
|
1923 gf_group_err += mod_frame_err; |
|
1924 } |
|
1925 } |
|
1926 } |
|
1927 |
|
1928 cpi->gfu_boost = (int)(boost_score * 100.0) >> 4; |
|
1929 |
|
1930 #if NEW_BOOST |
|
1931 /* Alterrnative boost calculation for alt ref */ |
|
1932 alt_boost = calc_arf_boost( cpi, 0, (i-1), (i-1), &f_boost, &b_boost ); |
|
1933 #endif |
|
1934 |
|
1935 /* Should we use the alternate refernce frame */ |
|
1936 if (allow_alt_ref && |
|
1937 (i >= MIN_GF_INTERVAL) && |
|
1938 /* dont use ARF very near next kf */ |
|
1939 (i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) && |
|
1940 #if NEW_BOOST |
|
1941 ((next_frame.pcnt_inter > 0.75) || |
|
1942 (next_frame.pcnt_second_ref > 0.5)) && |
|
1943 ((mv_in_out_accumulator / (double)i > -0.2) || |
|
1944 (mv_in_out_accumulator > -2.0)) && |
|
1945 (b_boost > 100) && |
|
1946 (f_boost > 100) ) |
|
1947 #else |
|
1948 (next_frame.pcnt_inter > 0.75) && |
|
1949 ((mv_in_out_accumulator / (double)i > -0.2) || |
|
1950 (mv_in_out_accumulator > -2.0)) && |
|
1951 (cpi->gfu_boost > 100) && |
|
1952 (cpi->twopass.gf_decay_rate <= |
|
1953 (ARF_DECAY_THRESH + (cpi->gfu_boost / 200))) ) |
|
1954 #endif |
|
1955 { |
|
1956 int Boost; |
|
1957 int allocation_chunks; |
|
1958 int Q = (cpi->oxcf.fixed_q < 0) |
|
1959 ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q; |
|
1960 int tmp_q; |
|
1961 int arf_frame_bits = 0; |
|
1962 int group_bits; |
|
1963 |
|
1964 #if NEW_BOOST |
|
1965 cpi->gfu_boost = alt_boost; |
|
1966 #endif |
|
1967 |
|
1968 /* Estimate the bits to be allocated to the group as a whole */ |
|
1969 if ((cpi->twopass.kf_group_bits > 0) && |
|
1970 (cpi->twopass.kf_group_error_left > 0)) |
|
1971 { |
|
1972 group_bits = (int)((double)cpi->twopass.kf_group_bits * |
|
1973 (gf_group_err / (double)cpi->twopass.kf_group_error_left)); |
|
1974 } |
|
1975 else |
|
1976 group_bits = 0; |
|
1977 |
|
1978 /* Boost for arf frame */ |
|
1979 #if NEW_BOOST |
|
1980 Boost = (alt_boost * GFQ_ADJUSTMENT) / 100; |
|
1981 #else |
|
1982 Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100); |
|
1983 #endif |
|
1984 Boost += (i * 50); |
|
1985 |
|
1986 /* Set max and minimum boost and hence minimum allocation */ |
|
1987 if (Boost > ((cpi->baseline_gf_interval + 1) * 200)) |
|
1988 Boost = ((cpi->baseline_gf_interval + 1) * 200); |
|
1989 else if (Boost < 125) |
|
1990 Boost = 125; |
|
1991 |
|
1992 allocation_chunks = (i * 100) + Boost; |
|
1993 |
|
1994 /* Normalize Altboost and allocations chunck down to prevent overflow */ |
|
1995 while (Boost > 1000) |
|
1996 { |
|
1997 Boost /= 2; |
|
1998 allocation_chunks /= 2; |
|
1999 } |
|
2000 |
|
2001 /* Calculate the number of bits to be spent on the arf based on the |
|
2002 * boost number |
|
2003 */ |
|
2004 arf_frame_bits = (int)((double)Boost * (group_bits / |
|
2005 (double)allocation_chunks)); |
|
2006 |
|
2007 /* Estimate if there are enough bits available to make worthwhile use |
|
2008 * of an arf. |
|
2009 */ |
|
2010 tmp_q = estimate_q(cpi, mod_frame_err, (int)arf_frame_bits); |
|
2011 |
|
2012 /* Only use an arf if it is likely we will be able to code |
|
2013 * it at a lower Q than the surrounding frames. |
|
2014 */ |
|
2015 if (tmp_q < cpi->worst_quality) |
|
2016 { |
|
2017 int half_gf_int; |
|
2018 int frames_after_arf; |
|
2019 int frames_bwd = cpi->oxcf.arnr_max_frames - 1; |
|
2020 int frames_fwd = cpi->oxcf.arnr_max_frames - 1; |
|
2021 |
|
2022 cpi->source_alt_ref_pending = 1; |
|
2023 |
|
2024 /* |
|
2025 * For alt ref frames the error score for the end frame of the |
|
2026 * group (the alt ref frame) should not contribute to the group |
|
2027 * total and hence the number of bit allocated to the group. |
|
2028 * Rather it forms part of the next group (it is the GF at the |
|
2029 * start of the next group) |
|
2030 * gf_group_err -= mod_frame_err; |
|
2031 * |
|
2032 * For alt ref frames alt ref frame is technically part of the |
|
2033 * GF frame for the next group but we always base the error |
|
2034 * calculation and bit allocation on the current group of frames. |
|
2035 * |
|
2036 * Set the interval till the next gf or arf. |
|
2037 * For ARFs this is the number of frames to be coded before the |
|
2038 * future frame that is coded as an ARF. |
|
2039 * The future frame itself is part of the next group |
|
2040 */ |
|
2041 cpi->baseline_gf_interval = i; |
|
2042 |
|
2043 /* |
|
2044 * Define the arnr filter width for this group of frames: |
|
2045 * We only filter frames that lie within a distance of half |
|
2046 * the GF interval from the ARF frame. We also have to trap |
|
2047 * cases where the filter extends beyond the end of clip. |
|
2048 * Note: this_frame->frame has been updated in the loop |
|
2049 * so it now points at the ARF frame. |
|
2050 */ |
|
2051 half_gf_int = cpi->baseline_gf_interval >> 1; |
|
2052 frames_after_arf = (int)(cpi->twopass.total_stats.count - |
|
2053 this_frame->frame - 1); |
|
2054 |
|
2055 switch (cpi->oxcf.arnr_type) |
|
2056 { |
|
2057 case 1: /* Backward filter */ |
|
2058 frames_fwd = 0; |
|
2059 if (frames_bwd > half_gf_int) |
|
2060 frames_bwd = half_gf_int; |
|
2061 break; |
|
2062 |
|
2063 case 2: /* Forward filter */ |
|
2064 if (frames_fwd > half_gf_int) |
|
2065 frames_fwd = half_gf_int; |
|
2066 if (frames_fwd > frames_after_arf) |
|
2067 frames_fwd = frames_after_arf; |
|
2068 frames_bwd = 0; |
|
2069 break; |
|
2070 |
|
2071 case 3: /* Centered filter */ |
|
2072 default: |
|
2073 frames_fwd >>= 1; |
|
2074 if (frames_fwd > frames_after_arf) |
|
2075 frames_fwd = frames_after_arf; |
|
2076 if (frames_fwd > half_gf_int) |
|
2077 frames_fwd = half_gf_int; |
|
2078 |
|
2079 frames_bwd = frames_fwd; |
|
2080 |
|
2081 /* For even length filter there is one more frame backward |
|
2082 * than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff. |
|
2083 */ |
|
2084 if (frames_bwd < half_gf_int) |
|
2085 frames_bwd += (cpi->oxcf.arnr_max_frames+1) & 0x1; |
|
2086 break; |
|
2087 } |
|
2088 |
|
2089 cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd; |
|
2090 } |
|
2091 else |
|
2092 { |
|
2093 cpi->source_alt_ref_pending = 0; |
|
2094 cpi->baseline_gf_interval = i; |
|
2095 } |
|
2096 } |
|
2097 else |
|
2098 { |
|
2099 cpi->source_alt_ref_pending = 0; |
|
2100 cpi->baseline_gf_interval = i; |
|
2101 } |
|
2102 |
|
2103 /* |
|
2104 * Now decide how many bits should be allocated to the GF group as a |
|
2105 * proportion of those remaining in the kf group. |
|
2106 * The final key frame group in the clip is treated as a special case |
|
2107 * where cpi->twopass.kf_group_bits is tied to cpi->twopass.bits_left. |
|
2108 * This is also important for short clips where there may only be one |
|
2109 * key frame. |
|
2110 */ |
|
2111 if (cpi->twopass.frames_to_key >= (int)(cpi->twopass.total_stats.count - |
|
2112 cpi->common.current_video_frame)) |
|
2113 { |
|
2114 cpi->twopass.kf_group_bits = |
|
2115 (cpi->twopass.bits_left > 0) ? cpi->twopass.bits_left : 0; |
|
2116 } |
|
2117 |
|
2118 /* Calculate the bits to be allocated to the group as a whole */ |
|
2119 if ((cpi->twopass.kf_group_bits > 0) && |
|
2120 (cpi->twopass.kf_group_error_left > 0)) |
|
2121 { |
|
2122 cpi->twopass.gf_group_bits = |
|
2123 (int64_t)(cpi->twopass.kf_group_bits * |
|
2124 (gf_group_err / cpi->twopass.kf_group_error_left)); |
|
2125 } |
|
2126 else |
|
2127 cpi->twopass.gf_group_bits = 0; |
|
2128 |
|
2129 cpi->twopass.gf_group_bits = |
|
2130 (cpi->twopass.gf_group_bits < 0) |
|
2131 ? 0 |
|
2132 : (cpi->twopass.gf_group_bits > cpi->twopass.kf_group_bits) |
|
2133 ? cpi->twopass.kf_group_bits : cpi->twopass.gf_group_bits; |
|
2134 |
|
2135 /* Clip cpi->twopass.gf_group_bits based on user supplied data rate |
|
2136 * variability limit (cpi->oxcf.two_pass_vbrmax_section) |
|
2137 */ |
|
2138 if (cpi->twopass.gf_group_bits > |
|
2139 (int64_t)max_bits * cpi->baseline_gf_interval) |
|
2140 cpi->twopass.gf_group_bits = |
|
2141 (int64_t)max_bits * cpi->baseline_gf_interval; |
|
2142 |
|
2143 /* Reset the file position */ |
|
2144 reset_fpf_position(cpi, start_pos); |
|
2145 |
|
2146 /* Update the record of error used so far (only done once per gf group) */ |
|
2147 cpi->twopass.modified_error_used += gf_group_err; |
|
2148 |
|
2149 /* Assign bits to the arf or gf. */ |
|
2150 for (i = 0; i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); i++) { |
|
2151 int Boost; |
|
2152 int allocation_chunks; |
|
2153 int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q; |
|
2154 int gf_bits; |
|
2155 |
|
2156 /* For ARF frames */ |
|
2157 if (cpi->source_alt_ref_pending && i == 0) |
|
2158 { |
|
2159 #if NEW_BOOST |
|
2160 Boost = (alt_boost * GFQ_ADJUSTMENT) / 100; |
|
2161 #else |
|
2162 Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100); |
|
2163 #endif |
|
2164 Boost += (cpi->baseline_gf_interval * 50); |
|
2165 |
|
2166 /* Set max and minimum boost and hence minimum allocation */ |
|
2167 if (Boost > ((cpi->baseline_gf_interval + 1) * 200)) |
|
2168 Boost = ((cpi->baseline_gf_interval + 1) * 200); |
|
2169 else if (Boost < 125) |
|
2170 Boost = 125; |
|
2171 |
|
2172 allocation_chunks = |
|
2173 ((cpi->baseline_gf_interval + 1) * 100) + Boost; |
|
2174 } |
|
2175 /* Else for standard golden frames */ |
|
2176 else |
|
2177 { |
|
2178 /* boost based on inter / intra ratio of subsequent frames */ |
|
2179 Boost = (cpi->gfu_boost * GFQ_ADJUSTMENT) / 100; |
|
2180 |
|
2181 /* Set max and minimum boost and hence minimum allocation */ |
|
2182 if (Boost > (cpi->baseline_gf_interval * 150)) |
|
2183 Boost = (cpi->baseline_gf_interval * 150); |
|
2184 else if (Boost < 125) |
|
2185 Boost = 125; |
|
2186 |
|
2187 allocation_chunks = |
|
2188 (cpi->baseline_gf_interval * 100) + (Boost - 100); |
|
2189 } |
|
2190 |
|
2191 /* Normalize Altboost and allocations chunck down to prevent overflow */ |
|
2192 while (Boost > 1000) |
|
2193 { |
|
2194 Boost /= 2; |
|
2195 allocation_chunks /= 2; |
|
2196 } |
|
2197 |
|
2198 /* Calculate the number of bits to be spent on the gf or arf based on |
|
2199 * the boost number |
|
2200 */ |
|
2201 gf_bits = (int)((double)Boost * |
|
2202 (cpi->twopass.gf_group_bits / |
|
2203 (double)allocation_chunks)); |
|
2204 |
|
2205 /* If the frame that is to be boosted is simpler than the average for |
|
2206 * the gf/arf group then use an alternative calculation |
|
2207 * based on the error score of the frame itself |
|
2208 */ |
|
2209 if (mod_frame_err < gf_group_err / (double)cpi->baseline_gf_interval) |
|
2210 { |
|
2211 double alt_gf_grp_bits; |
|
2212 int alt_gf_bits; |
|
2213 |
|
2214 alt_gf_grp_bits = |
|
2215 (double)cpi->twopass.kf_group_bits * |
|
2216 (mod_frame_err * (double)cpi->baseline_gf_interval) / |
|
2217 DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left); |
|
2218 |
|
2219 alt_gf_bits = (int)((double)Boost * (alt_gf_grp_bits / |
|
2220 (double)allocation_chunks)); |
|
2221 |
|
2222 if (gf_bits > alt_gf_bits) |
|
2223 { |
|
2224 gf_bits = alt_gf_bits; |
|
2225 } |
|
2226 } |
|
2227 /* Else if it is harder than other frames in the group make sure it at |
|
2228 * least receives an allocation in keeping with its relative error |
|
2229 * score, otherwise it may be worse off than an "un-boosted" frame |
|
2230 */ |
|
2231 else |
|
2232 { |
|
2233 int alt_gf_bits = |
|
2234 (int)((double)cpi->twopass.kf_group_bits * |
|
2235 mod_frame_err / |
|
2236 DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left)); |
|
2237 |
|
2238 if (alt_gf_bits > gf_bits) |
|
2239 { |
|
2240 gf_bits = alt_gf_bits; |
|
2241 } |
|
2242 } |
|
2243 |
|
2244 /* Apply an additional limit for CBR */ |
|
2245 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
|
2246 { |
|
2247 if (cpi->twopass.gf_bits > (int)(cpi->buffer_level >> 1)) |
|
2248 cpi->twopass.gf_bits = (int)(cpi->buffer_level >> 1); |
|
2249 } |
|
2250 |
|
2251 /* Dont allow a negative value for gf_bits */ |
|
2252 if (gf_bits < 0) |
|
2253 gf_bits = 0; |
|
2254 |
|
2255 /* Add in minimum for a frame */ |
|
2256 gf_bits += cpi->min_frame_bandwidth; |
|
2257 |
|
2258 if (i == 0) |
|
2259 { |
|
2260 cpi->twopass.gf_bits = gf_bits; |
|
2261 } |
|
2262 if (i == 1 || (!cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME))) |
|
2263 { |
|
2264 /* Per frame bit target for this frame */ |
|
2265 cpi->per_frame_bandwidth = gf_bits; |
|
2266 } |
|
2267 } |
|
2268 |
|
2269 { |
|
2270 /* Adjust KF group bits and error remainin */ |
|
2271 cpi->twopass.kf_group_error_left -= (int64_t)gf_group_err; |
|
2272 cpi->twopass.kf_group_bits -= cpi->twopass.gf_group_bits; |
|
2273 |
|
2274 if (cpi->twopass.kf_group_bits < 0) |
|
2275 cpi->twopass.kf_group_bits = 0; |
|
2276 |
|
2277 /* Note the error score left in the remaining frames of the group. |
|
2278 * For normal GFs we want to remove the error score for the first |
|
2279 * frame of the group (except in Key frame case where this has |
|
2280 * already happened) |
|
2281 */ |
|
2282 if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME) |
|
2283 cpi->twopass.gf_group_error_left = (int)(gf_group_err - |
|
2284 gf_first_frame_err); |
|
2285 else |
|
2286 cpi->twopass.gf_group_error_left = (int) gf_group_err; |
|
2287 |
|
2288 cpi->twopass.gf_group_bits -= cpi->twopass.gf_bits - cpi->min_frame_bandwidth; |
|
2289 |
|
2290 if (cpi->twopass.gf_group_bits < 0) |
|
2291 cpi->twopass.gf_group_bits = 0; |
|
2292 |
|
2293 /* This condition could fail if there are two kfs very close together |
|
2294 * despite (MIN_GF_INTERVAL) and would cause a devide by 0 in the |
|
2295 * calculation of cpi->twopass.alt_extra_bits. |
|
2296 */ |
|
2297 if ( cpi->baseline_gf_interval >= 3 ) |
|
2298 { |
|
2299 #if NEW_BOOST |
|
2300 int boost = (cpi->source_alt_ref_pending) |
|
2301 ? b_boost : cpi->gfu_boost; |
|
2302 #else |
|
2303 int boost = cpi->gfu_boost; |
|
2304 #endif |
|
2305 if ( boost >= 150 ) |
|
2306 { |
|
2307 int pct_extra; |
|
2308 |
|
2309 pct_extra = (boost - 100) / 50; |
|
2310 pct_extra = (pct_extra > 20) ? 20 : pct_extra; |
|
2311 |
|
2312 cpi->twopass.alt_extra_bits = |
|
2313 (cpi->twopass.gf_group_bits * pct_extra) / 100; |
|
2314 cpi->twopass.gf_group_bits -= cpi->twopass.alt_extra_bits; |
|
2315 cpi->twopass.alt_extra_bits /= |
|
2316 ((cpi->baseline_gf_interval-1)>>1); |
|
2317 } |
|
2318 else |
|
2319 cpi->twopass.alt_extra_bits = 0; |
|
2320 } |
|
2321 else |
|
2322 cpi->twopass.alt_extra_bits = 0; |
|
2323 } |
|
2324 |
|
2325 /* Adjustments based on a measure of complexity of the section */ |
|
2326 if (cpi->common.frame_type != KEY_FRAME) |
|
2327 { |
|
2328 FIRSTPASS_STATS sectionstats; |
|
2329 double Ratio; |
|
2330 |
|
2331 zero_stats(§ionstats); |
|
2332 reset_fpf_position(cpi, start_pos); |
|
2333 |
|
2334 for (i = 0 ; i < cpi->baseline_gf_interval ; i++) |
|
2335 { |
|
2336 input_stats(cpi, &next_frame); |
|
2337 accumulate_stats(§ionstats, &next_frame); |
|
2338 } |
|
2339 |
|
2340 avg_stats(§ionstats); |
|
2341 |
|
2342 cpi->twopass.section_intra_rating = (unsigned int) |
|
2343 (sectionstats.intra_error / |
|
2344 DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); |
|
2345 |
|
2346 Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error); |
|
2347 cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025); |
|
2348 |
|
2349 if (cpi->twopass.section_max_qfactor < 0.80) |
|
2350 cpi->twopass.section_max_qfactor = 0.80; |
|
2351 |
|
2352 reset_fpf_position(cpi, start_pos); |
|
2353 } |
|
2354 } |
|
2355 |
|
2356 /* Allocate bits to a normal frame that is neither a gf an arf or a key frame. */ |
|
2357 static void assign_std_frame_bits(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) |
|
2358 { |
|
2359 int target_frame_size; |
|
2360 |
|
2361 double modified_err; |
|
2362 double err_fraction; |
|
2363 |
|
2364 int max_bits = frame_max_bits(cpi); /* Max for a single frame */ |
|
2365 |
|
2366 /* Calculate modified prediction error used in bit allocation */ |
|
2367 modified_err = calculate_modified_err(cpi, this_frame); |
|
2368 |
|
2369 /* What portion of the remaining GF group error is used by this frame */ |
|
2370 if (cpi->twopass.gf_group_error_left > 0) |
|
2371 err_fraction = modified_err / cpi->twopass.gf_group_error_left; |
|
2372 else |
|
2373 err_fraction = 0.0; |
|
2374 |
|
2375 /* How many of those bits available for allocation should we give it? */ |
|
2376 target_frame_size = (int)((double)cpi->twopass.gf_group_bits * err_fraction); |
|
2377 |
|
2378 /* Clip to target size to 0 - max_bits (or cpi->twopass.gf_group_bits) |
|
2379 * at the top end. |
|
2380 */ |
|
2381 if (target_frame_size < 0) |
|
2382 target_frame_size = 0; |
|
2383 else |
|
2384 { |
|
2385 if (target_frame_size > max_bits) |
|
2386 target_frame_size = max_bits; |
|
2387 |
|
2388 if (target_frame_size > cpi->twopass.gf_group_bits) |
|
2389 target_frame_size = cpi->twopass.gf_group_bits; |
|
2390 } |
|
2391 |
|
2392 /* Adjust error and bits remaining */ |
|
2393 cpi->twopass.gf_group_error_left -= (int)modified_err; |
|
2394 cpi->twopass.gf_group_bits -= target_frame_size; |
|
2395 |
|
2396 if (cpi->twopass.gf_group_bits < 0) |
|
2397 cpi->twopass.gf_group_bits = 0; |
|
2398 |
|
2399 /* Add in the minimum number of bits that is set aside for every frame. */ |
|
2400 target_frame_size += cpi->min_frame_bandwidth; |
|
2401 |
|
2402 /* Every other frame gets a few extra bits */ |
|
2403 if ( (cpi->frames_since_golden & 0x01) && |
|
2404 (cpi->frames_till_gf_update_due > 0) ) |
|
2405 { |
|
2406 target_frame_size += cpi->twopass.alt_extra_bits; |
|
2407 } |
|
2408 |
|
2409 /* Per frame bit target for this frame */ |
|
2410 cpi->per_frame_bandwidth = target_frame_size; |
|
2411 } |
|
2412 |
|
2413 void vp8_second_pass(VP8_COMP *cpi) |
|
2414 { |
|
2415 int tmp_q; |
|
2416 int frames_left = (int)(cpi->twopass.total_stats.count - cpi->common.current_video_frame); |
|
2417 |
|
2418 FIRSTPASS_STATS this_frame = {0}; |
|
2419 FIRSTPASS_STATS this_frame_copy; |
|
2420 |
|
2421 double this_frame_intra_error; |
|
2422 double this_frame_coded_error; |
|
2423 |
|
2424 int overhead_bits; |
|
2425 |
|
2426 if (!cpi->twopass.stats_in) |
|
2427 { |
|
2428 return ; |
|
2429 } |
|
2430 |
|
2431 vp8_clear_system_state(); |
|
2432 |
|
2433 if (EOF == input_stats(cpi, &this_frame)) |
|
2434 return; |
|
2435 |
|
2436 this_frame_intra_error = this_frame.intra_error; |
|
2437 this_frame_coded_error = this_frame.coded_error; |
|
2438 |
|
2439 /* keyframe and section processing ! */ |
|
2440 if (cpi->twopass.frames_to_key == 0) |
|
2441 { |
|
2442 /* Define next KF group and assign bits to it */ |
|
2443 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); |
|
2444 find_next_key_frame(cpi, &this_frame_copy); |
|
2445 |
|
2446 /* Special case: Error error_resilient_mode mode does not make much |
|
2447 * sense for two pass but with its current meaning but this code is |
|
2448 * designed to stop outlandish behaviour if someone does set it when |
|
2449 * using two pass. It effectively disables GF groups. This is |
|
2450 * temporary code till we decide what should really happen in this |
|
2451 * case. |
|
2452 */ |
|
2453 if (cpi->oxcf.error_resilient_mode) |
|
2454 { |
|
2455 cpi->twopass.gf_group_bits = cpi->twopass.kf_group_bits; |
|
2456 cpi->twopass.gf_group_error_left = |
|
2457 (int)cpi->twopass.kf_group_error_left; |
|
2458 cpi->baseline_gf_interval = cpi->twopass.frames_to_key; |
|
2459 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; |
|
2460 cpi->source_alt_ref_pending = 0; |
|
2461 } |
|
2462 |
|
2463 } |
|
2464 |
|
2465 /* Is this a GF / ARF (Note that a KF is always also a GF) */ |
|
2466 if (cpi->frames_till_gf_update_due == 0) |
|
2467 { |
|
2468 /* Define next gf group and assign bits to it */ |
|
2469 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); |
|
2470 define_gf_group(cpi, &this_frame_copy); |
|
2471 |
|
2472 /* If we are going to code an altref frame at the end of the group |
|
2473 * and the current frame is not a key frame.... If the previous |
|
2474 * group used an arf this frame has already benefited from that arf |
|
2475 * boost and it should not be given extra bits If the previous |
|
2476 * group was NOT coded using arf we may want to apply some boost to |
|
2477 * this GF as well |
|
2478 */ |
|
2479 if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)) |
|
2480 { |
|
2481 /* Assign a standard frames worth of bits from those allocated |
|
2482 * to the GF group |
|
2483 */ |
|
2484 int bak = cpi->per_frame_bandwidth; |
|
2485 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); |
|
2486 assign_std_frame_bits(cpi, &this_frame_copy); |
|
2487 cpi->per_frame_bandwidth = bak; |
|
2488 } |
|
2489 } |
|
2490 |
|
2491 /* Otherwise this is an ordinary frame */ |
|
2492 else |
|
2493 { |
|
2494 /* Special case: Error error_resilient_mode mode does not make much |
|
2495 * sense for two pass but with its current meaning but this code is |
|
2496 * designed to stop outlandish behaviour if someone does set it |
|
2497 * when using two pass. It effectively disables GF groups. This is |
|
2498 * temporary code till we decide what should really happen in this |
|
2499 * case. |
|
2500 */ |
|
2501 if (cpi->oxcf.error_resilient_mode) |
|
2502 { |
|
2503 cpi->frames_till_gf_update_due = cpi->twopass.frames_to_key; |
|
2504 |
|
2505 if (cpi->common.frame_type != KEY_FRAME) |
|
2506 { |
|
2507 /* Assign bits from those allocated to the GF group */ |
|
2508 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); |
|
2509 assign_std_frame_bits(cpi, &this_frame_copy); |
|
2510 } |
|
2511 } |
|
2512 else |
|
2513 { |
|
2514 /* Assign bits from those allocated to the GF group */ |
|
2515 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); |
|
2516 assign_std_frame_bits(cpi, &this_frame_copy); |
|
2517 } |
|
2518 } |
|
2519 |
|
2520 /* Keep a globally available copy of this and the next frame's iiratio. */ |
|
2521 cpi->twopass.this_iiratio = (unsigned int)(this_frame_intra_error / |
|
2522 DOUBLE_DIVIDE_CHECK(this_frame_coded_error)); |
|
2523 { |
|
2524 FIRSTPASS_STATS next_frame; |
|
2525 if ( lookup_next_frame_stats(cpi, &next_frame) != EOF ) |
|
2526 { |
|
2527 cpi->twopass.next_iiratio = (unsigned int)(next_frame.intra_error / |
|
2528 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); |
|
2529 } |
|
2530 } |
|
2531 |
|
2532 /* Set nominal per second bandwidth for this frame */ |
|
2533 cpi->target_bandwidth = (int) |
|
2534 (cpi->per_frame_bandwidth * cpi->output_framerate); |
|
2535 if (cpi->target_bandwidth < 0) |
|
2536 cpi->target_bandwidth = 0; |
|
2537 |
|
2538 |
|
2539 /* Account for mv, mode and other overheads. */ |
|
2540 overhead_bits = (int)estimate_modemvcost( |
|
2541 cpi, &cpi->twopass.total_left_stats ); |
|
2542 |
|
2543 /* Special case code for first frame. */ |
|
2544 if (cpi->common.current_video_frame == 0) |
|
2545 { |
|
2546 cpi->twopass.est_max_qcorrection_factor = 1.0; |
|
2547 |
|
2548 /* Set a cq_level in constrained quality mode. */ |
|
2549 if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY ) |
|
2550 { |
|
2551 int est_cq; |
|
2552 |
|
2553 est_cq = |
|
2554 estimate_cq( cpi, |
|
2555 &cpi->twopass.total_left_stats, |
|
2556 (int)(cpi->twopass.bits_left / frames_left), |
|
2557 overhead_bits ); |
|
2558 |
|
2559 cpi->cq_target_quality = cpi->oxcf.cq_level; |
|
2560 if ( est_cq > cpi->cq_target_quality ) |
|
2561 cpi->cq_target_quality = est_cq; |
|
2562 } |
|
2563 |
|
2564 /* guess at maxq needed in 2nd pass */ |
|
2565 cpi->twopass.maxq_max_limit = cpi->worst_quality; |
|
2566 cpi->twopass.maxq_min_limit = cpi->best_quality; |
|
2567 |
|
2568 tmp_q = estimate_max_q( |
|
2569 cpi, |
|
2570 &cpi->twopass.total_left_stats, |
|
2571 (int)(cpi->twopass.bits_left / frames_left), |
|
2572 overhead_bits ); |
|
2573 |
|
2574 /* Limit the maxq value returned subsequently. |
|
2575 * This increases the risk of overspend or underspend if the initial |
|
2576 * estimate for the clip is bad, but helps prevent excessive |
|
2577 * variation in Q, especially near the end of a clip |
|
2578 * where for example a small overspend may cause Q to crash |
|
2579 */ |
|
2580 cpi->twopass.maxq_max_limit = ((tmp_q + 32) < cpi->worst_quality) |
|
2581 ? (tmp_q + 32) : cpi->worst_quality; |
|
2582 cpi->twopass.maxq_min_limit = ((tmp_q - 32) > cpi->best_quality) |
|
2583 ? (tmp_q - 32) : cpi->best_quality; |
|
2584 |
|
2585 cpi->active_worst_quality = tmp_q; |
|
2586 cpi->ni_av_qi = tmp_q; |
|
2587 } |
|
2588 |
|
2589 /* The last few frames of a clip almost always have to few or too many |
|
2590 * bits and for the sake of over exact rate control we dont want to make |
|
2591 * radical adjustments to the allowed quantizer range just to use up a |
|
2592 * few surplus bits or get beneath the target rate. |
|
2593 */ |
|
2594 else if ( (cpi->common.current_video_frame < |
|
2595 (((unsigned int)cpi->twopass.total_stats.count * 255)>>8)) && |
|
2596 ((cpi->common.current_video_frame + cpi->baseline_gf_interval) < |
|
2597 (unsigned int)cpi->twopass.total_stats.count) ) |
|
2598 { |
|
2599 if (frames_left < 1) |
|
2600 frames_left = 1; |
|
2601 |
|
2602 tmp_q = estimate_max_q( |
|
2603 cpi, |
|
2604 &cpi->twopass.total_left_stats, |
|
2605 (int)(cpi->twopass.bits_left / frames_left), |
|
2606 overhead_bits ); |
|
2607 |
|
2608 /* Move active_worst_quality but in a damped way */ |
|
2609 if (tmp_q > cpi->active_worst_quality) |
|
2610 cpi->active_worst_quality ++; |
|
2611 else if (tmp_q < cpi->active_worst_quality) |
|
2612 cpi->active_worst_quality --; |
|
2613 |
|
2614 cpi->active_worst_quality = |
|
2615 ((cpi->active_worst_quality * 3) + tmp_q + 2) / 4; |
|
2616 } |
|
2617 |
|
2618 cpi->twopass.frames_to_key --; |
|
2619 |
|
2620 /* Update the total stats remaining sturcture */ |
|
2621 subtract_stats(&cpi->twopass.total_left_stats, &this_frame ); |
|
2622 } |
|
2623 |
|
2624 |
|
2625 static int test_candidate_kf(VP8_COMP *cpi, FIRSTPASS_STATS *last_frame, FIRSTPASS_STATS *this_frame, FIRSTPASS_STATS *next_frame) |
|
2626 { |
|
2627 int is_viable_kf = 0; |
|
2628 |
|
2629 /* Does the frame satisfy the primary criteria of a key frame |
|
2630 * If so, then examine how well it predicts subsequent frames |
|
2631 */ |
|
2632 if ((this_frame->pcnt_second_ref < 0.10) && |
|
2633 (next_frame->pcnt_second_ref < 0.10) && |
|
2634 ((this_frame->pcnt_inter < 0.05) || |
|
2635 ( |
|
2636 ((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .25) && |
|
2637 ((this_frame->intra_error / DOUBLE_DIVIDE_CHECK(this_frame->coded_error)) < 2.5) && |
|
2638 ((fabs(last_frame->coded_error - this_frame->coded_error) / DOUBLE_DIVIDE_CHECK(this_frame->coded_error) > .40) || |
|
2639 (fabs(last_frame->intra_error - this_frame->intra_error) / DOUBLE_DIVIDE_CHECK(this_frame->intra_error) > .40) || |
|
2640 ((next_frame->intra_error / DOUBLE_DIVIDE_CHECK(next_frame->coded_error)) > 3.5) |
|
2641 ) |
|
2642 ) |
|
2643 ) |
|
2644 ) |
|
2645 { |
|
2646 int i; |
|
2647 FIRSTPASS_STATS *start_pos; |
|
2648 |
|
2649 FIRSTPASS_STATS local_next_frame; |
|
2650 |
|
2651 double boost_score = 0.0; |
|
2652 double old_boost_score = 0.0; |
|
2653 double decay_accumulator = 1.0; |
|
2654 double next_iiratio; |
|
2655 |
|
2656 vpx_memcpy(&local_next_frame, next_frame, sizeof(*next_frame)); |
|
2657 |
|
2658 /* Note the starting file position so we can reset to it */ |
|
2659 start_pos = cpi->twopass.stats_in; |
|
2660 |
|
2661 /* Examine how well the key frame predicts subsequent frames */ |
|
2662 for (i = 0 ; i < 16; i++) |
|
2663 { |
|
2664 next_iiratio = (IIKFACTOR1 * local_next_frame.intra_error / DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error)) ; |
|
2665 |
|
2666 if (next_iiratio > RMAX) |
|
2667 next_iiratio = RMAX; |
|
2668 |
|
2669 /* Cumulative effect of decay in prediction quality */ |
|
2670 if (local_next_frame.pcnt_inter > 0.85) |
|
2671 decay_accumulator = decay_accumulator * local_next_frame.pcnt_inter; |
|
2672 else |
|
2673 decay_accumulator = decay_accumulator * ((0.85 + local_next_frame.pcnt_inter) / 2.0); |
|
2674 |
|
2675 /* Keep a running total */ |
|
2676 boost_score += (decay_accumulator * next_iiratio); |
|
2677 |
|
2678 /* Test various breakout clauses */ |
|
2679 if ((local_next_frame.pcnt_inter < 0.05) || |
|
2680 (next_iiratio < 1.5) || |
|
2681 (((local_next_frame.pcnt_inter - |
|
2682 local_next_frame.pcnt_neutral) < 0.20) && |
|
2683 (next_iiratio < 3.0)) || |
|
2684 ((boost_score - old_boost_score) < 0.5) || |
|
2685 (local_next_frame.intra_error < 200) |
|
2686 ) |
|
2687 { |
|
2688 break; |
|
2689 } |
|
2690 |
|
2691 old_boost_score = boost_score; |
|
2692 |
|
2693 /* Get the next frame details */ |
|
2694 if (EOF == input_stats(cpi, &local_next_frame)) |
|
2695 break; |
|
2696 } |
|
2697 |
|
2698 /* If there is tolerable prediction for at least the next 3 frames |
|
2699 * then break out else discard this pottential key frame and move on |
|
2700 */ |
|
2701 if (boost_score > 5.0 && (i > 3)) |
|
2702 is_viable_kf = 1; |
|
2703 else |
|
2704 { |
|
2705 /* Reset the file position */ |
|
2706 reset_fpf_position(cpi, start_pos); |
|
2707 |
|
2708 is_viable_kf = 0; |
|
2709 } |
|
2710 } |
|
2711 |
|
2712 return is_viable_kf; |
|
2713 } |
|
2714 static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) |
|
2715 { |
|
2716 int i,j; |
|
2717 FIRSTPASS_STATS last_frame; |
|
2718 FIRSTPASS_STATS first_frame; |
|
2719 FIRSTPASS_STATS next_frame; |
|
2720 FIRSTPASS_STATS *start_position; |
|
2721 |
|
2722 double decay_accumulator = 1.0; |
|
2723 double boost_score = 0; |
|
2724 double old_boost_score = 0.0; |
|
2725 double loop_decay_rate; |
|
2726 |
|
2727 double kf_mod_err = 0.0; |
|
2728 double kf_group_err = 0.0; |
|
2729 double kf_group_intra_err = 0.0; |
|
2730 double kf_group_coded_err = 0.0; |
|
2731 double recent_loop_decay[8] = {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0}; |
|
2732 |
|
2733 vpx_memset(&next_frame, 0, sizeof(next_frame)); |
|
2734 |
|
2735 vp8_clear_system_state(); |
|
2736 start_position = cpi->twopass.stats_in; |
|
2737 |
|
2738 cpi->common.frame_type = KEY_FRAME; |
|
2739 |
|
2740 /* is this a forced key frame by interval */ |
|
2741 cpi->this_key_frame_forced = cpi->next_key_frame_forced; |
|
2742 |
|
2743 /* Clear the alt ref active flag as this can never be active on a key |
|
2744 * frame |
|
2745 */ |
|
2746 cpi->source_alt_ref_active = 0; |
|
2747 |
|
2748 /* Kf is always a gf so clear frames till next gf counter */ |
|
2749 cpi->frames_till_gf_update_due = 0; |
|
2750 |
|
2751 cpi->twopass.frames_to_key = 1; |
|
2752 |
|
2753 /* Take a copy of the initial frame details */ |
|
2754 vpx_memcpy(&first_frame, this_frame, sizeof(*this_frame)); |
|
2755 |
|
2756 cpi->twopass.kf_group_bits = 0; |
|
2757 cpi->twopass.kf_group_error_left = 0; |
|
2758 |
|
2759 kf_mod_err = calculate_modified_err(cpi, this_frame); |
|
2760 |
|
2761 /* find the next keyframe */ |
|
2762 i = 0; |
|
2763 while (cpi->twopass.stats_in < cpi->twopass.stats_in_end) |
|
2764 { |
|
2765 /* Accumulate kf group error */ |
|
2766 kf_group_err += calculate_modified_err(cpi, this_frame); |
|
2767 |
|
2768 /* These figures keep intra and coded error counts for all frames |
|
2769 * including key frames in the group. The effect of the key frame |
|
2770 * itself can be subtracted out using the first_frame data |
|
2771 * collected above |
|
2772 */ |
|
2773 kf_group_intra_err += this_frame->intra_error; |
|
2774 kf_group_coded_err += this_frame->coded_error; |
|
2775 |
|
2776 /* load a the next frame's stats */ |
|
2777 vpx_memcpy(&last_frame, this_frame, sizeof(*this_frame)); |
|
2778 input_stats(cpi, this_frame); |
|
2779 |
|
2780 /* Provided that we are not at the end of the file... */ |
|
2781 if (cpi->oxcf.auto_key |
|
2782 && lookup_next_frame_stats(cpi, &next_frame) != EOF) |
|
2783 { |
|
2784 /* Normal scene cut check */ |
|
2785 if ( ( i >= MIN_GF_INTERVAL ) && |
|
2786 test_candidate_kf(cpi, &last_frame, this_frame, &next_frame) ) |
|
2787 { |
|
2788 break; |
|
2789 } |
|
2790 |
|
2791 /* How fast is prediction quality decaying */ |
|
2792 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); |
|
2793 |
|
2794 /* We want to know something about the recent past... rather than |
|
2795 * as used elsewhere where we are concened with decay in prediction |
|
2796 * quality since the last GF or KF. |
|
2797 */ |
|
2798 recent_loop_decay[i%8] = loop_decay_rate; |
|
2799 decay_accumulator = 1.0; |
|
2800 for (j = 0; j < 8; j++) |
|
2801 { |
|
2802 decay_accumulator = decay_accumulator * recent_loop_decay[j]; |
|
2803 } |
|
2804 |
|
2805 /* Special check for transition or high motion followed by a |
|
2806 * static scene. |
|
2807 */ |
|
2808 if ( detect_transition_to_still( cpi, i, |
|
2809 (cpi->key_frame_frequency-i), |
|
2810 loop_decay_rate, |
|
2811 decay_accumulator ) ) |
|
2812 { |
|
2813 break; |
|
2814 } |
|
2815 |
|
2816 |
|
2817 /* Step on to the next frame */ |
|
2818 cpi->twopass.frames_to_key ++; |
|
2819 |
|
2820 /* If we don't have a real key frame within the next two |
|
2821 * forcekeyframeevery intervals then break out of the loop. |
|
2822 */ |
|
2823 if (cpi->twopass.frames_to_key >= 2 *(int)cpi->key_frame_frequency) |
|
2824 break; |
|
2825 } else |
|
2826 cpi->twopass.frames_to_key ++; |
|
2827 |
|
2828 i++; |
|
2829 } |
|
2830 |
|
2831 /* If there is a max kf interval set by the user we must obey it. |
|
2832 * We already breakout of the loop above at 2x max. |
|
2833 * This code centers the extra kf if the actual natural |
|
2834 * interval is between 1x and 2x |
|
2835 */ |
|
2836 if (cpi->oxcf.auto_key |
|
2837 && cpi->twopass.frames_to_key > (int)cpi->key_frame_frequency ) |
|
2838 { |
|
2839 FIRSTPASS_STATS *current_pos = cpi->twopass.stats_in; |
|
2840 FIRSTPASS_STATS tmp_frame; |
|
2841 |
|
2842 cpi->twopass.frames_to_key /= 2; |
|
2843 |
|
2844 /* Copy first frame details */ |
|
2845 vpx_memcpy(&tmp_frame, &first_frame, sizeof(first_frame)); |
|
2846 |
|
2847 /* Reset to the start of the group */ |
|
2848 reset_fpf_position(cpi, start_position); |
|
2849 |
|
2850 kf_group_err = 0; |
|
2851 kf_group_intra_err = 0; |
|
2852 kf_group_coded_err = 0; |
|
2853 |
|
2854 /* Rescan to get the correct error data for the forced kf group */ |
|
2855 for( i = 0; i < cpi->twopass.frames_to_key; i++ ) |
|
2856 { |
|
2857 /* Accumulate kf group errors */ |
|
2858 kf_group_err += calculate_modified_err(cpi, &tmp_frame); |
|
2859 kf_group_intra_err += tmp_frame.intra_error; |
|
2860 kf_group_coded_err += tmp_frame.coded_error; |
|
2861 |
|
2862 /* Load a the next frame's stats */ |
|
2863 input_stats(cpi, &tmp_frame); |
|
2864 } |
|
2865 |
|
2866 /* Reset to the start of the group */ |
|
2867 reset_fpf_position(cpi, current_pos); |
|
2868 |
|
2869 cpi->next_key_frame_forced = 1; |
|
2870 } |
|
2871 else |
|
2872 cpi->next_key_frame_forced = 0; |
|
2873 |
|
2874 /* Special case for the last frame of the file */ |
|
2875 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) |
|
2876 { |
|
2877 /* Accumulate kf group error */ |
|
2878 kf_group_err += calculate_modified_err(cpi, this_frame); |
|
2879 |
|
2880 /* These figures keep intra and coded error counts for all frames |
|
2881 * including key frames in the group. The effect of the key frame |
|
2882 * itself can be subtracted out using the first_frame data |
|
2883 * collected above |
|
2884 */ |
|
2885 kf_group_intra_err += this_frame->intra_error; |
|
2886 kf_group_coded_err += this_frame->coded_error; |
|
2887 } |
|
2888 |
|
2889 /* Calculate the number of bits that should be assigned to the kf group. */ |
|
2890 if ((cpi->twopass.bits_left > 0) && (cpi->twopass.modified_error_left > 0.0)) |
|
2891 { |
|
2892 /* Max for a single normal frame (not key frame) */ |
|
2893 int max_bits = frame_max_bits(cpi); |
|
2894 |
|
2895 /* Maximum bits for the kf group */ |
|
2896 int64_t max_grp_bits; |
|
2897 |
|
2898 /* Default allocation based on bits left and relative |
|
2899 * complexity of the section |
|
2900 */ |
|
2901 cpi->twopass.kf_group_bits = (int64_t)( cpi->twopass.bits_left * |
|
2902 ( kf_group_err / |
|
2903 cpi->twopass.modified_error_left )); |
|
2904 |
|
2905 /* Clip based on maximum per frame rate defined by the user. */ |
|
2906 max_grp_bits = (int64_t)max_bits * (int64_t)cpi->twopass.frames_to_key; |
|
2907 if (cpi->twopass.kf_group_bits > max_grp_bits) |
|
2908 cpi->twopass.kf_group_bits = max_grp_bits; |
|
2909 |
|
2910 /* Additional special case for CBR if buffer is getting full. */ |
|
2911 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
|
2912 { |
|
2913 int64_t opt_buffer_lvl = cpi->oxcf.optimal_buffer_level; |
|
2914 int64_t buffer_lvl = cpi->buffer_level; |
|
2915 |
|
2916 /* If the buffer is near or above the optimal and this kf group is |
|
2917 * not being allocated much then increase the allocation a bit. |
|
2918 */ |
|
2919 if (buffer_lvl >= opt_buffer_lvl) |
|
2920 { |
|
2921 int64_t high_water_mark = (opt_buffer_lvl + |
|
2922 cpi->oxcf.maximum_buffer_size) >> 1; |
|
2923 |
|
2924 int64_t av_group_bits; |
|
2925 |
|
2926 /* Av bits per frame * number of frames */ |
|
2927 av_group_bits = (int64_t)cpi->av_per_frame_bandwidth * |
|
2928 (int64_t)cpi->twopass.frames_to_key; |
|
2929 |
|
2930 /* We are at or above the maximum. */ |
|
2931 if (cpi->buffer_level >= high_water_mark) |
|
2932 { |
|
2933 int64_t min_group_bits; |
|
2934 |
|
2935 min_group_bits = av_group_bits + |
|
2936 (int64_t)(buffer_lvl - |
|
2937 high_water_mark); |
|
2938 |
|
2939 if (cpi->twopass.kf_group_bits < min_group_bits) |
|
2940 cpi->twopass.kf_group_bits = min_group_bits; |
|
2941 } |
|
2942 /* We are above optimal but below the maximum */ |
|
2943 else if (cpi->twopass.kf_group_bits < av_group_bits) |
|
2944 { |
|
2945 int64_t bits_below_av = av_group_bits - |
|
2946 cpi->twopass.kf_group_bits; |
|
2947 |
|
2948 cpi->twopass.kf_group_bits += |
|
2949 (int64_t)((double)bits_below_av * |
|
2950 (double)(buffer_lvl - opt_buffer_lvl) / |
|
2951 (double)(high_water_mark - opt_buffer_lvl)); |
|
2952 } |
|
2953 } |
|
2954 } |
|
2955 } |
|
2956 else |
|
2957 cpi->twopass.kf_group_bits = 0; |
|
2958 |
|
2959 /* Reset the first pass file position */ |
|
2960 reset_fpf_position(cpi, start_position); |
|
2961 |
|
2962 /* determine how big to make this keyframe based on how well the |
|
2963 * subsequent frames use inter blocks |
|
2964 */ |
|
2965 decay_accumulator = 1.0; |
|
2966 boost_score = 0.0; |
|
2967 loop_decay_rate = 1.00; /* Starting decay rate */ |
|
2968 |
|
2969 for (i = 0 ; i < cpi->twopass.frames_to_key ; i++) |
|
2970 { |
|
2971 double r; |
|
2972 |
|
2973 if (EOF == input_stats(cpi, &next_frame)) |
|
2974 break; |
|
2975 |
|
2976 if (next_frame.intra_error > cpi->twopass.kf_intra_err_min) |
|
2977 r = (IIKFACTOR2 * next_frame.intra_error / |
|
2978 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); |
|
2979 else |
|
2980 r = (IIKFACTOR2 * cpi->twopass.kf_intra_err_min / |
|
2981 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); |
|
2982 |
|
2983 if (r > RMAX) |
|
2984 r = RMAX; |
|
2985 |
|
2986 /* How fast is prediction quality decaying */ |
|
2987 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); |
|
2988 |
|
2989 decay_accumulator = decay_accumulator * loop_decay_rate; |
|
2990 decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator; |
|
2991 |
|
2992 boost_score += (decay_accumulator * r); |
|
2993 |
|
2994 if ((i > MIN_GF_INTERVAL) && |
|
2995 ((boost_score - old_boost_score) < 1.0)) |
|
2996 { |
|
2997 break; |
|
2998 } |
|
2999 |
|
3000 old_boost_score = boost_score; |
|
3001 } |
|
3002 |
|
3003 if (1) |
|
3004 { |
|
3005 FIRSTPASS_STATS sectionstats; |
|
3006 double Ratio; |
|
3007 |
|
3008 zero_stats(§ionstats); |
|
3009 reset_fpf_position(cpi, start_position); |
|
3010 |
|
3011 for (i = 0 ; i < cpi->twopass.frames_to_key ; i++) |
|
3012 { |
|
3013 input_stats(cpi, &next_frame); |
|
3014 accumulate_stats(§ionstats, &next_frame); |
|
3015 } |
|
3016 |
|
3017 avg_stats(§ionstats); |
|
3018 |
|
3019 cpi->twopass.section_intra_rating = (unsigned int) |
|
3020 (sectionstats.intra_error |
|
3021 / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); |
|
3022 |
|
3023 Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error); |
|
3024 cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025); |
|
3025 |
|
3026 if (cpi->twopass.section_max_qfactor < 0.80) |
|
3027 cpi->twopass.section_max_qfactor = 0.80; |
|
3028 } |
|
3029 |
|
3030 /* When using CBR apply additional buffer fullness related upper limits */ |
|
3031 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
|
3032 { |
|
3033 double max_boost; |
|
3034 |
|
3035 if (cpi->drop_frames_allowed) |
|
3036 { |
|
3037 int df_buffer_level = (int)(cpi->oxcf.drop_frames_water_mark |
|
3038 * (cpi->oxcf.optimal_buffer_level / 100)); |
|
3039 |
|
3040 if (cpi->buffer_level > df_buffer_level) |
|
3041 max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth); |
|
3042 else |
|
3043 max_boost = 0.0; |
|
3044 } |
|
3045 else if (cpi->buffer_level > 0) |
|
3046 { |
|
3047 max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth); |
|
3048 } |
|
3049 else |
|
3050 { |
|
3051 max_boost = 0.0; |
|
3052 } |
|
3053 |
|
3054 if (boost_score > max_boost) |
|
3055 boost_score = max_boost; |
|
3056 } |
|
3057 |
|
3058 /* Reset the first pass file position */ |
|
3059 reset_fpf_position(cpi, start_position); |
|
3060 |
|
3061 /* Work out how many bits to allocate for the key frame itself */ |
|
3062 if (1) |
|
3063 { |
|
3064 int kf_boost = (int)boost_score; |
|
3065 int allocation_chunks; |
|
3066 int Counter = cpi->twopass.frames_to_key; |
|
3067 int alt_kf_bits; |
|
3068 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx]; |
|
3069 /* Min boost based on kf interval */ |
|
3070 #if 0 |
|
3071 |
|
3072 while ((kf_boost < 48) && (Counter > 0)) |
|
3073 { |
|
3074 Counter -= 2; |
|
3075 kf_boost ++; |
|
3076 } |
|
3077 |
|
3078 #endif |
|
3079 |
|
3080 if (kf_boost < 48) |
|
3081 { |
|
3082 kf_boost += ((Counter + 1) >> 1); |
|
3083 |
|
3084 if (kf_boost > 48) kf_boost = 48; |
|
3085 } |
|
3086 |
|
3087 /* bigger frame sizes need larger kf boosts, smaller frames smaller |
|
3088 * boosts... |
|
3089 */ |
|
3090 if ((lst_yv12->y_width * lst_yv12->y_height) > (320 * 240)) |
|
3091 kf_boost += 2 * (lst_yv12->y_width * lst_yv12->y_height) / (320 * 240); |
|
3092 else if ((lst_yv12->y_width * lst_yv12->y_height) < (320 * 240)) |
|
3093 kf_boost -= 4 * (320 * 240) / (lst_yv12->y_width * lst_yv12->y_height); |
|
3094 |
|
3095 /* Min KF boost */ |
|
3096 kf_boost = (int)((double)kf_boost * 100.0) >> 4; /* Scale 16 to 100 */ |
|
3097 if (kf_boost < 250) |
|
3098 kf_boost = 250; |
|
3099 |
|
3100 /* |
|
3101 * We do three calculations for kf size. |
|
3102 * The first is based on the error score for the whole kf group. |
|
3103 * The second (optionaly) on the key frames own error if this is |
|
3104 * smaller than the average for the group. |
|
3105 * The final one insures that the frame receives at least the |
|
3106 * allocation it would have received based on its own error score vs |
|
3107 * the error score remaining |
|
3108 * Special case if the sequence appears almost totaly static |
|
3109 * as measured by the decay accumulator. In this case we want to |
|
3110 * spend almost all of the bits on the key frame. |
|
3111 * cpi->twopass.frames_to_key-1 because key frame itself is taken |
|
3112 * care of by kf_boost. |
|
3113 */ |
|
3114 if ( decay_accumulator >= 0.99 ) |
|
3115 { |
|
3116 allocation_chunks = |
|
3117 ((cpi->twopass.frames_to_key - 1) * 10) + kf_boost; |
|
3118 } |
|
3119 else |
|
3120 { |
|
3121 allocation_chunks = |
|
3122 ((cpi->twopass.frames_to_key - 1) * 100) + kf_boost; |
|
3123 } |
|
3124 |
|
3125 /* Normalize Altboost and allocations chunck down to prevent overflow */ |
|
3126 while (kf_boost > 1000) |
|
3127 { |
|
3128 kf_boost /= 2; |
|
3129 allocation_chunks /= 2; |
|
3130 } |
|
3131 |
|
3132 cpi->twopass.kf_group_bits = (cpi->twopass.kf_group_bits < 0) ? 0 : cpi->twopass.kf_group_bits; |
|
3133 |
|
3134 /* Calculate the number of bits to be spent on the key frame */ |
|
3135 cpi->twopass.kf_bits = (int)((double)kf_boost * ((double)cpi->twopass.kf_group_bits / (double)allocation_chunks)); |
|
3136 |
|
3137 /* Apply an additional limit for CBR */ |
|
3138 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
|
3139 { |
|
3140 if (cpi->twopass.kf_bits > (int)((3 * cpi->buffer_level) >> 2)) |
|
3141 cpi->twopass.kf_bits = (int)((3 * cpi->buffer_level) >> 2); |
|
3142 } |
|
3143 |
|
3144 /* If the key frame is actually easier than the average for the |
|
3145 * kf group (which does sometimes happen... eg a blank intro frame) |
|
3146 * Then use an alternate calculation based on the kf error score |
|
3147 * which should give a smaller key frame. |
|
3148 */ |
|
3149 if (kf_mod_err < kf_group_err / cpi->twopass.frames_to_key) |
|
3150 { |
|
3151 double alt_kf_grp_bits = |
|
3152 ((double)cpi->twopass.bits_left * |
|
3153 (kf_mod_err * (double)cpi->twopass.frames_to_key) / |
|
3154 DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left)); |
|
3155 |
|
3156 alt_kf_bits = (int)((double)kf_boost * |
|
3157 (alt_kf_grp_bits / (double)allocation_chunks)); |
|
3158 |
|
3159 if (cpi->twopass.kf_bits > alt_kf_bits) |
|
3160 { |
|
3161 cpi->twopass.kf_bits = alt_kf_bits; |
|
3162 } |
|
3163 } |
|
3164 /* Else if it is much harder than other frames in the group make sure |
|
3165 * it at least receives an allocation in keeping with its relative |
|
3166 * error score |
|
3167 */ |
|
3168 else |
|
3169 { |
|
3170 alt_kf_bits = |
|
3171 (int)((double)cpi->twopass.bits_left * |
|
3172 (kf_mod_err / |
|
3173 DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left))); |
|
3174 |
|
3175 if (alt_kf_bits > cpi->twopass.kf_bits) |
|
3176 { |
|
3177 cpi->twopass.kf_bits = alt_kf_bits; |
|
3178 } |
|
3179 } |
|
3180 |
|
3181 cpi->twopass.kf_group_bits -= cpi->twopass.kf_bits; |
|
3182 /* Add in the minimum frame allowance */ |
|
3183 cpi->twopass.kf_bits += cpi->min_frame_bandwidth; |
|
3184 |
|
3185 /* Peer frame bit target for this frame */ |
|
3186 cpi->per_frame_bandwidth = cpi->twopass.kf_bits; |
|
3187 |
|
3188 /* Convert to a per second bitrate */ |
|
3189 cpi->target_bandwidth = (int)(cpi->twopass.kf_bits * |
|
3190 cpi->output_framerate); |
|
3191 } |
|
3192 |
|
3193 /* Note the total error score of the kf group minus the key frame itself */ |
|
3194 cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err); |
|
3195 |
|
3196 /* Adjust the count of total modified error left. The count of bits left |
|
3197 * is adjusted elsewhere based on real coded frame sizes |
|
3198 */ |
|
3199 cpi->twopass.modified_error_left -= kf_group_err; |
|
3200 |
|
3201 if (cpi->oxcf.allow_spatial_resampling) |
|
3202 { |
|
3203 int resample_trigger = 0; |
|
3204 int last_kf_resampled = 0; |
|
3205 int kf_q; |
|
3206 int scale_val = 0; |
|
3207 int hr, hs, vr, vs; |
|
3208 int new_width = cpi->oxcf.Width; |
|
3209 int new_height = cpi->oxcf.Height; |
|
3210 |
|
3211 int projected_buffer_level = (int)cpi->buffer_level; |
|
3212 int tmp_q; |
|
3213 |
|
3214 double projected_bits_perframe; |
|
3215 double group_iiratio = (kf_group_intra_err - first_frame.intra_error) / (kf_group_coded_err - first_frame.coded_error); |
|
3216 double err_per_frame = kf_group_err / cpi->twopass.frames_to_key; |
|
3217 double bits_per_frame; |
|
3218 double av_bits_per_frame; |
|
3219 double effective_size_ratio; |
|
3220 |
|
3221 if ((cpi->common.Width != cpi->oxcf.Width) || (cpi->common.Height != cpi->oxcf.Height)) |
|
3222 last_kf_resampled = 1; |
|
3223 |
|
3224 /* Set back to unscaled by defaults */ |
|
3225 cpi->common.horiz_scale = NORMAL; |
|
3226 cpi->common.vert_scale = NORMAL; |
|
3227 |
|
3228 /* Calculate Average bits per frame. */ |
|
3229 av_bits_per_frame = cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate); |
|
3230 |
|
3231 /* CBR... Use the clip average as the target for deciding resample */ |
|
3232 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
|
3233 { |
|
3234 bits_per_frame = av_bits_per_frame; |
|
3235 } |
|
3236 |
|
3237 /* In VBR we want to avoid downsampling in easy section unless we |
|
3238 * are under extreme pressure So use the larger of target bitrate |
|
3239 * for this section or average bitrate for sequence |
|
3240 */ |
|
3241 else |
|
3242 { |
|
3243 /* This accounts for how hard the section is... */ |
|
3244 bits_per_frame = (double) |
|
3245 (cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key); |
|
3246 |
|
3247 /* Dont turn to resampling in easy sections just because they |
|
3248 * have been assigned a small number of bits |
|
3249 */ |
|
3250 if (bits_per_frame < av_bits_per_frame) |
|
3251 bits_per_frame = av_bits_per_frame; |
|
3252 } |
|
3253 |
|
3254 /* bits_per_frame should comply with our minimum */ |
|
3255 if (bits_per_frame < (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100)) |
|
3256 bits_per_frame = (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100); |
|
3257 |
|
3258 /* Work out if spatial resampling is necessary */ |
|
3259 kf_q = estimate_kf_group_q(cpi, err_per_frame, |
|
3260 (int)bits_per_frame, group_iiratio); |
|
3261 |
|
3262 /* If we project a required Q higher than the maximum allowed Q then |
|
3263 * make a guess at the actual size of frames in this section |
|
3264 */ |
|
3265 projected_bits_perframe = bits_per_frame; |
|
3266 tmp_q = kf_q; |
|
3267 |
|
3268 while (tmp_q > cpi->worst_quality) |
|
3269 { |
|
3270 projected_bits_perframe *= 1.04; |
|
3271 tmp_q--; |
|
3272 } |
|
3273 |
|
3274 /* Guess at buffer level at the end of the section */ |
|
3275 projected_buffer_level = (int) |
|
3276 (cpi->buffer_level - (int) |
|
3277 ((projected_bits_perframe - av_bits_per_frame) * |
|
3278 cpi->twopass.frames_to_key)); |
|
3279 |
|
3280 if (0) |
|
3281 { |
|
3282 FILE *f = fopen("Subsamle.stt", "a"); |
|
3283 fprintf(f, " %8d %8d %8d %8d %12.0f %8d %8d %8d\n", cpi->common.current_video_frame, kf_q, cpi->common.horiz_scale, cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key, (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key), new_height, new_width); |
|
3284 fclose(f); |
|
3285 } |
|
3286 |
|
3287 /* The trigger for spatial resampling depends on the various |
|
3288 * parameters such as whether we are streaming (CBR) or VBR. |
|
3289 */ |
|
3290 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
|
3291 { |
|
3292 /* Trigger resample if we are projected to fall below down |
|
3293 * sample level or resampled last time and are projected to |
|
3294 * remain below the up sample level |
|
3295 */ |
|
3296 if ((projected_buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100)) || |
|
3297 (last_kf_resampled && (projected_buffer_level < (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100)))) |
|
3298 resample_trigger = 1; |
|
3299 else |
|
3300 resample_trigger = 0; |
|
3301 } |
|
3302 else |
|
3303 { |
|
3304 int64_t clip_bits = (int64_t)(cpi->twopass.total_stats.count * cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate)); |
|
3305 int64_t over_spend = cpi->oxcf.starting_buffer_level - cpi->buffer_level; |
|
3306 |
|
3307 /* If triggered last time the threshold for triggering again is |
|
3308 * reduced: |
|
3309 * |
|
3310 * Projected Q higher than allowed and Overspend > 5% of total |
|
3311 * bits |
|
3312 */ |
|
3313 if ((last_kf_resampled && (kf_q > cpi->worst_quality)) || |
|
3314 ((kf_q > cpi->worst_quality) && |
|
3315 (over_spend > clip_bits / 20))) |
|
3316 resample_trigger = 1; |
|
3317 else |
|
3318 resample_trigger = 0; |
|
3319 |
|
3320 } |
|
3321 |
|
3322 if (resample_trigger) |
|
3323 { |
|
3324 while ((kf_q >= cpi->worst_quality) && (scale_val < 6)) |
|
3325 { |
|
3326 scale_val ++; |
|
3327 |
|
3328 cpi->common.vert_scale = vscale_lookup[scale_val]; |
|
3329 cpi->common.horiz_scale = hscale_lookup[scale_val]; |
|
3330 |
|
3331 Scale2Ratio(cpi->common.horiz_scale, &hr, &hs); |
|
3332 Scale2Ratio(cpi->common.vert_scale, &vr, &vs); |
|
3333 |
|
3334 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs; |
|
3335 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs; |
|
3336 |
|
3337 /* Reducing the area to 1/4 does not reduce the complexity |
|
3338 * (err_per_frame) to 1/4... effective_sizeratio attempts |
|
3339 * to provide a crude correction for this |
|
3340 */ |
|
3341 effective_size_ratio = (double)(new_width * new_height) / (double)(cpi->oxcf.Width * cpi->oxcf.Height); |
|
3342 effective_size_ratio = (1.0 + (3.0 * effective_size_ratio)) / 4.0; |
|
3343 |
|
3344 /* Now try again and see what Q we get with the smaller |
|
3345 * image size |
|
3346 */ |
|
3347 kf_q = estimate_kf_group_q(cpi, |
|
3348 err_per_frame * effective_size_ratio, |
|
3349 (int)bits_per_frame, group_iiratio); |
|
3350 |
|
3351 if (0) |
|
3352 { |
|
3353 FILE *f = fopen("Subsamle.stt", "a"); |
|
3354 fprintf(f, "******** %8d %8d %8d %12.0f %8d %8d %8d\n", kf_q, cpi->common.horiz_scale, cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key, (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key), new_height, new_width); |
|
3355 fclose(f); |
|
3356 } |
|
3357 } |
|
3358 } |
|
3359 |
|
3360 if ((cpi->common.Width != new_width) || (cpi->common.Height != new_height)) |
|
3361 { |
|
3362 cpi->common.Width = new_width; |
|
3363 cpi->common.Height = new_height; |
|
3364 vp8_alloc_compressor_data(cpi); |
|
3365 } |
|
3366 } |
|
3367 } |