| 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 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 void vp8_setup_key_frame(VP8_COMP *cpi) | 303 void vp8_setup_key_frame(VP8_COMP *cpi) |
| 304 { | 304 { |
| 305 // Setup for Key frame: | 305 // Setup for Key frame: |
| 306 | 306 |
| 307 vp8_default_coef_probs(& cpi->common); | 307 vp8_default_coef_probs(& cpi->common); |
| 308 vp8_kf_default_bmode_probs(cpi->common.kf_bmode_prob); | 308 vp8_kf_default_bmode_probs(cpi->common.kf_bmode_prob); |
| 309 | 309 |
| 310 vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv
_context)); | 310 vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv
_context)); |
| 311 { | 311 { |
| 312 int flag[2] = {1, 1}; | 312 int flag[2] = {1, 1}; |
| 313 vp8_build_component_cost_table(cpi->mb.mvcost, cpi->mb.mvsadcost, (const
MV_CONTEXT *) cpi->common.fc.mvc, flag); | 313 vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi-
>common.fc.mvc, flag); |
| 314 } | 314 } |
| 315 | 315 |
| 316 vpx_memset(cpi->common.fc.pre_mvc, 0, sizeof(cpi->common.fc.pre_mvc)); //in
itialize pre_mvc to all zero. | 316 vpx_memset(cpi->common.fc.pre_mvc, 0, sizeof(cpi->common.fc.pre_mvc)); //in
itialize pre_mvc to all zero. |
| 317 | 317 |
| 318 //cpi->common.filter_level = 0; // Reset every key frame. | 318 //cpi->common.filter_level = 0; // Reset every key frame. |
| 319 cpi->common.filter_level = cpi->common.base_qindex * 3 / 8 ; | 319 cpi->common.filter_level = cpi->common.base_qindex * 3 / 8 ; |
| 320 | 320 |
| 321 // Provisional interval before next GF | 321 // Provisional interval before next GF |
| 322 if (cpi->auto_gold) | 322 if (cpi->auto_gold) |
| 323 //cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL; | 323 //cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL; |
| 324 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; | 324 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; |
| 325 else | 325 else |
| 326 cpi->frames_till_gf_update_due = cpi->goldfreq; | 326 cpi->frames_till_gf_update_due = cpi->goldfreq; |
| 327 | 327 |
| 328 cpi->common.refresh_golden_frame = TRUE; | 328 cpi->common.refresh_golden_frame = TRUE; |
| 329 cpi->common.refresh_alt_ref_frame = TRUE; | 329 cpi->common.refresh_alt_ref_frame = TRUE; |
| 330 } | 330 } |
| 331 | 331 |
| 332 void vp8_calc_auto_iframe_target_size(VP8_COMP *cpi) | 332 |
| 333 static int estimate_bits_at_q(int frame_kind, int Q, int MBs, |
| 334 double correction_factor) |
| 335 { |
| 336 int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]); |
| 337 |
| 338 /* Attempt to retain reasonable accuracy without overflow. The cutoff is |
| 339 * chosen such that the maximum product of Bpm and MBs fits 31 bits. The |
| 340 * largest Bpm takes 20 bits. |
| 341 */ |
| 342 if (MBs > (1 << 11)) |
| 343 return (Bpm >> BPER_MB_NORMBITS) * MBs; |
| 344 else |
| 345 return (Bpm * MBs) >> BPER_MB_NORMBITS; |
| 346 } |
| 347 |
| 348 |
| 349 static void calc_iframe_target_size(VP8_COMP *cpi) |
| 333 { | 350 { |
| 334 // boost defaults to half second | 351 // boost defaults to half second |
| 335 int kf_boost; | 352 int kf_boost; |
| 353 int target; |
| 336 | 354 |
| 337 // Clear down mmx registers to allow floating point in what follows | 355 // Clear down mmx registers to allow floating point in what follows |
| 338 vp8_clear_system_state(); //__asm emms; | 356 vp8_clear_system_state(); //__asm emms; |
| 339 | 357 |
| 340 if (cpi->oxcf.fixed_q >= 0) | 358 if (cpi->oxcf.fixed_q >= 0) |
| 341 { | 359 { |
| 342 vp8_calc_iframe_target_size(cpi); | 360 int Q = cpi->oxcf.key_q; |
| 343 return; | 361 |
| 362 target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs, |
| 363 cpi->key_frame_rate_correction_factor); |
| 344 } | 364 } |
| 365 else if (cpi->pass == 2) |
| 366 { |
| 367 // New Two pass RC |
| 368 target = cpi->per_frame_bandwidth; |
| 369 } |
| 370 // First Frame is a special case |
| 371 else if (cpi->common.current_video_frame == 0) |
| 372 { |
| 373 /* 1 Pass there is no information on which to base size so use |
| 374 * bandwidth per second * fraction of the initial buffer |
| 375 * level |
| 376 */ |
| 377 target = cpi->oxcf.starting_buffer_level / 2; |
| 345 | 378 |
| 346 if (cpi->pass == 2) | 379 if(target > cpi->oxcf.target_bandwidth * 3 / 2) |
| 347 { | 380 target = cpi->oxcf.target_bandwidth * 3 / 2; |
| 348 cpi->this_frame_target = cpi->per_frame_bandwidth; // New Two pass
RC | |
| 349 } | 381 } |
| 350 else | 382 else |
| 351 { | 383 { |
| 384 // if this keyframe was forced, use a more recent Q estimate |
| 385 int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY) |
| 386 ? cpi->avg_frame_qindex : cpi->ni_av_qi; |
| 387 |
| 352 // Boost depends somewhat on frame rate | 388 // Boost depends somewhat on frame rate |
| 353 kf_boost = (int)(2 * cpi->output_frame_rate - 16); | 389 kf_boost = (int)(2 * cpi->output_frame_rate - 16); |
| 354 | 390 |
| 355 // adjustment up based on q | 391 // adjustment up based on q |
| 356 kf_boost = kf_boost * kf_boost_qadjustment[cpi->ni_av_qi] / 100; | 392 kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100; |
| 357 | 393 |
| 358 // frame separation adjustment ( down) | 394 // frame separation adjustment ( down) |
| 359 if (cpi->frames_since_key < cpi->output_frame_rate / 2) | 395 if (cpi->frames_since_key < cpi->output_frame_rate / 2) |
| 360 kf_boost = (int)(kf_boost * cpi->frames_since_key / (cpi->output_fra
me_rate / 2)); | 396 kf_boost = (int)(kf_boost |
| 397 * cpi->frames_since_key / (cpi->output_frame_rate / 2)); |
| 361 | 398 |
| 362 if (kf_boost < 16) | 399 if (kf_boost < 16) |
| 363 kf_boost = 16; | 400 kf_boost = 16; |
| 364 | 401 |
| 365 // Reset the active worst quality to the baseline value for key frames. | 402 target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4; |
| 366 cpi->active_worst_quality = cpi->worst_quality; | |
| 367 | |
| 368 cpi->this_frame_target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >
> 4; | |
| 369 } | 403 } |
| 370 | 404 |
| 371 | 405 |
| 372 // Should the next frame be an altref frame | 406 if (cpi->oxcf.rc_max_intra_bitrate_pct) |
| 373 if (cpi->pass != 2) | |
| 374 { | 407 { |
| 375 // For now Alt ref is not allowed except in 2 pass modes. | 408 unsigned int max_rate = cpi->per_frame_bandwidth |
| 376 cpi->source_alt_ref_pending = FALSE; | 409 * cpi->oxcf.rc_max_intra_bitrate_pct / 100; |
| 377 | 410 |
| 378 /*if ( cpi->oxcf.fixed_q == -1) | 411 if (target > max_rate) |
| 379 { | 412 target = max_rate; |
| 380 if ( cpi->oxcf.play_alternate && ( (cpi->last_boost/2) > (100+(AF_TH
RESH*cpi->frames_till_gf_update_due)) ) ) | |
| 381 cpi->source_alt_ref_pending = TRUE; | |
| 382 else | |
| 383 cpi->source_alt_ref_pending = FALSE; | |
| 384 }*/ | |
| 385 } | 413 } |
| 386 | 414 |
| 387 if (0) | 415 cpi->this_frame_target = target; |
| 416 |
| 417 // TODO: if we separate rate targeting from Q targetting, move this. |
| 418 // Reset the active worst quality to the baseline value for key frames. |
| 419 if (cpi->pass != 2) |
| 420 cpi->active_worst_quality = cpi->worst_quality; |
| 421 |
| 422 #if 0 |
| 388 { | 423 { |
| 389 FILE *f; | 424 FILE *f; |
| 390 | 425 |
| 391 f = fopen("kf_boost.stt", "a"); | 426 f = fopen("kf_boost.stt", "a"); |
| 392 //fprintf(f, " %8d %10d %10d %10d %10d %10d %10d\n", | 427 //fprintf(f, " %8d %10d %10d %10d %10d %10d %10d\n", |
| 393 // cpi->common.current_video_frame, cpi->target_bandwidth, cpi->frames
_to_key, kf_boost_qadjustment[cpi->ni_av_qi], cpi->kf_boost, (cpi->this_frame_ta
rget *100 / cpi->per_frame_bandwidth), cpi->this_frame_target ); | 428 // cpi->common.current_video_frame, cpi->target_bandwidth, cpi->frames
_to_key, kf_boost_qadjustment[cpi->ni_av_qi], cpi->kf_boost, (cpi->this_frame_ta
rget *100 / cpi->per_frame_bandwidth), cpi->this_frame_target ); |
| 394 | 429 |
| 395 fprintf(f, " %8u %10d %10d %10d\n", | 430 fprintf(f, " %8u %10d %10d %10d\n", |
| 396 cpi->common.current_video_frame, cpi->gfu_boost, cpi->baseline_
gf_interval, cpi->source_alt_ref_pending); | 431 cpi->common.current_video_frame, cpi->gfu_boost, cpi->baseline_
gf_interval, cpi->source_alt_ref_pending); |
| 397 | 432 |
| 398 fclose(f); | 433 fclose(f); |
| 399 } | 434 } |
| 435 #endif |
| 400 } | 436 } |
| 401 | 437 |
| 438 |
| 402 // Do the best we can to define the parameteres for the next GF based on what i
nformation we have available. | 439 // Do the best we can to define the parameteres for the next GF based on what i
nformation we have available. |
| 403 static void calc_gf_params(VP8_COMP *cpi) | 440 static void calc_gf_params(VP8_COMP *cpi) |
| 404 { | 441 { |
| 405 int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed
_q; | 442 int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed
_q; |
| 406 int Boost = 0; | 443 int Boost = 0; |
| 407 | 444 |
| 408 int gf_frame_useage = 0; // Golden frame useage since last GF | 445 int gf_frame_useage = 0; // Golden frame useage since last GF |
| 409 int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] + | 446 int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] + |
| 410 cpi->recent_ref_frame_usage[LAST_FRAME] + | 447 cpi->recent_ref_frame_usage[LAST_FRAME] + |
| 411 cpi->recent_ref_frame_usage[GOLDEN_FRAME] + | 448 cpi->recent_ref_frame_usage[GOLDEN_FRAME] + |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 | 594 |
| 558 /*if ( cpi->oxcf.fixed_q == -1) | 595 /*if ( cpi->oxcf.fixed_q == -1) |
| 559 { | 596 { |
| 560 if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRES
H*cpi->frames_till_gf_update_due)) ) ) | 597 if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRES
H*cpi->frames_till_gf_update_due)) ) ) |
| 561 cpi->source_alt_ref_pending = TRUE; | 598 cpi->source_alt_ref_pending = TRUE; |
| 562 else | 599 else |
| 563 cpi->source_alt_ref_pending = FALSE; | 600 cpi->source_alt_ref_pending = FALSE; |
| 564 }*/ | 601 }*/ |
| 565 } | 602 } |
| 566 } | 603 } |
| 567 /* This is equvialent to estimate_bits_at_q without the rate_correction_factor.
*/ | |
| 568 static int baseline_bits_at_q(int frame_kind, int Q, int MBs) | |
| 569 { | |
| 570 int Bpm = vp8_bits_per_mb[frame_kind][Q]; | |
| 571 | |
| 572 /* Attempt to retain reasonable accuracy without overflow. The cutoff is | |
| 573 * chosen such that the maximum product of Bpm and MBs fits 31 bits. The | |
| 574 * largest Bpm takes 20 bits. | |
| 575 */ | |
| 576 if (MBs > (1 << 11)) | |
| 577 return (Bpm >> BPER_MB_NORMBITS) * MBs; | |
| 578 else | |
| 579 return (Bpm * MBs) >> BPER_MB_NORMBITS; | |
| 580 } | |
| 581 | |
| 582 void vp8_calc_iframe_target_size(VP8_COMP *cpi) | |
| 583 { | |
| 584 int Q; | |
| 585 int Boost = 100; | |
| 586 | |
| 587 Q = (cpi->oxcf.fixed_q >= 0) ? cpi->oxcf.fixed_q : cpi->avg_frame_qindex; | |
| 588 | |
| 589 if (cpi->auto_adjust_key_quantizer == 1) | |
| 590 { | |
| 591 // If (auto_adjust_key_quantizer==1) then a lower Q is selected for key-
frames. | |
| 592 // The enhanced Q is calculated so as to boost the key frame size by a f
actor | |
| 593 // specified in kf_boost_qadjustment. Also, can adjust based on distance | |
| 594 // between key frames. | |
| 595 | |
| 596 // Adjust boost based upon ambient Q | |
| 597 Boost = kf_boost_qadjustment[Q]; | |
| 598 | |
| 599 // Make the Key frame boost less if the seperation from the previous key
frame is small | |
| 600 if (cpi->frames_since_key < 16) | |
| 601 Boost = Boost * kf_boost_seperation_adjustment[cpi->frames_since_key
] / 100; | |
| 602 else | |
| 603 Boost = Boost * kf_boost_seperation_adjustment[15] / 100; | |
| 604 | |
| 605 // Apply limits on boost | |
| 606 if (Boost > kf_gf_boost_qlimits[Q]) | |
| 607 Boost = kf_gf_boost_qlimits[Q]; | |
| 608 else if (Boost < 120) | |
| 609 Boost = 120; | |
| 610 } | |
| 611 | |
| 612 // Keep a record of the boost that was used | |
| 613 cpi->last_boost = Boost; | |
| 614 | |
| 615 // Should the next frame be an altref frame | |
| 616 if (cpi->pass != 2) | |
| 617 { | |
| 618 // For now Alt ref is not allowed except in 2 pass modes. | |
| 619 cpi->source_alt_ref_pending = FALSE; | |
| 620 | |
| 621 /*if ( cpi->oxcf.fixed_q == -1) | |
| 622 { | |
| 623 if ( cpi->oxcf.play_alternate && ( (cpi->last_boost/2) > (100+(AF_TH
RESH*cpi->frames_till_gf_update_due)) ) ) | |
| 624 cpi->source_alt_ref_pending = TRUE; | |
| 625 else | |
| 626 cpi->source_alt_ref_pending = FALSE; | |
| 627 }*/ | |
| 628 } | |
| 629 | |
| 630 if (cpi->oxcf.fixed_q >= 0) | |
| 631 { | |
| 632 cpi->this_frame_target = (baseline_bits_at_q(0, Q, cpi->common.MBs) * Bo
ost) / 100; | |
| 633 } | |
| 634 else | |
| 635 { | |
| 636 | |
| 637 int bits_per_mb_at_this_q ; | |
| 638 | |
| 639 if (cpi->oxcf.error_resilient_mode == 1) | |
| 640 { | |
| 641 cpi->this_frame_target = 2 * cpi->av_per_frame_bandwidth; | |
| 642 return; | |
| 643 } | |
| 644 | |
| 645 // Rate targetted scenario: | |
| 646 // Be careful of 32-bit OVERFLOW if restructuring the caluclation of cpi
->this_frame_target | |
| 647 bits_per_mb_at_this_q = (int)(.5 + | |
| 648 cpi->key_frame_rate_correction_factor * vp
8_bits_per_mb[0][Q]); | |
| 649 | |
| 650 cpi->this_frame_target = (((bits_per_mb_at_this_q * cpi->common.MBs) >>
BPER_MB_NORMBITS) * Boost) / 100; | |
| 651 | |
| 652 // Reset the active worst quality to the baseline value for key frames. | |
| 653 if (cpi->pass < 2) | |
| 654 cpi->active_worst_quality = cpi->worst_quality; | |
| 655 } | |
| 656 } | |
| 657 | 604 |
| 658 | 605 |
| 659 | 606 static void calc_pframe_target_size(VP8_COMP *cpi) |
| 660 void vp8_calc_pframe_target_size(VP8_COMP *cpi) | |
| 661 { | 607 { |
| 662 int min_frame_target; | 608 int min_frame_target; |
| 663 int Adjustment; | 609 int Adjustment; |
| 664 | 610 |
| 665 // Set the min frame bandwidth. | |
| 666 //min_frame_target = estimate_min_frame_size( cpi ); | |
| 667 min_frame_target = 0; | 611 min_frame_target = 0; |
| 668 | 612 |
| 669 if (cpi->pass == 2) | 613 if (cpi->pass == 2) |
| 670 { | 614 { |
| 671 min_frame_target = cpi->min_frame_bandwidth; | 615 min_frame_target = cpi->min_frame_bandwidth; |
| 672 | 616 |
| 673 if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5)) | 617 if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5)) |
| 674 min_frame_target = cpi->av_per_frame_bandwidth >> 5; | 618 min_frame_target = cpi->av_per_frame_bandwidth >> 5; |
| 675 } | 619 } |
| 676 else if (min_frame_target < cpi->per_frame_bandwidth / 4) | 620 else if (min_frame_target < cpi->per_frame_bandwidth / 4) |
| 677 min_frame_target = cpi->per_frame_bandwidth / 4; | 621 min_frame_target = cpi->per_frame_bandwidth / 4; |
| 678 | 622 |
| 679 | 623 |
| 680 // Special alt reference frame case | 624 // Special alt reference frame case |
| 681 if (cpi->common.refresh_alt_ref_frame) | 625 if (cpi->common.refresh_alt_ref_frame) |
| 682 { | 626 { |
| 683 if (cpi->pass == 2) | 627 if (cpi->pass == 2) |
| 684 { | 628 { |
| 685 cpi->per_frame_bandwidth = cpi->gf_bits; // Pe
r frame bit target for the alt ref frame | 629 cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
// Per frame bit target for the alt ref frame |
| 686 cpi->this_frame_target = cpi->per_frame_bandwidth; | 630 cpi->this_frame_target = cpi->per_frame_bandwidth; |
| 687 } | 631 } |
| 688 | 632 |
| 689 /* One Pass ??? TBD */ | 633 /* One Pass ??? TBD */ |
| 690 /*else | 634 /*else |
| 691 { | 635 { |
| 692 int frames_in_section; | 636 int frames_in_section; |
| 693 int allocation_chunks; | 637 int allocation_chunks; |
| 694 int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->ox
cf.fixed_q; | 638 int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->ox
cf.fixed_q; |
| 695 int alt_boost; | 639 int alt_boost; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 Adjustment = (cpi->this_frame_target - min_frame_target); | 754 Adjustment = (cpi->this_frame_target - min_frame_target); |
| 811 | 755 |
| 812 if (cpi->common.frames_since_golden == (cpi->current_gf_interval
>> 1)) | 756 if (cpi->common.frames_since_golden == (cpi->current_gf_interval
>> 1)) |
| 813 cpi->this_frame_target += ((cpi->current_gf_interval - 1) *
Adjustment); | 757 cpi->this_frame_target += ((cpi->current_gf_interval - 1) *
Adjustment); |
| 814 else | 758 else |
| 815 cpi->this_frame_target -= Adjustment; | 759 cpi->this_frame_target -= Adjustment; |
| 816 } | 760 } |
| 817 } | 761 } |
| 818 } | 762 } |
| 819 | 763 |
| 820 // Set a reduced data rate target for our initial Q calculation. | |
| 821 // This should help to save bits during earier sections. | |
| 822 if ((cpi->oxcf.under_shoot_pct > 0) && (cpi->oxcf.under_shoot_pct <= 100)) | |
| 823 cpi->this_frame_target = (cpi->this_frame_target * cpi->oxcf.under_shoot
_pct) / 100; | |
| 824 | |
| 825 // Sanity check that the total sum of adjustments is not above the maximum a
llowed | 764 // Sanity check that the total sum of adjustments is not above the maximum a
llowed |
| 826 // That is that having allowed for KF and GF penalties we have not pushed th
e | 765 // That is that having allowed for KF and GF penalties we have not pushed th
e |
| 827 // current interframe target to low. If the adjustment we apply here is not
capable of recovering | 766 // current interframe target to low. If the adjustment we apply here is not
capable of recovering |
| 828 // all the extra bits we have spent in the KF or GF then the remainder will
have to be recovered over | 767 // all the extra bits we have spent in the KF or GF then the remainder will
have to be recovered over |
| 829 // a longer time span via other buffer / rate control mechanisms. | 768 // a longer time span via other buffer / rate control mechanisms. |
| 830 if (cpi->this_frame_target < min_frame_target) | 769 if (cpi->this_frame_target < min_frame_target) |
| 831 cpi->this_frame_target = min_frame_target; | 770 cpi->this_frame_target = min_frame_target; |
| 832 | 771 |
| 833 if (!cpi->common.refresh_alt_ref_frame) | 772 if (!cpi->common.refresh_alt_ref_frame) |
| 834 // Note the baseline target data rate for this inter frame. | 773 // Note the baseline target data rate for this inter frame. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 851 // | 790 // |
| 852 // If we are are below the optimal buffer fullness level and adh
erence | 791 // If we are are below the optimal buffer fullness level and adh
erence |
| 853 // to buffering contraints is important to the end useage then a
djust | 792 // to buffering contraints is important to the end useage then a
djust |
| 854 // the per frame target. | 793 // the per frame target. |
| 855 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) && | 794 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) && |
| 856 (cpi->buffer_level < cpi->oxcf.optimal_buffer_level)) | 795 (cpi->buffer_level < cpi->oxcf.optimal_buffer_level)) |
| 857 { | 796 { |
| 858 percent_low = | 797 percent_low = |
| 859 (cpi->oxcf.optimal_buffer_level - cpi->buffer_level) / | 798 (cpi->oxcf.optimal_buffer_level - cpi->buffer_level) / |
| 860 one_percent_bits; | 799 one_percent_bits; |
| 861 | |
| 862 if (percent_low > 100) | |
| 863 percent_low = 100; | |
| 864 else if (percent_low < 0) | |
| 865 percent_low = 0; | |
| 866 } | 800 } |
| 867 // Are we overshooting the long term clip data rate... | 801 // Are we overshooting the long term clip data rate... |
| 868 else if (cpi->bits_off_target < 0) | 802 else if (cpi->bits_off_target < 0) |
| 869 { | 803 { |
| 870 // Adjust per frame data target downwards to compensate. | 804 // Adjust per frame data target downwards to compensate. |
| 871 percent_low = (int)(100 * -cpi->bits_off_target / | 805 percent_low = (int)(100 * -cpi->bits_off_target / |
| 872 (cpi->total_byte_count * 8)); | 806 (cpi->total_byte_count * 8)); |
| 873 | |
| 874 if (percent_low > 100) | |
| 875 percent_low = 100; | |
| 876 else if (percent_low < 0) | |
| 877 percent_low = 0; | |
| 878 } | 807 } |
| 879 | 808 |
| 809 if (percent_low > cpi->oxcf.under_shoot_pct) |
| 810 percent_low = cpi->oxcf.under_shoot_pct; |
| 811 else if (percent_low < 0) |
| 812 percent_low = 0; |
| 813 |
| 880 // lower the target bandwidth for this frame. | 814 // lower the target bandwidth for this frame. |
| 881 cpi->this_frame_target = | 815 cpi->this_frame_target -= (cpi->this_frame_target * percent_low) |
| 882 (cpi->this_frame_target * (100 - (percent_low / 2))) / 100; | 816 / 200; |
| 883 | 817 |
| 884 // Are we using allowing control of active_worst_allowed_q | 818 // Are we using allowing control of active_worst_allowed_q |
| 885 // according to buffer level. | 819 // according to buffer level. |
| 886 if (cpi->auto_worst_q) | 820 if (cpi->auto_worst_q) |
| 887 { | 821 { |
| 888 int critical_buffer_level; | 822 int critical_buffer_level; |
| 889 | 823 |
| 890 // For streaming applications the most important factor is | 824 // For streaming applications the most important factor is |
| 891 // cpi->buffer_level as this takes into account the | 825 // cpi->buffer_level as this takes into account the |
| 892 // specified short term buffering constraints. However, | 826 // specified short term buffering constraints. However, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 909 critical_buffer_level = cpi->bits_off_target; | 843 critical_buffer_level = cpi->bits_off_target; |
| 910 } | 844 } |
| 911 | 845 |
| 912 // Set the active worst quality based upon the selected | 846 // Set the active worst quality based upon the selected |
| 913 // buffer fullness number. | 847 // buffer fullness number. |
| 914 if (critical_buffer_level < cpi->oxcf.optimal_buffer_level) | 848 if (critical_buffer_level < cpi->oxcf.optimal_buffer_level) |
| 915 { | 849 { |
| 916 if ( critical_buffer_level > | 850 if ( critical_buffer_level > |
| 917 (cpi->oxcf.optimal_buffer_level >> 2) ) | 851 (cpi->oxcf.optimal_buffer_level >> 2) ) |
| 918 { | 852 { |
| 919 INT64 qadjustment_range = | 853 int64_t qadjustment_range = |
| 920 cpi->worst_quality - cpi->ni_av_qi; | 854 cpi->worst_quality - cpi->ni_av_qi; |
| 921 INT64 above_base = | 855 int64_t above_base = |
| 922 (critical_buffer_level - | 856 (critical_buffer_level - |
| 923 (cpi->oxcf.optimal_buffer_level >> 2)); | 857 (cpi->oxcf.optimal_buffer_level >> 2)); |
| 924 | 858 |
| 925 // Step active worst quality down from | 859 // Step active worst quality down from |
| 926 // cpi->ni_av_qi when (critical_buffer_level == | 860 // cpi->ni_av_qi when (critical_buffer_level == |
| 927 // cpi->optimal_buffer_level) to | 861 // cpi->optimal_buffer_level) to |
| 928 // cpi->worst_quality when | 862 // cpi->worst_quality when |
| 929 // (critical_buffer_level == | 863 // (critical_buffer_level == |
| 930 // cpi->optimal_buffer_level >> 2) | 864 // cpi->optimal_buffer_level >> 2) |
| 931 cpi->active_worst_quality = | 865 cpi->active_worst_quality = |
| (...skipping 11 matching lines...) Expand all Loading... |
| 943 cpi->active_worst_quality = cpi->ni_av_qi; | 877 cpi->active_worst_quality = cpi->ni_av_qi; |
| 944 } | 878 } |
| 945 } | 879 } |
| 946 else | 880 else |
| 947 { | 881 { |
| 948 cpi->active_worst_quality = cpi->worst_quality; | 882 cpi->active_worst_quality = cpi->worst_quality; |
| 949 } | 883 } |
| 950 } | 884 } |
| 951 else | 885 else |
| 952 { | 886 { |
| 953 int percent_high; | 887 int percent_high = 0; |
| 954 | 888 |
| 955 if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level) | 889 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) |
| 890 && (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)) |
| 956 { | 891 { |
| 957 percent_high = (int)(100 * (cpi->bits_off_target - cpi->oxcf
.optimal_buffer_level) / (cpi->total_byte_count * 8)); | 892 percent_high = (cpi->buffer_level |
| 893 - cpi->oxcf.optimal_buffer_level) |
| 894 / one_percent_bits; |
| 895 } |
| 896 else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level) |
| 897 { |
| 898 percent_high = (int)((100 * cpi->bits_off_target) |
| 899 / (cpi->total_byte_count * 8)); |
| 900 } |
| 958 | 901 |
| 959 if (percent_high > 100) | 902 if (percent_high > cpi->oxcf.over_shoot_pct) |
| 960 percent_high = 100; | 903 percent_high = cpi->oxcf.over_shoot_pct; |
| 961 else if (percent_high < 0) | 904 else if (percent_high < 0) |
| 962 percent_high = 0; | 905 percent_high = 0; |
| 963 | 906 |
| 964 cpi->this_frame_target = (cpi->this_frame_target * (100 + (p
ercent_high / 2))) / 100; | 907 cpi->this_frame_target += (cpi->this_frame_target * |
| 908 percent_high) / 200; |
| 965 | 909 |
| 966 } | |
| 967 | 910 |
| 968 // Are we allowing control of active_worst_allowed_q according t
o bufferl level. | 911 // Are we allowing control of active_worst_allowed_q according t
o bufferl level. |
| 969 if (cpi->auto_worst_q) | 912 if (cpi->auto_worst_q) |
| 970 { | 913 { |
| 971 // When using the relaxed buffer model stick to the user spe
cified value | 914 // When using the relaxed buffer model stick to the user spe
cified value |
| 972 cpi->active_worst_quality = cpi->ni_av_qi; | 915 cpi->active_worst_quality = cpi->ni_av_qi; |
| 973 } | 916 } |
| 974 else | 917 else |
| 975 { | 918 { |
| 976 cpi->active_worst_quality = cpi->worst_quality; | 919 cpi->active_worst_quality = cpi->worst_quality; |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 if (0) // p_gw | 1048 if (0) // p_gw |
| 1106 { | 1049 { |
| 1107 FILE *f; | 1050 FILE *f; |
| 1108 | 1051 |
| 1109 f = fopen("GFexit.stt", "a"); | 1052 f = fopen("GFexit.stt", "a"); |
| 1110 fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame); | 1053 fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame); |
| 1111 fclose(f); | 1054 fclose(f); |
| 1112 } | 1055 } |
| 1113 | 1056 |
| 1114 #endif | 1057 #endif |
| 1115 cpi->initial_gf_use = 0; | |
| 1116 | 1058 |
| 1117 if (cpi->auto_adjust_gold_quantizer) | 1059 if (cpi->auto_adjust_gold_quantizer) |
| 1118 { | 1060 { |
| 1119 calc_gf_params(cpi); | 1061 calc_gf_params(cpi); |
| 1120 } | 1062 } |
| 1121 | 1063 |
| 1122 // If we are using alternate ref instead of gf then do not apply the
boost | 1064 // If we are using alternate ref instead of gf then do not apply the
boost |
| 1123 // It will instead be applied to the altref update | 1065 // It will instead be applied to the altref update |
| 1124 // Jims modified boost | 1066 // Jims modified boost |
| 1125 if (!cpi->source_alt_ref_active) | 1067 if (!cpi->source_alt_ref_active) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1145 } | 1087 } |
| 1146 | 1088 |
| 1147 // Avoid loss of precision but avoid overflow | 1089 // Avoid loss of precision but avoid overflow |
| 1148 if ((bits_in_section >> 7) > allocation_chunks) | 1090 if ((bits_in_section >> 7) > allocation_chunks) |
| 1149 cpi->this_frame_target = Boost * (bits_in_section /
allocation_chunks); | 1091 cpi->this_frame_target = Boost * (bits_in_section /
allocation_chunks); |
| 1150 else | 1092 else |
| 1151 cpi->this_frame_target = (Boost * bits_in_section) /
allocation_chunks; | 1093 cpi->this_frame_target = (Boost * bits_in_section) /
allocation_chunks; |
| 1152 } | 1094 } |
| 1153 } | 1095 } |
| 1154 else | 1096 else |
| 1155 cpi->this_frame_target = (baseline_bits_at_q(1, Q, cpi->comm
on.MBs) * cpi->last_boost) / 100; | 1097 cpi->this_frame_target = |
| 1098 (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0) |
| 1099 * cpi->last_boost) / 100; |
| 1156 | 1100 |
| 1157 } | 1101 } |
| 1158 // If there is an active ARF at this location use the minimum | 1102 // If there is an active ARF at this location use the minimum |
| 1159 // bits on this frame even if it is a contructed arf. | 1103 // bits on this frame even if it is a contructed arf. |
| 1160 // The active maximum quantizer insures that an appropriate | 1104 // The active maximum quantizer insures that an appropriate |
| 1161 // number of bits will be spent if needed for contstructed ARFs. | 1105 // number of bits will be spent if needed for contstructed ARFs. |
| 1162 else | 1106 else |
| 1163 { | 1107 { |
| 1164 cpi->this_frame_target = 0; | 1108 cpi->this_frame_target = 0; |
| 1165 } | 1109 } |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 cpi->key_frame_rate_correction_factor = rate_correction_factor; | 1211 cpi->key_frame_rate_correction_factor = rate_correction_factor; |
| 1268 else | 1212 else |
| 1269 { | 1213 { |
| 1270 if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_fram
e) | 1214 if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_fram
e) |
| 1271 cpi->gf_rate_correction_factor = rate_correction_factor; | 1215 cpi->gf_rate_correction_factor = rate_correction_factor; |
| 1272 else | 1216 else |
| 1273 cpi->rate_correction_factor = rate_correction_factor; | 1217 cpi->rate_correction_factor = rate_correction_factor; |
| 1274 } | 1218 } |
| 1275 } | 1219 } |
| 1276 | 1220 |
| 1277 static int estimate_bits_at_q(VP8_COMP *cpi, int Q) | |
| 1278 { | |
| 1279 int Bpm = (int)(.5 + cpi->rate_correction_factor * vp8_bits_per_mb[INTER_FRA
ME][Q]); | |
| 1280 | |
| 1281 /* Attempt to retain reasonable accuracy without overflow. The cutoff is | |
| 1282 * chosen such that the maximum product of Bpm and MBs fits 31 bits. The | |
| 1283 * largest Bpm takes 20 bits. | |
| 1284 */ | |
| 1285 if (cpi->common.MBs > (1 << 11)) | |
| 1286 return (Bpm >> BPER_MB_NORMBITS) * cpi->common.MBs; | |
| 1287 else | |
| 1288 return (Bpm * cpi->common.MBs) >> BPER_MB_NORMBITS; | |
| 1289 | |
| 1290 } | |
| 1291 | |
| 1292 | 1221 |
| 1293 int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame) | 1222 int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame) |
| 1294 { | 1223 { |
| 1295 int Q = cpi->active_worst_quality; | 1224 int Q = cpi->active_worst_quality; |
| 1296 | 1225 |
| 1297 // Reset Zbin OQ value | 1226 // Reset Zbin OQ value |
| 1298 cpi->zbin_over_quant = 0; | 1227 cpi->zbin_over_quant = 0; |
| 1299 | 1228 |
| 1300 if (cpi->oxcf.fixed_q >= 0) | 1229 if (cpi->oxcf.fixed_q >= 0) |
| 1301 { | 1230 { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1412 if (bits_per_mb_at_this_q <= target_bits_per_mb) // Break out
if we get down to the target rate | 1341 if (bits_per_mb_at_this_q <= target_bits_per_mb) // Break out
if we get down to the target rate |
| 1413 break; | 1342 break; |
| 1414 } | 1343 } |
| 1415 | 1344 |
| 1416 } | 1345 } |
| 1417 } | 1346 } |
| 1418 | 1347 |
| 1419 return Q; | 1348 return Q; |
| 1420 } | 1349 } |
| 1421 | 1350 |
| 1422 static int estimate_min_frame_size(VP8_COMP *cpi) | 1351 |
| 1352 static int estimate_keyframe_frequency(VP8_COMP *cpi) |
| 1423 { | 1353 { |
| 1424 double correction_factor; | 1354 int i; |
| 1425 int bits_per_mb_at_max_q; | |
| 1426 | 1355 |
| 1427 // This funtion returns a default value for the first few frames untill the
correction factor has had time to adapt. | 1356 // Average key frame frequency |
| 1428 if (cpi->common.current_video_frame < 10) | 1357 int av_key_frame_frequency = 0; |
| 1358 |
| 1359 /* First key frame at start of sequence is a special case. We have no |
| 1360 * frequency data. |
| 1361 */ |
| 1362 if (cpi->key_frame_count == 1) |
| 1429 { | 1363 { |
| 1430 if (cpi->pass == 2) | 1364 /* Assume a default of 1 kf every 2 seconds, or the max kf interval, |
| 1431 return (cpi->min_frame_bandwidth); | 1365 * whichever is smaller. |
| 1432 else | 1366 */ |
| 1433 return cpi->per_frame_bandwidth / 3; | 1367 int key_freq = cpi->oxcf.key_freq>0 ? cpi->oxcf.key_freq : 1; |
| 1368 av_key_frame_frequency = (int)cpi->output_frame_rate * 2; |
| 1369 |
| 1370 if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq) |
| 1371 av_key_frame_frequency = cpi->oxcf.key_freq; |
| 1372 |
| 1373 cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1] |
| 1374 = av_key_frame_frequency; |
| 1434 } | 1375 } |
| 1376 else |
| 1377 { |
| 1378 unsigned int total_weight = 0; |
| 1379 int last_kf_interval = |
| 1380 (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1; |
| 1435 | 1381 |
| 1436 /* // Select the appropriate correction factor based upon type of frame. | 1382 /* reset keyframe context and calculate weighted average of last |
| 1437 if ( cpi->common.frame_type == KEY_FRAME ) | 1383 * KEY_FRAME_CONTEXT keyframes |
| 1438 correction_factor = cpi->key_frame_rate_correction_factor; | 1384 */ |
| 1439 else | 1385 for (i = 0; i < KEY_FRAME_CONTEXT; i++) |
| 1440 { | 1386 { |
| 1441 if ( cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden
_frame ) | 1387 if (i < KEY_FRAME_CONTEXT - 1) |
| 1442 correction_factor = cpi->gf_rate_correction_factor; | 1388 cpi->prior_key_frame_distance[i] |
| 1389 = cpi->prior_key_frame_distance[i+1]; |
| 1443 else | 1390 else |
| 1444 correction_factor = cpi->rate_correction_factor; | 1391 cpi->prior_key_frame_distance[i] = last_kf_interval; |
| 1445 }*/ | |
| 1446 | 1392 |
| 1447 // We estimate at half the value we get from vp8_bits_per_mb | 1393 av_key_frame_frequency += prior_key_frame_weight[i] |
| 1448 correction_factor = cpi->rate_correction_factor / 2.0; | 1394 * cpi->prior_key_frame_distance[i]; |
| 1395 total_weight += prior_key_frame_weight[i]; |
| 1396 } |
| 1449 | 1397 |
| 1450 bits_per_mb_at_max_q = (int)(.5 + correction_factor * vp8_bits_per_mb[cpi->c
ommon.frame_type][MAXQ]); | 1398 av_key_frame_frequency /= total_weight; |
| 1451 | 1399 |
| 1452 return (bits_per_mb_at_max_q * cpi->common.MBs) >> BPER_MB_NORMBITS; | 1400 } |
| 1401 return av_key_frame_frequency; |
| 1453 } | 1402 } |
| 1454 | 1403 |
| 1404 |
| 1455 void vp8_adjust_key_frame_context(VP8_COMP *cpi) | 1405 void vp8_adjust_key_frame_context(VP8_COMP *cpi) |
| 1456 { | 1406 { |
| 1457 int i; | |
| 1458 int av_key_frames_per_second; | |
| 1459 | |
| 1460 // Average key frame frequency and size | |
| 1461 unsigned int total_weight = 0; | |
| 1462 unsigned int av_key_frame_frequency = 0; | |
| 1463 unsigned int av_key_frame_bits = 0; | |
| 1464 | |
| 1465 unsigned int output_frame_rate = (unsigned int)(100 * cpi->output_frame_rate
); | |
| 1466 unsigned int target_bandwidth = (unsigned int)(100 * cpi->target_bandwidth); | |
| 1467 | |
| 1468 // Clear down mmx registers to allow floating point in what follows | 1407 // Clear down mmx registers to allow floating point in what follows |
| 1469 vp8_clear_system_state(); //__asm emms; | 1408 vp8_clear_system_state(); |
| 1470 | |
| 1471 // Update the count of total key frame bits | |
| 1472 cpi->tot_key_frame_bits += cpi->projected_frame_size; | |
| 1473 | |
| 1474 // First key frame at start of sequence is a special case. We have no freque
ncy data. | |
| 1475 if (cpi->key_frame_count == 1) | |
| 1476 { | |
| 1477 av_key_frame_frequency = (int)cpi->output_frame_rate * 2; //
Assume a default of 1 kf every 2 seconds | |
| 1478 av_key_frame_bits = cpi->projected_frame_size; | |
| 1479 av_key_frames_per_second = output_frame_rate / av_key_frame_frequency;
// Note output_frame_rate not cpi->output_frame_rate | |
| 1480 } | |
| 1481 else | |
| 1482 { | |
| 1483 int last_kf_interval = | |
| 1484 (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1; | |
| 1485 | |
| 1486 // reset keyframe context and calculate weighted average of last KEY_FRA
ME_CONTEXT keyframes | |
| 1487 for (i = 0; i < KEY_FRAME_CONTEXT; i++) | |
| 1488 { | |
| 1489 if (i < KEY_FRAME_CONTEXT - 1) | |
| 1490 { | |
| 1491 cpi->prior_key_frame_size[i] = cpi->prior_key_frame_size[i+1
]; | |
| 1492 cpi->prior_key_frame_distance[i] = cpi->prior_key_frame_distance
[i+1]; | |
| 1493 } | |
| 1494 else | |
| 1495 { | |
| 1496 cpi->prior_key_frame_size[i] = cpi->projected_frame_size; | |
| 1497 cpi->prior_key_frame_distance[i] = last_kf_interval; | |
| 1498 } | |
| 1499 | |
| 1500 av_key_frame_bits += prior_key_frame_weight[i] * cpi->prior_key
_frame_size[i]; | |
| 1501 av_key_frame_frequency += prior_key_frame_weight[i] * cpi->prior_key
_frame_distance[i]; | |
| 1502 total_weight += prior_key_frame_weight[i]; | |
| 1503 } | |
| 1504 | |
| 1505 av_key_frame_bits /= total_weight; | |
| 1506 av_key_frame_frequency /= total_weight; | |
| 1507 av_key_frames_per_second = output_frame_rate / av_key_frame_frequency; | |
| 1508 | |
| 1509 } | |
| 1510 | 1409 |
| 1511 // Do we have any key frame overspend to recover? | 1410 // Do we have any key frame overspend to recover? |
| 1512 if ((cpi->pass != 2) && (cpi->projected_frame_size > cpi->per_frame_bandwidt
h)) | 1411 // Two-pass overspend handled elsewhere. |
| 1412 if ((cpi->pass != 2) |
| 1413 && (cpi->projected_frame_size > cpi->per_frame_bandwidth)) |
| 1513 { | 1414 { |
| 1514 // Update the count of key frame overspend to be recovered in subsequent
frames | 1415 int overspend; |
| 1515 // A portion of the KF overspend is treated as gf overspend (and hence r
ecovered more quickly) | |
| 1516 // as the kf is also a gf. Otherwise the few frames following each kf te
nd to get more bits | |
| 1517 // allocated than those following other gfs. | |
| 1518 cpi->kf_overspend_bits += (cpi->projected_frame_size - cpi->per_frame_ba
ndwidth) * 7 / 8; | |
| 1519 cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->per_frame_ba
ndwidth) * 1 / 8; | |
| 1520 if(!av_key_frame_frequency) | |
| 1521 av_key_frame_frequency = 60; | |
| 1522 | 1416 |
| 1523 // Work out how much to try and recover per frame. | 1417 /* Update the count of key frame overspend to be recovered in |
| 1524 // For one pass we estimate the number of frames to spread it over based
upon past history. | 1418 * subsequent frames. A portion of the KF overspend is treated as gf |
| 1525 // For two pass we know how many frames there will be till the next kf. | 1419 * overspend (and hence recovered more quickly) as the kf is also a |
| 1526 if (cpi->pass == 2) | 1420 * gf. Otherwise the few frames following each kf tend to get more |
| 1527 { | 1421 * bits allocated than those following other gfs. |
| 1528 if (cpi->frames_to_key > 16) | 1422 */ |
| 1529 cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits / (int)cpi->
frames_to_key; | 1423 overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth); |
| 1530 else | 1424 cpi->kf_overspend_bits += overspend * 7 / 8; |
| 1531 cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits / 16; | 1425 cpi->gf_overspend_bits += overspend * 1 / 8; |
| 1532 } | 1426 |
| 1533 else | 1427 /* Work out how much to try and recover per frame. */ |
| 1534 cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits / (int)av_key_fr
ame_frequency; | 1428 cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits |
| 1429 / estimate_keyframe_frequency(cpi); |
| 1535 } | 1430 } |
| 1536 | 1431 |
| 1537 cpi->frames_since_key = 0; | 1432 cpi->frames_since_key = 0; |
| 1538 cpi->last_key_frame_size = cpi->projected_frame_size; | |
| 1539 cpi->key_frame_count++; | 1433 cpi->key_frame_count++; |
| 1540 } | 1434 } |
| 1541 | 1435 |
| 1436 |
| 1542 void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit,
int *frame_over_shoot_limit) | 1437 void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit,
int *frame_over_shoot_limit) |
| 1543 { | 1438 { |
| 1544 // Set-up bounds on acceptable frame size: | 1439 // Set-up bounds on acceptable frame size: |
| 1545 if (cpi->oxcf.fixed_q >= 0) | 1440 if (cpi->oxcf.fixed_q >= 0) |
| 1546 { | 1441 { |
| 1547 // Fixed Q scenario: frame size never outranges target (there is no targ
et!) | 1442 // Fixed Q scenario: frame size never outranges target (there is no targ
et!) |
| 1548 *frame_under_shoot_limit = 0; | 1443 *frame_under_shoot_limit = 0; |
| 1549 *frame_over_shoot_limit = INT_MAX; | 1444 *frame_over_shoot_limit = INT_MAX; |
| 1550 } | 1445 } |
| 1551 else | 1446 else |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1598 else | 1493 else |
| 1599 { | 1494 { |
| 1600 *frame_over_shoot_limit = cpi->this_frame_target * 11 /
8; | 1495 *frame_over_shoot_limit = cpi->this_frame_target * 11 /
8; |
| 1601 *frame_under_shoot_limit = cpi->this_frame_target * 5 /
8; | 1496 *frame_under_shoot_limit = cpi->this_frame_target * 5 /
8; |
| 1602 } | 1497 } |
| 1603 } | 1498 } |
| 1604 } | 1499 } |
| 1605 } | 1500 } |
| 1606 } | 1501 } |
| 1607 } | 1502 } |
| 1503 |
| 1504 |
| 1505 // return of 0 means drop frame |
| 1506 int vp8_pick_frame_size(VP8_COMP *cpi) |
| 1507 { |
| 1508 VP8_COMMON *cm = &cpi->common; |
| 1509 |
| 1510 if (cm->frame_type == KEY_FRAME) |
| 1511 calc_iframe_target_size(cpi); |
| 1512 else |
| 1513 { |
| 1514 calc_pframe_target_size(cpi); |
| 1515 |
| 1516 // Check if we're dropping the frame: |
| 1517 if (cpi->drop_frame) |
| 1518 { |
| 1519 cpi->drop_frame = FALSE; |
| 1520 cpi->drop_count++; |
| 1521 return 0; |
| 1522 } |
| 1523 } |
| 1524 return 1; |
| 1525 } |
| OLD | NEW |