| 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 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 int current_temporal_layer = svc->temporal_layer_id; | 152 int current_temporal_layer = svc->temporal_layer_id; |
| 153 for (temporal_layer = current_temporal_layer + 1; | 153 for (temporal_layer = current_temporal_layer + 1; |
| 154 temporal_layer < svc->number_temporal_layers; ++temporal_layer) { | 154 temporal_layer < svc->number_temporal_layers; ++temporal_layer) { |
| 155 LAYER_CONTEXT *lc = &svc->layer_context[temporal_layer]; | 155 LAYER_CONTEXT *lc = &svc->layer_context[temporal_layer]; |
| 156 RATE_CONTROL *lrc = &lc->rc; | 156 RATE_CONTROL *lrc = &lc->rc; |
| 157 int bits_off_for_this_layer = (int)(lc->target_bandwidth / lc->framerate - | 157 int bits_off_for_this_layer = (int)(lc->target_bandwidth / lc->framerate - |
| 158 encoded_frame_size); | 158 encoded_frame_size); |
| 159 lrc->bits_off_target += bits_off_for_this_layer; | 159 lrc->bits_off_target += bits_off_for_this_layer; |
| 160 | 160 |
| 161 // Clip buffer level to maximum buffer size for the layer. | 161 // Clip buffer level to maximum buffer size for the layer. |
| 162 lrc->bits_off_target = MIN(lrc->bits_off_target, lc->maximum_buffer_size); | 162 lrc->bits_off_target = MIN(lrc->bits_off_target, lrc->maximum_buffer_size); |
| 163 lrc->buffer_level = lrc->bits_off_target; | 163 lrc->buffer_level = lrc->bits_off_target; |
| 164 } | 164 } |
| 165 } | 165 } |
| 166 | 166 |
| 167 // Update the buffer level: leaky bucket model. | 167 // Update the buffer level: leaky bucket model. |
| 168 static void update_buffer_level(VP9_COMP *cpi, int encoded_frame_size) { | 168 static void update_buffer_level(VP9_COMP *cpi, int encoded_frame_size) { |
| 169 const VP9_COMMON *const cm = &cpi->common; | 169 const VP9_COMMON *const cm = &cpi->common; |
| 170 const VP9EncoderConfig *oxcf = &cpi->oxcf; | |
| 171 RATE_CONTROL *const rc = &cpi->rc; | 170 RATE_CONTROL *const rc = &cpi->rc; |
| 172 | 171 |
| 173 // Non-viewable frames are a special case and are treated as pure overhead. | 172 // Non-viewable frames are a special case and are treated as pure overhead. |
| 174 if (!cm->show_frame) { | 173 if (!cm->show_frame) { |
| 175 rc->bits_off_target -= encoded_frame_size; | 174 rc->bits_off_target -= encoded_frame_size; |
| 176 } else { | 175 } else { |
| 177 rc->bits_off_target += rc->avg_frame_bandwidth - encoded_frame_size; | 176 rc->bits_off_target += rc->avg_frame_bandwidth - encoded_frame_size; |
| 178 } | 177 } |
| 179 | 178 |
| 180 // Clip the buffer level to the maximum specified buffer size. | 179 // Clip the buffer level to the maximum specified buffer size. |
| 181 rc->bits_off_target = MIN(rc->bits_off_target, oxcf->maximum_buffer_size); | 180 rc->bits_off_target = MIN(rc->bits_off_target, rc->maximum_buffer_size); |
| 182 rc->buffer_level = rc->bits_off_target; | 181 rc->buffer_level = rc->bits_off_target; |
| 183 | 182 |
| 184 if (cpi->use_svc && cpi->oxcf.rc_mode == RC_MODE_CBR) { | 183 if (cpi->use_svc && cpi->oxcf.rc_mode == VPX_CBR) { |
| 185 update_layer_buffer_level(&cpi->svc, encoded_frame_size); | 184 update_layer_buffer_level(&cpi->svc, encoded_frame_size); |
| 186 } | 185 } |
| 187 } | 186 } |
| 188 | 187 |
| 189 void vp9_rc_init(const VP9EncoderConfig *oxcf, int pass, RATE_CONTROL *rc) { | 188 void vp9_rc_init(const VP9EncoderConfig *oxcf, int pass, RATE_CONTROL *rc) { |
| 190 if (pass == 0 && oxcf->rc_mode == RC_MODE_CBR) { | 189 if (pass == 0 && oxcf->rc_mode == VPX_CBR) { |
| 191 rc->avg_frame_qindex[0] = oxcf->worst_allowed_q; | 190 rc->avg_frame_qindex[KEY_FRAME] = oxcf->worst_allowed_q; |
| 192 rc->avg_frame_qindex[1] = oxcf->worst_allowed_q; | 191 rc->avg_frame_qindex[INTER_FRAME] = oxcf->worst_allowed_q; |
| 193 rc->avg_frame_qindex[2] = oxcf->worst_allowed_q; | |
| 194 } else { | 192 } else { |
| 195 rc->avg_frame_qindex[0] = (oxcf->worst_allowed_q + | 193 rc->avg_frame_qindex[KEY_FRAME] = (oxcf->worst_allowed_q + |
| 196 oxcf->best_allowed_q) / 2; | 194 oxcf->best_allowed_q) / 2; |
| 197 rc->avg_frame_qindex[1] = (oxcf->worst_allowed_q + | 195 rc->avg_frame_qindex[INTER_FRAME] = (oxcf->worst_allowed_q + |
| 198 oxcf->best_allowed_q) / 2; | 196 oxcf->best_allowed_q) / 2; |
| 199 rc->avg_frame_qindex[2] = (oxcf->worst_allowed_q + | |
| 200 oxcf->best_allowed_q) / 2; | |
| 201 } | 197 } |
| 202 | 198 |
| 203 rc->last_q[0] = oxcf->best_allowed_q; | 199 rc->last_q[KEY_FRAME] = oxcf->best_allowed_q; |
| 204 rc->last_q[1] = oxcf->best_allowed_q; | 200 rc->last_q[INTER_FRAME] = oxcf->best_allowed_q; |
| 205 rc->last_q[2] = oxcf->best_allowed_q; | |
| 206 | 201 |
| 207 rc->buffer_level = oxcf->starting_buffer_level; | 202 rc->buffer_level = rc->starting_buffer_level; |
| 208 rc->bits_off_target = oxcf->starting_buffer_level; | 203 rc->bits_off_target = rc->starting_buffer_level; |
| 209 | 204 |
| 210 rc->rolling_target_bits = rc->avg_frame_bandwidth; | 205 rc->rolling_target_bits = rc->avg_frame_bandwidth; |
| 211 rc->rolling_actual_bits = rc->avg_frame_bandwidth; | 206 rc->rolling_actual_bits = rc->avg_frame_bandwidth; |
| 212 rc->long_rolling_target_bits = rc->avg_frame_bandwidth; | 207 rc->long_rolling_target_bits = rc->avg_frame_bandwidth; |
| 213 rc->long_rolling_actual_bits = rc->avg_frame_bandwidth; | 208 rc->long_rolling_actual_bits = rc->avg_frame_bandwidth; |
| 214 | 209 |
| 215 rc->total_actual_bits = 0; | 210 rc->total_actual_bits = 0; |
| 211 rc->total_target_bits = 0; |
| 216 rc->total_target_vs_actual = 0; | 212 rc->total_target_vs_actual = 0; |
| 217 | 213 |
| 218 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; | 214 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; |
| 219 rc->frames_since_key = 8; // Sensible default for first frame. | 215 rc->frames_since_key = 8; // Sensible default for first frame. |
| 220 rc->this_key_frame_forced = 0; | 216 rc->this_key_frame_forced = 0; |
| 221 rc->next_key_frame_forced = 0; | 217 rc->next_key_frame_forced = 0; |
| 222 rc->source_alt_ref_pending = 0; | 218 rc->source_alt_ref_pending = 0; |
| 223 rc->source_alt_ref_active = 0; | 219 rc->source_alt_ref_active = 0; |
| 224 | 220 |
| 225 rc->frames_till_gf_update_due = 0; | 221 rc->frames_till_gf_update_due = 0; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 243 if (!oxcf->drop_frames_water_mark) { | 239 if (!oxcf->drop_frames_water_mark) { |
| 244 return 0; | 240 return 0; |
| 245 } else { | 241 } else { |
| 246 if (rc->buffer_level < 0) { | 242 if (rc->buffer_level < 0) { |
| 247 // Always drop if buffer is below 0. | 243 // Always drop if buffer is below 0. |
| 248 return 1; | 244 return 1; |
| 249 } else { | 245 } else { |
| 250 // If buffer is below drop_mark, for now just drop every other frame | 246 // If buffer is below drop_mark, for now just drop every other frame |
| 251 // (starting with the next frame) until it increases back over drop_mark. | 247 // (starting with the next frame) until it increases back over drop_mark. |
| 252 int drop_mark = (int)(oxcf->drop_frames_water_mark * | 248 int drop_mark = (int)(oxcf->drop_frames_water_mark * |
| 253 oxcf->optimal_buffer_level / 100); | 249 rc->optimal_buffer_level / 100); |
| 254 if ((rc->buffer_level > drop_mark) && | 250 if ((rc->buffer_level > drop_mark) && |
| 255 (rc->decimation_factor > 0)) { | 251 (rc->decimation_factor > 0)) { |
| 256 --rc->decimation_factor; | 252 --rc->decimation_factor; |
| 257 } else if (rc->buffer_level <= drop_mark && | 253 } else if (rc->buffer_level <= drop_mark && |
| 258 rc->decimation_factor == 0) { | 254 rc->decimation_factor == 0) { |
| 259 rc->decimation_factor = 1; | 255 rc->decimation_factor = 1; |
| 260 } | 256 } |
| 261 if (rc->decimation_factor > 0) { | 257 if (rc->decimation_factor > 0) { |
| 262 if (rc->decimation_count > 0) { | 258 if (rc->decimation_count > 0) { |
| 263 --rc->decimation_count; | 259 --rc->decimation_count; |
| 264 return 1; | 260 return 1; |
| 265 } else { | 261 } else { |
| 266 rc->decimation_count = rc->decimation_factor; | 262 rc->decimation_count = rc->decimation_factor; |
| 267 return 0; | 263 return 0; |
| 268 } | 264 } |
| 269 } else { | 265 } else { |
| 270 rc->decimation_count = 0; | 266 rc->decimation_count = 0; |
| 271 return 0; | 267 return 0; |
| 272 } | 268 } |
| 273 } | 269 } |
| 274 } | 270 } |
| 275 } | 271 } |
| 276 | 272 |
| 277 static double get_rate_correction_factor(const VP9_COMP *cpi) { | 273 static double get_rate_correction_factor(const VP9_COMP *cpi) { |
| 278 if (cpi->common.frame_type == KEY_FRAME) { | 274 if (cpi->common.frame_type == KEY_FRAME) { |
| 279 return cpi->rc.key_frame_rate_correction_factor; | 275 return cpi->rc.key_frame_rate_correction_factor; |
| 280 } else { | 276 } else { |
| 281 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && | 277 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && |
| 282 !cpi->rc.is_src_frame_alt_ref && | 278 !cpi->rc.is_src_frame_alt_ref && |
| 283 !(cpi->use_svc && cpi->oxcf.rc_mode == RC_MODE_CBR)) | 279 !(cpi->use_svc && cpi->oxcf.rc_mode == VPX_CBR)) |
| 284 return cpi->rc.gf_rate_correction_factor; | 280 return cpi->rc.gf_rate_correction_factor; |
| 285 else | 281 else |
| 286 return cpi->rc.rate_correction_factor; | 282 return cpi->rc.rate_correction_factor; |
| 287 } | 283 } |
| 288 } | 284 } |
| 289 | 285 |
| 290 static void set_rate_correction_factor(VP9_COMP *cpi, double factor) { | 286 static void set_rate_correction_factor(VP9_COMP *cpi, double factor) { |
| 291 if (cpi->common.frame_type == KEY_FRAME) { | 287 if (cpi->common.frame_type == KEY_FRAME) { |
| 292 cpi->rc.key_frame_rate_correction_factor = factor; | 288 cpi->rc.key_frame_rate_correction_factor = factor; |
| 293 } else { | 289 } else { |
| 294 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && | 290 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && |
| 295 !cpi->rc.is_src_frame_alt_ref && | 291 !cpi->rc.is_src_frame_alt_ref && |
| 296 !(cpi->use_svc && cpi->oxcf.rc_mode == RC_MODE_CBR)) | 292 !(cpi->use_svc && cpi->oxcf.rc_mode == VPX_CBR)) |
| 297 cpi->rc.gf_rate_correction_factor = factor; | 293 cpi->rc.gf_rate_correction_factor = factor; |
| 298 else | 294 else |
| 299 cpi->rc.rate_correction_factor = factor; | 295 cpi->rc.rate_correction_factor = factor; |
| 300 } | 296 } |
| 301 } | 297 } |
| 302 | 298 |
| 303 void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) { | 299 void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) { |
| 304 const VP9_COMMON *const cm = &cpi->common; | 300 const VP9_COMMON *const cm = &cpi->common; |
| 305 int correction_factor = 100; | 301 int correction_factor = 100; |
| 306 double rate_correction_factor = get_rate_correction_factor(cpi); | 302 double rate_correction_factor = get_rate_correction_factor(cpi); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 } else { | 421 } else { |
| 426 if (!rc->is_src_frame_alt_ref && | 422 if (!rc->is_src_frame_alt_ref && |
| 427 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { | 423 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { |
| 428 active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 5 / 4 | 424 active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 5 / 4 |
| 429 : rc->last_q[INTER_FRAME]; | 425 : rc->last_q[INTER_FRAME]; |
| 430 } else { | 426 } else { |
| 431 active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 2 | 427 active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 2 |
| 432 : rc->last_q[INTER_FRAME] * 2; | 428 : rc->last_q[INTER_FRAME] * 2; |
| 433 } | 429 } |
| 434 } | 430 } |
| 435 | |
| 436 return MIN(active_worst_quality, rc->worst_quality); | 431 return MIN(active_worst_quality, rc->worst_quality); |
| 437 } | 432 } |
| 438 | 433 |
| 439 // Adjust active_worst_quality level based on buffer level. | 434 // Adjust active_worst_quality level based on buffer level. |
| 440 static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) { | 435 static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) { |
| 441 // Adjust active_worst_quality: If buffer is above the optimal/target level, | 436 // Adjust active_worst_quality: If buffer is above the optimal/target level, |
| 442 // bring active_worst_quality down depending on fullness of buffer. | 437 // bring active_worst_quality down depending on fullness of buffer. |
| 443 // If buffer is below the optimal level, let the active_worst_quality go from | 438 // If buffer is below the optimal level, let the active_worst_quality go from |
| 444 // ambient Q (at buffer = optimal level) to worst_quality level | 439 // ambient Q (at buffer = optimal level) to worst_quality level |
| 445 // (at buffer = critical level). | 440 // (at buffer = critical level). |
| 446 const VP9_COMMON *const cm = &cpi->common; | 441 const VP9_COMMON *const cm = &cpi->common; |
| 447 const VP9EncoderConfig *oxcf = &cpi->oxcf; | |
| 448 const RATE_CONTROL *rc = &cpi->rc; | 442 const RATE_CONTROL *rc = &cpi->rc; |
| 449 // Buffer level below which we push active_worst to worst_quality. | 443 // Buffer level below which we push active_worst to worst_quality. |
| 450 int64_t critical_level = oxcf->optimal_buffer_level >> 2; | 444 int64_t critical_level = rc->optimal_buffer_level >> 2; |
| 451 int64_t buff_lvl_step = 0; | 445 int64_t buff_lvl_step = 0; |
| 452 int adjustment = 0; | 446 int adjustment = 0; |
| 453 int active_worst_quality; | 447 int active_worst_quality; |
| 454 if (cm->frame_type == KEY_FRAME) | 448 if (cm->frame_type == KEY_FRAME) |
| 455 return rc->worst_quality; | 449 return rc->worst_quality; |
| 456 if (cm->current_video_frame > 1) | 450 if (cm->current_video_frame > 1) |
| 457 active_worst_quality = MIN(rc->worst_quality, | 451 active_worst_quality = MIN(rc->worst_quality, |
| 458 rc->avg_frame_qindex[INTER_FRAME] * 5 / 4); | 452 rc->avg_frame_qindex[INTER_FRAME] * 5 / 4); |
| 459 else | 453 else |
| 460 active_worst_quality = MIN(rc->worst_quality, | 454 active_worst_quality = MIN(rc->worst_quality, |
| 461 rc->avg_frame_qindex[KEY_FRAME] * 3 / 2); | 455 rc->avg_frame_qindex[KEY_FRAME] * 3 / 2); |
| 462 if (rc->buffer_level > oxcf->optimal_buffer_level) { | 456 if (rc->buffer_level > rc->optimal_buffer_level) { |
| 463 // Adjust down. | 457 // Adjust down. |
| 464 // Maximum limit for down adjustment, ~30%. | 458 // Maximum limit for down adjustment, ~30%. |
| 465 int max_adjustment_down = active_worst_quality / 3; | 459 int max_adjustment_down = active_worst_quality / 3; |
| 466 if (max_adjustment_down) { | 460 if (max_adjustment_down) { |
| 467 buff_lvl_step = ((oxcf->maximum_buffer_size - | 461 buff_lvl_step = ((rc->maximum_buffer_size - |
| 468 oxcf->optimal_buffer_level) / max_adjustment_down); | 462 rc->optimal_buffer_level) / max_adjustment_down); |
| 469 if (buff_lvl_step) | 463 if (buff_lvl_step) |
| 470 adjustment = (int)((rc->buffer_level - oxcf->optimal_buffer_level) / | 464 adjustment = (int)((rc->buffer_level - rc->optimal_buffer_level) / |
| 471 buff_lvl_step); | 465 buff_lvl_step); |
| 472 active_worst_quality -= adjustment; | 466 active_worst_quality -= adjustment; |
| 473 } | 467 } |
| 474 } else if (rc->buffer_level > critical_level) { | 468 } else if (rc->buffer_level > critical_level) { |
| 475 // Adjust up from ambient Q. | 469 // Adjust up from ambient Q. |
| 476 if (critical_level) { | 470 if (critical_level) { |
| 477 buff_lvl_step = (oxcf->optimal_buffer_level - critical_level); | 471 buff_lvl_step = (rc->optimal_buffer_level - critical_level); |
| 478 if (buff_lvl_step) { | 472 if (buff_lvl_step) { |
| 479 adjustment = | 473 adjustment = |
| 480 (int)((rc->worst_quality - rc->avg_frame_qindex[INTER_FRAME]) * | 474 (int)((rc->worst_quality - rc->avg_frame_qindex[INTER_FRAME]) * |
| 481 (oxcf->optimal_buffer_level - rc->buffer_level) / | 475 (rc->optimal_buffer_level - rc->buffer_level) / |
| 482 buff_lvl_step); | 476 buff_lvl_step); |
| 483 } | 477 } |
| 484 active_worst_quality = rc->avg_frame_qindex[INTER_FRAME] + adjustment; | 478 active_worst_quality = rc->avg_frame_qindex[INTER_FRAME] + adjustment; |
| 485 } | 479 } |
| 486 } else { | 480 } else { |
| 487 // Set to worst_quality if buffer is below critical level. | 481 // Set to worst_quality if buffer is below critical level. |
| 488 active_worst_quality = rc->worst_quality; | 482 active_worst_quality = rc->worst_quality; |
| 489 } | 483 } |
| 490 return active_worst_quality; | 484 return active_worst_quality; |
| 491 } | 485 } |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 } | 594 } |
| 601 } | 595 } |
| 602 assert(*top_index <= rc->worst_quality && | 596 assert(*top_index <= rc->worst_quality && |
| 603 *top_index >= rc->best_quality); | 597 *top_index >= rc->best_quality); |
| 604 assert(*bottom_index <= rc->worst_quality && | 598 assert(*bottom_index <= rc->worst_quality && |
| 605 *bottom_index >= rc->best_quality); | 599 *bottom_index >= rc->best_quality); |
| 606 assert(q <= rc->worst_quality && q >= rc->best_quality); | 600 assert(q <= rc->worst_quality && q >= rc->best_quality); |
| 607 return q; | 601 return q; |
| 608 } | 602 } |
| 609 | 603 |
| 604 static int get_active_cq_level(const RATE_CONTROL *rc, |
| 605 const VP9EncoderConfig *const oxcf) { |
| 606 static const double cq_adjust_threshold = 0.5; |
| 607 int active_cq_level = oxcf->cq_level; |
| 608 if (oxcf->rc_mode == VPX_CQ && |
| 609 rc->total_target_bits > 0) { |
| 610 const double x = (double)rc->total_actual_bits / rc->total_target_bits; |
| 611 if (x < cq_adjust_threshold) { |
| 612 active_cq_level = (int)(active_cq_level * x / cq_adjust_threshold); |
| 613 } |
| 614 } |
| 615 return active_cq_level; |
| 616 } |
| 617 |
| 610 static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi, | 618 static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi, |
| 611 int *bottom_index, | 619 int *bottom_index, |
| 612 int *top_index) { | 620 int *top_index) { |
| 613 const VP9_COMMON *const cm = &cpi->common; | 621 const VP9_COMMON *const cm = &cpi->common; |
| 614 const RATE_CONTROL *const rc = &cpi->rc; | 622 const RATE_CONTROL *const rc = &cpi->rc; |
| 615 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 623 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 616 const int cq_level = oxcf->cq_level; | 624 const int cq_level = get_active_cq_level(rc, oxcf); |
| 617 int active_best_quality; | 625 int active_best_quality; |
| 618 int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi); | 626 int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi); |
| 619 int q; | 627 int q; |
| 620 | 628 |
| 621 if (frame_is_intra_only(cm)) { | 629 if (frame_is_intra_only(cm)) { |
| 622 active_best_quality = rc->best_quality; | 630 active_best_quality = rc->best_quality; |
| 623 #if !CONFIG_MULTIPLE_ARF | 631 #if !CONFIG_MULTIPLE_ARF |
| 624 // Handle the special case for key frames forced when we have75 reached | 632 // Handle the special case for key frames forced when we have75 reached |
| 625 // the maximum key frame interval. Here force the Q to a range | 633 // the maximum key frame interval. Here force the Q to a range |
| 626 // based on the ambient Q to reduce the risk of popping. | 634 // based on the ambient Q to reduce the risk of popping. |
| 627 if (rc->this_key_frame_forced) { | 635 if (rc->this_key_frame_forced) { |
| 628 int qindex = rc->last_boosted_qindex; | 636 int qindex = rc->last_boosted_qindex; |
| 629 double last_boosted_q = vp9_convert_qindex_to_q(qindex); | 637 double last_boosted_q = vp9_convert_qindex_to_q(qindex); |
| 630 int delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, | 638 int delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, |
| 631 last_boosted_q * 0.75); | 639 last_boosted_q * 0.75); |
| 632 active_best_quality = MAX(qindex + delta_qindex, rc->best_quality); | 640 active_best_quality = MAX(qindex + delta_qindex, rc->best_quality); |
| 633 } else if (cm->current_video_frame > 0) { | 641 } else { |
| 634 // not first frame of one pass and kf_boost is set | 642 // not first frame of one pass and kf_boost is set |
| 635 double q_adj_factor = 1.0; | 643 double q_adj_factor = 1.0; |
| 636 double q_val; | 644 double q_val; |
| 637 | 645 |
| 638 active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME], | 646 active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME], |
| 639 rc->kf_boost, | 647 rc->kf_boost, |
| 640 kf_low, kf_high, | 648 kf_low, kf_high, |
| 641 kf_low_motion_minq, | 649 kf_low_motion_minq, |
| 642 kf_high_motion_minq); | 650 kf_high_motion_minq); |
| 643 | 651 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 664 // Use the lower of active_worst_quality and recent | 672 // Use the lower of active_worst_quality and recent |
| 665 // average Q as basis for GF/ARF best Q limit unless last frame was | 673 // average Q as basis for GF/ARF best Q limit unless last frame was |
| 666 // a key frame. | 674 // a key frame. |
| 667 if (rc->frames_since_key > 1 && | 675 if (rc->frames_since_key > 1 && |
| 668 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { | 676 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { |
| 669 q = rc->avg_frame_qindex[INTER_FRAME]; | 677 q = rc->avg_frame_qindex[INTER_FRAME]; |
| 670 } else { | 678 } else { |
| 671 q = rc->avg_frame_qindex[KEY_FRAME]; | 679 q = rc->avg_frame_qindex[KEY_FRAME]; |
| 672 } | 680 } |
| 673 // For constrained quality dont allow Q less than the cq level | 681 // For constrained quality dont allow Q less than the cq level |
| 674 if (oxcf->rc_mode == RC_MODE_CONSTRAINED_QUALITY) { | 682 if (oxcf->rc_mode == VPX_CQ) { |
| 675 if (q < cq_level) | 683 if (q < cq_level) |
| 676 q = cq_level; | 684 q = cq_level; |
| 677 | 685 |
| 678 active_best_quality = get_active_quality(q, rc->gfu_boost, | 686 active_best_quality = get_active_quality(q, rc->gfu_boost, |
| 679 gf_low, gf_high, | 687 gf_low, gf_high, |
| 680 arfgf_low_motion_minq, | 688 arfgf_low_motion_minq, |
| 681 arfgf_high_motion_minq); | 689 arfgf_high_motion_minq); |
| 682 | 690 |
| 683 // Constrained quality use slightly lower active best. | 691 // Constrained quality use slightly lower active best. |
| 684 active_best_quality = active_best_quality * 15 / 16; | 692 active_best_quality = active_best_quality * 15 / 16; |
| 685 | 693 |
| 686 } else if (oxcf->rc_mode == RC_MODE_CONSTANT_QUALITY) { | 694 } else if (oxcf->rc_mode == VPX_Q) { |
| 687 if (!cpi->refresh_alt_ref_frame) { | 695 if (!cpi->refresh_alt_ref_frame) { |
| 688 active_best_quality = cq_level; | 696 active_best_quality = cq_level; |
| 689 } else { | 697 } else { |
| 690 active_best_quality = get_active_quality( | 698 active_best_quality = get_active_quality( |
| 691 q, rc->gfu_boost, gf_low, gf_high, | 699 q, rc->gfu_boost, gf_low, gf_high, |
| 692 arfgf_low_motion_minq, arfgf_high_motion_minq); | 700 arfgf_low_motion_minq, arfgf_high_motion_minq); |
| 693 } | 701 } |
| 694 } else { | 702 } else { |
| 695 active_best_quality = get_active_quality( | 703 active_best_quality = get_active_quality( |
| 696 q, rc->gfu_boost, gf_low, gf_high, | 704 q, rc->gfu_boost, gf_low, gf_high, |
| 697 arfgf_low_motion_minq, arfgf_high_motion_minq); | 705 arfgf_low_motion_minq, arfgf_high_motion_minq); |
| 698 } | 706 } |
| 699 } else { | 707 } else { |
| 700 if (oxcf->rc_mode == RC_MODE_CONSTANT_QUALITY) { | 708 if (oxcf->rc_mode == VPX_Q) { |
| 701 active_best_quality = cq_level; | 709 active_best_quality = cq_level; |
| 702 } else { | 710 } else { |
| 703 // Use the lower of active_worst_quality and recent/average Q. | 711 // Use the lower of active_worst_quality and recent/average Q. |
| 704 if (cm->current_video_frame > 1) | 712 if (cm->current_video_frame > 1) |
| 705 active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]]; | 713 active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]]; |
| 706 else | 714 else |
| 707 active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]]; | 715 active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]]; |
| 708 // For the constrained quality mode we don't want | 716 // For the constrained quality mode we don't want |
| 709 // q to fall below the cq level. | 717 // q to fall below the cq level. |
| 710 if ((oxcf->rc_mode == RC_MODE_CONSTRAINED_QUALITY) && | 718 if ((oxcf->rc_mode == VPX_CQ) && |
| 711 (active_best_quality < cq_level)) { | 719 (active_best_quality < cq_level)) { |
| 712 active_best_quality = cq_level; | 720 active_best_quality = cq_level; |
| 713 } | 721 } |
| 714 } | 722 } |
| 715 } | 723 } |
| 716 | 724 |
| 717 // Clip the active best and worst quality values to limits | 725 // Clip the active best and worst quality values to limits |
| 718 active_best_quality = clamp(active_best_quality, | 726 active_best_quality = clamp(active_best_quality, |
| 719 rc->best_quality, rc->worst_quality); | 727 rc->best_quality, rc->worst_quality); |
| 720 active_worst_quality = clamp(active_worst_quality, | 728 active_worst_quality = clamp(active_worst_quality, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 737 } else if (!rc->is_src_frame_alt_ref && | 745 } else if (!rc->is_src_frame_alt_ref && |
| 738 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { | 746 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { |
| 739 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, | 747 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, |
| 740 active_worst_quality, 1.75); | 748 active_worst_quality, 1.75); |
| 741 } | 749 } |
| 742 *top_index = active_worst_quality + qdelta; | 750 *top_index = active_worst_quality + qdelta; |
| 743 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; | 751 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; |
| 744 } | 752 } |
| 745 #endif | 753 #endif |
| 746 | 754 |
| 747 if (oxcf->rc_mode == RC_MODE_CONSTANT_QUALITY) { | 755 if (oxcf->rc_mode == VPX_Q) { |
| 748 q = active_best_quality; | 756 q = active_best_quality; |
| 749 // Special case code to try and match quality with forced key frames | 757 // Special case code to try and match quality with forced key frames |
| 750 } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) { | 758 } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) { |
| 751 q = rc->last_boosted_qindex; | 759 q = rc->last_boosted_qindex; |
| 752 } else { | 760 } else { |
| 753 q = vp9_rc_regulate_q(cpi, rc->this_frame_target, | 761 q = vp9_rc_regulate_q(cpi, rc->this_frame_target, |
| 754 active_best_quality, active_worst_quality); | 762 active_best_quality, active_worst_quality); |
| 755 if (q > *top_index) { | 763 if (q > *top_index) { |
| 756 // Special case when we are targeting the max allowed rate | 764 // Special case when we are targeting the max allowed rate |
| 757 if (rc->this_frame_target >= rc->max_frame_bandwidth) | 765 if (rc->this_frame_target >= rc->max_frame_bandwidth) |
| 758 *top_index = q; | 766 *top_index = q; |
| 759 else | 767 else |
| 760 q = *top_index; | 768 q = *top_index; |
| 761 } | 769 } |
| 762 } | 770 } |
| 763 #if CONFIG_MULTIPLE_ARF | 771 #if CONFIG_MULTIPLE_ARF |
| 764 // Force the quantizer determined by the coding order pattern. | 772 // Force the quantizer determined by the coding order pattern. |
| 765 if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) && | 773 if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) && |
| 766 cpi->oxcf.rc_mode != RC_MODE_CONSTANT_QUALITY) { | 774 cpi->oxcf.rc_mode != VPX_Q) { |
| 767 double new_q; | 775 double new_q; |
| 768 double current_q = vp9_convert_qindex_to_q(active_worst_quality); | 776 double current_q = vp9_convert_qindex_to_q(active_worst_quality); |
| 769 int level = cpi->this_frame_weight; | 777 int level = cpi->this_frame_weight; |
| 770 assert(level >= 0); | 778 assert(level >= 0); |
| 771 new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level))); | 779 new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level))); |
| 772 q = active_worst_quality + | 780 q = active_worst_quality + |
| 773 vp9_compute_qdelta(rc, current_q, new_q); | 781 vp9_compute_qdelta(rc, current_q, new_q); |
| 774 | 782 |
| 775 *bottom_index = q; | 783 *bottom_index = q; |
| 776 *top_index = q; | 784 *top_index = q; |
| 777 printf("frame:%d q:%d\n", cm->current_video_frame, q); | 785 printf("frame:%d q:%d\n", cm->current_video_frame, q); |
| 778 } | 786 } |
| 779 #endif | 787 #endif |
| 780 assert(*top_index <= rc->worst_quality && | 788 assert(*top_index <= rc->worst_quality && |
| 781 *top_index >= rc->best_quality); | 789 *top_index >= rc->best_quality); |
| 782 assert(*bottom_index <= rc->worst_quality && | 790 assert(*bottom_index <= rc->worst_quality && |
| 783 *bottom_index >= rc->best_quality); | 791 *bottom_index >= rc->best_quality); |
| 784 assert(q <= rc->worst_quality && q >= rc->best_quality); | 792 assert(q <= rc->worst_quality && q >= rc->best_quality); |
| 785 return q; | 793 return q; |
| 786 } | 794 } |
| 787 | 795 |
| 788 static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, | 796 static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, |
| 789 int *bottom_index, | 797 int *bottom_index, |
| 790 int *top_index) { | 798 int *top_index) { |
| 791 const VP9_COMMON *const cm = &cpi->common; | 799 const VP9_COMMON *const cm = &cpi->common; |
| 792 const RATE_CONTROL *const rc = &cpi->rc; | 800 const RATE_CONTROL *const rc = &cpi->rc; |
| 793 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 801 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 794 const int cq_level = oxcf->cq_level; | 802 const int cq_level = get_active_cq_level(rc, oxcf); |
| 795 int active_best_quality; | 803 int active_best_quality; |
| 796 int active_worst_quality = cpi->twopass.active_worst_quality; | 804 int active_worst_quality = cpi->twopass.active_worst_quality; |
| 797 int q; | 805 int q; |
| 798 | 806 |
| 799 if (frame_is_intra_only(cm) || vp9_is_upper_layer_key_frame(cpi)) { | 807 if (frame_is_intra_only(cm) || vp9_is_upper_layer_key_frame(cpi)) { |
| 800 #if !CONFIG_MULTIPLE_ARF | 808 #if !CONFIG_MULTIPLE_ARF |
| 801 // Handle the special case for key frames forced when we have75 reached | 809 // Handle the special case for key frames forced when we have75 reached |
| 802 // the maximum key frame interval. Here force the Q to a range | 810 // the maximum key frame interval. Here force the Q to a range |
| 803 // based on the ambient Q to reduce the risk of popping. | 811 // based on the ambient Q to reduce the risk of popping. |
| 804 if (rc->this_key_frame_forced) { | 812 if (rc->this_key_frame_forced) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 // Use the lower of active_worst_quality and recent | 852 // Use the lower of active_worst_quality and recent |
| 845 // average Q as basis for GF/ARF best Q limit unless last frame was | 853 // average Q as basis for GF/ARF best Q limit unless last frame was |
| 846 // a key frame. | 854 // a key frame. |
| 847 if (rc->frames_since_key > 1 && | 855 if (rc->frames_since_key > 1 && |
| 848 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { | 856 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { |
| 849 q = rc->avg_frame_qindex[INTER_FRAME]; | 857 q = rc->avg_frame_qindex[INTER_FRAME]; |
| 850 } else { | 858 } else { |
| 851 q = active_worst_quality; | 859 q = active_worst_quality; |
| 852 } | 860 } |
| 853 // For constrained quality dont allow Q less than the cq level | 861 // For constrained quality dont allow Q less than the cq level |
| 854 if (oxcf->rc_mode == RC_MODE_CONSTRAINED_QUALITY) { | 862 if (oxcf->rc_mode == VPX_CQ) { |
| 855 if (q < cq_level) | 863 if (q < cq_level) |
| 856 q = cq_level; | 864 q = cq_level; |
| 857 | 865 |
| 858 active_best_quality = get_active_quality(q, rc->gfu_boost, | 866 active_best_quality = get_active_quality(q, rc->gfu_boost, |
| 859 gf_low, gf_high, | 867 gf_low, gf_high, |
| 860 arfgf_low_motion_minq, | 868 arfgf_low_motion_minq, |
| 861 arfgf_high_motion_minq); | 869 arfgf_high_motion_minq); |
| 862 | 870 |
| 863 // Constrained quality use slightly lower active best. | 871 // Constrained quality use slightly lower active best. |
| 864 active_best_quality = active_best_quality * 15 / 16; | 872 active_best_quality = active_best_quality * 15 / 16; |
| 865 | 873 |
| 866 } else if (oxcf->rc_mode == RC_MODE_CONSTANT_QUALITY) { | 874 } else if (oxcf->rc_mode == VPX_Q) { |
| 867 if (!cpi->refresh_alt_ref_frame) { | 875 if (!cpi->refresh_alt_ref_frame) { |
| 868 active_best_quality = cq_level; | 876 active_best_quality = cq_level; |
| 869 } else { | 877 } else { |
| 870 active_best_quality = get_active_quality( | 878 active_best_quality = get_active_quality( |
| 871 q, rc->gfu_boost, gf_low, gf_high, | 879 q, rc->gfu_boost, gf_low, gf_high, |
| 872 arfgf_low_motion_minq, arfgf_high_motion_minq); | 880 arfgf_low_motion_minq, arfgf_high_motion_minq); |
| 873 } | 881 } |
| 874 } else { | 882 } else { |
| 875 active_best_quality = get_active_quality( | 883 active_best_quality = get_active_quality( |
| 876 q, rc->gfu_boost, gf_low, gf_high, | 884 q, rc->gfu_boost, gf_low, gf_high, |
| 877 arfgf_low_motion_minq, arfgf_high_motion_minq); | 885 arfgf_low_motion_minq, arfgf_high_motion_minq); |
| 878 } | 886 } |
| 879 } else { | 887 } else { |
| 880 if (oxcf->rc_mode == RC_MODE_CONSTANT_QUALITY) { | 888 if (oxcf->rc_mode == VPX_Q) { |
| 881 active_best_quality = cq_level; | 889 active_best_quality = cq_level; |
| 882 } else { | 890 } else { |
| 883 active_best_quality = inter_minq[active_worst_quality]; | 891 active_best_quality = inter_minq[active_worst_quality]; |
| 884 | 892 |
| 885 // For the constrained quality mode we don't want | 893 // For the constrained quality mode we don't want |
| 886 // q to fall below the cq level. | 894 // q to fall below the cq level. |
| 887 if ((oxcf->rc_mode == RC_MODE_CONSTRAINED_QUALITY) && | 895 if ((oxcf->rc_mode == VPX_CQ) && |
| 888 (active_best_quality < cq_level)) { | 896 (active_best_quality < cq_level)) { |
| 889 active_best_quality = cq_level; | 897 active_best_quality = cq_level; |
| 890 } | 898 } |
| 891 } | 899 } |
| 892 } | 900 } |
| 893 | 901 |
| 894 // Clip the active best and worst quality values to limits. | 902 // Clip the active best and worst quality values to limits. |
| 895 active_best_quality = clamp(active_best_quality, | 903 active_best_quality = clamp(active_best_quality, |
| 896 rc->best_quality, rc->worst_quality); | 904 rc->best_quality, rc->worst_quality); |
| 897 active_worst_quality = clamp(active_worst_quality, | 905 active_worst_quality = clamp(active_worst_quality, |
| 898 active_best_quality, rc->worst_quality); | 906 active_best_quality, rc->worst_quality); |
| 899 | 907 |
| 900 *top_index = active_worst_quality; | 908 *top_index = active_worst_quality; |
| 901 *bottom_index = active_best_quality; | 909 *bottom_index = active_best_quality; |
| 902 | 910 |
| 903 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY | 911 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY |
| 904 { | 912 { |
| 905 int qdelta = 0; | 913 int qdelta = 0; |
| 906 vp9_clear_system_state(); | 914 vp9_clear_system_state(); |
| 907 | 915 |
| 908 // Limit Q range for the adaptive loop. | 916 // Limit Q range for the adaptive loop. |
| 909 if ((cm->frame_type == KEY_FRAME || vp9_is_upper_layer_key_frame(cpi)) && | 917 if ((cm->frame_type == KEY_FRAME || vp9_is_upper_layer_key_frame(cpi)) && |
| 910 !rc->this_key_frame_forced) { | 918 !rc->this_key_frame_forced) { |
| 911 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, | 919 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, |
| 912 active_worst_quality, 2.0); | 920 active_worst_quality, 2.0); |
| 913 } else if (!rc->is_src_frame_alt_ref && | 921 } else if (!rc->is_src_frame_alt_ref && |
| 914 (oxcf->rc_mode != RC_MODE_CBR) && | 922 (oxcf->rc_mode != VPX_CBR) && |
| 915 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { | 923 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { |
| 916 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, | 924 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, |
| 917 active_worst_quality, 1.75); | 925 active_worst_quality, 1.75); |
| 918 } | 926 } |
| 919 *top_index = active_worst_quality + qdelta; | 927 *top_index = active_worst_quality + qdelta; |
| 920 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; | 928 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; |
| 921 } | 929 } |
| 922 #endif | 930 #endif |
| 923 | 931 |
| 924 if (oxcf->rc_mode == RC_MODE_CONSTANT_QUALITY) { | 932 if (oxcf->rc_mode == VPX_Q) { |
| 925 q = active_best_quality; | 933 q = active_best_quality; |
| 926 // Special case code to try and match quality with forced key frames. | 934 // Special case code to try and match quality with forced key frames. |
| 927 } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) { | 935 } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) { |
| 928 q = rc->last_boosted_qindex; | 936 q = rc->last_boosted_qindex; |
| 929 } else { | 937 } else { |
| 930 q = vp9_rc_regulate_q(cpi, rc->this_frame_target, | 938 q = vp9_rc_regulate_q(cpi, rc->this_frame_target, |
| 931 active_best_quality, active_worst_quality); | 939 active_best_quality, active_worst_quality); |
| 932 if (q > *top_index) { | 940 if (q > *top_index) { |
| 933 // Special case when we are targeting the max allowed rate. | 941 // Special case when we are targeting the max allowed rate. |
| 934 if (rc->this_frame_target >= rc->max_frame_bandwidth) | 942 if (rc->this_frame_target >= rc->max_frame_bandwidth) |
| 935 *top_index = q; | 943 *top_index = q; |
| 936 else | 944 else |
| 937 q = *top_index; | 945 q = *top_index; |
| 938 } | 946 } |
| 939 } | 947 } |
| 940 #if CONFIG_MULTIPLE_ARF | 948 #if CONFIG_MULTIPLE_ARF |
| 941 // Force the quantizer determined by the coding order pattern. | 949 // Force the quantizer determined by the coding order pattern. |
| 942 if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) && | 950 if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) && |
| 943 cpi->oxcf.rc_mode != RC_MODE_CONSTANT_QUALITY) { | 951 cpi->oxcf.rc_mode != VPX_Q) { |
| 944 double new_q; | 952 double new_q; |
| 945 double current_q = vp9_convert_qindex_to_q(active_worst_quality); | 953 double current_q = vp9_convert_qindex_to_q(active_worst_quality); |
| 946 int level = cpi->this_frame_weight; | 954 int level = cpi->this_frame_weight; |
| 947 assert(level >= 0); | 955 assert(level >= 0); |
| 948 new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level))); | 956 new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level))); |
| 949 q = active_worst_quality + | 957 q = active_worst_quality + |
| 950 vp9_compute_qdelta(rc, current_q, new_q); | 958 vp9_compute_qdelta(rc, current_q, new_q); |
| 951 | 959 |
| 952 *bottom_index = q; | 960 *bottom_index = q; |
| 953 *top_index = q; | 961 *top_index = q; |
| 954 printf("frame:%d q:%d\n", cm->current_video_frame, q); | 962 printf("frame:%d q:%d\n", cm->current_video_frame, q); |
| 955 } | 963 } |
| 956 #endif | 964 #endif |
| 957 assert(*top_index <= rc->worst_quality && | 965 assert(*top_index <= rc->worst_quality && |
| 958 *top_index >= rc->best_quality); | 966 *top_index >= rc->best_quality); |
| 959 assert(*bottom_index <= rc->worst_quality && | 967 assert(*bottom_index <= rc->worst_quality && |
| 960 *bottom_index >= rc->best_quality); | 968 *bottom_index >= rc->best_quality); |
| 961 assert(q <= rc->worst_quality && q >= rc->best_quality); | 969 assert(q <= rc->worst_quality && q >= rc->best_quality); |
| 962 return q; | 970 return q; |
| 963 } | 971 } |
| 964 | 972 |
| 965 int vp9_rc_pick_q_and_bounds(const VP9_COMP *cpi, | 973 int vp9_rc_pick_q_and_bounds(const VP9_COMP *cpi, |
| 966 int *bottom_index, int *top_index) { | 974 int *bottom_index, int *top_index) { |
| 967 int q; | 975 int q; |
| 968 if (cpi->pass == 0) { | 976 if (cpi->pass == 0) { |
| 969 if (cpi->oxcf.rc_mode == RC_MODE_CBR) | 977 if (cpi->oxcf.rc_mode == VPX_CBR) |
| 970 q = rc_pick_q_and_bounds_one_pass_cbr(cpi, bottom_index, top_index); | 978 q = rc_pick_q_and_bounds_one_pass_cbr(cpi, bottom_index, top_index); |
| 971 else | 979 else |
| 972 q = rc_pick_q_and_bounds_one_pass_vbr(cpi, bottom_index, top_index); | 980 q = rc_pick_q_and_bounds_one_pass_vbr(cpi, bottom_index, top_index); |
| 973 } else { | 981 } else { |
| 974 q = rc_pick_q_and_bounds_two_pass(cpi, bottom_index, top_index); | 982 q = rc_pick_q_and_bounds_two_pass(cpi, bottom_index, top_index); |
| 975 } | 983 } |
| 976 | |
| 977 if (cpi->sf.use_nonrd_pick_mode) { | 984 if (cpi->sf.use_nonrd_pick_mode) { |
| 978 if (cpi->sf.force_frame_boost == 1) | 985 if (cpi->sf.force_frame_boost == 1) |
| 979 q -= cpi->sf.max_delta_qindex; | 986 q -= cpi->sf.max_delta_qindex; |
| 980 | 987 |
| 981 if (q < *bottom_index) | 988 if (q < *bottom_index) |
| 982 *bottom_index = q; | 989 *bottom_index = q; |
| 983 else if (q > *top_index) | 990 else if (q > *top_index) |
| 984 *top_index = q; | 991 *top_index = q; |
| 985 } | 992 } |
| 986 return q; | 993 return q; |
| 987 } | 994 } |
| 988 | 995 |
| 989 void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi, | 996 void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi, |
| 990 int frame_target, | 997 int frame_target, |
| 991 int *frame_under_shoot_limit, | 998 int *frame_under_shoot_limit, |
| 992 int *frame_over_shoot_limit) { | 999 int *frame_over_shoot_limit) { |
| 993 if (cpi->oxcf.rc_mode == RC_MODE_CONSTANT_QUALITY) { | 1000 if (cpi->oxcf.rc_mode == VPX_Q) { |
| 994 *frame_under_shoot_limit = 0; | 1001 *frame_under_shoot_limit = 0; |
| 995 *frame_over_shoot_limit = INT_MAX; | 1002 *frame_over_shoot_limit = INT_MAX; |
| 996 } else { | 1003 } else { |
| 997 // For very small rate targets where the fractional adjustment | 1004 // For very small rate targets where the fractional adjustment |
| 998 // may be tiny make sure there is at least a minimum range. | 1005 // may be tiny make sure there is at least a minimum range. |
| 999 const int tolerance = (cpi->sf.recode_tolerance * frame_target) / 100; | 1006 const int tolerance = (cpi->sf.recode_tolerance * frame_target) / 100; |
| 1000 *frame_under_shoot_limit = MAX(frame_target - tolerance - 200, 0); | 1007 *frame_under_shoot_limit = MAX(frame_target - tolerance - 200, 0); |
| 1001 *frame_over_shoot_limit = MIN(frame_target + tolerance + 200, | 1008 *frame_over_shoot_limit = MIN(frame_target + tolerance + 200, |
| 1002 cpi->rc.max_frame_bandwidth); | 1009 cpi->rc.max_frame_bandwidth); |
| 1003 } | 1010 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 1065 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 1059 RATE_CONTROL *const rc = &cpi->rc; | 1066 RATE_CONTROL *const rc = &cpi->rc; |
| 1060 const int qindex = cm->base_qindex; | 1067 const int qindex = cm->base_qindex; |
| 1061 | 1068 |
| 1062 // Update rate control heuristics | 1069 // Update rate control heuristics |
| 1063 rc->projected_frame_size = (int)(bytes_used << 3); | 1070 rc->projected_frame_size = (int)(bytes_used << 3); |
| 1064 | 1071 |
| 1065 // Post encode loop adjustment of Q prediction. | 1072 // Post encode loop adjustment of Q prediction. |
| 1066 vp9_rc_update_rate_correction_factors( | 1073 vp9_rc_update_rate_correction_factors( |
| 1067 cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF || | 1074 cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF || |
| 1068 oxcf->rc_mode == RC_MODE_CBR) ? 2 : 0); | 1075 oxcf->rc_mode == VPX_CBR) ? 2 : 0); |
| 1069 | 1076 |
| 1070 // Keep a record of last Q and ambient average Q. | 1077 // Keep a record of last Q and ambient average Q. |
| 1071 if (cm->frame_type == KEY_FRAME) { | 1078 if (cm->frame_type == KEY_FRAME) { |
| 1072 rc->last_q[KEY_FRAME] = qindex; | 1079 rc->last_q[KEY_FRAME] = qindex; |
| 1073 rc->avg_frame_qindex[KEY_FRAME] = | 1080 rc->avg_frame_qindex[KEY_FRAME] = |
| 1074 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[KEY_FRAME] + qindex, 2); | 1081 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[KEY_FRAME] + qindex, 2); |
| 1075 } else if (!rc->is_src_frame_alt_ref && | |
| 1076 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) && | |
| 1077 !(cpi->use_svc && oxcf->rc_mode == RC_MODE_CBR)) { | |
| 1078 rc->last_q[2] = qindex; | |
| 1079 rc->avg_frame_qindex[2] = | |
| 1080 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[2] + qindex, 2); | |
| 1081 } else { | 1082 } else { |
| 1082 rc->last_q[INTER_FRAME] = qindex; | 1083 if (rc->is_src_frame_alt_ref || |
| 1083 rc->avg_frame_qindex[INTER_FRAME] = | 1084 !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) || |
| 1085 (cpi->use_svc && oxcf->rc_mode == VPX_CBR)) { |
| 1086 rc->last_q[INTER_FRAME] = qindex; |
| 1087 rc->avg_frame_qindex[INTER_FRAME] = |
| 1084 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[INTER_FRAME] + qindex, 2); | 1088 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[INTER_FRAME] + qindex, 2); |
| 1085 rc->ni_frames++; | 1089 rc->ni_frames++; |
| 1086 rc->tot_q += vp9_convert_qindex_to_q(qindex); | 1090 rc->tot_q += vp9_convert_qindex_to_q(qindex); |
| 1087 rc->avg_q = rc->tot_q / rc->ni_frames; | 1091 rc->avg_q = rc->tot_q / rc->ni_frames; |
| 1088 // Calculate the average Q for normal inter frames (not key or GFU frames). | 1092 // Calculate the average Q for normal inter frames (not key or GFU |
| 1089 rc->ni_tot_qi += qindex; | 1093 // frames). |
| 1090 rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames; | 1094 rc->ni_tot_qi += qindex; |
| 1095 rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames; |
| 1096 } |
| 1091 } | 1097 } |
| 1092 | 1098 |
| 1093 // Keep record of last boosted (KF/KF/ARF) Q value. | 1099 // Keep record of last boosted (KF/KF/ARF) Q value. |
| 1094 // If the current frame is coded at a lower Q then we also update it. | 1100 // If the current frame is coded at a lower Q then we also update it. |
| 1095 // If all mbs in this group are skipped only update if the Q value is | 1101 // If all mbs in this group are skipped only update if the Q value is |
| 1096 // better than that already stored. | 1102 // better than that already stored. |
| 1097 // This is used to help set quality in forced key frames to reduce popping | 1103 // This is used to help set quality in forced key frames to reduce popping |
| 1098 if ((qindex < rc->last_boosted_qindex) || | 1104 if ((qindex < rc->last_boosted_qindex) || |
| 1099 ((cpi->static_mb_pct < 100) && | 1105 ((cpi->static_mb_pct < 100) && |
| 1100 ((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame || | 1106 ((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame || |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1116 rc->long_rolling_actual_bits = ROUND_POWER_OF_TWO( | 1122 rc->long_rolling_actual_bits = ROUND_POWER_OF_TWO( |
| 1117 rc->long_rolling_actual_bits * 31 + rc->projected_frame_size, 5); | 1123 rc->long_rolling_actual_bits * 31 + rc->projected_frame_size, 5); |
| 1118 } | 1124 } |
| 1119 | 1125 |
| 1120 // Actual bits spent | 1126 // Actual bits spent |
| 1121 rc->total_actual_bits += rc->projected_frame_size; | 1127 rc->total_actual_bits += rc->projected_frame_size; |
| 1122 rc->total_target_bits += cm->show_frame ? rc->avg_frame_bandwidth : 0; | 1128 rc->total_target_bits += cm->show_frame ? rc->avg_frame_bandwidth : 0; |
| 1123 | 1129 |
| 1124 rc->total_target_vs_actual = rc->total_actual_bits - rc->total_target_bits; | 1130 rc->total_target_vs_actual = rc->total_actual_bits - rc->total_target_bits; |
| 1125 | 1131 |
| 1126 if (oxcf->play_alternate && cpi->refresh_alt_ref_frame && | 1132 if (is_altref_enabled(oxcf) && cpi->refresh_alt_ref_frame && |
| 1127 (cm->frame_type != KEY_FRAME)) | 1133 (cm->frame_type != KEY_FRAME)) |
| 1128 // Update the alternate reference frame stats as appropriate. | 1134 // Update the alternate reference frame stats as appropriate. |
| 1129 update_alt_ref_frame_stats(cpi); | 1135 update_alt_ref_frame_stats(cpi); |
| 1130 else | 1136 else |
| 1131 // Update the Golden frame stats as appropriate. | 1137 // Update the Golden frame stats as appropriate. |
| 1132 update_golden_frame_stats(cpi); | 1138 update_golden_frame_stats(cpi); |
| 1133 | 1139 |
| 1134 if (cm->frame_type == KEY_FRAME) | 1140 if (cm->frame_type == KEY_FRAME) |
| 1135 rc->frames_since_key = 0; | 1141 rc->frames_since_key = 0; |
| 1136 if (cm->show_frame) { | 1142 if (cm->show_frame) { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1207 target = calc_iframe_target_size_one_pass_vbr(cpi); | 1213 target = calc_iframe_target_size_one_pass_vbr(cpi); |
| 1208 else | 1214 else |
| 1209 target = calc_pframe_target_size_one_pass_vbr(cpi); | 1215 target = calc_pframe_target_size_one_pass_vbr(cpi); |
| 1210 vp9_rc_set_frame_target(cpi, target); | 1216 vp9_rc_set_frame_target(cpi, target); |
| 1211 } | 1217 } |
| 1212 | 1218 |
| 1213 static int calc_pframe_target_size_one_pass_cbr(const VP9_COMP *cpi) { | 1219 static int calc_pframe_target_size_one_pass_cbr(const VP9_COMP *cpi) { |
| 1214 const VP9EncoderConfig *oxcf = &cpi->oxcf; | 1220 const VP9EncoderConfig *oxcf = &cpi->oxcf; |
| 1215 const RATE_CONTROL *rc = &cpi->rc; | 1221 const RATE_CONTROL *rc = &cpi->rc; |
| 1216 const SVC *const svc = &cpi->svc; | 1222 const SVC *const svc = &cpi->svc; |
| 1217 const int64_t diff = oxcf->optimal_buffer_level - rc->buffer_level; | 1223 const int64_t diff = rc->optimal_buffer_level - rc->buffer_level; |
| 1218 const int64_t one_pct_bits = 1 + oxcf->optimal_buffer_level / 100; | 1224 const int64_t one_pct_bits = 1 + rc->optimal_buffer_level / 100; |
| 1219 int min_frame_target = MAX(rc->avg_frame_bandwidth >> 4, FRAME_OVERHEAD_BITS); | 1225 int min_frame_target = MAX(rc->avg_frame_bandwidth >> 4, FRAME_OVERHEAD_BITS); |
| 1220 int target = rc->avg_frame_bandwidth; | 1226 int target = rc->avg_frame_bandwidth; |
| 1221 if (svc->number_temporal_layers > 1 && | 1227 if (svc->number_temporal_layers > 1 && |
| 1222 oxcf->rc_mode == RC_MODE_CBR) { | 1228 oxcf->rc_mode == VPX_CBR) { |
| 1223 // Note that for layers, avg_frame_bandwidth is the cumulative | 1229 // Note that for layers, avg_frame_bandwidth is the cumulative |
| 1224 // per-frame-bandwidth. For the target size of this frame, use the | 1230 // per-frame-bandwidth. For the target size of this frame, use the |
| 1225 // layer average frame size (i.e., non-cumulative per-frame-bw). | 1231 // layer average frame size (i.e., non-cumulative per-frame-bw). |
| 1226 int current_temporal_layer = svc->temporal_layer_id; | 1232 int current_temporal_layer = svc->temporal_layer_id; |
| 1227 const LAYER_CONTEXT *lc = &svc->layer_context[current_temporal_layer]; | 1233 const LAYER_CONTEXT *lc = &svc->layer_context[current_temporal_layer]; |
| 1228 target = lc->avg_frame_size; | 1234 target = lc->avg_frame_size; |
| 1229 min_frame_target = MAX(lc->avg_frame_size >> 4, FRAME_OVERHEAD_BITS); | 1235 min_frame_target = MAX(lc->avg_frame_size >> 4, FRAME_OVERHEAD_BITS); |
| 1230 } | 1236 } |
| 1231 if (diff > 0) { | 1237 if (diff > 0) { |
| 1232 // Lower the target bandwidth for this frame. | 1238 // Lower the target bandwidth for this frame. |
| 1233 const int pct_low = (int)MIN(diff / one_pct_bits, oxcf->under_shoot_pct); | 1239 const int pct_low = (int)MIN(diff / one_pct_bits, oxcf->under_shoot_pct); |
| 1234 target -= (target * pct_low) / 200; | 1240 target -= (target * pct_low) / 200; |
| 1235 } else if (diff < 0) { | 1241 } else if (diff < 0) { |
| 1236 // Increase the target bandwidth for this frame. | 1242 // Increase the target bandwidth for this frame. |
| 1237 const int pct_high = (int)MIN(-diff / one_pct_bits, oxcf->over_shoot_pct); | 1243 const int pct_high = (int)MIN(-diff / one_pct_bits, oxcf->over_shoot_pct); |
| 1238 target += (target * pct_high) / 200; | 1244 target += (target * pct_high) / 200; |
| 1239 } | 1245 } |
| 1240 return MAX(min_frame_target, target); | 1246 return MAX(min_frame_target, target); |
| 1241 } | 1247 } |
| 1242 | 1248 |
| 1243 static int calc_iframe_target_size_one_pass_cbr(const VP9_COMP *cpi) { | 1249 static int calc_iframe_target_size_one_pass_cbr(const VP9_COMP *cpi) { |
| 1244 const RATE_CONTROL *rc = &cpi->rc; | 1250 const RATE_CONTROL *rc = &cpi->rc; |
| 1245 const VP9EncoderConfig *oxcf = &cpi->oxcf; | 1251 const VP9EncoderConfig *oxcf = &cpi->oxcf; |
| 1246 const SVC *const svc = &cpi->svc; | 1252 const SVC *const svc = &cpi->svc; |
| 1247 int target; | 1253 int target; |
| 1248 if (cpi->common.current_video_frame == 0) { | 1254 if (cpi->common.current_video_frame == 0) { |
| 1249 target = ((cpi->oxcf.starting_buffer_level / 2) > INT_MAX) | 1255 target = ((rc->starting_buffer_level / 2) > INT_MAX) |
| 1250 ? INT_MAX : (int)(cpi->oxcf.starting_buffer_level / 2); | 1256 ? INT_MAX : (int)(rc->starting_buffer_level / 2); |
| 1251 } else { | 1257 } else { |
| 1252 int kf_boost = 32; | 1258 int kf_boost = 32; |
| 1253 double framerate = oxcf->framerate; | 1259 double framerate = oxcf->framerate; |
| 1254 if (svc->number_temporal_layers > 1 && | 1260 if (svc->number_temporal_layers > 1 && |
| 1255 oxcf->rc_mode == RC_MODE_CBR) { | 1261 oxcf->rc_mode == VPX_CBR) { |
| 1256 // Use the layer framerate for temporal layers CBR mode. | 1262 // Use the layer framerate for temporal layers CBR mode. |
| 1257 const LAYER_CONTEXT *lc = &svc->layer_context[svc->temporal_layer_id]; | 1263 const LAYER_CONTEXT *lc = &svc->layer_context[svc->temporal_layer_id]; |
| 1258 framerate = lc->framerate; | 1264 framerate = lc->framerate; |
| 1259 } | 1265 } |
| 1260 kf_boost = MAX(kf_boost, (int)(2 * framerate - 16)); | 1266 kf_boost = MAX(kf_boost, (int)(2 * framerate - 16)); |
| 1261 if (rc->frames_since_key < framerate / 2) { | 1267 if (rc->frames_since_key < framerate / 2) { |
| 1262 kf_boost = (int)(kf_boost * rc->frames_since_key / | 1268 kf_boost = (int)(kf_boost * rc->frames_since_key / |
| 1263 (framerate / 2)); | 1269 (framerate / 2)); |
| 1264 } | 1270 } |
| 1265 target = ((16 + kf_boost) * rc->avg_frame_bandwidth) >> 4; | 1271 target = ((16 + kf_boost) * rc->avg_frame_bandwidth) >> 4; |
| 1266 } | 1272 } |
| 1267 return vp9_rc_clamp_iframe_target_size(cpi, target); | 1273 return vp9_rc_clamp_iframe_target_size(cpi, target); |
| 1268 } | 1274 } |
| 1269 | 1275 |
| 1270 void vp9_rc_get_svc_params(VP9_COMP *cpi) { | 1276 void vp9_rc_get_svc_params(VP9_COMP *cpi) { |
| 1271 VP9_COMMON *const cm = &cpi->common; | 1277 VP9_COMMON *const cm = &cpi->common; |
| 1272 RATE_CONTROL *const rc = &cpi->rc; | 1278 RATE_CONTROL *const rc = &cpi->rc; |
| 1273 int target = rc->avg_frame_bandwidth; | 1279 int target = rc->avg_frame_bandwidth; |
| 1274 if ((cm->current_video_frame == 0) || | 1280 if ((cm->current_video_frame == 0) || |
| 1275 (cpi->frame_flags & FRAMEFLAGS_KEY) || | 1281 (cpi->frame_flags & FRAMEFLAGS_KEY) || |
| 1276 (cpi->oxcf.auto_key && (rc->frames_since_key % | 1282 (cpi->oxcf.auto_key && (rc->frames_since_key % |
| 1277 cpi->oxcf.key_freq == 0))) { | 1283 cpi->oxcf.key_freq == 0))) { |
| 1278 cm->frame_type = KEY_FRAME; | 1284 cm->frame_type = KEY_FRAME; |
| 1279 rc->source_alt_ref_active = 0; | 1285 rc->source_alt_ref_active = 0; |
| 1280 | 1286 |
| 1281 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { | 1287 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { |
| 1282 cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame = 1; | 1288 cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame = 1; |
| 1283 } | 1289 } |
| 1284 | 1290 |
| 1285 if (cpi->pass == 0 && cpi->oxcf.rc_mode == RC_MODE_CBR) { | 1291 if (cpi->pass == 0 && cpi->oxcf.rc_mode == VPX_CBR) { |
| 1286 target = calc_iframe_target_size_one_pass_cbr(cpi); | 1292 target = calc_iframe_target_size_one_pass_cbr(cpi); |
| 1287 } | 1293 } |
| 1288 } else { | 1294 } else { |
| 1289 cm->frame_type = INTER_FRAME; | 1295 cm->frame_type = INTER_FRAME; |
| 1290 | 1296 |
| 1291 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { | 1297 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { |
| 1292 LAYER_CONTEXT *lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; | 1298 LAYER_CONTEXT *lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; |
| 1293 if (cpi->svc.spatial_layer_id == 0) { | 1299 if (cpi->svc.spatial_layer_id == 0) { |
| 1294 lc->is_key_frame = 0; | 1300 lc->is_key_frame = 0; |
| 1295 } else { | 1301 } else { |
| 1296 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; | 1302 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; |
| 1297 } | 1303 } |
| 1298 } | 1304 } |
| 1299 | 1305 |
| 1300 if (cpi->pass == 0 && cpi->oxcf.rc_mode == RC_MODE_CBR) { | 1306 if (cpi->pass == 0 && cpi->oxcf.rc_mode == VPX_CBR) { |
| 1301 target = calc_pframe_target_size_one_pass_cbr(cpi); | 1307 target = calc_pframe_target_size_one_pass_cbr(cpi); |
| 1302 } | 1308 } |
| 1303 } | 1309 } |
| 1304 vp9_rc_set_frame_target(cpi, target); | 1310 vp9_rc_set_frame_target(cpi, target); |
| 1305 rc->frames_till_gf_update_due = INT_MAX; | 1311 rc->frames_till_gf_update_due = INT_MAX; |
| 1306 rc->baseline_gf_interval = INT_MAX; | 1312 rc->baseline_gf_interval = INT_MAX; |
| 1307 } | 1313 } |
| 1308 | 1314 |
| 1309 void vp9_rc_get_one_pass_cbr_params(VP9_COMP *cpi) { | 1315 void vp9_rc_get_one_pass_cbr_params(VP9_COMP *cpi) { |
| 1310 VP9_COMMON *const cm = &cpi->common; | 1316 VP9_COMMON *const cm = &cpi->common; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1368 // Convert the q target to an index | 1374 // Convert the q target to an index |
| 1369 for (i = rc->best_quality; i < rc->worst_quality; ++i) { | 1375 for (i = rc->best_quality; i < rc->worst_quality; ++i) { |
| 1370 target_index = i; | 1376 target_index = i; |
| 1371 if (vp9_rc_bits_per_mb(frame_type, i, 1.0) <= target_bits_per_mb ) | 1377 if (vp9_rc_bits_per_mb(frame_type, i, 1.0) <= target_bits_per_mb ) |
| 1372 break; | 1378 break; |
| 1373 } | 1379 } |
| 1374 | 1380 |
| 1375 return target_index - qindex; | 1381 return target_index - qindex; |
| 1376 } | 1382 } |
| 1377 | 1383 |
| 1384 void vp9_rc_set_gf_max_interval(const VP9EncoderConfig *const oxcf, |
| 1385 RATE_CONTROL *const rc) { |
| 1386 // Set Maximum gf/arf interval |
| 1387 rc->max_gf_interval = 16; |
| 1388 |
| 1389 // Extended interval for genuinely static scenes |
| 1390 rc->static_scene_max_gf_interval = oxcf->key_freq >> 1; |
| 1391 |
| 1392 if (is_altref_enabled(oxcf)) { |
| 1393 if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1) |
| 1394 rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1; |
| 1395 } |
| 1396 |
| 1397 if (rc->max_gf_interval > rc->static_scene_max_gf_interval) |
| 1398 rc->max_gf_interval = rc->static_scene_max_gf_interval; |
| 1399 } |
| 1400 |
| 1378 void vp9_rc_update_framerate(VP9_COMP *cpi) { | 1401 void vp9_rc_update_framerate(VP9_COMP *cpi) { |
| 1379 const VP9_COMMON *const cm = &cpi->common; | 1402 const VP9_COMMON *const cm = &cpi->common; |
| 1380 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 1403 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 1381 RATE_CONTROL *const rc = &cpi->rc; | 1404 RATE_CONTROL *const rc = &cpi->rc; |
| 1382 int vbr_max_bits; | 1405 int vbr_max_bits; |
| 1383 | 1406 |
| 1384 rc->avg_frame_bandwidth = (int)(oxcf->target_bandwidth / oxcf->framerate); | 1407 rc->avg_frame_bandwidth = (int)(oxcf->target_bandwidth / oxcf->framerate); |
| 1385 rc->min_frame_bandwidth = (int)(rc->avg_frame_bandwidth * | 1408 rc->min_frame_bandwidth = (int)(rc->avg_frame_bandwidth * |
| 1386 oxcf->two_pass_vbrmin_section / 100); | 1409 oxcf->two_pass_vbrmin_section / 100); |
| 1387 | 1410 |
| 1388 rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS); | 1411 rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS); |
| 1389 | 1412 |
| 1390 // A maximum bitrate for a frame is defined. | 1413 // A maximum bitrate for a frame is defined. |
| 1391 // The baseline for this aligns with HW implementations that | 1414 // The baseline for this aligns with HW implementations that |
| 1392 // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits | 1415 // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits |
| 1393 // per 16x16 MB (averaged over a frame). However this limit is extended if | 1416 // per 16x16 MB (averaged over a frame). However this limit is extended if |
| 1394 // a very high rate is given on the command line or the the rate cannnot | 1417 // a very high rate is given on the command line or the the rate cannnot |
| 1395 // be acheived because of a user specificed max q (e.g. when the user | 1418 // be acheived because of a user specificed max q (e.g. when the user |
| 1396 // specifies lossless encode. | 1419 // specifies lossless encode. |
| 1397 vbr_max_bits = (int)(((int64_t)rc->avg_frame_bandwidth * | 1420 vbr_max_bits = (int)(((int64_t)rc->avg_frame_bandwidth * |
| 1398 oxcf->two_pass_vbrmax_section) / 100); | 1421 oxcf->two_pass_vbrmax_section) / 100); |
| 1399 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), | 1422 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), |
| 1400 vbr_max_bits); | 1423 vbr_max_bits); |
| 1401 | 1424 |
| 1402 // Set Maximum gf/arf interval | 1425 vp9_rc_set_gf_max_interval(oxcf, rc); |
| 1403 rc->max_gf_interval = 16; | |
| 1404 | |
| 1405 // Extended interval for genuinely static scenes | |
| 1406 rc->static_scene_max_gf_interval = cpi->oxcf.key_freq >> 1; | |
| 1407 | |
| 1408 // Special conditions when alt ref frame enabled in lagged compress mode | |
| 1409 if (oxcf->play_alternate && oxcf->lag_in_frames) { | |
| 1410 if (rc->max_gf_interval > oxcf->lag_in_frames - 1) | |
| 1411 rc->max_gf_interval = oxcf->lag_in_frames - 1; | |
| 1412 | |
| 1413 if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1) | |
| 1414 rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1; | |
| 1415 } | |
| 1416 | |
| 1417 if (rc->max_gf_interval > rc->static_scene_max_gf_interval) | |
| 1418 rc->max_gf_interval = rc->static_scene_max_gf_interval; | |
| 1419 } | 1426 } |
| OLD | NEW |