| 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 24 matching lines...) Expand all Loading... |
| 35 #define DEFAULT_KF_BOOST 2000 | 35 #define DEFAULT_KF_BOOST 2000 |
| 36 #define DEFAULT_GF_BOOST 2000 | 36 #define DEFAULT_GF_BOOST 2000 |
| 37 | 37 |
| 38 #define LIMIT_QRANGE_FOR_ALTREF_AND_KEY 1 | 38 #define LIMIT_QRANGE_FOR_ALTREF_AND_KEY 1 |
| 39 | 39 |
| 40 #define MIN_BPB_FACTOR 0.005 | 40 #define MIN_BPB_FACTOR 0.005 |
| 41 #define MAX_BPB_FACTOR 50 | 41 #define MAX_BPB_FACTOR 50 |
| 42 | 42 |
| 43 #define FRAME_OVERHEAD_BITS 200 | 43 #define FRAME_OVERHEAD_BITS 200 |
| 44 | 44 |
| 45 #if CONFIG_VP9_HIGHBITDEPTH |
| 46 #define ASSIGN_MINQ_TABLE(bit_depth, name) \ |
| 47 do { \ |
| 48 switch (bit_depth) { \ |
| 49 case VPX_BITS_8: \ |
| 50 name = name##_8; \ |
| 51 break; \ |
| 52 case VPX_BITS_10: \ |
| 53 name = name##_10; \ |
| 54 break; \ |
| 55 case VPX_BITS_12: \ |
| 56 name = name##_12; \ |
| 57 break; \ |
| 58 default: \ |
| 59 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10" \ |
| 60 " or VPX_BITS_12"); \ |
| 61 name = NULL; \ |
| 62 } \ |
| 63 } while (0) |
| 64 #else |
| 65 #define ASSIGN_MINQ_TABLE(bit_depth, name) \ |
| 66 do { \ |
| 67 (void) bit_depth; \ |
| 68 name = name##_8; \ |
| 69 } while (0) |
| 70 #endif |
| 71 |
| 45 // Tables relating active max Q to active min Q | 72 // Tables relating active max Q to active min Q |
| 46 static int kf_low_motion_minq[QINDEX_RANGE]; | 73 static int kf_low_motion_minq_8[QINDEX_RANGE]; |
| 47 static int kf_high_motion_minq[QINDEX_RANGE]; | 74 static int kf_high_motion_minq_8[QINDEX_RANGE]; |
| 48 static int arfgf_low_motion_minq[QINDEX_RANGE]; | 75 static int arfgf_low_motion_minq_8[QINDEX_RANGE]; |
| 49 static int arfgf_high_motion_minq[QINDEX_RANGE]; | 76 static int arfgf_high_motion_minq_8[QINDEX_RANGE]; |
| 50 static int inter_minq[QINDEX_RANGE]; | 77 static int inter_minq_8[QINDEX_RANGE]; |
| 51 static int rtc_minq[QINDEX_RANGE]; | 78 static int rtc_minq_8[QINDEX_RANGE]; |
| 79 |
| 80 #if CONFIG_VP9_HIGHBITDEPTH |
| 81 static int kf_low_motion_minq_10[QINDEX_RANGE]; |
| 82 static int kf_high_motion_minq_10[QINDEX_RANGE]; |
| 83 static int arfgf_low_motion_minq_10[QINDEX_RANGE]; |
| 84 static int arfgf_high_motion_minq_10[QINDEX_RANGE]; |
| 85 static int inter_minq_10[QINDEX_RANGE]; |
| 86 static int rtc_minq_10[QINDEX_RANGE]; |
| 87 static int kf_low_motion_minq_12[QINDEX_RANGE]; |
| 88 static int kf_high_motion_minq_12[QINDEX_RANGE]; |
| 89 static int arfgf_low_motion_minq_12[QINDEX_RANGE]; |
| 90 static int arfgf_high_motion_minq_12[QINDEX_RANGE]; |
| 91 static int inter_minq_12[QINDEX_RANGE]; |
| 92 static int rtc_minq_12[QINDEX_RANGE]; |
| 93 #endif |
| 94 |
| 52 static int gf_high = 2000; | 95 static int gf_high = 2000; |
| 53 static int gf_low = 400; | 96 static int gf_low = 400; |
| 54 static int kf_high = 5000; | 97 static int kf_high = 5000; |
| 55 static int kf_low = 400; | 98 static int kf_low = 400; |
| 56 | 99 |
| 57 // Functions to compute the active minq lookup table entries based on a | 100 // Functions to compute the active minq lookup table entries based on a |
| 58 // formulaic approach to facilitate easier adjustment of the Q tables. | 101 // formulaic approach to facilitate easier adjustment of the Q tables. |
| 59 // The formulae were derived from computing a 3rd order polynomial best | 102 // The formulae were derived from computing a 3rd order polynomial best |
| 60 // fit to the original data (after plotting real maxq vs minq (not q index)) | 103 // fit to the original data (after plotting real maxq vs minq (not q index)) |
| 61 static int get_minq_index(double maxq, double x3, double x2, double x1) { | 104 static int get_minq_index(double maxq, double x3, double x2, double x1, |
| 105 vpx_bit_depth_t bit_depth) { |
| 62 int i; | 106 int i; |
| 63 const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq, | 107 const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq, |
| 64 maxq); | 108 maxq); |
| 65 | 109 |
| 66 // Special case handling to deal with the step from q2.0 | 110 // Special case handling to deal with the step from q2.0 |
| 67 // down to lossless mode represented by q 1.0. | 111 // down to lossless mode represented by q 1.0. |
| 68 if (minqtarget <= 2.0) | 112 if (minqtarget <= 2.0) |
| 69 return 0; | 113 return 0; |
| 70 | 114 |
| 71 for (i = 0; i < QINDEX_RANGE; i++) | 115 for (i = 0; i < QINDEX_RANGE; i++) { |
| 72 if (minqtarget <= vp9_convert_qindex_to_q(i)) | 116 if (minqtarget <= vp9_convert_qindex_to_q(i, bit_depth)) |
| 73 return i; | 117 return i; |
| 118 } |
| 74 | 119 |
| 75 return QINDEX_RANGE - 1; | 120 return QINDEX_RANGE - 1; |
| 76 } | 121 } |
| 77 | 122 |
| 123 static void init_minq_luts(int *kf_low_m, int *kf_high_m, |
| 124 int *arfgf_low, int *arfgf_high, |
| 125 int *inter, int *rtc, vpx_bit_depth_t bit_depth) { |
| 126 int i; |
| 127 for (i = 0; i < QINDEX_RANGE; i++) { |
| 128 const double maxq = vp9_convert_qindex_to_q(i, bit_depth); |
| 129 kf_low_m[i] = get_minq_index(maxq, 0.000001, -0.0004, 0.150, bit_depth); |
| 130 kf_high_m[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55, bit_depth); |
| 131 arfgf_low[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.30, bit_depth); |
| 132 arfgf_high[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55, bit_depth); |
| 133 inter[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.90, bit_depth); |
| 134 rtc[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.70, bit_depth); |
| 135 } |
| 136 } |
| 137 |
| 78 void vp9_rc_init_minq_luts() { | 138 void vp9_rc_init_minq_luts() { |
| 79 int i; | 139 init_minq_luts(kf_low_motion_minq_8, kf_high_motion_minq_8, |
| 80 | 140 arfgf_low_motion_minq_8, arfgf_high_motion_minq_8, |
| 81 for (i = 0; i < QINDEX_RANGE; i++) { | 141 inter_minq_8, rtc_minq_8, VPX_BITS_8); |
| 82 const double maxq = vp9_convert_qindex_to_q(i); | 142 #if CONFIG_VP9_HIGHBITDEPTH |
| 83 kf_low_motion_minq[i] = get_minq_index(maxq, 0.000001, -0.0004, 0.125); | 143 init_minq_luts(kf_low_motion_minq_10, kf_high_motion_minq_10, |
| 84 kf_high_motion_minq[i] = get_minq_index(maxq, 0.000002, -0.0012, 0.50); | 144 arfgf_low_motion_minq_10, arfgf_high_motion_minq_10, |
| 85 arfgf_low_motion_minq[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.30); | 145 inter_minq_10, rtc_minq_10, VPX_BITS_10); |
| 86 arfgf_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.50); | 146 init_minq_luts(kf_low_motion_minq_12, kf_high_motion_minq_12, |
| 87 inter_minq[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.90); | 147 arfgf_low_motion_minq_12, arfgf_high_motion_minq_12, |
| 88 rtc_minq[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.70); | 148 inter_minq_12, rtc_minq_12, VPX_BITS_12); |
| 89 } | 149 #endif |
| 90 } | 150 } |
| 91 | 151 |
| 92 // These functions use formulaic calculations to make playing with the | 152 // These functions use formulaic calculations to make playing with the |
| 93 // quantizer tables easier. If necessary they can be replaced by lookup | 153 // quantizer tables easier. If necessary they can be replaced by lookup |
| 94 // tables if and when things settle down in the experimental bitstream | 154 // tables if and when things settle down in the experimental bitstream |
| 95 double vp9_convert_qindex_to_q(int qindex) { | 155 double vp9_convert_qindex_to_q(int qindex, vpx_bit_depth_t bit_depth) { |
| 96 // Convert the index to a real Q value (scaled down to match old Q values) | 156 // Convert the index to a real Q value (scaled down to match old Q values) |
| 97 return vp9_ac_quant(qindex, 0) / 4.0; | 157 #if CONFIG_VP9_HIGHBITDEPTH |
| 158 switch (bit_depth) { |
| 159 case VPX_BITS_8: |
| 160 return vp9_ac_quant(qindex, 0, bit_depth) / 4.0; |
| 161 case VPX_BITS_10: |
| 162 return vp9_ac_quant(qindex, 0, bit_depth) / 16.0; |
| 163 case VPX_BITS_12: |
| 164 return vp9_ac_quant(qindex, 0, bit_depth) / 64.0; |
| 165 default: |
| 166 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); |
| 167 return -1.0; |
| 168 } |
| 169 #else |
| 170 return vp9_ac_quant(qindex, 0, bit_depth) / 4.0; |
| 171 #endif |
| 98 } | 172 } |
| 99 | 173 |
| 100 int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex, | 174 int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex, |
| 101 double correction_factor) { | 175 double correction_factor, |
| 102 const double q = vp9_convert_qindex_to_q(qindex); | 176 vpx_bit_depth_t bit_depth) { |
| 103 int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000; | 177 const double q = vp9_convert_qindex_to_q(qindex, bit_depth); |
| 178 int enumerator = frame_type == KEY_FRAME ? 2700000 : 1800000; |
| 104 | 179 |
| 105 // q based adjustment to baseline enumerator | 180 // q based adjustment to baseline enumerator |
| 106 enumerator += (int)(enumerator * q) >> 12; | 181 enumerator += (int)(enumerator * q) >> 12; |
| 107 return (int)(enumerator * correction_factor / q); | 182 return (int)(enumerator * correction_factor / q); |
| 108 } | 183 } |
| 109 | 184 |
| 110 static int estimate_bits_at_q(FRAME_TYPE frame_type, int q, int mbs, | 185 static int estimate_bits_at_q(FRAME_TYPE frame_type, int q, int mbs, |
| 111 double correction_factor) { | 186 double correction_factor, |
| 112 const int bpm = (int)(vp9_rc_bits_per_mb(frame_type, q, correction_factor)); | 187 vpx_bit_depth_t bit_depth) { |
| 188 const int bpm = (int)(vp9_rc_bits_per_mb(frame_type, q, correction_factor, |
| 189 bit_depth)); |
| 113 return ((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS; | 190 return ((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS; |
| 114 } | 191 } |
| 115 | 192 |
| 116 int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) { | 193 int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) { |
| 117 const RATE_CONTROL *rc = &cpi->rc; | 194 const RATE_CONTROL *rc = &cpi->rc; |
| 118 const int min_frame_target = MAX(rc->min_frame_bandwidth, | 195 const int min_frame_target = MAX(rc->min_frame_bandwidth, |
| 119 rc->avg_frame_bandwidth >> 5); | 196 rc->avg_frame_bandwidth >> 5); |
| 120 if (target < min_frame_target) | 197 if (target < min_frame_target) |
| 121 target = min_frame_target; | 198 target = min_frame_target; |
| 122 if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) { | 199 if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) { |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 rc->source_alt_ref_pending = 0; | 297 rc->source_alt_ref_pending = 0; |
| 221 rc->source_alt_ref_active = 0; | 298 rc->source_alt_ref_active = 0; |
| 222 | 299 |
| 223 rc->frames_till_gf_update_due = 0; | 300 rc->frames_till_gf_update_due = 0; |
| 224 | 301 |
| 225 rc->ni_av_qi = oxcf->worst_allowed_q; | 302 rc->ni_av_qi = oxcf->worst_allowed_q; |
| 226 rc->ni_tot_qi = 0; | 303 rc->ni_tot_qi = 0; |
| 227 rc->ni_frames = 0; | 304 rc->ni_frames = 0; |
| 228 | 305 |
| 229 rc->tot_q = 0.0; | 306 rc->tot_q = 0.0; |
| 230 rc->avg_q = vp9_convert_qindex_to_q(oxcf->worst_allowed_q); | 307 rc->avg_q = vp9_convert_qindex_to_q(oxcf->worst_allowed_q, oxcf->bit_depth); |
| 231 | 308 |
| 232 for (i = 0; i < RATE_FACTOR_LEVELS; ++i) { | 309 for (i = 0; i < RATE_FACTOR_LEVELS; ++i) { |
| 233 rc->rate_correction_factors[i] = 1.0; | 310 rc->rate_correction_factors[i] = 1.0; |
| 234 } | 311 } |
| 235 } | 312 } |
| 236 | 313 |
| 237 int vp9_rc_drop_frame(VP9_COMP *cpi) { | 314 int vp9_rc_drop_frame(VP9_COMP *cpi) { |
| 238 const VP9EncoderConfig *oxcf = &cpi->oxcf; | 315 const VP9EncoderConfig *oxcf = &cpi->oxcf; |
| 239 RATE_CONTROL *const rc = &cpi->rc; | 316 RATE_CONTROL *const rc = &cpi->rc; |
| 240 | 317 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 return; | 400 return; |
| 324 | 401 |
| 325 // Clear down mmx registers to allow floating point in what follows | 402 // Clear down mmx registers to allow floating point in what follows |
| 326 vp9_clear_system_state(); | 403 vp9_clear_system_state(); |
| 327 | 404 |
| 328 // Work out how big we would have expected the frame to be at this Q given | 405 // Work out how big we would have expected the frame to be at this Q given |
| 329 // the current correction factor. | 406 // the current correction factor. |
| 330 // Stay in double to avoid int overflow when values are large | 407 // Stay in double to avoid int overflow when values are large |
| 331 projected_size_based_on_q = estimate_bits_at_q(cm->frame_type, | 408 projected_size_based_on_q = estimate_bits_at_q(cm->frame_type, |
| 332 cm->base_qindex, cm->MBs, | 409 cm->base_qindex, cm->MBs, |
| 333 rate_correction_factor); | 410 rate_correction_factor, |
| 411 cm->bit_depth); |
| 334 // Work out a size correction factor. | 412 // Work out a size correction factor. |
| 335 if (projected_size_based_on_q > 0) | 413 if (projected_size_based_on_q > 0) |
| 336 correction_factor = (100 * cpi->rc.projected_frame_size) / | 414 correction_factor = (100 * cpi->rc.projected_frame_size) / |
| 337 projected_size_based_on_q; | 415 projected_size_based_on_q; |
| 338 | 416 |
| 339 // More heavily damped adjustment used if we have been oscillating either side | 417 // More heavily damped adjustment used if we have been oscillating either side |
| 340 // of target. | 418 // of target. |
| 341 switch (damp_var) { | 419 switch (damp_var) { |
| 342 case 0: | 420 case 0: |
| 343 adjustment_limit = 0.75; | 421 adjustment_limit = 0.75; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 | 463 |
| 386 // Calculate required scaling factor based on target frame size and size of | 464 // Calculate required scaling factor based on target frame size and size of |
| 387 // frame produced using previous Q. | 465 // frame produced using previous Q. |
| 388 target_bits_per_mb = | 466 target_bits_per_mb = |
| 389 ((uint64_t)target_bits_per_frame << BPER_MB_NORMBITS) / cm->MBs; | 467 ((uint64_t)target_bits_per_frame << BPER_MB_NORMBITS) / cm->MBs; |
| 390 | 468 |
| 391 i = active_best_quality; | 469 i = active_best_quality; |
| 392 | 470 |
| 393 do { | 471 do { |
| 394 const int bits_per_mb_at_this_q = (int)vp9_rc_bits_per_mb(cm->frame_type, i, | 472 const int bits_per_mb_at_this_q = (int)vp9_rc_bits_per_mb(cm->frame_type, i, |
| 395 correction_factor); | 473 correction_factor, |
| 474 cm->bit_depth); |
| 396 | 475 |
| 397 if (bits_per_mb_at_this_q <= target_bits_per_mb) { | 476 if (bits_per_mb_at_this_q <= target_bits_per_mb) { |
| 398 if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error) | 477 if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error) |
| 399 q = i; | 478 q = i; |
| 400 else | 479 else |
| 401 q = i - 1; | 480 q = i - 1; |
| 402 | 481 |
| 403 break; | 482 break; |
| 404 } else { | 483 } else { |
| 405 last_error = bits_per_mb_at_this_q - target_bits_per_mb; | 484 last_error = bits_per_mb_at_this_q - target_bits_per_mb; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 417 return high_motion_minq[q]; | 496 return high_motion_minq[q]; |
| 418 } else { | 497 } else { |
| 419 const int gap = high - low; | 498 const int gap = high - low; |
| 420 const int offset = high - gfu_boost; | 499 const int offset = high - gfu_boost; |
| 421 const int qdiff = high_motion_minq[q] - low_motion_minq[q]; | 500 const int qdiff = high_motion_minq[q] - low_motion_minq[q]; |
| 422 const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap; | 501 const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap; |
| 423 return low_motion_minq[q] + adjustment; | 502 return low_motion_minq[q] + adjustment; |
| 424 } | 503 } |
| 425 } | 504 } |
| 426 | 505 |
| 427 static int get_kf_active_quality(const RATE_CONTROL *const rc, int q) { | 506 static int get_kf_active_quality(const RATE_CONTROL *const rc, int q, |
| 507 vpx_bit_depth_t bit_depth) { |
| 508 int *kf_low_motion_minq; |
| 509 int *kf_high_motion_minq; |
| 510 ASSIGN_MINQ_TABLE(bit_depth, kf_low_motion_minq); |
| 511 ASSIGN_MINQ_TABLE(bit_depth, kf_high_motion_minq); |
| 428 return get_active_quality(q, rc->kf_boost, kf_low, kf_high, | 512 return get_active_quality(q, rc->kf_boost, kf_low, kf_high, |
| 429 kf_low_motion_minq, kf_high_motion_minq); | 513 kf_low_motion_minq, kf_high_motion_minq); |
| 430 } | 514 } |
| 431 | 515 |
| 432 static int get_gf_active_quality(const RATE_CONTROL *const rc, int q) { | 516 static int get_gf_active_quality(const RATE_CONTROL *const rc, int q, |
| 517 vpx_bit_depth_t bit_depth) { |
| 518 int *arfgf_low_motion_minq; |
| 519 int *arfgf_high_motion_minq; |
| 520 ASSIGN_MINQ_TABLE(bit_depth, arfgf_low_motion_minq); |
| 521 ASSIGN_MINQ_TABLE(bit_depth, arfgf_high_motion_minq); |
| 433 return get_active_quality(q, rc->gfu_boost, gf_low, gf_high, | 522 return get_active_quality(q, rc->gfu_boost, gf_low, gf_high, |
| 434 arfgf_low_motion_minq, arfgf_high_motion_minq); | 523 arfgf_low_motion_minq, arfgf_high_motion_minq); |
| 435 } | 524 } |
| 436 | 525 |
| 437 static int calc_active_worst_quality_one_pass_vbr(const VP9_COMP *cpi) { | 526 static int calc_active_worst_quality_one_pass_vbr(const VP9_COMP *cpi) { |
| 438 const RATE_CONTROL *const rc = &cpi->rc; | 527 const RATE_CONTROL *const rc = &cpi->rc; |
| 439 const unsigned int curr_frame = cpi->common.current_video_frame; | 528 const unsigned int curr_frame = cpi->common.current_video_frame; |
| 440 int active_worst_quality; | 529 int active_worst_quality; |
| 441 | 530 |
| 442 if (cpi->common.frame_type == KEY_FRAME) { | 531 if (cpi->common.frame_type == KEY_FRAME) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 } | 598 } |
| 510 | 599 |
| 511 static int rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi, | 600 static int rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi, |
| 512 int *bottom_index, | 601 int *bottom_index, |
| 513 int *top_index) { | 602 int *top_index) { |
| 514 const VP9_COMMON *const cm = &cpi->common; | 603 const VP9_COMMON *const cm = &cpi->common; |
| 515 const RATE_CONTROL *const rc = &cpi->rc; | 604 const RATE_CONTROL *const rc = &cpi->rc; |
| 516 int active_best_quality; | 605 int active_best_quality; |
| 517 int active_worst_quality = calc_active_worst_quality_one_pass_cbr(cpi); | 606 int active_worst_quality = calc_active_worst_quality_one_pass_cbr(cpi); |
| 518 int q; | 607 int q; |
| 608 int *rtc_minq; |
| 609 ASSIGN_MINQ_TABLE(cm->bit_depth, rtc_minq); |
| 519 | 610 |
| 520 if (frame_is_intra_only(cm)) { | 611 if (frame_is_intra_only(cm)) { |
| 521 active_best_quality = rc->best_quality; | 612 active_best_quality = rc->best_quality; |
| 522 // Handle the special case for key frames forced when we have75 reached | 613 // Handle the special case for key frames forced when we have reached |
| 523 // the maximum key frame interval. Here force the Q to a range | 614 // the maximum key frame interval. Here force the Q to a range |
| 524 // based on the ambient Q to reduce the risk of popping. | 615 // based on the ambient Q to reduce the risk of popping. |
| 525 if (rc->this_key_frame_forced) { | 616 if (rc->this_key_frame_forced) { |
| 526 int qindex = rc->last_boosted_qindex; | 617 int qindex = rc->last_boosted_qindex; |
| 527 double last_boosted_q = vp9_convert_qindex_to_q(qindex); | 618 double last_boosted_q = vp9_convert_qindex_to_q(qindex, cm->bit_depth); |
| 528 int delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, | 619 int delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, |
| 529 (last_boosted_q * 0.75)); | 620 (last_boosted_q * 0.75), |
| 621 cm->bit_depth); |
| 530 active_best_quality = MAX(qindex + delta_qindex, rc->best_quality); | 622 active_best_quality = MAX(qindex + delta_qindex, rc->best_quality); |
| 531 } else if (cm->current_video_frame > 0) { | 623 } else if (cm->current_video_frame > 0) { |
| 532 // not first frame of one pass and kf_boost is set | 624 // not first frame of one pass and kf_boost is set |
| 533 double q_adj_factor = 1.0; | 625 double q_adj_factor = 1.0; |
| 534 double q_val; | 626 double q_val; |
| 535 | 627 |
| 536 active_best_quality = | 628 active_best_quality = |
| 537 get_kf_active_quality(rc, rc->avg_frame_qindex[KEY_FRAME]); | 629 get_kf_active_quality(rc, rc->avg_frame_qindex[KEY_FRAME], |
| 630 cm->bit_depth); |
| 538 | 631 |
| 539 // Allow somewhat lower kf minq with small image formats. | 632 // Allow somewhat lower kf minq with small image formats. |
| 540 if ((cm->width * cm->height) <= (352 * 288)) { | 633 if ((cm->width * cm->height) <= (352 * 288)) { |
| 541 q_adj_factor -= 0.25; | 634 q_adj_factor -= 0.25; |
| 542 } | 635 } |
| 543 | 636 |
| 544 // Convert the adjustment factor to a qindex delta | 637 // Convert the adjustment factor to a qindex delta |
| 545 // on active_best_quality. | 638 // on active_best_quality. |
| 546 q_val = vp9_convert_qindex_to_q(active_best_quality); | 639 q_val = vp9_convert_qindex_to_q(active_best_quality, cm->bit_depth); |
| 547 active_best_quality += vp9_compute_qdelta(rc, q_val, | 640 active_best_quality += vp9_compute_qdelta(rc, q_val, |
| 548 q_val * q_adj_factor); | 641 q_val * q_adj_factor, |
| 642 cm->bit_depth); |
| 549 } | 643 } |
| 550 } else if (!rc->is_src_frame_alt_ref && | 644 } else if (!rc->is_src_frame_alt_ref && |
| 551 !cpi->use_svc && | 645 !cpi->use_svc && |
| 552 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { | 646 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { |
| 553 // Use the lower of active_worst_quality and recent | 647 // Use the lower of active_worst_quality and recent |
| 554 // average Q as basis for GF/ARF best Q limit unless last frame was | 648 // average Q as basis for GF/ARF best Q limit unless last frame was |
| 555 // a key frame. | 649 // a key frame. |
| 556 if (rc->frames_since_key > 1 && | 650 if (rc->frames_since_key > 1 && |
| 557 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { | 651 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { |
| 558 q = rc->avg_frame_qindex[INTER_FRAME]; | 652 q = rc->avg_frame_qindex[INTER_FRAME]; |
| 559 } else { | 653 } else { |
| 560 q = active_worst_quality; | 654 q = active_worst_quality; |
| 561 } | 655 } |
| 562 active_best_quality = get_gf_active_quality(rc, q); | 656 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 563 } else { | 657 } else { |
| 564 // Use the lower of active_worst_quality and recent/average Q. | 658 // Use the lower of active_worst_quality and recent/average Q. |
| 565 if (cm->current_video_frame > 1) { | 659 if (cm->current_video_frame > 1) { |
| 566 if (rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) | 660 if (rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) |
| 567 active_best_quality = rtc_minq[rc->avg_frame_qindex[INTER_FRAME]]; | 661 active_best_quality = rtc_minq[rc->avg_frame_qindex[INTER_FRAME]]; |
| 568 else | 662 else |
| 569 active_best_quality = rtc_minq[active_worst_quality]; | 663 active_best_quality = rtc_minq[active_worst_quality]; |
| 570 } else { | 664 } else { |
| 571 if (rc->avg_frame_qindex[KEY_FRAME] < active_worst_quality) | 665 if (rc->avg_frame_qindex[KEY_FRAME] < active_worst_quality) |
| 572 active_best_quality = rtc_minq[rc->avg_frame_qindex[KEY_FRAME]]; | 666 active_best_quality = rtc_minq[rc->avg_frame_qindex[KEY_FRAME]]; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 585 *bottom_index = active_best_quality; | 679 *bottom_index = active_best_quality; |
| 586 | 680 |
| 587 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY | 681 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY |
| 588 // Limit Q range for the adaptive loop. | 682 // Limit Q range for the adaptive loop. |
| 589 if (cm->frame_type == KEY_FRAME && | 683 if (cm->frame_type == KEY_FRAME && |
| 590 !rc->this_key_frame_forced && | 684 !rc->this_key_frame_forced && |
| 591 !(cm->current_video_frame == 0)) { | 685 !(cm->current_video_frame == 0)) { |
| 592 int qdelta = 0; | 686 int qdelta = 0; |
| 593 vp9_clear_system_state(); | 687 vp9_clear_system_state(); |
| 594 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, | 688 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, |
| 595 active_worst_quality, 2.0); | 689 active_worst_quality, 2.0, |
| 690 cm->bit_depth); |
| 596 *top_index = active_worst_quality + qdelta; | 691 *top_index = active_worst_quality + qdelta; |
| 597 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; | 692 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; |
| 598 } | 693 } |
| 599 #endif | 694 #endif |
| 600 | 695 |
| 601 // Special case code to try and match quality with forced key frames | 696 // Special case code to try and match quality with forced key frames |
| 602 if (cm->frame_type == KEY_FRAME && rc->this_key_frame_forced) { | 697 if (cm->frame_type == KEY_FRAME && rc->this_key_frame_forced) { |
| 603 q = rc->last_boosted_qindex; | 698 q = rc->last_boosted_qindex; |
| 604 } else { | 699 } else { |
| 605 q = vp9_rc_regulate_q(cpi, rc->this_frame_target, | 700 q = vp9_rc_regulate_q(cpi, rc->this_frame_target, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi, | 732 static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi, |
| 638 int *bottom_index, | 733 int *bottom_index, |
| 639 int *top_index) { | 734 int *top_index) { |
| 640 const VP9_COMMON *const cm = &cpi->common; | 735 const VP9_COMMON *const cm = &cpi->common; |
| 641 const RATE_CONTROL *const rc = &cpi->rc; | 736 const RATE_CONTROL *const rc = &cpi->rc; |
| 642 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 737 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 643 const int cq_level = get_active_cq_level(rc, oxcf); | 738 const int cq_level = get_active_cq_level(rc, oxcf); |
| 644 int active_best_quality; | 739 int active_best_quality; |
| 645 int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi); | 740 int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi); |
| 646 int q; | 741 int q; |
| 742 int *inter_minq; |
| 743 ASSIGN_MINQ_TABLE(cm->bit_depth, inter_minq); |
| 647 | 744 |
| 648 if (frame_is_intra_only(cm)) { | 745 if (frame_is_intra_only(cm)) { |
| 649 | 746 |
| 650 // Handle the special case for key frames forced when we have reached | 747 // Handle the special case for key frames forced when we have reached |
| 651 // the maximum key frame interval. Here force the Q to a range | 748 // the maximum key frame interval. Here force the Q to a range |
| 652 // based on the ambient Q to reduce the risk of popping. | 749 // based on the ambient Q to reduce the risk of popping. |
| 653 if (rc->this_key_frame_forced) { | 750 if (rc->this_key_frame_forced) { |
| 654 int qindex = rc->last_boosted_qindex; | 751 int qindex = rc->last_boosted_qindex; |
| 655 double last_boosted_q = vp9_convert_qindex_to_q(qindex); | 752 double last_boosted_q = vp9_convert_qindex_to_q(qindex, cm->bit_depth); |
| 656 int delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, | 753 int delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, |
| 657 last_boosted_q * 0.75); | 754 last_boosted_q * 0.75, |
| 755 cm->bit_depth); |
| 658 active_best_quality = MAX(qindex + delta_qindex, rc->best_quality); | 756 active_best_quality = MAX(qindex + delta_qindex, rc->best_quality); |
| 659 } else { | 757 } else { |
| 660 // not first frame of one pass and kf_boost is set | 758 // not first frame of one pass and kf_boost is set |
| 661 double q_adj_factor = 1.0; | 759 double q_adj_factor = 1.0; |
| 662 double q_val; | 760 double q_val; |
| 663 | 761 |
| 664 active_best_quality = | 762 active_best_quality = |
| 665 get_kf_active_quality(rc, rc->avg_frame_qindex[KEY_FRAME]); | 763 get_kf_active_quality(rc, rc->avg_frame_qindex[KEY_FRAME], |
| 764 cm->bit_depth); |
| 666 | 765 |
| 667 // Allow somewhat lower kf minq with small image formats. | 766 // Allow somewhat lower kf minq with small image formats. |
| 668 if ((cm->width * cm->height) <= (352 * 288)) { | 767 if ((cm->width * cm->height) <= (352 * 288)) { |
| 669 q_adj_factor -= 0.25; | 768 q_adj_factor -= 0.25; |
| 670 } | 769 } |
| 671 | 770 |
| 672 // Convert the adjustment factor to a qindex delta | 771 // Convert the adjustment factor to a qindex delta |
| 673 // on active_best_quality. | 772 // on active_best_quality. |
| 674 q_val = vp9_convert_qindex_to_q(active_best_quality); | 773 q_val = vp9_convert_qindex_to_q(active_best_quality, cm->bit_depth); |
| 675 active_best_quality += vp9_compute_qdelta(rc, q_val, | 774 active_best_quality += vp9_compute_qdelta(rc, q_val, |
| 676 q_val * q_adj_factor); | 775 q_val * q_adj_factor, |
| 776 cm->bit_depth); |
| 677 } | 777 } |
| 678 } else if (!rc->is_src_frame_alt_ref && | 778 } else if (!rc->is_src_frame_alt_ref && |
| 679 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { | 779 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { |
| 680 // Use the lower of active_worst_quality and recent | 780 // Use the lower of active_worst_quality and recent |
| 681 // average Q as basis for GF/ARF best Q limit unless last frame was | 781 // average Q as basis for GF/ARF best Q limit unless last frame was |
| 682 // a key frame. | 782 // a key frame. |
| 683 if (rc->frames_since_key > 1 && | 783 if (rc->frames_since_key > 1 && |
| 684 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { | 784 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { |
| 685 q = rc->avg_frame_qindex[INTER_FRAME]; | 785 q = rc->avg_frame_qindex[INTER_FRAME]; |
| 686 } else { | 786 } else { |
| 687 q = rc->avg_frame_qindex[KEY_FRAME]; | 787 q = rc->avg_frame_qindex[KEY_FRAME]; |
| 688 } | 788 } |
| 689 // For constrained quality dont allow Q less than the cq level | 789 // For constrained quality dont allow Q less than the cq level |
| 690 if (oxcf->rc_mode == VPX_CQ) { | 790 if (oxcf->rc_mode == VPX_CQ) { |
| 691 if (q < cq_level) | 791 if (q < cq_level) |
| 692 q = cq_level; | 792 q = cq_level; |
| 693 | 793 |
| 694 active_best_quality = get_gf_active_quality(rc, q); | 794 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 695 | 795 |
| 696 // Constrained quality use slightly lower active best. | 796 // Constrained quality use slightly lower active best. |
| 697 active_best_quality = active_best_quality * 15 / 16; | 797 active_best_quality = active_best_quality * 15 / 16; |
| 698 | 798 |
| 699 } else if (oxcf->rc_mode == VPX_Q) { | 799 } else if (oxcf->rc_mode == VPX_Q) { |
| 700 if (!cpi->refresh_alt_ref_frame) { | 800 if (!cpi->refresh_alt_ref_frame) { |
| 701 active_best_quality = cq_level; | 801 active_best_quality = cq_level; |
| 702 } else { | 802 } else { |
| 703 active_best_quality = get_gf_active_quality(rc, q); | 803 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 704 } | 804 } |
| 705 } else { | 805 } else { |
| 706 active_best_quality = get_gf_active_quality(rc, q); | 806 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 707 } | 807 } |
| 708 } else { | 808 } else { |
| 709 if (oxcf->rc_mode == VPX_Q) { | 809 if (oxcf->rc_mode == VPX_Q) { |
| 710 active_best_quality = cq_level; | 810 active_best_quality = cq_level; |
| 711 } else { | 811 } else { |
| 712 // Use the lower of active_worst_quality and recent/average Q. | 812 // Use the lower of active_worst_quality and recent/average Q. |
| 713 if (cm->current_video_frame > 1) | 813 if (cm->current_video_frame > 1) |
| 714 active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]]; | 814 active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]]; |
| 715 else | 815 else |
| 716 active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]]; | 816 active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]]; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 735 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY | 835 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY |
| 736 { | 836 { |
| 737 int qdelta = 0; | 837 int qdelta = 0; |
| 738 vp9_clear_system_state(); | 838 vp9_clear_system_state(); |
| 739 | 839 |
| 740 // Limit Q range for the adaptive loop. | 840 // Limit Q range for the adaptive loop. |
| 741 if (cm->frame_type == KEY_FRAME && | 841 if (cm->frame_type == KEY_FRAME && |
| 742 !rc->this_key_frame_forced && | 842 !rc->this_key_frame_forced && |
| 743 !(cm->current_video_frame == 0)) { | 843 !(cm->current_video_frame == 0)) { |
| 744 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, | 844 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, |
| 745 active_worst_quality, 2.0); | 845 active_worst_quality, 2.0, |
| 846 cm->bit_depth); |
| 746 } else if (!rc->is_src_frame_alt_ref && | 847 } else if (!rc->is_src_frame_alt_ref && |
| 747 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { | 848 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { |
| 748 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, | 849 qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, |
| 749 active_worst_quality, 1.75); | 850 active_worst_quality, 1.75, |
| 851 cm->bit_depth); |
| 750 } | 852 } |
| 751 *top_index = active_worst_quality + qdelta; | 853 *top_index = active_worst_quality + qdelta; |
| 752 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; | 854 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; |
| 753 } | 855 } |
| 754 #endif | 856 #endif |
| 755 | 857 |
| 756 if (oxcf->rc_mode == VPX_Q) { | 858 if (oxcf->rc_mode == VPX_Q) { |
| 757 q = active_best_quality; | 859 q = active_best_quality; |
| 758 // Special case code to try and match quality with forced key frames | 860 // Special case code to try and match quality with forced key frames |
| 759 } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) { | 861 } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 771 } | 873 } |
| 772 | 874 |
| 773 assert(*top_index <= rc->worst_quality && | 875 assert(*top_index <= rc->worst_quality && |
| 774 *top_index >= rc->best_quality); | 876 *top_index >= rc->best_quality); |
| 775 assert(*bottom_index <= rc->worst_quality && | 877 assert(*bottom_index <= rc->worst_quality && |
| 776 *bottom_index >= rc->best_quality); | 878 *bottom_index >= rc->best_quality); |
| 777 assert(q <= rc->worst_quality && q >= rc->best_quality); | 879 assert(q <= rc->worst_quality && q >= rc->best_quality); |
| 778 return q; | 880 return q; |
| 779 } | 881 } |
| 780 | 882 |
| 883 #define STATIC_MOTION_THRESH 95 |
| 781 static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, | 884 static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, |
| 782 int *bottom_index, | 885 int *bottom_index, |
| 783 int *top_index) { | 886 int *top_index) { |
| 784 const VP9_COMMON *const cm = &cpi->common; | 887 const VP9_COMMON *const cm = &cpi->common; |
| 785 const RATE_CONTROL *const rc = &cpi->rc; | 888 const RATE_CONTROL *const rc = &cpi->rc; |
| 786 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 889 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 787 const int cq_level = get_active_cq_level(rc, oxcf); | 890 const int cq_level = get_active_cq_level(rc, oxcf); |
| 788 int active_best_quality; | 891 int active_best_quality; |
| 789 int active_worst_quality = cpi->twopass.active_worst_quality; | 892 int active_worst_quality = cpi->twopass.active_worst_quality; |
| 790 int q; | 893 int q; |
| 894 int *inter_minq; |
| 895 ASSIGN_MINQ_TABLE(cm->bit_depth, inter_minq); |
| 791 | 896 |
| 792 if (frame_is_intra_only(cm) || vp9_is_upper_layer_key_frame(cpi)) { | 897 if (frame_is_intra_only(cm) || vp9_is_upper_layer_key_frame(cpi)) { |
| 793 // Handle the special case for key frames forced when we have75 reached | 898 // Handle the special case for key frames forced when we have reached |
| 794 // the maximum key frame interval. Here force the Q to a range | 899 // the maximum key frame interval. Here force the Q to a range |
| 795 // based on the ambient Q to reduce the risk of popping. | 900 // based on the ambient Q to reduce the risk of popping. |
| 796 if (rc->this_key_frame_forced) { | 901 if (rc->this_key_frame_forced) { |
| 797 int qindex = rc->last_boosted_qindex; | 902 double last_boosted_q; |
| 798 double last_boosted_q = vp9_convert_qindex_to_q(qindex); | 903 int delta_qindex; |
| 799 int delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, | 904 int qindex; |
| 800 last_boosted_q * 0.75); | 905 |
| 801 active_best_quality = MAX(qindex + delta_qindex, rc->best_quality); | 906 if (cpi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) { |
| 907 qindex = MIN(rc->last_kf_qindex, rc->last_boosted_qindex); |
| 908 active_best_quality = qindex; |
| 909 last_boosted_q = vp9_convert_qindex_to_q(qindex, cm->bit_depth); |
| 910 delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, |
| 911 last_boosted_q * 1.25, |
| 912 cm->bit_depth); |
| 913 active_worst_quality = MIN(qindex + delta_qindex, active_worst_quality); |
| 914 |
| 915 } else { |
| 916 qindex = rc->last_boosted_qindex; |
| 917 last_boosted_q = vp9_convert_qindex_to_q(qindex, cm->bit_depth); |
| 918 delta_qindex = vp9_compute_qdelta(rc, last_boosted_q, |
| 919 last_boosted_q * 0.75, |
| 920 cm->bit_depth); |
| 921 active_best_quality = MAX(qindex + delta_qindex, rc->best_quality); |
| 922 } |
| 802 } else { | 923 } else { |
| 803 // Not forced keyframe. | 924 // Not forced keyframe. |
| 804 double q_adj_factor = 1.0; | 925 double q_adj_factor = 1.0; |
| 805 double q_val; | 926 double q_val; |
| 806 // Baseline value derived from cpi->active_worst_quality and kf boost. | 927 // Baseline value derived from cpi->active_worst_quality and kf boost. |
| 807 active_best_quality = get_kf_active_quality(rc, active_worst_quality); | 928 active_best_quality = get_kf_active_quality(rc, active_worst_quality, |
| 929 cm->bit_depth); |
| 808 | 930 |
| 809 // Allow somewhat lower kf minq with small image formats. | 931 // Allow somewhat lower kf minq with small image formats. |
| 810 if ((cm->width * cm->height) <= (352 * 288)) { | 932 if ((cm->width * cm->height) <= (352 * 288)) { |
| 811 q_adj_factor -= 0.25; | 933 q_adj_factor -= 0.25; |
| 812 } | 934 } |
| 813 | 935 |
| 814 // Make a further adjustment based on the kf zero motion measure. | 936 // Make a further adjustment based on the kf zero motion measure. |
| 815 q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct); | 937 q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct); |
| 816 | 938 |
| 817 // Convert the adjustment factor to a qindex delta | 939 // Convert the adjustment factor to a qindex delta |
| 818 // on active_best_quality. | 940 // on active_best_quality. |
| 819 q_val = vp9_convert_qindex_to_q(active_best_quality); | 941 q_val = vp9_convert_qindex_to_q(active_best_quality, cm->bit_depth); |
| 820 active_best_quality += vp9_compute_qdelta(rc, q_val, | 942 active_best_quality += vp9_compute_qdelta(rc, q_val, |
| 821 q_val * q_adj_factor); | 943 q_val * q_adj_factor, |
| 944 cm->bit_depth); |
| 822 } | 945 } |
| 823 } else if (!rc->is_src_frame_alt_ref && | 946 } else if (!rc->is_src_frame_alt_ref && |
| 824 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { | 947 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { |
| 825 // Use the lower of active_worst_quality and recent | 948 // Use the lower of active_worst_quality and recent |
| 826 // average Q as basis for GF/ARF best Q limit unless last frame was | 949 // average Q as basis for GF/ARF best Q limit unless last frame was |
| 827 // a key frame. | 950 // a key frame. |
| 828 if (rc->frames_since_key > 1 && | 951 if (rc->frames_since_key > 1 && |
| 829 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { | 952 rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { |
| 830 q = rc->avg_frame_qindex[INTER_FRAME]; | 953 q = rc->avg_frame_qindex[INTER_FRAME]; |
| 831 } else { | 954 } else { |
| 832 q = active_worst_quality; | 955 q = active_worst_quality; |
| 833 } | 956 } |
| 834 // For constrained quality dont allow Q less than the cq level | 957 // For constrained quality dont allow Q less than the cq level |
| 835 if (oxcf->rc_mode == VPX_CQ) { | 958 if (oxcf->rc_mode == VPX_CQ) { |
| 836 if (q < cq_level) | 959 if (q < cq_level) |
| 837 q = cq_level; | 960 q = cq_level; |
| 838 | 961 |
| 839 active_best_quality = get_gf_active_quality(rc, q); | 962 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 840 | 963 |
| 841 // Constrained quality use slightly lower active best. | 964 // Constrained quality use slightly lower active best. |
| 842 active_best_quality = active_best_quality * 15 / 16; | 965 active_best_quality = active_best_quality * 15 / 16; |
| 843 | 966 |
| 844 } else if (oxcf->rc_mode == VPX_Q) { | 967 } else if (oxcf->rc_mode == VPX_Q) { |
| 845 if (!cpi->refresh_alt_ref_frame) { | 968 if (!cpi->refresh_alt_ref_frame) { |
| 846 active_best_quality = cq_level; | 969 active_best_quality = cq_level; |
| 847 } else { | 970 } else { |
| 848 active_best_quality = get_gf_active_quality(rc, q); | 971 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 849 } | 972 } |
| 850 } else { | 973 } else { |
| 851 active_best_quality = get_gf_active_quality(rc, q); | 974 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 852 } | 975 } |
| 853 } else { | 976 } else { |
| 854 if (oxcf->rc_mode == VPX_Q) { | 977 if (oxcf->rc_mode == VPX_Q) { |
| 855 active_best_quality = cq_level; | 978 active_best_quality = cq_level; |
| 856 } else { | 979 } else { |
| 857 active_best_quality = inter_minq[active_worst_quality]; | 980 active_best_quality = inter_minq[active_worst_quality]; |
| 858 | 981 |
| 859 // For the constrained quality mode we don't want | 982 // For the constrained quality mode we don't want |
| 860 // q to fall below the cq level. | 983 // q to fall below the cq level. |
| 861 if ((oxcf->rc_mode == VPX_CQ) && | 984 if ((oxcf->rc_mode == VPX_CQ) && |
| 862 (active_best_quality < cq_level)) { | 985 (active_best_quality < cq_level)) { |
| 863 active_best_quality = cq_level; | 986 active_best_quality = cq_level; |
| 864 } | 987 } |
| 865 } | 988 } |
| 866 } | 989 } |
| 867 | 990 |
| 868 // Clip the active best and worst quality values to limits. | |
| 869 active_best_quality = clamp(active_best_quality, | |
| 870 rc->best_quality, rc->worst_quality); | |
| 871 active_worst_quality = clamp(active_worst_quality, | |
| 872 active_best_quality, rc->worst_quality); | |
| 873 | |
| 874 *top_index = active_worst_quality; | |
| 875 *bottom_index = active_best_quality; | |
| 876 | |
| 877 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY | 991 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY |
| 878 vp9_clear_system_state(); | 992 vp9_clear_system_state(); |
| 879 { | 993 // Static forced key frames Q restrictions dealt with elsewhere. |
| 994 if (!((frame_is_intra_only(cm) || vp9_is_upper_layer_key_frame(cpi))) || |
| 995 !rc->this_key_frame_forced || |
| 996 (cpi->twopass.last_kfgroup_zeromotion_pct < STATIC_MOTION_THRESH)) { |
| 880 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; | 997 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; |
| 881 const double rate_factor_deltas[RATE_FACTOR_LEVELS] = { | 998 const double rate_factor_deltas[RATE_FACTOR_LEVELS] = { |
| 882 1.00, // INTER_NORMAL | 999 1.00, // INTER_NORMAL |
| 883 1.00, // INTER_HIGH | 1000 1.00, // INTER_HIGH |
| 884 1.50, // GF_ARF_LOW | 1001 1.50, // GF_ARF_LOW |
| 885 1.75, // GF_ARF_STD | 1002 1.75, // GF_ARF_STD |
| 886 2.00, // KF_STD | 1003 2.00, // KF_STD |
| 887 }; | 1004 }; |
| 888 const double rate_factor = | 1005 const double rate_factor = |
| 889 rate_factor_deltas[gf_group->rf_level[gf_group->index]]; | 1006 rate_factor_deltas[gf_group->rf_level[gf_group->index]]; |
| 890 int qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, | 1007 int qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, |
| 891 active_worst_quality, rate_factor); | 1008 active_worst_quality, rate_factor, |
| 892 *top_index = active_worst_quality + qdelta; | 1009 cm->bit_depth); |
| 893 *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index; | 1010 active_worst_quality = active_worst_quality + qdelta; |
| 1011 active_worst_quality = MAX(active_worst_quality, active_best_quality); |
| 894 } | 1012 } |
| 895 #endif | 1013 #endif |
| 896 | 1014 |
| 1015 // Clip the active best and worst quality values to limits. |
| 1016 active_best_quality = clamp(active_best_quality, |
| 1017 rc->best_quality, rc->worst_quality); |
| 1018 active_worst_quality = clamp(active_worst_quality, |
| 1019 active_best_quality, rc->worst_quality); |
| 1020 |
| 897 if (oxcf->rc_mode == VPX_Q) { | 1021 if (oxcf->rc_mode == VPX_Q) { |
| 898 q = active_best_quality; | 1022 q = active_best_quality; |
| 899 // Special case code to try and match quality with forced key frames. | 1023 // Special case code to try and match quality with forced key frames. |
| 900 } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) { | 1024 } else if ((frame_is_intra_only(cm) || vp9_is_upper_layer_key_frame(cpi)) && |
| 901 q = rc->last_boosted_qindex; | 1025 rc->this_key_frame_forced) { |
| 1026 // If static since last kf use better of last boosted and last kf q. |
| 1027 if (cpi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) { |
| 1028 q = MIN(rc->last_kf_qindex, rc->last_boosted_qindex); |
| 1029 } else { |
| 1030 q = rc->last_boosted_qindex; |
| 1031 } |
| 902 } else { | 1032 } else { |
| 903 q = vp9_rc_regulate_q(cpi, rc->this_frame_target, | 1033 q = vp9_rc_regulate_q(cpi, rc->this_frame_target, |
| 904 active_best_quality, active_worst_quality); | 1034 active_best_quality, active_worst_quality); |
| 905 if (q > *top_index) { | 1035 if (q > active_worst_quality) { |
| 906 // Special case when we are targeting the max allowed rate. | 1036 // Special case when we are targeting the max allowed rate. |
| 907 if (rc->this_frame_target >= rc->max_frame_bandwidth) | 1037 if (rc->this_frame_target >= rc->max_frame_bandwidth) |
| 908 *top_index = q; | 1038 active_worst_quality = q; |
| 909 else | 1039 else |
| 910 q = *top_index; | 1040 q = active_worst_quality; |
| 911 } | 1041 } |
| 912 } | 1042 } |
| 1043 clamp(q, active_best_quality, active_worst_quality); |
| 1044 |
| 1045 *top_index = active_worst_quality; |
| 1046 *bottom_index = active_best_quality; |
| 913 | 1047 |
| 914 assert(*top_index <= rc->worst_quality && | 1048 assert(*top_index <= rc->worst_quality && |
| 915 *top_index >= rc->best_quality); | 1049 *top_index >= rc->best_quality); |
| 916 assert(*bottom_index <= rc->worst_quality && | 1050 assert(*bottom_index <= rc->worst_quality && |
| 917 *bottom_index >= rc->best_quality); | 1051 *bottom_index >= rc->best_quality); |
| 918 assert(q <= rc->worst_quality && q >= rc->best_quality); | 1052 assert(q <= rc->worst_quality && q >= rc->best_quality); |
| 919 return q; | 1053 return q; |
| 920 } | 1054 } |
| 921 | 1055 |
| 922 int vp9_rc_pick_q_and_bounds(const VP9_COMP *cpi, | 1056 int vp9_rc_pick_q_and_bounds(const VP9_COMP *cpi, |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1031 rc->avg_frame_qindex[KEY_FRAME] = | 1165 rc->avg_frame_qindex[KEY_FRAME] = |
| 1032 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[KEY_FRAME] + qindex, 2); | 1166 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[KEY_FRAME] + qindex, 2); |
| 1033 } else { | 1167 } else { |
| 1034 if (rc->is_src_frame_alt_ref || | 1168 if (rc->is_src_frame_alt_ref || |
| 1035 !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) || | 1169 !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) || |
| 1036 (cpi->use_svc && oxcf->rc_mode == VPX_CBR)) { | 1170 (cpi->use_svc && oxcf->rc_mode == VPX_CBR)) { |
| 1037 rc->last_q[INTER_FRAME] = qindex; | 1171 rc->last_q[INTER_FRAME] = qindex; |
| 1038 rc->avg_frame_qindex[INTER_FRAME] = | 1172 rc->avg_frame_qindex[INTER_FRAME] = |
| 1039 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[INTER_FRAME] + qindex, 2); | 1173 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[INTER_FRAME] + qindex, 2); |
| 1040 rc->ni_frames++; | 1174 rc->ni_frames++; |
| 1041 rc->tot_q += vp9_convert_qindex_to_q(qindex); | 1175 rc->tot_q += vp9_convert_qindex_to_q(qindex, cm->bit_depth); |
| 1042 rc->avg_q = rc->tot_q / rc->ni_frames; | 1176 rc->avg_q = rc->tot_q / rc->ni_frames; |
| 1043 // Calculate the average Q for normal inter frames (not key or GFU | 1177 // Calculate the average Q for normal inter frames (not key or GFU |
| 1044 // frames). | 1178 // frames). |
| 1045 rc->ni_tot_qi += qindex; | 1179 rc->ni_tot_qi += qindex; |
| 1046 rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames; | 1180 rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames; |
| 1047 } | 1181 } |
| 1048 } | 1182 } |
| 1049 | 1183 |
| 1050 // Keep record of last boosted (KF/KF/ARF) Q value. | 1184 // Keep record of last boosted (KF/KF/ARF) Q value. |
| 1051 // If the current frame is coded at a lower Q then we also update it. | 1185 // If the current frame is coded at a lower Q then we also update it. |
| 1052 // If all mbs in this group are skipped only update if the Q value is | 1186 // If all mbs in this group are skipped only update if the Q value is |
| 1053 // better than that already stored. | 1187 // better than that already stored. |
| 1054 // This is used to help set quality in forced key frames to reduce popping | 1188 // This is used to help set quality in forced key frames to reduce popping |
| 1055 if ((qindex < rc->last_boosted_qindex) || | 1189 if ((qindex < rc->last_boosted_qindex) || |
| 1056 ((cpi->static_mb_pct < 100) && | 1190 (((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame || |
| 1057 ((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame || | |
| 1058 (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) { | 1191 (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) { |
| 1059 rc->last_boosted_qindex = qindex; | 1192 rc->last_boosted_qindex = qindex; |
| 1060 } | 1193 } |
| 1194 if (cm->frame_type == KEY_FRAME) |
| 1195 rc->last_kf_qindex = qindex; |
| 1061 | 1196 |
| 1062 update_buffer_level(cpi, rc->projected_frame_size); | 1197 update_buffer_level(cpi, rc->projected_frame_size); |
| 1063 | 1198 |
| 1064 // Rolling monitors of whether we are over or underspending used to help | 1199 // Rolling monitors of whether we are over or underspending used to help |
| 1065 // regulate min and Max Q in two pass. | 1200 // regulate min and Max Q in two pass. |
| 1066 if (cm->frame_type != KEY_FRAME) { | 1201 if (cm->frame_type != KEY_FRAME) { |
| 1067 rc->rolling_target_bits = ROUND_POWER_OF_TWO( | 1202 rc->rolling_target_bits = ROUND_POWER_OF_TWO( |
| 1068 rc->rolling_target_bits * 3 + rc->this_frame_target, 2); | 1203 rc->rolling_target_bits * 3 + rc->this_frame_target, 2); |
| 1069 rc->rolling_actual_bits = ROUND_POWER_OF_TWO( | 1204 rc->rolling_actual_bits = ROUND_POWER_OF_TWO( |
| 1070 rc->rolling_actual_bits * 3 + rc->projected_frame_size, 2); | 1205 rc->rolling_actual_bits * 3 + rc->projected_frame_size, 2); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1287 } else { | 1422 } else { |
| 1288 cm->frame_type = INTER_FRAME; | 1423 cm->frame_type = INTER_FRAME; |
| 1289 target = calc_pframe_target_size_one_pass_cbr(cpi); | 1424 target = calc_pframe_target_size_one_pass_cbr(cpi); |
| 1290 } | 1425 } |
| 1291 vp9_rc_set_frame_target(cpi, target); | 1426 vp9_rc_set_frame_target(cpi, target); |
| 1292 // Don't use gf_update by default in CBR mode. | 1427 // Don't use gf_update by default in CBR mode. |
| 1293 rc->frames_till_gf_update_due = INT_MAX; | 1428 rc->frames_till_gf_update_due = INT_MAX; |
| 1294 rc->baseline_gf_interval = INT_MAX; | 1429 rc->baseline_gf_interval = INT_MAX; |
| 1295 } | 1430 } |
| 1296 | 1431 |
| 1297 int vp9_compute_qdelta(const RATE_CONTROL *rc, double qstart, double qtarget) { | 1432 int vp9_compute_qdelta(const RATE_CONTROL *rc, double qstart, double qtarget, |
| 1433 vpx_bit_depth_t bit_depth) { |
| 1298 int start_index = rc->worst_quality; | 1434 int start_index = rc->worst_quality; |
| 1299 int target_index = rc->worst_quality; | 1435 int target_index = rc->worst_quality; |
| 1300 int i; | 1436 int i; |
| 1301 | 1437 |
| 1302 // Convert the average q value to an index. | 1438 // Convert the average q value to an index. |
| 1303 for (i = rc->best_quality; i < rc->worst_quality; ++i) { | 1439 for (i = rc->best_quality; i < rc->worst_quality; ++i) { |
| 1304 start_index = i; | 1440 start_index = i; |
| 1305 if (vp9_convert_qindex_to_q(i) >= qstart) | 1441 if (vp9_convert_qindex_to_q(i, bit_depth) >= qstart) |
| 1306 break; | 1442 break; |
| 1307 } | 1443 } |
| 1308 | 1444 |
| 1309 // Convert the q target to an index | 1445 // Convert the q target to an index |
| 1310 for (i = rc->best_quality; i < rc->worst_quality; ++i) { | 1446 for (i = rc->best_quality; i < rc->worst_quality; ++i) { |
| 1311 target_index = i; | 1447 target_index = i; |
| 1312 if (vp9_convert_qindex_to_q(i) >= qtarget) | 1448 if (vp9_convert_qindex_to_q(i, bit_depth) >= qtarget) |
| 1313 break; | 1449 break; |
| 1314 } | 1450 } |
| 1315 | 1451 |
| 1316 return target_index - start_index; | 1452 return target_index - start_index; |
| 1317 } | 1453 } |
| 1318 | 1454 |
| 1319 int vp9_compute_qdelta_by_rate(const RATE_CONTROL *rc, FRAME_TYPE frame_type, | 1455 int vp9_compute_qdelta_by_rate(const RATE_CONTROL *rc, FRAME_TYPE frame_type, |
| 1320 int qindex, double rate_target_ratio) { | 1456 int qindex, double rate_target_ratio, |
| 1457 vpx_bit_depth_t bit_depth) { |
| 1321 int target_index = rc->worst_quality; | 1458 int target_index = rc->worst_quality; |
| 1322 int i; | 1459 int i; |
| 1323 | 1460 |
| 1324 // Look up the current projected bits per block for the base index | 1461 // Look up the current projected bits per block for the base index |
| 1325 const int base_bits_per_mb = vp9_rc_bits_per_mb(frame_type, qindex, 1.0); | 1462 const int base_bits_per_mb = vp9_rc_bits_per_mb(frame_type, qindex, 1.0, |
| 1463 bit_depth); |
| 1326 | 1464 |
| 1327 // Find the target bits per mb based on the base value and given ratio. | 1465 // Find the target bits per mb based on the base value and given ratio. |
| 1328 const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb); | 1466 const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb); |
| 1329 | 1467 |
| 1330 // Convert the q target to an index | 1468 // Convert the q target to an index |
| 1331 for (i = rc->best_quality; i < rc->worst_quality; ++i) { | 1469 for (i = rc->best_quality; i < rc->worst_quality; ++i) { |
| 1332 target_index = i; | 1470 target_index = i; |
| 1333 if (vp9_rc_bits_per_mb(frame_type, i, 1.0) <= target_bits_per_mb ) | 1471 if (vp9_rc_bits_per_mb(frame_type, i, 1.0, bit_depth) <= target_bits_per_mb) |
| 1334 break; | 1472 break; |
| 1335 } | 1473 } |
| 1336 | 1474 |
| 1337 return target_index - qindex; | 1475 return target_index - qindex; |
| 1338 } | 1476 } |
| 1339 | 1477 |
| 1340 void vp9_rc_set_gf_max_interval(const VP9_COMP *const cpi, | 1478 void vp9_rc_set_gf_max_interval(const VP9_COMP *const cpi, |
| 1341 RATE_CONTROL *const rc) { | 1479 RATE_CONTROL *const rc) { |
| 1342 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 1480 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 1343 // Set Maximum gf/arf interval | 1481 // Set Maximum gf/arf interval |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1376 // a very high rate is given on the command line or the the rate cannnot | 1514 // a very high rate is given on the command line or the the rate cannnot |
| 1377 // be acheived because of a user specificed max q (e.g. when the user | 1515 // be acheived because of a user specificed max q (e.g. when the user |
| 1378 // specifies lossless encode. | 1516 // specifies lossless encode. |
| 1379 vbr_max_bits = (int)(((int64_t)rc->avg_frame_bandwidth * | 1517 vbr_max_bits = (int)(((int64_t)rc->avg_frame_bandwidth * |
| 1380 oxcf->two_pass_vbrmax_section) / 100); | 1518 oxcf->two_pass_vbrmax_section) / 100); |
| 1381 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), | 1519 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), |
| 1382 vbr_max_bits); | 1520 vbr_max_bits); |
| 1383 | 1521 |
| 1384 vp9_rc_set_gf_max_interval(cpi, rc); | 1522 vp9_rc_set_gf_max_interval(cpi, rc); |
| 1385 } | 1523 } |
| OLD | NEW |