OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 #define FIRST_PASS_Q 10.0 | 46 #define FIRST_PASS_Q 10.0 |
47 #define GF_MAX_BOOST 96.0 | 47 #define GF_MAX_BOOST 96.0 |
48 #define INTRA_MODE_PENALTY 1024 | 48 #define INTRA_MODE_PENALTY 1024 |
49 #define KF_MAX_BOOST 128.0 | 49 #define KF_MAX_BOOST 128.0 |
50 #define MIN_ARF_GF_BOOST 240 | 50 #define MIN_ARF_GF_BOOST 240 |
51 #define MIN_DECAY_FACTOR 0.01 | 51 #define MIN_DECAY_FACTOR 0.01 |
52 #define MIN_GF_INTERVAL 4 | 52 #define MIN_GF_INTERVAL 4 |
53 #define MIN_KF_BOOST 300 | 53 #define MIN_KF_BOOST 300 |
54 #define NEW_MV_MODE_PENALTY 32 | 54 #define NEW_MV_MODE_PENALTY 32 |
55 #define SVC_FACTOR_PT_LOW 0.45 | 55 #define SVC_FACTOR_PT_LOW 0.45 |
| 56 #define DARK_THRESH 64 |
56 | 57 |
57 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001) | 58 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001) |
58 | 59 |
59 #if ARF_STATS_OUTPUT | 60 #if ARF_STATS_OUTPUT |
60 unsigned int arf_count = 0; | 61 unsigned int arf_count = 0; |
61 #endif | 62 #endif |
62 | 63 |
63 static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { | 64 static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { |
64 YV12_BUFFER_CONFIG temp = *a; | 65 YV12_BUFFER_CONFIG temp = *a; |
65 *a = *b; | 66 *a = *b; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 pkt.data.twopass_stats.buf = stats; | 100 pkt.data.twopass_stats.buf = stats; |
100 pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS); | 101 pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS); |
101 vpx_codec_pkt_list_add(pktlist, &pkt); | 102 vpx_codec_pkt_list_add(pktlist, &pkt); |
102 | 103 |
103 // TEMP debug code | 104 // TEMP debug code |
104 #if OUTPUT_FPF | 105 #if OUTPUT_FPF |
105 { | 106 { |
106 FILE *fpfile; | 107 FILE *fpfile; |
107 fpfile = fopen("firstpass.stt", "a"); | 108 fpfile = fopen("firstpass.stt", "a"); |
108 | 109 |
109 fprintf(fpfile, "%12.0f %12.0f %12.0f %12.0f %12.4f %12.4f" | 110 fprintf(fpfile, "%12.0f %12.4f %12.0f %12.0f %12.0f %12.4f %12.4f" |
110 "%12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f" | 111 "%12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f" |
111 "%12.0f %12.0f %12.4f %12.0f %12.0f %12.4f\n", | 112 "%12.0f %12.0f %12.4f %12.0f %12.0f %12.4f\n", |
112 stats->frame, | 113 stats->frame, |
| 114 stats->weight, |
113 stats->intra_error, | 115 stats->intra_error, |
114 stats->coded_error, | 116 stats->coded_error, |
115 stats->sr_coded_error, | 117 stats->sr_coded_error, |
116 stats->pcnt_inter, | 118 stats->pcnt_inter, |
117 stats->pcnt_motion, | 119 stats->pcnt_motion, |
118 stats->pcnt_second_ref, | 120 stats->pcnt_second_ref, |
119 stats->pcnt_neutral, | 121 stats->pcnt_neutral, |
120 stats->MVr, | 122 stats->MVr, |
121 stats->mvr_abs, | 123 stats->mvr_abs, |
122 stats->MVc, | 124 stats->MVc, |
123 stats->mvc_abs, | 125 stats->mvc_abs, |
124 stats->MVrv, | 126 stats->MVrv, |
125 stats->MVcv, | 127 stats->MVcv, |
126 stats->mv_in_out_count, | 128 stats->mv_in_out_count, |
127 stats->new_mv_count, | 129 stats->new_mv_count, |
128 stats->count, | 130 stats->count, |
129 stats->duration); | 131 stats->duration); |
130 fclose(fpfile); | 132 fclose(fpfile); |
131 } | 133 } |
132 #endif | 134 #endif |
133 } | 135 } |
134 | 136 |
135 #if CONFIG_FP_MB_STATS | 137 #if CONFIG_FP_MB_STATS |
136 static void output_fpmb_stats(uint8_t *this_frame_mb_stats, VP9_COMMON *cm, | 138 static void output_fpmb_stats(uint8_t *this_frame_mb_stats, VP9_COMMON *cm, |
137 struct vpx_codec_pkt_list *pktlist) { | 139 struct vpx_codec_pkt_list *pktlist) { |
138 struct vpx_codec_cx_pkt pkt; | 140 struct vpx_codec_cx_pkt pkt; |
139 pkt.kind = VPX_CODEC_FPMB_STATS_PKT; | 141 pkt.kind = VPX_CODEC_FPMB_STATS_PKT; |
140 pkt.data.firstpass_mb_stats.buf = this_frame_mb_stats; | 142 pkt.data.firstpass_mb_stats.buf = this_frame_mb_stats; |
141 pkt.data.firstpass_mb_stats.sz = cm->MBs * sizeof(uint8_t); | 143 pkt.data.firstpass_mb_stats.sz = cm->initial_mbs * sizeof(uint8_t); |
142 vpx_codec_pkt_list_add(pktlist, &pkt); | 144 vpx_codec_pkt_list_add(pktlist, &pkt); |
143 } | 145 } |
144 #endif | 146 #endif |
145 | 147 |
146 static void zero_stats(FIRSTPASS_STATS *section) { | 148 static void zero_stats(FIRSTPASS_STATS *section) { |
147 section->frame = 0.0; | 149 section->frame = 0.0; |
| 150 section->weight = 0.0; |
148 section->intra_error = 0.0; | 151 section->intra_error = 0.0; |
149 section->coded_error = 0.0; | 152 section->coded_error = 0.0; |
150 section->sr_coded_error = 0.0; | 153 section->sr_coded_error = 0.0; |
151 section->pcnt_inter = 0.0; | 154 section->pcnt_inter = 0.0; |
152 section->pcnt_motion = 0.0; | 155 section->pcnt_motion = 0.0; |
153 section->pcnt_second_ref = 0.0; | 156 section->pcnt_second_ref = 0.0; |
154 section->pcnt_neutral = 0.0; | 157 section->pcnt_neutral = 0.0; |
155 section->MVr = 0.0; | 158 section->MVr = 0.0; |
156 section->mvr_abs = 0.0; | 159 section->mvr_abs = 0.0; |
157 section->MVc = 0.0; | 160 section->MVc = 0.0; |
158 section->mvc_abs = 0.0; | 161 section->mvc_abs = 0.0; |
159 section->MVrv = 0.0; | 162 section->MVrv = 0.0; |
160 section->MVcv = 0.0; | 163 section->MVcv = 0.0; |
161 section->mv_in_out_count = 0.0; | 164 section->mv_in_out_count = 0.0; |
162 section->new_mv_count = 0.0; | 165 section->new_mv_count = 0.0; |
163 section->count = 0.0; | 166 section->count = 0.0; |
164 section->duration = 1.0; | 167 section->duration = 1.0; |
165 section->spatial_layer_id = 0; | 168 section->spatial_layer_id = 0; |
166 } | 169 } |
167 | 170 |
168 static void accumulate_stats(FIRSTPASS_STATS *section, | 171 static void accumulate_stats(FIRSTPASS_STATS *section, |
169 const FIRSTPASS_STATS *frame) { | 172 const FIRSTPASS_STATS *frame) { |
170 section->frame += frame->frame; | 173 section->frame += frame->frame; |
| 174 section->weight += frame->weight; |
171 section->spatial_layer_id = frame->spatial_layer_id; | 175 section->spatial_layer_id = frame->spatial_layer_id; |
172 section->intra_error += frame->intra_error; | 176 section->intra_error += frame->intra_error; |
173 section->coded_error += frame->coded_error; | 177 section->coded_error += frame->coded_error; |
174 section->sr_coded_error += frame->sr_coded_error; | 178 section->sr_coded_error += frame->sr_coded_error; |
175 section->pcnt_inter += frame->pcnt_inter; | 179 section->pcnt_inter += frame->pcnt_inter; |
176 section->pcnt_motion += frame->pcnt_motion; | 180 section->pcnt_motion += frame->pcnt_motion; |
177 section->pcnt_second_ref += frame->pcnt_second_ref; | 181 section->pcnt_second_ref += frame->pcnt_second_ref; |
178 section->pcnt_neutral += frame->pcnt_neutral; | 182 section->pcnt_neutral += frame->pcnt_neutral; |
179 section->MVr += frame->MVr; | 183 section->MVr += frame->MVr; |
180 section->mvr_abs += frame->mvr_abs; | 184 section->mvr_abs += frame->mvr_abs; |
181 section->MVc += frame->MVc; | 185 section->MVc += frame->MVc; |
182 section->mvc_abs += frame->mvc_abs; | 186 section->mvc_abs += frame->mvc_abs; |
183 section->MVrv += frame->MVrv; | 187 section->MVrv += frame->MVrv; |
184 section->MVcv += frame->MVcv; | 188 section->MVcv += frame->MVcv; |
185 section->mv_in_out_count += frame->mv_in_out_count; | 189 section->mv_in_out_count += frame->mv_in_out_count; |
186 section->new_mv_count += frame->new_mv_count; | 190 section->new_mv_count += frame->new_mv_count; |
187 section->count += frame->count; | 191 section->count += frame->count; |
188 section->duration += frame->duration; | 192 section->duration += frame->duration; |
189 } | 193 } |
190 | 194 |
191 static void subtract_stats(FIRSTPASS_STATS *section, | 195 static void subtract_stats(FIRSTPASS_STATS *section, |
192 const FIRSTPASS_STATS *frame) { | 196 const FIRSTPASS_STATS *frame) { |
193 section->frame -= frame->frame; | 197 section->frame -= frame->frame; |
| 198 section->weight -= frame->weight; |
194 section->intra_error -= frame->intra_error; | 199 section->intra_error -= frame->intra_error; |
195 section->coded_error -= frame->coded_error; | 200 section->coded_error -= frame->coded_error; |
196 section->sr_coded_error -= frame->sr_coded_error; | 201 section->sr_coded_error -= frame->sr_coded_error; |
197 section->pcnt_inter -= frame->pcnt_inter; | 202 section->pcnt_inter -= frame->pcnt_inter; |
198 section->pcnt_motion -= frame->pcnt_motion; | 203 section->pcnt_motion -= frame->pcnt_motion; |
199 section->pcnt_second_ref -= frame->pcnt_second_ref; | 204 section->pcnt_second_ref -= frame->pcnt_second_ref; |
200 section->pcnt_neutral -= frame->pcnt_neutral; | 205 section->pcnt_neutral -= frame->pcnt_neutral; |
201 section->MVr -= frame->MVr; | 206 section->MVr -= frame->MVr; |
202 section->mvr_abs -= frame->mvr_abs; | 207 section->mvr_abs -= frame->mvr_abs; |
203 section->MVc -= frame->MVc; | 208 section->MVc -= frame->MVc; |
204 section->mvc_abs -= frame->mvc_abs; | 209 section->mvc_abs -= frame->mvc_abs; |
205 section->MVrv -= frame->MVrv; | 210 section->MVrv -= frame->MVrv; |
206 section->MVcv -= frame->MVcv; | 211 section->MVcv -= frame->MVcv; |
207 section->mv_in_out_count -= frame->mv_in_out_count; | 212 section->mv_in_out_count -= frame->mv_in_out_count; |
208 section->new_mv_count -= frame->new_mv_count; | 213 section->new_mv_count -= frame->new_mv_count; |
209 section->count -= frame->count; | 214 section->count -= frame->count; |
210 section->duration -= frame->duration; | 215 section->duration -= frame->duration; |
211 } | 216 } |
212 | 217 |
213 | 218 |
214 // Calculate a modified Error used in distributing bits between easier and | 219 // Calculate a modified Error used in distributing bits between easier and |
215 // harder frames. | 220 // harder frames. |
216 static double calculate_modified_err(const TWO_PASS *twopass, | 221 static double calculate_modified_err(const TWO_PASS *twopass, |
217 const VP9EncoderConfig *oxcf, | 222 const VP9EncoderConfig *oxcf, |
218 const FIRSTPASS_STATS *this_frame) { | 223 const FIRSTPASS_STATS *this_frame) { |
219 const FIRSTPASS_STATS *const stats = &twopass->total_stats; | 224 const FIRSTPASS_STATS *const stats = &twopass->total_stats; |
220 const double av_err = stats->coded_error / stats->count; | 225 const double av_weight = stats->weight / stats->count; |
221 const double modified_error = av_err * | 226 const double av_err = (stats->coded_error * av_weight) / stats->count; |
222 pow(this_frame->coded_error / DOUBLE_DIVIDE_CHECK(av_err), | 227 const double modified_error = |
223 oxcf->two_pass_vbrbias / 100.0); | 228 av_err * pow(this_frame->coded_error * this_frame->weight / |
| 229 DOUBLE_DIVIDE_CHECK(av_err), oxcf->two_pass_vbrbias / 100.0); |
224 return fclamp(modified_error, | 230 return fclamp(modified_error, |
225 twopass->modified_error_min, twopass->modified_error_max); | 231 twopass->modified_error_min, twopass->modified_error_max); |
226 } | 232 } |
227 | 233 |
228 // This function returns the maximum target rate per frame. | 234 // This function returns the maximum target rate per frame. |
229 static int frame_max_bits(const RATE_CONTROL *rc, | 235 static int frame_max_bits(const RATE_CONTROL *rc, |
230 const VP9EncoderConfig *oxcf) { | 236 const VP9EncoderConfig *oxcf) { |
231 int64_t max_bits = ((int64_t)rc->avg_frame_bandwidth * | 237 int64_t max_bits = ((int64_t)rc->avg_frame_bandwidth * |
232 (int64_t)oxcf->two_pass_vbrmax_section) / 100; | 238 (int64_t)oxcf->two_pass_vbrmax_section) / 100; |
233 if (max_bits < 0) | 239 if (max_bits < 0) |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 int bd) { | 331 int bd) { |
326 unsigned int sse; | 332 unsigned int sse; |
327 const vp9_variance_fn_t fn = highbd_get_block_variance_fn(bsize, bd); | 333 const vp9_variance_fn_t fn = highbd_get_block_variance_fn(bsize, bd); |
328 fn(src->buf, src->stride, ref->buf, ref->stride, &sse); | 334 fn(src->buf, src->stride, ref->buf, ref->stride, &sse); |
329 return sse; | 335 return sse; |
330 } | 336 } |
331 #endif // CONFIG_VP9_HIGHBITDEPTH | 337 #endif // CONFIG_VP9_HIGHBITDEPTH |
332 | 338 |
333 // Refine the motion search range according to the frame dimension | 339 // Refine the motion search range according to the frame dimension |
334 // for first pass test. | 340 // for first pass test. |
335 static int get_search_range(const VP9_COMMON *cm) { | 341 static int get_search_range(const VP9_COMP *cpi) { |
336 int sr = 0; | 342 int sr = 0; |
337 const int dim = MIN(cm->width, cm->height); | 343 const int dim = MIN(cpi->initial_width, cpi->initial_height); |
338 | 344 |
339 while ((dim << sr) < MAX_FULL_PEL_VAL) | 345 while ((dim << sr) < MAX_FULL_PEL_VAL) |
340 ++sr; | 346 ++sr; |
341 return sr; | 347 return sr; |
342 } | 348 } |
343 | 349 |
344 static void first_pass_motion_search(VP9_COMP *cpi, MACROBLOCK *x, | 350 static void first_pass_motion_search(VP9_COMP *cpi, MACROBLOCK *x, |
345 const MV *ref_mv, MV *best_mv, | 351 const MV *ref_mv, MV *best_mv, |
346 int *best_motion_err) { | 352 int *best_motion_err) { |
347 MACROBLOCKD *const xd = &x->e_mbd; | 353 MACROBLOCKD *const xd = &x->e_mbd; |
348 MV tmp_mv = {0, 0}; | 354 MV tmp_mv = {0, 0}; |
349 MV ref_mv_full = {ref_mv->row >> 3, ref_mv->col >> 3}; | 355 MV ref_mv_full = {ref_mv->row >> 3, ref_mv->col >> 3}; |
350 int num00, tmp_err, n; | 356 int num00, tmp_err, n; |
351 const BLOCK_SIZE bsize = xd->mi[0].src_mi->mbmi.sb_type; | 357 const BLOCK_SIZE bsize = xd->mi[0].src_mi->mbmi.sb_type; |
352 vp9_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[bsize]; | 358 vp9_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[bsize]; |
353 const int new_mv_mode_penalty = NEW_MV_MODE_PENALTY; | 359 const int new_mv_mode_penalty = NEW_MV_MODE_PENALTY; |
354 | 360 |
355 int step_param = 3; | 361 int step_param = 3; |
356 int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; | 362 int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; |
357 const int sr = get_search_range(&cpi->common); | 363 const int sr = get_search_range(cpi); |
358 step_param += sr; | 364 step_param += sr; |
359 further_steps -= sr; | 365 further_steps -= sr; |
360 | 366 |
361 // Override the default variance function to use MSE. | 367 // Override the default variance function to use MSE. |
362 v_fn_ptr.vf = get_block_variance_fn(bsize); | 368 v_fn_ptr.vf = get_block_variance_fn(bsize); |
363 #if CONFIG_VP9_HIGHBITDEPTH | 369 #if CONFIG_VP9_HIGHBITDEPTH |
364 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { | 370 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { |
365 v_fn_ptr.vf = highbd_get_block_variance_fn(bsize, xd->bd); | 371 v_fn_ptr.vf = highbd_get_block_variance_fn(bsize, xd->bd); |
366 } | 372 } |
367 #endif // CONFIG_VP9_HIGHBITDEPTH | 373 #endif // CONFIG_VP9_HIGHBITDEPTH |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 const int intrapenalty = INTRA_MODE_PENALTY; | 479 const int intrapenalty = INTRA_MODE_PENALTY; |
474 int neutral_count = 0; | 480 int neutral_count = 0; |
475 int new_mv_count = 0; | 481 int new_mv_count = 0; |
476 int sum_in_vectors = 0; | 482 int sum_in_vectors = 0; |
477 MV lastmv = {0, 0}; | 483 MV lastmv = {0, 0}; |
478 TWO_PASS *twopass = &cpi->twopass; | 484 TWO_PASS *twopass = &cpi->twopass; |
479 const MV zero_mv = {0, 0}; | 485 const MV zero_mv = {0, 0}; |
480 const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; | 486 const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; |
481 LAYER_CONTEXT *const lc = is_two_pass_svc(cpi) ? | 487 LAYER_CONTEXT *const lc = is_two_pass_svc(cpi) ? |
482 &cpi->svc.layer_context[cpi->svc.spatial_layer_id] : NULL; | 488 &cpi->svc.layer_context[cpi->svc.spatial_layer_id] : NULL; |
| 489 double intra_factor; |
| 490 double brightness_factor; |
483 | 491 |
484 #if CONFIG_FP_MB_STATS | 492 #if CONFIG_FP_MB_STATS |
485 if (cpi->use_fp_mb_stats) { | 493 if (cpi->use_fp_mb_stats) { |
486 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->MBs); | 494 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->initial_mbs); |
487 } | 495 } |
488 #endif | 496 #endif |
489 | 497 |
490 vp9_clear_system_state(); | 498 vp9_clear_system_state(); |
491 | 499 |
| 500 intra_factor = 0.0; |
| 501 brightness_factor = 0.0; |
| 502 |
492 set_first_pass_params(cpi); | 503 set_first_pass_params(cpi); |
493 vp9_set_quantizer(cm, find_fp_qindex(cm->bit_depth)); | 504 vp9_set_quantizer(cm, find_fp_qindex(cm->bit_depth)); |
494 | 505 |
495 if (lc != NULL) { | 506 if (lc != NULL) { |
496 twopass = &lc->twopass; | 507 twopass = &lc->twopass; |
497 | 508 |
498 cpi->lst_fb_idx = cpi->svc.spatial_layer_id; | 509 cpi->lst_fb_idx = cpi->svc.spatial_layer_id; |
499 cpi->ref_frame_flags = VP9_LAST_FLAG; | 510 cpi->ref_frame_flags = VP9_LAST_FLAG; |
500 | 511 |
501 if (cpi->svc.number_spatial_layers + cpi->svc.spatial_layer_id < | 512 if (cpi->svc.number_spatial_layers + cpi->svc.spatial_layer_id < |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 | 589 |
579 // Set up limit values for motion vectors to prevent them extending | 590 // Set up limit values for motion vectors to prevent them extending |
580 // outside the UMV borders. | 591 // outside the UMV borders. |
581 x->mv_row_min = -((mb_row * 16) + BORDER_MV_PIXELS_B16); | 592 x->mv_row_min = -((mb_row * 16) + BORDER_MV_PIXELS_B16); |
582 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) | 593 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) |
583 + BORDER_MV_PIXELS_B16; | 594 + BORDER_MV_PIXELS_B16; |
584 | 595 |
585 for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) { | 596 for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) { |
586 int this_error; | 597 int this_error; |
587 const int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); | 598 const int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); |
588 double error_weight = 1.0; | |
589 const BLOCK_SIZE bsize = get_bsize(cm, mb_row, mb_col); | 599 const BLOCK_SIZE bsize = get_bsize(cm, mb_row, mb_col); |
| 600 double log_intra; |
| 601 int level_sample; |
| 602 |
590 #if CONFIG_FP_MB_STATS | 603 #if CONFIG_FP_MB_STATS |
591 const int mb_index = mb_row * cm->mb_cols + mb_col; | 604 const int mb_index = mb_row * cm->mb_cols + mb_col; |
592 #endif | 605 #endif |
593 | 606 |
594 vp9_clear_system_state(); | 607 vp9_clear_system_state(); |
595 | 608 |
596 xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset; | 609 xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset; |
597 xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset; | 610 xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset; |
598 xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset; | 611 xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset; |
599 xd->left_available = (mb_col != 0); | 612 xd->left_available = (mb_col != 0); |
600 xd->mi[0].src_mi->mbmi.sb_type = bsize; | 613 xd->mi[0].src_mi->mbmi.sb_type = bsize; |
601 xd->mi[0].src_mi->mbmi.ref_frame[0] = INTRA_FRAME; | 614 xd->mi[0].src_mi->mbmi.ref_frame[0] = INTRA_FRAME; |
602 set_mi_row_col(xd, &tile, | 615 set_mi_row_col(xd, &tile, |
603 mb_row << 1, num_8x8_blocks_high_lookup[bsize], | 616 mb_row << 1, num_8x8_blocks_high_lookup[bsize], |
604 mb_col << 1, num_8x8_blocks_wide_lookup[bsize], | 617 mb_col << 1, num_8x8_blocks_wide_lookup[bsize], |
605 cm->mi_rows, cm->mi_cols); | 618 cm->mi_rows, cm->mi_cols); |
606 | 619 |
607 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | |
608 const int energy = vp9_block_energy(cpi, x, bsize); | |
609 error_weight = vp9_vaq_inv_q_ratio(energy); | |
610 } | |
611 | |
612 // Do intra 16x16 prediction. | 620 // Do intra 16x16 prediction. |
613 x->skip_encode = 0; | 621 x->skip_encode = 0; |
614 xd->mi[0].src_mi->mbmi.mode = DC_PRED; | 622 xd->mi[0].src_mi->mbmi.mode = DC_PRED; |
615 xd->mi[0].src_mi->mbmi.tx_size = use_dc_pred ? | 623 xd->mi[0].src_mi->mbmi.tx_size = use_dc_pred ? |
616 (bsize >= BLOCK_16X16 ? TX_16X16 : TX_8X8) : TX_4X4; | 624 (bsize >= BLOCK_16X16 ? TX_16X16 : TX_8X8) : TX_4X4; |
617 vp9_encode_intra_block_plane(x, bsize, 0); | 625 vp9_encode_intra_block_plane(x, bsize, 0); |
618 this_error = vp9_get_mb_ss(x->plane[0].src_diff); | 626 this_error = vp9_get_mb_ss(x->plane[0].src_diff); |
619 #if CONFIG_VP9_HIGHBITDEPTH | 627 #if CONFIG_VP9_HIGHBITDEPTH |
620 if (cm->use_highbitdepth) { | 628 if (cm->use_highbitdepth) { |
621 switch (cm->bit_depth) { | 629 switch (cm->bit_depth) { |
622 case VPX_BITS_8: | 630 case VPX_BITS_8: |
623 break; | 631 break; |
624 case VPX_BITS_10: | 632 case VPX_BITS_10: |
625 this_error >>= 4; | 633 this_error >>= 4; |
626 break; | 634 break; |
627 case VPX_BITS_12: | 635 case VPX_BITS_12: |
628 this_error >>= 8; | 636 this_error >>= 8; |
629 break; | 637 break; |
630 default: | 638 default: |
631 assert(0 && "cm->bit_depth should be VPX_BITS_8, " | 639 assert(0 && "cm->bit_depth should be VPX_BITS_8, " |
632 "VPX_BITS_10 or VPX_BITS_12"); | 640 "VPX_BITS_10 or VPX_BITS_12"); |
633 return; | 641 return; |
634 } | 642 } |
635 } | 643 } |
636 #endif // CONFIG_VP9_HIGHBITDEPTH | 644 #endif // CONFIG_VP9_HIGHBITDEPTH |
637 | 645 |
638 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | 646 vp9_clear_system_state(); |
639 vp9_clear_system_state(); | 647 log_intra = log(this_error + 1.0); |
640 this_error = (int)(this_error * error_weight); | 648 if (log_intra < 10.0) |
641 } | 649 intra_factor += 1.0 + ((10.0 - log_intra) * 0.05); |
| 650 else |
| 651 intra_factor += 1.0; |
| 652 |
| 653 #if CONFIG_VP9_HIGHBITDEPTH |
| 654 if (cm->use_highbitdepth) |
| 655 level_sample = CONVERT_TO_SHORTPTR(x->plane[0].src.buf)[0]; |
| 656 else |
| 657 level_sample = x->plane[0].src.buf[0]; |
| 658 #else |
| 659 level_sample = x->plane[0].src.buf[0]; |
| 660 #endif |
| 661 if ((level_sample < DARK_THRESH) && (log_intra < 9.0)) |
| 662 brightness_factor += 1.0 + (0.01 * (DARK_THRESH - level_sample)); |
| 663 else |
| 664 brightness_factor += 1.0; |
642 | 665 |
643 // Intrapenalty below deals with situations where the intra and inter | 666 // Intrapenalty below deals with situations where the intra and inter |
644 // error scores are very low (e.g. a plain black frame). | 667 // error scores are very low (e.g. a plain black frame). |
645 // We do not have special cases in first pass for 0,0 and nearest etc so | 668 // We do not have special cases in first pass for 0,0 and nearest etc so |
646 // all inter modes carry an overhead cost estimate for the mv. | 669 // all inter modes carry an overhead cost estimate for the mv. |
647 // When the error score is very low this causes us to pick all or lots of | 670 // When the error score is very low this causes us to pick all or lots of |
648 // INTRA modes and throw lots of key frames. | 671 // INTRA modes and throw lots of key frames. |
649 // This penalty adds a cost matching that of a 0,0 mv to the intra case. | 672 // This penalty adds a cost matching that of a 0,0 mv to the intra case. |
650 this_error += intrapenalty; | 673 this_error += intrapenalty; |
651 | 674 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 #else | 727 #else |
705 raw_motion_error = get_prediction_error( | 728 raw_motion_error = get_prediction_error( |
706 bsize, &x->plane[0].src, &unscaled_last_source_buf_2d); | 729 bsize, &x->plane[0].src, &unscaled_last_source_buf_2d); |
707 #endif // CONFIG_VP9_HIGHBITDEPTH | 730 #endif // CONFIG_VP9_HIGHBITDEPTH |
708 | 731 |
709 // TODO(pengchong): Replace the hard-coded threshold | 732 // TODO(pengchong): Replace the hard-coded threshold |
710 if (raw_motion_error > 25 || lc != NULL) { | 733 if (raw_motion_error > 25 || lc != NULL) { |
711 // Test last reference frame using the previous best mv as the | 734 // Test last reference frame using the previous best mv as the |
712 // starting point (best reference) for the search. | 735 // starting point (best reference) for the search. |
713 first_pass_motion_search(cpi, x, &best_ref_mv, &mv, &motion_error); | 736 first_pass_motion_search(cpi, x, &best_ref_mv, &mv, &motion_error); |
714 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | |
715 vp9_clear_system_state(); | |
716 motion_error = (int)(motion_error * error_weight); | |
717 } | |
718 | 737 |
719 // If the current best reference mv is not centered on 0,0 then do a | 738 // If the current best reference mv is not centered on 0,0 then do a |
720 // 0,0 based search as well. | 739 // 0,0 based search as well. |
721 if (!is_zero_mv(&best_ref_mv)) { | 740 if (!is_zero_mv(&best_ref_mv)) { |
722 tmp_err = INT_MAX; | 741 tmp_err = INT_MAX; |
723 first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv, &tmp_err); | 742 first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv, &tmp_err); |
724 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | |
725 vp9_clear_system_state(); | |
726 tmp_err = (int)(tmp_err * error_weight); | |
727 } | |
728 | 743 |
729 if (tmp_err < motion_error) { | 744 if (tmp_err < motion_error) { |
730 motion_error = tmp_err; | 745 motion_error = tmp_err; |
731 mv = tmp_mv; | 746 mv = tmp_mv; |
732 } | 747 } |
733 } | 748 } |
734 | 749 |
735 // Search in an older reference frame. | 750 // Search in an older reference frame. |
736 if (((lc == NULL && cm->current_video_frame > 1) || | 751 if (((lc == NULL && cm->current_video_frame > 1) || |
737 (lc != NULL && lc->current_video_frame_in_layer > 1)) | 752 (lc != NULL && lc->current_video_frame_in_layer > 1)) |
(...skipping 10 matching lines...) Expand all Loading... |
748 gf_motion_error = get_prediction_error( | 763 gf_motion_error = get_prediction_error( |
749 bsize, &x->plane[0].src, &xd->plane[0].pre[0]); | 764 bsize, &x->plane[0].src, &xd->plane[0].pre[0]); |
750 } | 765 } |
751 #else | 766 #else |
752 gf_motion_error = get_prediction_error( | 767 gf_motion_error = get_prediction_error( |
753 bsize, &x->plane[0].src, &xd->plane[0].pre[0]); | 768 bsize, &x->plane[0].src, &xd->plane[0].pre[0]); |
754 #endif // CONFIG_VP9_HIGHBITDEPTH | 769 #endif // CONFIG_VP9_HIGHBITDEPTH |
755 | 770 |
756 first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv, | 771 first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv, |
757 &gf_motion_error); | 772 &gf_motion_error); |
758 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | |
759 vp9_clear_system_state(); | |
760 gf_motion_error = (int)(gf_motion_error * error_weight); | |
761 } | |
762 | 773 |
763 if (gf_motion_error < motion_error && gf_motion_error < this_error) | 774 if (gf_motion_error < motion_error && gf_motion_error < this_error) |
764 ++second_ref_count; | 775 ++second_ref_count; |
765 | 776 |
766 // Reset to last frame as reference buffer. | 777 // Reset to last frame as reference buffer. |
767 xd->plane[0].pre[0].buf = first_ref_buf->y_buffer + recon_yoffset; | 778 xd->plane[0].pre[0].buf = first_ref_buf->y_buffer + recon_yoffset; |
768 xd->plane[1].pre[0].buf = first_ref_buf->u_buffer + recon_uvoffset; | 779 xd->plane[1].pre[0].buf = first_ref_buf->u_buffer + recon_uvoffset; |
769 xd->plane[2].pre[0].buf = first_ref_buf->v_buffer + recon_uvoffset; | 780 xd->plane[2].pre[0].buf = first_ref_buf->v_buffer + recon_uvoffset; |
770 | 781 |
771 // In accumulating a score for the older reference frame take the | 782 // In accumulating a score for the older reference frame take the |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 // Adjust to the next row of MBs. | 935 // Adjust to the next row of MBs. |
925 x->plane[0].src.buf += 16 * x->plane[0].src.stride - 16 * cm->mb_cols; | 936 x->plane[0].src.buf += 16 * x->plane[0].src.stride - 16 * cm->mb_cols; |
926 x->plane[1].src.buf += uv_mb_height * x->plane[1].src.stride - | 937 x->plane[1].src.buf += uv_mb_height * x->plane[1].src.stride - |
927 uv_mb_height * cm->mb_cols; | 938 uv_mb_height * cm->mb_cols; |
928 x->plane[2].src.buf += uv_mb_height * x->plane[1].src.stride - | 939 x->plane[2].src.buf += uv_mb_height * x->plane[1].src.stride - |
929 uv_mb_height * cm->mb_cols; | 940 uv_mb_height * cm->mb_cols; |
930 | 941 |
931 vp9_clear_system_state(); | 942 vp9_clear_system_state(); |
932 } | 943 } |
933 | 944 |
934 vp9_clear_system_state(); | |
935 { | 945 { |
936 FIRSTPASS_STATS fps; | 946 FIRSTPASS_STATS fps; |
937 // The minimum error here insures some bit alocation to frames even | 947 // The minimum error here insures some bit allocation to frames even |
938 // in static regions. The allocation per MB declines for larger formats | 948 // in static regions. The allocation per MB declines for larger formats |
939 // where the typical "real" energy per MB also falls. | 949 // where the typical "real" energy per MB also falls. |
940 // Initial estimate here uses sqrt(mbs) to define the min_err, where the | 950 // Initial estimate here uses sqrt(mbs) to define the min_err, where the |
941 // number of mbs is propotional to image area. | 951 // number of mbs is proportional to the image area. |
942 const double min_err = 200 * sqrt(cm->MBs); | 952 const int num_mbs = (cpi->oxcf.resize_mode != RESIZE_NONE) |
| 953 ? cpi->initial_mbs : cpi->common.MBs; |
| 954 const double min_err = 200 * sqrt(num_mbs); |
| 955 |
| 956 intra_factor = intra_factor / (double)num_mbs; |
| 957 brightness_factor = brightness_factor / (double)num_mbs; |
| 958 fps.weight = intra_factor * brightness_factor; |
943 | 959 |
944 fps.frame = cm->current_video_frame; | 960 fps.frame = cm->current_video_frame; |
945 fps.spatial_layer_id = cpi->svc.spatial_layer_id; | 961 fps.spatial_layer_id = cpi->svc.spatial_layer_id; |
946 fps.coded_error = (double)(coded_error >> 8) + min_err; | 962 fps.coded_error = (double)(coded_error >> 8) + min_err; |
947 fps.sr_coded_error = (double)(sr_coded_error >> 8) + min_err; | 963 fps.sr_coded_error = (double)(sr_coded_error >> 8) + min_err; |
948 fps.intra_error = (double)(intra_error >> 8) + min_err; | 964 fps.intra_error = (double)(intra_error >> 8) + min_err; |
949 fps.count = 1.0; | 965 fps.count = 1.0; |
950 fps.pcnt_inter = (double)intercount / cm->MBs; | 966 fps.pcnt_inter = (double)intercount / num_mbs; |
951 fps.pcnt_second_ref = (double)second_ref_count / cm->MBs; | 967 fps.pcnt_second_ref = (double)second_ref_count / num_mbs; |
952 fps.pcnt_neutral = (double)neutral_count / cm->MBs; | 968 fps.pcnt_neutral = (double)neutral_count / num_mbs; |
953 | 969 |
954 if (mvcount > 0) { | 970 if (mvcount > 0) { |
955 fps.MVr = (double)sum_mvr / mvcount; | 971 fps.MVr = (double)sum_mvr / mvcount; |
956 fps.mvr_abs = (double)sum_mvr_abs / mvcount; | 972 fps.mvr_abs = (double)sum_mvr_abs / mvcount; |
957 fps.MVc = (double)sum_mvc / mvcount; | 973 fps.MVc = (double)sum_mvc / mvcount; |
958 fps.mvc_abs = (double)sum_mvc_abs / mvcount; | 974 fps.mvc_abs = (double)sum_mvc_abs / mvcount; |
959 fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / mvcount)) / mvcount; | 975 fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / mvcount)) / mvcount; |
960 fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / mvcount)) / mvcount; | 976 fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / mvcount)) / mvcount; |
961 fps.mv_in_out_count = (double)sum_in_vectors / (mvcount * 2); | 977 fps.mv_in_out_count = (double)sum_in_vectors / (mvcount * 2); |
962 fps.new_mv_count = new_mv_count; | 978 fps.new_mv_count = new_mv_count; |
963 fps.pcnt_motion = (double)mvcount / cm->MBs; | 979 fps.pcnt_motion = (double)mvcount / num_mbs; |
964 } else { | 980 } else { |
965 fps.MVr = 0.0; | 981 fps.MVr = 0.0; |
966 fps.mvr_abs = 0.0; | 982 fps.mvr_abs = 0.0; |
967 fps.MVc = 0.0; | 983 fps.MVc = 0.0; |
968 fps.mvc_abs = 0.0; | 984 fps.mvc_abs = 0.0; |
969 fps.MVrv = 0.0; | 985 fps.MVrv = 0.0; |
970 fps.MVcv = 0.0; | 986 fps.MVcv = 0.0; |
971 fps.mv_in_out_count = 0.0; | 987 fps.mv_in_out_count = 0.0; |
972 fps.new_mv_count = 0.0; | 988 fps.new_mv_count = 0.0; |
973 fps.pcnt_motion = 0.0; | 989 fps.pcnt_motion = 0.0; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 | 1083 |
1068 static int get_twopass_worst_quality(const VP9_COMP *cpi, | 1084 static int get_twopass_worst_quality(const VP9_COMP *cpi, |
1069 const FIRSTPASS_STATS *stats, | 1085 const FIRSTPASS_STATS *stats, |
1070 int section_target_bandwidth) { | 1086 int section_target_bandwidth) { |
1071 const RATE_CONTROL *const rc = &cpi->rc; | 1087 const RATE_CONTROL *const rc = &cpi->rc; |
1072 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 1088 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
1073 | 1089 |
1074 if (section_target_bandwidth <= 0) { | 1090 if (section_target_bandwidth <= 0) { |
1075 return rc->worst_quality; // Highest value allowed | 1091 return rc->worst_quality; // Highest value allowed |
1076 } else { | 1092 } else { |
1077 const int num_mbs = cpi->common.MBs; | 1093 const int num_mbs = (cpi->oxcf.resize_mode != RESIZE_NONE) |
| 1094 ? cpi->initial_mbs : cpi->common.MBs; |
1078 const double section_err = stats->coded_error / stats->count; | 1095 const double section_err = stats->coded_error / stats->count; |
1079 const double err_per_mb = section_err / num_mbs; | 1096 const double err_per_mb = section_err / num_mbs; |
1080 const double speed_term = 1.0 + 0.04 * oxcf->speed; | 1097 const double speed_term = 1.0 + 0.04 * oxcf->speed; |
1081 const double ediv_size_correction = num_mbs / EDIV_SIZE_FACTOR; | 1098 const double ediv_size_correction = num_mbs / EDIV_SIZE_FACTOR; |
1082 const int target_norm_bits_per_mb = ((uint64_t)section_target_bandwidth << | 1099 const int target_norm_bits_per_mb = ((uint64_t)section_target_bandwidth << |
1083 BPER_MB_NORMBITS) / num_mbs; | 1100 BPER_MB_NORMBITS) / num_mbs; |
1084 | 1101 |
1085 int q; | 1102 int q; |
1086 int is_svc_upper_layer = 0; | 1103 int is_svc_upper_layer = 0; |
1087 if (is_two_pass_svc(cpi) && cpi->svc.spatial_layer_id > 0) | 1104 if (is_two_pass_svc(cpi) && cpi->svc.spatial_layer_id > 0) |
1088 is_svc_upper_layer = 1; | 1105 is_svc_upper_layer = 1; |
1089 | 1106 |
1090 // Try and pick a max Q that will be high enough to encode the | 1107 // Try and pick a max Q that will be high enough to encode the |
1091 // content at the given rate. | 1108 // content at the given rate. |
1092 for (q = rc->best_quality; q < rc->worst_quality; ++q) { | 1109 for (q = rc->best_quality; q < rc->worst_quality; ++q) { |
1093 const double factor = | 1110 const double factor = |
1094 calc_correction_factor(err_per_mb, ERR_DIVISOR - ediv_size_correction, | 1111 calc_correction_factor(err_per_mb, |
| 1112 ERR_DIVISOR - ediv_size_correction, |
1095 is_svc_upper_layer ? SVC_FACTOR_PT_LOW : | 1113 is_svc_upper_layer ? SVC_FACTOR_PT_LOW : |
1096 FACTOR_PT_LOW, FACTOR_PT_HIGH, q, | 1114 FACTOR_PT_LOW, FACTOR_PT_HIGH, q, |
1097 cpi->common.bit_depth); | 1115 cpi->common.bit_depth); |
1098 const int bits_per_mb = vp9_rc_bits_per_mb(INTER_FRAME, q, | 1116 const int bits_per_mb = vp9_rc_bits_per_mb(INTER_FRAME, q, |
1099 factor * speed_term, | 1117 factor * speed_term, |
1100 cpi->common.bit_depth); | 1118 cpi->common.bit_depth); |
1101 if (bits_per_mb <= target_norm_bits_per_mb) | 1119 if (bits_per_mb <= target_norm_bits_per_mb) |
1102 break; | 1120 break; |
1103 } | 1121 } |
1104 | 1122 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1181 twopass->last_kfgroup_zeromotion_pct = 100; | 1199 twopass->last_kfgroup_zeromotion_pct = 100; |
1182 } | 1200 } |
1183 | 1201 |
1184 #define SR_DIFF_PART 0.0015 | 1202 #define SR_DIFF_PART 0.0015 |
1185 #define MOTION_AMP_PART 0.003 | 1203 #define MOTION_AMP_PART 0.003 |
1186 #define INTRA_PART 0.005 | 1204 #define INTRA_PART 0.005 |
1187 #define DEFAULT_DECAY_LIMIT 0.75 | 1205 #define DEFAULT_DECAY_LIMIT 0.75 |
1188 #define LOW_SR_DIFF_TRHESH 0.1 | 1206 #define LOW_SR_DIFF_TRHESH 0.1 |
1189 #define SR_DIFF_MAX 128.0 | 1207 #define SR_DIFF_MAX 128.0 |
1190 | 1208 |
1191 static double get_sr_decay_rate(const VP9_COMMON *cm, | 1209 static double get_sr_decay_rate(const VP9_COMP *cpi, |
1192 const FIRSTPASS_STATS *frame) { | 1210 const FIRSTPASS_STATS *frame) { |
1193 double sr_diff = (frame->sr_coded_error - frame->coded_error) / cm->MBs; | 1211 const int num_mbs = (cpi->oxcf.resize_mode != RESIZE_NONE) |
| 1212 ? cpi->initial_mbs : cpi->common.MBs; |
| 1213 double sr_diff = |
| 1214 (frame->sr_coded_error - frame->coded_error) / num_mbs; |
1194 double sr_decay = 1.0; | 1215 double sr_decay = 1.0; |
1195 const double motion_amplitude_factor = | 1216 const double motion_amplitude_factor = |
1196 frame->pcnt_motion * ((frame->mvc_abs + frame->mvr_abs) / 2); | 1217 frame->pcnt_motion * ((frame->mvc_abs + frame->mvr_abs) / 2); |
1197 const double pcnt_intra = 100 * (1.0 - frame->pcnt_inter); | 1218 const double pcnt_intra = 100 * (1.0 - frame->pcnt_inter); |
1198 | 1219 |
1199 if ((sr_diff > LOW_SR_DIFF_TRHESH)) { | 1220 if ((sr_diff > LOW_SR_DIFF_TRHESH)) { |
1200 sr_diff = MIN(sr_diff, SR_DIFF_MAX); | 1221 sr_diff = MIN(sr_diff, SR_DIFF_MAX); |
1201 sr_decay = 1.0 - (SR_DIFF_PART * sr_diff) - | 1222 sr_decay = 1.0 - (SR_DIFF_PART * sr_diff) - |
1202 (MOTION_AMP_PART * motion_amplitude_factor) - | 1223 (MOTION_AMP_PART * motion_amplitude_factor) - |
1203 (INTRA_PART * pcnt_intra); | 1224 (INTRA_PART * pcnt_intra); |
1204 } | 1225 } |
1205 return MAX(sr_decay, MIN(DEFAULT_DECAY_LIMIT, frame->pcnt_inter)); | 1226 return MAX(sr_decay, MIN(DEFAULT_DECAY_LIMIT, frame->pcnt_inter)); |
1206 } | 1227 } |
1207 | 1228 |
1208 // This function gives an estimate of how badly we believe the prediction | 1229 // This function gives an estimate of how badly we believe the prediction |
1209 // quality is decaying from frame to frame. | 1230 // quality is decaying from frame to frame. |
1210 static double get_zero_motion_factor(const VP9_COMMON *cm, | 1231 static double get_zero_motion_factor(const VP9_COMP *cpi, |
1211 const FIRSTPASS_STATS *frame) { | 1232 const FIRSTPASS_STATS *frame) { |
1212 const double zero_motion_pct = frame->pcnt_inter - | 1233 const double zero_motion_pct = frame->pcnt_inter - |
1213 frame->pcnt_motion; | 1234 frame->pcnt_motion; |
1214 double sr_decay = get_sr_decay_rate(cm, frame); | 1235 double sr_decay = get_sr_decay_rate(cpi, frame); |
1215 return MIN(sr_decay, zero_motion_pct); | 1236 return MIN(sr_decay, zero_motion_pct); |
1216 } | 1237 } |
1217 | 1238 |
1218 #define ZM_POWER_FACTOR 0.75 | 1239 #define ZM_POWER_FACTOR 0.75 |
1219 | 1240 |
1220 static double get_prediction_decay_rate(const VP9_COMMON *cm, | 1241 static double get_prediction_decay_rate(const VP9_COMP *cpi, |
1221 const FIRSTPASS_STATS *next_frame) { | 1242 const FIRSTPASS_STATS *next_frame) { |
1222 const double sr_decay_rate = get_sr_decay_rate(cm, next_frame); | 1243 const double sr_decay_rate = get_sr_decay_rate(cpi, next_frame); |
1223 const double zero_motion_factor = | 1244 const double zero_motion_factor = |
1224 (0.95 * pow((next_frame->pcnt_inter - next_frame->pcnt_motion), | 1245 (0.95 * pow((next_frame->pcnt_inter - next_frame->pcnt_motion), |
1225 ZM_POWER_FACTOR)); | 1246 ZM_POWER_FACTOR)); |
1226 | 1247 |
1227 return MAX(zero_motion_factor, | 1248 return MAX(zero_motion_factor, |
1228 (sr_decay_rate + ((1.0 - sr_decay_rate) * zero_motion_factor))); | 1249 (sr_decay_rate + ((1.0 - sr_decay_rate) * zero_motion_factor))); |
1229 } | 1250 } |
1230 | 1251 |
1231 // Function to test for a condition where a complex transition is followed | 1252 // Function to test for a condition where a complex transition is followed |
1232 // by a static section. For example in slide shows where there is a fade | 1253 // by a static section. For example in slide shows where there is a fade |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1306 | 1327 |
1307 #define BASELINE_ERR_PER_MB 1000.0 | 1328 #define BASELINE_ERR_PER_MB 1000.0 |
1308 static double calc_frame_boost(VP9_COMP *cpi, | 1329 static double calc_frame_boost(VP9_COMP *cpi, |
1309 const FIRSTPASS_STATS *this_frame, | 1330 const FIRSTPASS_STATS *this_frame, |
1310 double this_frame_mv_in_out, | 1331 double this_frame_mv_in_out, |
1311 double max_boost) { | 1332 double max_boost) { |
1312 double frame_boost; | 1333 double frame_boost; |
1313 const double lq = | 1334 const double lq = |
1314 vp9_convert_qindex_to_q(cpi->rc.avg_frame_qindex[INTER_FRAME], | 1335 vp9_convert_qindex_to_q(cpi->rc.avg_frame_qindex[INTER_FRAME], |
1315 cpi->common.bit_depth); | 1336 cpi->common.bit_depth); |
1316 const double boost_correction = MIN((0.5 + (lq * 0.015)), 1.5); | 1337 const double boost_q_correction = MIN((0.5 + (lq * 0.015)), 1.5); |
| 1338 const int num_mbs = (cpi->oxcf.resize_mode != RESIZE_NONE) |
| 1339 ? cpi->initial_mbs : cpi->common.MBs; |
1317 | 1340 |
1318 // Underlying boost factor is based on inter error ratio. | 1341 // Underlying boost factor is based on inter error ratio. |
1319 frame_boost = (BASELINE_ERR_PER_MB * cpi->common.MBs) / | 1342 frame_boost = (BASELINE_ERR_PER_MB * num_mbs) / |
1320 DOUBLE_DIVIDE_CHECK(this_frame->coded_error); | 1343 DOUBLE_DIVIDE_CHECK(this_frame->coded_error); |
1321 frame_boost = frame_boost * BOOST_FACTOR * boost_correction; | 1344 frame_boost = frame_boost * BOOST_FACTOR * boost_q_correction; |
1322 | 1345 |
1323 // Increase boost for frames where new data coming into frame (e.g. zoom out). | 1346 // Increase boost for frames where new data coming into frame (e.g. zoom out). |
1324 // Slightly reduce boost if there is a net balance of motion out of the frame | 1347 // Slightly reduce boost if there is a net balance of motion out of the frame |
1325 // (zoom in). The range for this_frame_mv_in_out is -1.0 to +1.0. | 1348 // (zoom in). The range for this_frame_mv_in_out is -1.0 to +1.0. |
1326 if (this_frame_mv_in_out > 0.0) | 1349 if (this_frame_mv_in_out > 0.0) |
1327 frame_boost += frame_boost * (this_frame_mv_in_out * 2.0); | 1350 frame_boost += frame_boost * (this_frame_mv_in_out * 2.0); |
1328 // In the extreme case the boost is halved. | 1351 // In the extreme case the boost is halved. |
1329 else | 1352 else |
1330 frame_boost += frame_boost * (this_frame_mv_in_out / 2.0); | 1353 frame_boost += frame_boost * (this_frame_mv_in_out / 2.0); |
1331 | 1354 |
1332 return MIN(frame_boost, max_boost * boost_correction); | 1355 return MIN(frame_boost, max_boost * boost_q_correction); |
1333 } | 1356 } |
1334 | 1357 |
1335 static int calc_arf_boost(VP9_COMP *cpi, int offset, | 1358 static int calc_arf_boost(VP9_COMP *cpi, int offset, |
1336 int f_frames, int b_frames, | 1359 int f_frames, int b_frames, |
1337 int *f_boost, int *b_boost) { | 1360 int *f_boost, int *b_boost) { |
1338 TWO_PASS *const twopass = &cpi->twopass; | 1361 TWO_PASS *const twopass = &cpi->twopass; |
1339 int i; | 1362 int i; |
1340 double boost_score = 0.0; | 1363 double boost_score = 0.0; |
1341 double mv_ratio_accumulator = 0.0; | 1364 double mv_ratio_accumulator = 0.0; |
1342 double decay_accumulator = 1.0; | 1365 double decay_accumulator = 1.0; |
(...skipping 15 matching lines...) Expand all Loading... |
1358 &abs_mv_in_out_accumulator, | 1381 &abs_mv_in_out_accumulator, |
1359 &mv_ratio_accumulator); | 1382 &mv_ratio_accumulator); |
1360 | 1383 |
1361 // We want to discount the flash frame itself and the recovery | 1384 // We want to discount the flash frame itself and the recovery |
1362 // frame that follows as both will have poor scores. | 1385 // frame that follows as both will have poor scores. |
1363 flash_detected = detect_flash(twopass, i + offset) || | 1386 flash_detected = detect_flash(twopass, i + offset) || |
1364 detect_flash(twopass, i + offset + 1); | 1387 detect_flash(twopass, i + offset + 1); |
1365 | 1388 |
1366 // Accumulate the effect of prediction quality decay. | 1389 // Accumulate the effect of prediction quality decay. |
1367 if (!flash_detected) { | 1390 if (!flash_detected) { |
1368 decay_accumulator *= get_prediction_decay_rate(&cpi->common, this_frame); | 1391 decay_accumulator *= get_prediction_decay_rate(cpi, this_frame); |
1369 decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR | 1392 decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR |
1370 ? MIN_DECAY_FACTOR : decay_accumulator; | 1393 ? MIN_DECAY_FACTOR : decay_accumulator; |
1371 } | 1394 } |
1372 | 1395 |
1373 boost_score += decay_accumulator * calc_frame_boost(cpi, this_frame, | 1396 boost_score += decay_accumulator * calc_frame_boost(cpi, this_frame, |
1374 this_frame_mv_in_out, | 1397 this_frame_mv_in_out, |
1375 GF_MAX_BOOST); | 1398 GF_MAX_BOOST); |
1376 } | 1399 } |
1377 | 1400 |
1378 *f_boost = (int)boost_score; | 1401 *f_boost = (int)boost_score; |
(...skipping 18 matching lines...) Expand all Loading... |
1397 &abs_mv_in_out_accumulator, | 1420 &abs_mv_in_out_accumulator, |
1398 &mv_ratio_accumulator); | 1421 &mv_ratio_accumulator); |
1399 | 1422 |
1400 // We want to discount the the flash frame itself and the recovery | 1423 // We want to discount the the flash frame itself and the recovery |
1401 // frame that follows as both will have poor scores. | 1424 // frame that follows as both will have poor scores. |
1402 flash_detected = detect_flash(twopass, i + offset) || | 1425 flash_detected = detect_flash(twopass, i + offset) || |
1403 detect_flash(twopass, i + offset + 1); | 1426 detect_flash(twopass, i + offset + 1); |
1404 | 1427 |
1405 // Cumulative effect of prediction quality decay. | 1428 // Cumulative effect of prediction quality decay. |
1406 if (!flash_detected) { | 1429 if (!flash_detected) { |
1407 decay_accumulator *= get_prediction_decay_rate(&cpi->common, this_frame); | 1430 decay_accumulator *= get_prediction_decay_rate(cpi, this_frame); |
1408 decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR | 1431 decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR |
1409 ? MIN_DECAY_FACTOR : decay_accumulator; | 1432 ? MIN_DECAY_FACTOR : decay_accumulator; |
1410 } | 1433 } |
1411 | 1434 |
1412 boost_score += decay_accumulator * calc_frame_boost(cpi, this_frame, | 1435 boost_score += decay_accumulator * calc_frame_boost(cpi, this_frame, |
1413 this_frame_mv_in_out, | 1436 this_frame_mv_in_out, |
1414 GF_MAX_BOOST); | 1437 GF_MAX_BOOST); |
1415 } | 1438 } |
1416 *b_boost = (int)boost_score; | 1439 *b_boost = (int)boost_score; |
1417 | 1440 |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1716 // Note the error of the frame at the start of the group. This will be | 1739 // Note the error of the frame at the start of the group. This will be |
1717 // the GF frame error if we code a normal gf. | 1740 // the GF frame error if we code a normal gf. |
1718 gf_first_frame_err = mod_frame_err; | 1741 gf_first_frame_err = mod_frame_err; |
1719 | 1742 |
1720 // If this is a key frame or the overlay from a previous arf then | 1743 // If this is a key frame or the overlay from a previous arf then |
1721 // the error score / cost of this frame has already been accounted for. | 1744 // the error score / cost of this frame has already been accounted for. |
1722 if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) | 1745 if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) |
1723 gf_group_err -= gf_first_frame_err; | 1746 gf_group_err -= gf_first_frame_err; |
1724 | 1747 |
1725 // Motion breakout threshold for loop below depends on image size. | 1748 // Motion breakout threshold for loop below depends on image size. |
1726 mv_ratio_accumulator_thresh = (cpi->common.width + cpi->common.height) / 4.0; | 1749 mv_ratio_accumulator_thresh = |
| 1750 (cpi->initial_height + cpi->initial_width) / 4.0; |
1727 | 1751 |
1728 // Set a maximum and minimum interval for the GF group. | 1752 // Set a maximum and minimum interval for the GF group. |
1729 // If the image appears almost completely static we can extend beyond this. | 1753 // If the image appears almost completely static we can extend beyond this. |
1730 { | 1754 { |
1731 int int_max_q = | 1755 int int_max_q = |
1732 (int)(vp9_convert_qindex_to_q(twopass->active_worst_quality, | 1756 (int)(vp9_convert_qindex_to_q(twopass->active_worst_quality, |
1733 cpi->common.bit_depth)); | 1757 cpi->common.bit_depth)); |
1734 int int_lbq = | 1758 int int_lbq = |
1735 (int)(vp9_convert_qindex_to_q(rc->last_boosted_qindex, | 1759 (int)(vp9_convert_qindex_to_q(rc->last_boosted_qindex, |
1736 cpi->common.bit_depth)); | 1760 cpi->common.bit_depth)); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1768 | 1792 |
1769 // Update the motion related elements to the boost calculation. | 1793 // Update the motion related elements to the boost calculation. |
1770 accumulate_frame_motion_stats(&next_frame, | 1794 accumulate_frame_motion_stats(&next_frame, |
1771 &this_frame_mv_in_out, &mv_in_out_accumulator, | 1795 &this_frame_mv_in_out, &mv_in_out_accumulator, |
1772 &abs_mv_in_out_accumulator, | 1796 &abs_mv_in_out_accumulator, |
1773 &mv_ratio_accumulator); | 1797 &mv_ratio_accumulator); |
1774 | 1798 |
1775 // Accumulate the effect of prediction quality decay. | 1799 // Accumulate the effect of prediction quality decay. |
1776 if (!flash_detected) { | 1800 if (!flash_detected) { |
1777 last_loop_decay_rate = loop_decay_rate; | 1801 last_loop_decay_rate = loop_decay_rate; |
1778 loop_decay_rate = get_prediction_decay_rate(&cpi->common, &next_frame); | 1802 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame); |
1779 | 1803 |
1780 decay_accumulator = decay_accumulator * loop_decay_rate; | 1804 decay_accumulator = decay_accumulator * loop_decay_rate; |
1781 | 1805 |
1782 // Monitor for static sections. | 1806 // Monitor for static sections. |
1783 zero_motion_accumulator = | 1807 zero_motion_accumulator = |
1784 MIN(zero_motion_accumulator, | 1808 MIN(zero_motion_accumulator, get_zero_motion_factor(cpi, &next_frame)); |
1785 get_zero_motion_factor(&cpi->common, &next_frame)); | |
1786 | 1809 |
1787 // Break clause to detect very still sections after motion. For example, | 1810 // Break clause to detect very still sections after motion. For example, |
1788 // a static image after a fade or other transition. | 1811 // a static image after a fade or other transition. |
1789 if (detect_transition_to_still(twopass, i, 5, loop_decay_rate, | 1812 if (detect_transition_to_still(twopass, i, 5, loop_decay_rate, |
1790 last_loop_decay_rate)) { | 1813 last_loop_decay_rate)) { |
1791 allow_alt_ref = 0; | 1814 allow_alt_ref = 0; |
1792 break; | 1815 break; |
1793 } | 1816 } |
1794 } | 1817 } |
1795 | 1818 |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2041 // Provided that we are not at the end of the file... | 2064 // Provided that we are not at the end of the file... |
2042 if (cpi->oxcf.auto_key && twopass->stats_in < twopass->stats_in_end) { | 2065 if (cpi->oxcf.auto_key && twopass->stats_in < twopass->stats_in_end) { |
2043 double loop_decay_rate; | 2066 double loop_decay_rate; |
2044 | 2067 |
2045 // Check for a scene cut. | 2068 // Check for a scene cut. |
2046 if (test_candidate_kf(twopass, &last_frame, this_frame, | 2069 if (test_candidate_kf(twopass, &last_frame, this_frame, |
2047 twopass->stats_in)) | 2070 twopass->stats_in)) |
2048 break; | 2071 break; |
2049 | 2072 |
2050 // How fast is the prediction quality decaying? | 2073 // How fast is the prediction quality decaying? |
2051 loop_decay_rate = get_prediction_decay_rate(&cpi->common, | 2074 loop_decay_rate = get_prediction_decay_rate(cpi, twopass->stats_in); |
2052 twopass->stats_in); | |
2053 | 2075 |
2054 // We want to know something about the recent past... rather than | 2076 // We want to know something about the recent past... rather than |
2055 // as used elsewhere where we are concerned with decay in prediction | 2077 // as used elsewhere where we are concerned with decay in prediction |
2056 // quality since the last GF or KF. | 2078 // quality since the last GF or KF. |
2057 recent_loop_decay[i % 8] = loop_decay_rate; | 2079 recent_loop_decay[i % 8] = loop_decay_rate; |
2058 decay_accumulator = 1.0; | 2080 decay_accumulator = 1.0; |
2059 for (j = 0; j < 8; ++j) | 2081 for (j = 0; j < 8; ++j) |
2060 decay_accumulator *= recent_loop_decay[j]; | 2082 decay_accumulator *= recent_loop_decay[j]; |
2061 | 2083 |
2062 // Special check for transition or high motion followed by a | 2084 // Special check for transition or high motion followed by a |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2153 // how many bits to spend on it. | 2175 // how many bits to spend on it. |
2154 decay_accumulator = 1.0; | 2176 decay_accumulator = 1.0; |
2155 boost_score = 0.0; | 2177 boost_score = 0.0; |
2156 for (i = 0; i < (rc->frames_to_key - 1); ++i) { | 2178 for (i = 0; i < (rc->frames_to_key - 1); ++i) { |
2157 if (EOF == input_stats(twopass, &next_frame)) | 2179 if (EOF == input_stats(twopass, &next_frame)) |
2158 break; | 2180 break; |
2159 | 2181 |
2160 // Monitor for static sections. | 2182 // Monitor for static sections. |
2161 zero_motion_accumulator = | 2183 zero_motion_accumulator = |
2162 MIN(zero_motion_accumulator, | 2184 MIN(zero_motion_accumulator, |
2163 get_zero_motion_factor(&cpi->common, &next_frame)); | 2185 get_zero_motion_factor(cpi, &next_frame)); |
2164 | 2186 |
2165 // Not all frames in the group are necessarily used in calculating boost. | 2187 // Not all frames in the group are necessarily used in calculating boost. |
2166 if ((i <= rc->max_gf_interval) || | 2188 if ((i <= rc->max_gf_interval) || |
2167 ((i <= (rc->max_gf_interval * 4)) && (decay_accumulator > 0.5))) { | 2189 ((i <= (rc->max_gf_interval * 4)) && (decay_accumulator > 0.5))) { |
2168 const double frame_boost = | 2190 const double frame_boost = |
2169 calc_frame_boost(cpi, this_frame, 0, KF_MAX_BOOST); | 2191 calc_frame_boost(cpi, this_frame, 0, KF_MAX_BOOST); |
2170 | 2192 |
2171 // How fast is prediction quality decaying. | 2193 // How fast is prediction quality decaying. |
2172 if (!detect_flash(twopass, 0)) { | 2194 if (!detect_flash(twopass, 0)) { |
2173 const double loop_decay_rate = | 2195 const double loop_decay_rate = |
2174 get_prediction_decay_rate(&cpi->common, &next_frame); | 2196 get_prediction_decay_rate(cpi, &next_frame); |
2175 decay_accumulator *= loop_decay_rate; | 2197 decay_accumulator *= loop_decay_rate; |
2176 decay_accumulator = MAX(decay_accumulator, MIN_DECAY_FACTOR); | 2198 decay_accumulator = MAX(decay_accumulator, MIN_DECAY_FACTOR); |
2177 av_decay_accumulator += decay_accumulator; | 2199 av_decay_accumulator += decay_accumulator; |
2178 ++loop_decay_counter; | 2200 ++loop_decay_counter; |
2179 } | 2201 } |
2180 boost_score += (decay_accumulator * frame_boost); | 2202 boost_score += (decay_accumulator * frame_boost); |
2181 } | 2203 } |
2182 } | 2204 } |
2183 av_decay_accumulator /= (double)loop_decay_counter; | 2205 av_decay_accumulator /= (double)loop_decay_counter; |
2184 | 2206 |
(...skipping 25 matching lines...) Expand all Loading... |
2210 | 2232 |
2211 // Note the total error score of the kf group minus the key frame itself. | 2233 // Note the total error score of the kf group minus the key frame itself. |
2212 twopass->kf_group_error_left = (int)(kf_group_err - kf_mod_err); | 2234 twopass->kf_group_error_left = (int)(kf_group_err - kf_mod_err); |
2213 | 2235 |
2214 // Adjust the count of total modified error left. | 2236 // Adjust the count of total modified error left. |
2215 // The count of bits left is adjusted elsewhere based on real coded frame | 2237 // The count of bits left is adjusted elsewhere based on real coded frame |
2216 // sizes. | 2238 // sizes. |
2217 twopass->modified_error_left -= kf_group_err; | 2239 twopass->modified_error_left -= kf_group_err; |
2218 } | 2240 } |
2219 | 2241 |
2220 #define VBR_PCT_ADJUSTMENT_LIMIT 50 | |
2221 // For VBR...adjustment to the frame target based on error from previous frames | |
2222 void vbr_rate_correction(VP9_COMP *cpi, | |
2223 int * this_frame_target, | |
2224 const int64_t vbr_bits_off_target) { | |
2225 int max_delta; | |
2226 double position_factor = 1.0; | |
2227 | |
2228 // How far through the clip are we. | |
2229 // This number is used to damp the per frame rate correction. | |
2230 // Range 0 - 1.0 | |
2231 if (cpi->twopass.total_stats.count) { | |
2232 position_factor = sqrt((double)cpi->common.current_video_frame / | |
2233 cpi->twopass.total_stats.count); | |
2234 } | |
2235 max_delta = (int)(position_factor * | |
2236 ((*this_frame_target * VBR_PCT_ADJUSTMENT_LIMIT) / 100)); | |
2237 | |
2238 // vbr_bits_off_target > 0 means we have extra bits to spend | |
2239 if (vbr_bits_off_target > 0) { | |
2240 *this_frame_target += | |
2241 (vbr_bits_off_target > max_delta) ? max_delta | |
2242 : (int)vbr_bits_off_target; | |
2243 } else { | |
2244 *this_frame_target -= | |
2245 (vbr_bits_off_target < -max_delta) ? max_delta | |
2246 : (int)-vbr_bits_off_target; | |
2247 } | |
2248 } | |
2249 | |
2250 // Define the reference buffers that will be updated post encode. | 2242 // Define the reference buffers that will be updated post encode. |
2251 void configure_buffer_updates(VP9_COMP *cpi) { | 2243 void configure_buffer_updates(VP9_COMP *cpi) { |
2252 TWO_PASS *const twopass = &cpi->twopass; | 2244 TWO_PASS *const twopass = &cpi->twopass; |
2253 | 2245 |
2254 cpi->rc.is_src_frame_alt_ref = 0; | 2246 cpi->rc.is_src_frame_alt_ref = 0; |
2255 switch (twopass->gf_group.update_type[twopass->gf_group.index]) { | 2247 switch (twopass->gf_group.update_type[twopass->gf_group.index]) { |
2256 case KF_UPDATE: | 2248 case KF_UPDATE: |
2257 cpi->refresh_last_frame = 1; | 2249 cpi->refresh_last_frame = 1; |
2258 cpi->refresh_golden_frame = 1; | 2250 cpi->refresh_golden_frame = 1; |
2259 cpi->refresh_alt_ref_frame = 1; | 2251 cpi->refresh_alt_ref_frame = 1; |
(...skipping 28 matching lines...) Expand all Loading... |
2288 cpi->refresh_last_frame = 0; | 2280 cpi->refresh_last_frame = 0; |
2289 cpi->refresh_golden_frame = 0; | 2281 cpi->refresh_golden_frame = 0; |
2290 } | 2282 } |
2291 if (cpi->svc.layer_context[cpi->svc.spatial_layer_id].gold_ref_idx < 0) | 2283 if (cpi->svc.layer_context[cpi->svc.spatial_layer_id].gold_ref_idx < 0) |
2292 cpi->refresh_golden_frame = 0; | 2284 cpi->refresh_golden_frame = 0; |
2293 if (cpi->alt_ref_source == NULL) | 2285 if (cpi->alt_ref_source == NULL) |
2294 cpi->refresh_alt_ref_frame = 0; | 2286 cpi->refresh_alt_ref_frame = 0; |
2295 } | 2287 } |
2296 } | 2288 } |
2297 | 2289 |
| 2290 int is_skippable_frame(const VP9_COMP *cpi) { |
| 2291 // If the current frame does not have non-zero motion vector detected in the |
| 2292 // first pass, and so do its previous and forward frames, then this frame |
| 2293 // can be skipped for partition check, and the partition size is assigned |
| 2294 // according to the variance |
| 2295 const SVC *const svc = &cpi->svc; |
| 2296 const TWO_PASS *const twopass = is_two_pass_svc(cpi) ? |
| 2297 &svc->layer_context[svc->spatial_layer_id].twopass : &cpi->twopass; |
| 2298 |
| 2299 return (!frame_is_intra_only(&cpi->common) && |
| 2300 twopass->stats_in - 2 > twopass->stats_in_start && |
| 2301 twopass->stats_in < twopass->stats_in_end && |
| 2302 (twopass->stats_in - 1)->pcnt_inter - (twopass->stats_in - 1)->pcnt_motion |
| 2303 == 1 && |
| 2304 (twopass->stats_in - 2)->pcnt_inter - (twopass->stats_in - 2)->pcnt_motion |
| 2305 == 1 && |
| 2306 twopass->stats_in->pcnt_inter - twopass->stats_in->pcnt_motion == 1); |
| 2307 } |
2298 | 2308 |
2299 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { | 2309 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { |
2300 VP9_COMMON *const cm = &cpi->common; | 2310 VP9_COMMON *const cm = &cpi->common; |
2301 RATE_CONTROL *const rc = &cpi->rc; | 2311 RATE_CONTROL *const rc = &cpi->rc; |
2302 TWO_PASS *const twopass = &cpi->twopass; | 2312 TWO_PASS *const twopass = &cpi->twopass; |
2303 GF_GROUP *const gf_group = &twopass->gf_group; | 2313 GF_GROUP *const gf_group = &twopass->gf_group; |
2304 int frames_left; | 2314 int frames_left; |
2305 FIRSTPASS_STATS this_frame; | 2315 FIRSTPASS_STATS this_frame; |
2306 FIRSTPASS_STATS this_frame_copy; | 2316 FIRSTPASS_STATS this_frame_copy; |
2307 | 2317 |
(...skipping 14 matching lines...) Expand all Loading... |
2322 | 2332 |
2323 // If this is an arf frame then we dont want to read the stats file or | 2333 // If this is an arf frame then we dont want to read the stats file or |
2324 // advance the input pointer as we already have what we need. | 2334 // advance the input pointer as we already have what we need. |
2325 if (gf_group->update_type[gf_group->index] == ARF_UPDATE) { | 2335 if (gf_group->update_type[gf_group->index] == ARF_UPDATE) { |
2326 int target_rate; | 2336 int target_rate; |
2327 configure_buffer_updates(cpi); | 2337 configure_buffer_updates(cpi); |
2328 target_rate = gf_group->bit_allocation[gf_group->index]; | 2338 target_rate = gf_group->bit_allocation[gf_group->index]; |
2329 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); | 2339 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); |
2330 rc->base_frame_target = target_rate; | 2340 rc->base_frame_target = target_rate; |
2331 | 2341 |
2332 // Correction to rate target based on prior over or under shoot. | |
2333 if (cpi->oxcf.rc_mode == VPX_VBR) | |
2334 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target); | |
2335 | |
2336 vp9_rc_set_frame_target(cpi, target_rate); | |
2337 cm->frame_type = INTER_FRAME; | 2342 cm->frame_type = INTER_FRAME; |
2338 | 2343 |
2339 if (lc != NULL) { | 2344 if (lc != NULL) { |
2340 if (cpi->svc.spatial_layer_id == 0) { | 2345 if (cpi->svc.spatial_layer_id == 0) { |
2341 lc->is_key_frame = 0; | 2346 lc->is_key_frame = 0; |
2342 } else { | 2347 } else { |
2343 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; | 2348 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; |
2344 | 2349 |
2345 if (lc->is_key_frame) | 2350 if (lc->is_key_frame) |
2346 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); | 2351 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); |
2347 } | 2352 } |
2348 } | 2353 } |
2349 | 2354 |
| 2355 // Do the firstpass stats indicate that this frame is skippable for the |
| 2356 // partition search? |
| 2357 if (cpi->sf.allow_partition_search_skip && |
| 2358 cpi->oxcf.pass == 2 && (!cpi->use_svc || is_two_pass_svc(cpi))) { |
| 2359 cpi->partition_search_skippable_frame = is_skippable_frame(cpi); |
| 2360 } |
| 2361 |
2350 return; | 2362 return; |
2351 } | 2363 } |
2352 | 2364 |
2353 vp9_clear_system_state(); | 2365 vp9_clear_system_state(); |
2354 | 2366 |
2355 if (cpi->oxcf.rc_mode == VPX_Q) { | 2367 if (cpi->oxcf.rc_mode == VPX_Q) { |
2356 twopass->active_worst_quality = cpi->oxcf.cq_level; | 2368 twopass->active_worst_quality = cpi->oxcf.cq_level; |
2357 } else if (cm->current_video_frame == 0 || | 2369 } else if (cm->current_video_frame == 0 || |
2358 (lc != NULL && lc->current_video_frame_in_layer == 0)) { | 2370 (lc != NULL && lc->current_video_frame_in_layer == 0)) { |
2359 // Special case code for first frame. | 2371 // Special case code for first frame. |
(...skipping 10 matching lines...) Expand all Loading... |
2370 rc->avg_frame_qindex[KEY_FRAME] = rc->last_q[KEY_FRAME]; | 2382 rc->avg_frame_qindex[KEY_FRAME] = rc->last_q[KEY_FRAME]; |
2371 } | 2383 } |
2372 vp9_zero(this_frame); | 2384 vp9_zero(this_frame); |
2373 if (EOF == input_stats(twopass, &this_frame)) | 2385 if (EOF == input_stats(twopass, &this_frame)) |
2374 return; | 2386 return; |
2375 | 2387 |
2376 // Local copy of the current frame's first pass stats. | 2388 // Local copy of the current frame's first pass stats. |
2377 this_frame_copy = this_frame; | 2389 this_frame_copy = this_frame; |
2378 | 2390 |
2379 // Keyframe and section processing. | 2391 // Keyframe and section processing. |
2380 if (rc->frames_to_key == 0 || | 2392 if (rc->frames_to_key == 0 || (cpi->frame_flags & FRAMEFLAGS_KEY)) { |
2381 (cpi->frame_flags & FRAMEFLAGS_KEY)) { | |
2382 // Define next KF group and assign bits to it. | 2393 // Define next KF group and assign bits to it. |
2383 find_next_key_frame(cpi, &this_frame_copy); | 2394 find_next_key_frame(cpi, &this_frame_copy); |
2384 } else { | 2395 } else { |
2385 cm->frame_type = INTER_FRAME; | 2396 cm->frame_type = INTER_FRAME; |
2386 } | 2397 } |
2387 | 2398 |
2388 if (lc != NULL) { | 2399 if (lc != NULL) { |
2389 if (cpi->svc.spatial_layer_id == 0) { | 2400 if (cpi->svc.spatial_layer_id == 0) { |
2390 lc->is_key_frame = (cm->frame_type == KEY_FRAME); | 2401 lc->is_key_frame = (cm->frame_type == KEY_FRAME); |
2391 if (lc->is_key_frame) { | 2402 if (lc->is_key_frame) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2424 cm->current_video_frame, rc->frames_till_gf_update_due, | 2435 cm->current_video_frame, rc->frames_till_gf_update_due, |
2425 rc->kf_boost, arf_count, rc->gfu_boost); | 2436 rc->kf_boost, arf_count, rc->gfu_boost); |
2426 | 2437 |
2427 fclose(fpfile); | 2438 fclose(fpfile); |
2428 } | 2439 } |
2429 #endif | 2440 #endif |
2430 } | 2441 } |
2431 | 2442 |
2432 configure_buffer_updates(cpi); | 2443 configure_buffer_updates(cpi); |
2433 | 2444 |
| 2445 // Do the firstpass stats indicate that this frame is skippable for the |
| 2446 // partition search? |
| 2447 if (cpi->sf.allow_partition_search_skip && cpi->oxcf.pass == 2 && |
| 2448 (!cpi->use_svc || is_two_pass_svc(cpi))) { |
| 2449 cpi->partition_search_skippable_frame = is_skippable_frame(cpi); |
| 2450 } |
| 2451 |
2434 target_rate = gf_group->bit_allocation[gf_group->index]; | 2452 target_rate = gf_group->bit_allocation[gf_group->index]; |
2435 if (cpi->common.frame_type == KEY_FRAME) | 2453 if (cpi->common.frame_type == KEY_FRAME) |
2436 target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate); | 2454 target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate); |
2437 else | 2455 else |
2438 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); | 2456 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); |
2439 | 2457 |
2440 rc->base_frame_target = target_rate; | 2458 rc->base_frame_target = target_rate; |
2441 | 2459 |
2442 // Correction to rate target based on prior over or under shoot. | 2460 { |
2443 if (cpi->oxcf.rc_mode == VPX_VBR) | 2461 const int num_mbs = (cpi->oxcf.resize_mode != RESIZE_NONE) |
2444 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target); | 2462 ? cpi->initial_mbs : cpi->common.MBs; |
2445 | 2463 // The multiplication by 256 reverses a scaling factor of (>> 8) |
2446 vp9_rc_set_frame_target(cpi, target_rate); | 2464 // applied when combining MB error values for the frame. |
| 2465 twopass->mb_av_energy = |
| 2466 log(((this_frame.intra_error * 256.0) / num_mbs) + 1.0); |
| 2467 } |
2447 | 2468 |
2448 // Update the total stats remaining structure. | 2469 // Update the total stats remaining structure. |
2449 subtract_stats(&twopass->total_left_stats, &this_frame); | 2470 subtract_stats(&twopass->total_left_stats, &this_frame); |
2450 } | 2471 } |
2451 | 2472 |
2452 #define MINQ_ADJ_LIMIT 32 | 2473 #define MINQ_ADJ_LIMIT 32 |
2453 #define Q_LIMIT_STEP 1 | |
2454 void vp9_twopass_postencode_update(VP9_COMP *cpi) { | 2474 void vp9_twopass_postencode_update(VP9_COMP *cpi) { |
2455 TWO_PASS *const twopass = &cpi->twopass; | 2475 TWO_PASS *const twopass = &cpi->twopass; |
2456 RATE_CONTROL *const rc = &cpi->rc; | 2476 RATE_CONTROL *const rc = &cpi->rc; |
2457 const int bits_used = rc->base_frame_target; | 2477 const int bits_used = rc->base_frame_target; |
2458 | 2478 |
2459 // VBR correction is done through rc->vbr_bits_off_target. Based on the | 2479 // VBR correction is done through rc->vbr_bits_off_target. Based on the |
2460 // sign of this value, a limited % adjustment is made to the target rate | 2480 // sign of this value, a limited % adjustment is made to the target rate |
2461 // of subsequent frames, to try and push it back towards 0. This method | 2481 // of subsequent frames, to try and push it back towards 0. This method |
2462 // is designed to prevent extreme behaviour at the end of a clip | 2482 // is designed to prevent extreme behaviour at the end of a clip |
2463 // or group of frames. | 2483 // or group of frames. |
(...skipping 24 matching lines...) Expand all Loading... |
2488 if ((cpi->oxcf.rc_mode == VPX_VBR) && | 2508 if ((cpi->oxcf.rc_mode == VPX_VBR) && |
2489 (cpi->twopass.gf_zeromotion_pct < VLOW_MOTION_THRESHOLD) && | 2509 (cpi->twopass.gf_zeromotion_pct < VLOW_MOTION_THRESHOLD) && |
2490 !cpi->rc.is_src_frame_alt_ref) { | 2510 !cpi->rc.is_src_frame_alt_ref) { |
2491 const int maxq_adj_limit = | 2511 const int maxq_adj_limit = |
2492 rc->worst_quality - twopass->active_worst_quality; | 2512 rc->worst_quality - twopass->active_worst_quality; |
2493 | 2513 |
2494 // Undershoot. | 2514 // Undershoot. |
2495 if (rc->rate_error_estimate > cpi->oxcf.under_shoot_pct) { | 2515 if (rc->rate_error_estimate > cpi->oxcf.under_shoot_pct) { |
2496 --twopass->extend_maxq; | 2516 --twopass->extend_maxq; |
2497 if (rc->rolling_target_bits >= rc->rolling_actual_bits) | 2517 if (rc->rolling_target_bits >= rc->rolling_actual_bits) |
2498 twopass->extend_minq += Q_LIMIT_STEP; | 2518 ++twopass->extend_minq; |
2499 // Overshoot. | 2519 // Overshoot. |
2500 } else if (rc->rate_error_estimate < -cpi->oxcf.over_shoot_pct) { | 2520 } else if (rc->rate_error_estimate < -cpi->oxcf.over_shoot_pct) { |
2501 --twopass->extend_minq; | 2521 --twopass->extend_minq; |
2502 if (rc->rolling_target_bits < rc->rolling_actual_bits) | 2522 if (rc->rolling_target_bits < rc->rolling_actual_bits) |
2503 twopass->extend_maxq += Q_LIMIT_STEP; | 2523 ++twopass->extend_maxq; |
2504 } else { | 2524 } else { |
| 2525 // Adjustment for extreme local overshoot. |
| 2526 if (rc->projected_frame_size > (2 * rc->base_frame_target) && |
| 2527 rc->projected_frame_size > (2 * rc->avg_frame_bandwidth)) |
| 2528 ++twopass->extend_maxq; |
| 2529 |
| 2530 // Unwind undershoot or overshoot adjustment. |
2505 if (rc->rolling_target_bits < rc->rolling_actual_bits) | 2531 if (rc->rolling_target_bits < rc->rolling_actual_bits) |
2506 --twopass->extend_minq; | 2532 --twopass->extend_minq; |
2507 if (rc->rolling_target_bits > rc->rolling_actual_bits) | 2533 else if (rc->rolling_target_bits > rc->rolling_actual_bits) |
2508 --twopass->extend_maxq; | 2534 --twopass->extend_maxq; |
2509 } | 2535 } |
2510 twopass->extend_minq = clamp(twopass->extend_minq, 0, MINQ_ADJ_LIMIT); | 2536 twopass->extend_minq = clamp(twopass->extend_minq, 0, MINQ_ADJ_LIMIT); |
2511 twopass->extend_maxq = clamp(twopass->extend_maxq, 0, maxq_adj_limit); | 2537 twopass->extend_maxq = clamp(twopass->extend_maxq, 0, maxq_adj_limit); |
2512 } | 2538 } |
2513 } | 2539 } |
OLD | NEW |