| 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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 // Read frame stats at an offset from the current position. | 91 // Read frame stats at an offset from the current position. |
| 92 static const FIRSTPASS_STATS *read_frame_stats(const TWO_PASS *p, int offset) { | 92 static const FIRSTPASS_STATS *read_frame_stats(const TWO_PASS *p, int offset) { |
| 93 if ((offset >= 0 && p->stats_in + offset >= p->stats_in_end) || | 93 if ((offset >= 0 && p->stats_in + offset >= p->stats_in_end) || |
| 94 (offset < 0 && p->stats_in + offset < p->stats_in_start)) { | 94 (offset < 0 && p->stats_in + offset < p->stats_in_start)) { |
| 95 return NULL; | 95 return NULL; |
| 96 } | 96 } |
| 97 | 97 |
| 98 return &p->stats_in[offset]; | 98 return &p->stats_in[offset]; |
| 99 } | 99 } |
| 100 | 100 |
| 101 #if CONFIG_FP_MB_STATS | |
| 102 static int input_mb_stats(FIRSTPASS_FRAME_MB_STATS *fp_frame_stats, | |
| 103 const VP9_COMMON *const cm) { | |
| 104 FILE *fpfile; | |
| 105 int ret; | |
| 106 | |
| 107 fpfile = fopen("firstpass_mb.stt", "r"); | |
| 108 fseek(fpfile, cm->current_video_frame * cm->MBs * sizeof(FIRSTPASS_MB_STATS), | |
| 109 SEEK_SET); | |
| 110 ret = fread(fp_frame_stats->mb_stats, sizeof(FIRSTPASS_MB_STATS), cm->MBs, | |
| 111 fpfile); | |
| 112 fclose(fpfile); | |
| 113 if (ret < cm->MBs) { | |
| 114 return EOF; | |
| 115 } | |
| 116 return 1; | |
| 117 } | |
| 118 | |
| 119 static void output_mb_stats(FIRSTPASS_FRAME_MB_STATS *fp_frame_stats, | |
| 120 const VP9_COMMON *const cm) { | |
| 121 FILE *fpfile; | |
| 122 | |
| 123 fpfile = fopen("firstpass_mb.stt", "a"); | |
| 124 fwrite(fp_frame_stats->mb_stats, sizeof(FIRSTPASS_MB_STATS), cm->MBs, fpfile); | |
| 125 fclose(fpfile); | |
| 126 } | |
| 127 #endif | |
| 128 | |
| 129 static int input_stats(TWO_PASS *p, FIRSTPASS_STATS *fps) { | 101 static int input_stats(TWO_PASS *p, FIRSTPASS_STATS *fps) { |
| 130 if (p->stats_in >= p->stats_in_end) | 102 if (p->stats_in >= p->stats_in_end) |
| 131 return EOF; | 103 return EOF; |
| 132 | 104 |
| 133 *fps = *p->stats_in; | 105 *fps = *p->stats_in; |
| 134 ++p->stats_in; | 106 ++p->stats_in; |
| 135 return 1; | 107 return 1; |
| 136 } | 108 } |
| 137 | 109 |
| 138 static void output_stats(FIRSTPASS_STATS *stats, | 110 static void output_stats(FIRSTPASS_STATS *stats, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 168 stats->MVcv, | 140 stats->MVcv, |
| 169 stats->mv_in_out_count, | 141 stats->mv_in_out_count, |
| 170 stats->new_mv_count, | 142 stats->new_mv_count, |
| 171 stats->count, | 143 stats->count, |
| 172 stats->duration); | 144 stats->duration); |
| 173 fclose(fpfile); | 145 fclose(fpfile); |
| 174 } | 146 } |
| 175 #endif | 147 #endif |
| 176 } | 148 } |
| 177 | 149 |
| 150 #if CONFIG_FP_MB_STATS |
| 151 static void output_fpmb_stats(uint8_t *this_frame_mb_stats, VP9_COMMON *cm, |
| 152 struct vpx_codec_pkt_list *pktlist) { |
| 153 struct vpx_codec_cx_pkt pkt; |
| 154 pkt.kind = VPX_CODEC_FPMB_STATS_PKT; |
| 155 pkt.data.firstpass_mb_stats.buf = this_frame_mb_stats; |
| 156 pkt.data.firstpass_mb_stats.sz = cm->MBs * sizeof(uint8_t); |
| 157 vpx_codec_pkt_list_add(pktlist, &pkt); |
| 158 } |
| 159 #endif |
| 160 |
| 178 static void zero_stats(FIRSTPASS_STATS *section) { | 161 static void zero_stats(FIRSTPASS_STATS *section) { |
| 179 section->frame = 0.0; | 162 section->frame = 0.0; |
| 180 section->intra_error = 0.0; | 163 section->intra_error = 0.0; |
| 181 section->coded_error = 0.0; | 164 section->coded_error = 0.0; |
| 182 section->sr_coded_error = 0.0; | 165 section->sr_coded_error = 0.0; |
| 183 section->pcnt_inter = 0.0; | 166 section->pcnt_inter = 0.0; |
| 184 section->pcnt_motion = 0.0; | 167 section->pcnt_motion = 0.0; |
| 185 section->pcnt_second_ref = 0.0; | 168 section->pcnt_second_ref = 0.0; |
| 186 section->pcnt_neutral = 0.0; | 169 section->pcnt_neutral = 0.0; |
| 187 section->MVr = 0.0; | 170 section->MVr = 0.0; |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 int intrapenalty = 256; | 449 int intrapenalty = 256; |
| 467 int neutral_count = 0; | 450 int neutral_count = 0; |
| 468 int new_mv_count = 0; | 451 int new_mv_count = 0; |
| 469 int sum_in_vectors = 0; | 452 int sum_in_vectors = 0; |
| 470 uint32_t lastmv_as_int = 0; | 453 uint32_t lastmv_as_int = 0; |
| 471 TWO_PASS *twopass = &cpi->twopass; | 454 TWO_PASS *twopass = &cpi->twopass; |
| 472 const MV zero_mv = {0, 0}; | 455 const MV zero_mv = {0, 0}; |
| 473 const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; | 456 const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; |
| 474 | 457 |
| 475 #if CONFIG_FP_MB_STATS | 458 #if CONFIG_FP_MB_STATS |
| 476 FIRSTPASS_FRAME_MB_STATS *this_frame_mb_stats = &twopass->this_frame_mb_stats; | 459 if (cpi->use_fp_mb_stats) { |
| 460 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->MBs); |
| 461 } |
| 477 #endif | 462 #endif |
| 478 | 463 |
| 479 vp9_clear_system_state(); | 464 vp9_clear_system_state(); |
| 480 | 465 |
| 481 set_first_pass_params(cpi); | 466 set_first_pass_params(cpi); |
| 482 vp9_set_quantizer(cm, find_fp_qindex()); | 467 vp9_set_quantizer(cm, find_fp_qindex()); |
| 483 | 468 |
| 484 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { | 469 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { |
| 485 MV_REFERENCE_FRAME ref_frame = LAST_FRAME; | 470 MV_REFERENCE_FRAME ref_frame = LAST_FRAME; |
| 486 const YV12_BUFFER_CONFIG *scaled_ref_buf = NULL; | 471 const YV12_BUFFER_CONFIG *scaled_ref_buf = NULL; |
| 487 twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass; | 472 twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass; |
| 488 | 473 |
| 474 if (cpi->common.current_video_frame == 0) { |
| 475 cpi->ref_frame_flags = 0; |
| 476 } else { |
| 477 LAYER_CONTEXT *lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; |
| 478 if (lc->current_video_frame_in_layer == 0) |
| 479 cpi->ref_frame_flags = VP9_GOLD_FLAG; |
| 480 else |
| 481 cpi->ref_frame_flags = VP9_LAST_FLAG | VP9_GOLD_FLAG; |
| 482 } |
| 483 |
| 489 vp9_scale_references(cpi); | 484 vp9_scale_references(cpi); |
| 490 | 485 |
| 491 // Use either last frame or alt frame for motion search. | 486 // Use either last frame or alt frame for motion search. |
| 492 if (cpi->ref_frame_flags & VP9_LAST_FLAG) { | 487 if (cpi->ref_frame_flags & VP9_LAST_FLAG) { |
| 493 scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, LAST_FRAME); | 488 scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, LAST_FRAME); |
| 494 ref_frame = LAST_FRAME; | 489 ref_frame = LAST_FRAME; |
| 495 } else if (cpi->ref_frame_flags & VP9_ALT_FLAG) { | 490 } else if (cpi->ref_frame_flags & VP9_GOLD_FLAG) { |
| 496 scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, ALTREF_FRAME); | 491 scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, GOLDEN_FRAME); |
| 497 ref_frame = ALTREF_FRAME; | 492 ref_frame = GOLDEN_FRAME; |
| 498 } | 493 } |
| 499 | 494 |
| 500 if (scaled_ref_buf != NULL) { | 495 if (scaled_ref_buf != NULL) |
| 501 // Update the stride since we are using scaled reference buffer | |
| 502 first_ref_buf = scaled_ref_buf; | 496 first_ref_buf = scaled_ref_buf; |
| 503 recon_y_stride = first_ref_buf->y_stride; | 497 |
| 504 recon_uv_stride = first_ref_buf->uv_stride; | 498 recon_y_stride = new_yv12->y_stride; |
| 505 uv_mb_height = 16 >> (first_ref_buf->y_height > first_ref_buf->uv_height); | 499 recon_uv_stride = new_yv12->uv_stride; |
| 506 } | 500 uv_mb_height = 16 >> (new_yv12->y_height > new_yv12->uv_height); |
| 507 | 501 |
| 508 // Disable golden frame for svc first pass for now. | 502 // Disable golden frame for svc first pass for now. |
| 509 gld_yv12 = NULL; | 503 gld_yv12 = NULL; |
| 510 set_ref_ptrs(cm, xd, ref_frame, NONE); | 504 set_ref_ptrs(cm, xd, ref_frame, NONE); |
| 511 | 505 |
| 512 cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source, | 506 cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source, |
| 513 &cpi->scaled_source); | 507 &cpi->scaled_source); |
| 514 } | 508 } |
| 515 | 509 |
| 516 vp9_setup_block_planes(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); | 510 vp9_setup_block_planes(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 // When the error score is very low this causes us to pick all or lots of | 592 // When the error score is very low this causes us to pick all or lots of |
| 599 // INTRA modes and throw lots of key frames. | 593 // INTRA modes and throw lots of key frames. |
| 600 // This penalty adds a cost matching that of a 0,0 mv to the intra case. | 594 // This penalty adds a cost matching that of a 0,0 mv to the intra case. |
| 601 this_error += intrapenalty; | 595 this_error += intrapenalty; |
| 602 | 596 |
| 603 // Accumulate the intra error. | 597 // Accumulate the intra error. |
| 604 intra_error += (int64_t)this_error; | 598 intra_error += (int64_t)this_error; |
| 605 | 599 |
| 606 #if CONFIG_FP_MB_STATS | 600 #if CONFIG_FP_MB_STATS |
| 607 if (cpi->use_fp_mb_stats) { | 601 if (cpi->use_fp_mb_stats) { |
| 608 this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].mode = | 602 // TODO(pengchong): store some related block statistics here |
| 609 DC_PRED; | |
| 610 this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].err = | |
| 611 this_error; | |
| 612 this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].mv.as_int | |
| 613 = 0; | |
| 614 } | 603 } |
| 615 #endif | 604 #endif |
| 616 | 605 |
| 617 // Set up limit values for motion vectors to prevent them extending | 606 // Set up limit values for motion vectors to prevent them extending |
| 618 // outside the UMV borders. | 607 // outside the UMV borders. |
| 619 x->mv_col_min = -((mb_col * 16) + BORDER_MV_PIXELS_B16); | 608 x->mv_col_min = -((mb_col * 16) + BORDER_MV_PIXELS_B16); |
| 620 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + BORDER_MV_PIXELS_B16; | 609 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + BORDER_MV_PIXELS_B16; |
| 621 | 610 |
| 622 // Other than for the first frame do a motion search. | 611 // Other than for the first frame do a motion search. |
| 623 if (cm->current_video_frame > 0) { | 612 if (cm->current_video_frame > 0) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 sum_mvc += mv.as_mv.col; | 723 sum_mvc += mv.as_mv.col; |
| 735 sum_mvc_abs += abs(mv.as_mv.col); | 724 sum_mvc_abs += abs(mv.as_mv.col); |
| 736 sum_mvrs += mv.as_mv.row * mv.as_mv.row; | 725 sum_mvrs += mv.as_mv.row * mv.as_mv.row; |
| 737 sum_mvcs += mv.as_mv.col * mv.as_mv.col; | 726 sum_mvcs += mv.as_mv.col * mv.as_mv.col; |
| 738 ++intercount; | 727 ++intercount; |
| 739 | 728 |
| 740 best_ref_mv.as_int = mv.as_int; | 729 best_ref_mv.as_int = mv.as_int; |
| 741 | 730 |
| 742 #if CONFIG_FP_MB_STATS | 731 #if CONFIG_FP_MB_STATS |
| 743 if (cpi->use_fp_mb_stats) { | 732 if (cpi->use_fp_mb_stats) { |
| 744 this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].mode = | 733 // TODO(pengchong): save some related block statistics here |
| 745 NEWMV; | |
| 746 this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].err = | |
| 747 motion_error; | |
| 748 this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].mv. | |
| 749 as_int = mv.as_int; | |
| 750 } | 734 } |
| 751 #endif | 735 #endif |
| 752 | 736 |
| 753 if (mv.as_int) { | 737 if (mv.as_int) { |
| 754 ++mvcount; | 738 ++mvcount; |
| 755 | 739 |
| 756 // Non-zero vector, was it different from the last non zero vector? | 740 // Non-zero vector, was it different from the last non zero vector? |
| 757 if (mv.as_int != lastmv_as_int) | 741 if (mv.as_int != lastmv_as_int) |
| 758 ++new_mv_count; | 742 ++new_mv_count; |
| 759 lastmv_as_int = mv.as_int; | 743 lastmv_as_int = mv.as_int; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 // cpi->source_time_stamp. | 834 // cpi->source_time_stamp. |
| 851 fps.duration = (double)(cpi->source->ts_end - cpi->source->ts_start); | 835 fps.duration = (double)(cpi->source->ts_end - cpi->source->ts_start); |
| 852 | 836 |
| 853 // Don't want to do output stats with a stack variable! | 837 // Don't want to do output stats with a stack variable! |
| 854 twopass->this_frame_stats = fps; | 838 twopass->this_frame_stats = fps; |
| 855 output_stats(&twopass->this_frame_stats, cpi->output_pkt_list); | 839 output_stats(&twopass->this_frame_stats, cpi->output_pkt_list); |
| 856 accumulate_stats(&twopass->total_stats, &fps); | 840 accumulate_stats(&twopass->total_stats, &fps); |
| 857 | 841 |
| 858 #if CONFIG_FP_MB_STATS | 842 #if CONFIG_FP_MB_STATS |
| 859 if (cpi->use_fp_mb_stats) { | 843 if (cpi->use_fp_mb_stats) { |
| 860 output_mb_stats(this_frame_mb_stats, cm); | 844 output_fpmb_stats(twopass->frame_mb_stats_buf, cm, cpi->output_pkt_list); |
| 861 } | 845 } |
| 862 #endif | 846 #endif |
| 863 } | 847 } |
| 864 | 848 |
| 865 // Copy the previous Last Frame back into gf and and arf buffers if | 849 // Copy the previous Last Frame back into gf and and arf buffers if |
| 866 // the prediction is good enough... but also don't allow it to lag too far. | 850 // the prediction is good enough... but also don't allow it to lag too far. |
| 867 if ((twopass->sr_update_lag > 3) || | 851 if ((twopass->sr_update_lag > 3) || |
| 868 ((cm->current_video_frame > 0) && | 852 ((cm->current_video_frame > 0) && |
| 869 (twopass->this_frame_stats.pcnt_inter > 0.20) && | 853 (twopass->this_frame_stats.pcnt_inter > 0.20) && |
| 870 ((twopass->this_frame_stats.intra_error / | 854 ((twopass->this_frame_stats.intra_error / |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 if (cm->current_video_frame == 0) | 886 if (cm->current_video_frame == 0) |
| 903 recon_file = fopen(filename, "wb"); | 887 recon_file = fopen(filename, "wb"); |
| 904 else | 888 else |
| 905 recon_file = fopen(filename, "ab"); | 889 recon_file = fopen(filename, "ab"); |
| 906 | 890 |
| 907 (void)fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, recon_file); | 891 (void)fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, recon_file); |
| 908 fclose(recon_file); | 892 fclose(recon_file); |
| 909 } | 893 } |
| 910 | 894 |
| 911 ++cm->current_video_frame; | 895 ++cm->current_video_frame; |
| 896 if (cpi->use_svc) |
| 897 vp9_inc_frame_in_layer(&cpi->svc); |
| 912 } | 898 } |
| 913 | 899 |
| 914 static double calc_correction_factor(double err_per_mb, | 900 static double calc_correction_factor(double err_per_mb, |
| 915 double err_divisor, | 901 double err_divisor, |
| 916 double pt_low, | 902 double pt_low, |
| 917 double pt_high, | 903 double pt_high, |
| 918 int q) { | 904 int q) { |
| 919 const double error_term = err_per_mb / err_divisor; | 905 const double error_term = err_per_mb / err_divisor; |
| 920 | 906 |
| 921 // Adjustment based on actual quantizer to power term. | 907 // Adjustment based on actual quantizer to power term. |
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1499 double decay_accumulator = 1.0; | 1485 double decay_accumulator = 1.0; |
| 1500 double zero_motion_accumulator = 1.0; | 1486 double zero_motion_accumulator = 1.0; |
| 1501 | 1487 |
| 1502 double loop_decay_rate = 1.00; | 1488 double loop_decay_rate = 1.00; |
| 1503 double last_loop_decay_rate = 1.00; | 1489 double last_loop_decay_rate = 1.00; |
| 1504 | 1490 |
| 1505 double this_frame_mv_in_out = 0.0; | 1491 double this_frame_mv_in_out = 0.0; |
| 1506 double mv_in_out_accumulator = 0.0; | 1492 double mv_in_out_accumulator = 0.0; |
| 1507 double abs_mv_in_out_accumulator = 0.0; | 1493 double abs_mv_in_out_accumulator = 0.0; |
| 1508 double mv_ratio_accumulator_thresh; | 1494 double mv_ratio_accumulator_thresh; |
| 1509 unsigned int allow_alt_ref = is_altref_enabled(oxcf); | 1495 unsigned int allow_alt_ref = is_altref_enabled(cpi); |
| 1510 | 1496 |
| 1511 int f_boost = 0; | 1497 int f_boost = 0; |
| 1512 int b_boost = 0; | 1498 int b_boost = 0; |
| 1513 int flash_detected; | 1499 int flash_detected; |
| 1514 int active_max_gf_interval; | 1500 int active_max_gf_interval; |
| 1515 int64_t gf_group_bits; | 1501 int64_t gf_group_bits; |
| 1516 double gf_group_error_left; | 1502 double gf_group_error_left; |
| 1517 int gf_arf_bits; | 1503 int gf_arf_bits; |
| 1518 | 1504 |
| 1519 // Reset the GF group data structures unless this is a key | 1505 // Reset the GF group data structures unless this is a key |
| (...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2073 cpi->rc.is_src_frame_alt_ref = 1; | 2059 cpi->rc.is_src_frame_alt_ref = 1; |
| 2074 break; | 2060 break; |
| 2075 case ARF_UPDATE: | 2061 case ARF_UPDATE: |
| 2076 cpi->refresh_last_frame = 0; | 2062 cpi->refresh_last_frame = 0; |
| 2077 cpi->refresh_golden_frame = 0; | 2063 cpi->refresh_golden_frame = 0; |
| 2078 cpi->refresh_alt_ref_frame = 1; | 2064 cpi->refresh_alt_ref_frame = 1; |
| 2079 break; | 2065 break; |
| 2080 default: | 2066 default: |
| 2081 assert(0); | 2067 assert(0); |
| 2082 } | 2068 } |
| 2069 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { |
| 2070 cpi->refresh_golden_frame = 0; |
| 2071 if (cpi->alt_ref_source == NULL) |
| 2072 cpi->refresh_alt_ref_frame = 0; |
| 2073 } |
| 2083 } | 2074 } |
| 2084 | 2075 |
| 2085 | 2076 |
| 2086 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { | 2077 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { |
| 2087 VP9_COMMON *const cm = &cpi->common; | 2078 VP9_COMMON *const cm = &cpi->common; |
| 2088 RATE_CONTROL *const rc = &cpi->rc; | 2079 RATE_CONTROL *const rc = &cpi->rc; |
| 2089 TWO_PASS *const twopass = &cpi->twopass; | 2080 TWO_PASS *const twopass = &cpi->twopass; |
| 2090 int frames_left; | 2081 int frames_left; |
| 2091 FIRSTPASS_STATS this_frame; | 2082 FIRSTPASS_STATS this_frame; |
| 2092 FIRSTPASS_STATS this_frame_copy; | 2083 FIRSTPASS_STATS this_frame_copy; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2115 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; | 2106 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; |
| 2116 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); | 2107 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); |
| 2117 rc->base_frame_target = target_rate; | 2108 rc->base_frame_target = target_rate; |
| 2118 #ifdef LONG_TERM_VBR_CORRECTION | 2109 #ifdef LONG_TERM_VBR_CORRECTION |
| 2119 // Correction to rate target based on prior over or under shoot. | 2110 // Correction to rate target based on prior over or under shoot. |
| 2120 if (cpi->oxcf.rc_mode == VPX_VBR) | 2111 if (cpi->oxcf.rc_mode == VPX_VBR) |
| 2121 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); | 2112 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); |
| 2122 #endif | 2113 #endif |
| 2123 vp9_rc_set_frame_target(cpi, target_rate); | 2114 vp9_rc_set_frame_target(cpi, target_rate); |
| 2124 cm->frame_type = INTER_FRAME; | 2115 cm->frame_type = INTER_FRAME; |
| 2116 |
| 2117 if (is_spatial_svc) { |
| 2118 if (cpi->svc.spatial_layer_id == 0) { |
| 2119 lc->is_key_frame = 0; |
| 2120 } else { |
| 2121 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; |
| 2122 |
| 2123 if (lc->is_key_frame) |
| 2124 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); |
| 2125 } |
| 2126 } |
| 2127 |
| 2125 return; | 2128 return; |
| 2126 } | 2129 } |
| 2127 | 2130 |
| 2128 vp9_clear_system_state(); | 2131 vp9_clear_system_state(); |
| 2129 | 2132 |
| 2130 if (is_spatial_svc && twopass->kf_intra_err_min == 0) { | 2133 if (is_spatial_svc && twopass->kf_intra_err_min == 0) { |
| 2131 twopass->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; | 2134 twopass->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; |
| 2132 twopass->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; | 2135 twopass->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; |
| 2133 } | 2136 } |
| 2134 | 2137 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2182 // As long as max_thresh for encode breakout is small enough, it is ok | 2185 // As long as max_thresh for encode breakout is small enough, it is ok |
| 2183 // to enable it for show frame, i.e. set allow_encode_breakout to | 2186 // to enable it for show frame, i.e. set allow_encode_breakout to |
| 2184 // ENCODE_BREAKOUT_LIMITED. | 2187 // ENCODE_BREAKOUT_LIMITED. |
| 2185 if (!cm->show_frame) | 2188 if (!cm->show_frame) |
| 2186 cpi->allow_encode_breakout = ENCODE_BREAKOUT_DISABLED; | 2189 cpi->allow_encode_breakout = ENCODE_BREAKOUT_DISABLED; |
| 2187 else | 2190 else |
| 2188 cpi->allow_encode_breakout = ENCODE_BREAKOUT_LIMITED; | 2191 cpi->allow_encode_breakout = ENCODE_BREAKOUT_LIMITED; |
| 2189 } | 2192 } |
| 2190 | 2193 |
| 2191 rc->frames_till_gf_update_due = rc->baseline_gf_interval; | 2194 rc->frames_till_gf_update_due = rc->baseline_gf_interval; |
| 2192 cpi->refresh_golden_frame = 1; | 2195 if (!is_spatial_svc) |
| 2193 } | 2196 cpi->refresh_golden_frame = 1; |
| 2194 | |
| 2195 { | |
| 2196 FIRSTPASS_STATS next_frame; | |
| 2197 if (lookup_next_frame_stats(twopass, &next_frame) != EOF) { | |
| 2198 twopass->next_iiratio = (int)(next_frame.intra_error / | |
| 2199 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); | |
| 2200 } | |
| 2201 } | 2197 } |
| 2202 | 2198 |
| 2203 configure_buffer_updates(cpi); | 2199 configure_buffer_updates(cpi); |
| 2204 | 2200 |
| 2205 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; | 2201 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; |
| 2206 if (cpi->common.frame_type == KEY_FRAME) | 2202 if (cpi->common.frame_type == KEY_FRAME) |
| 2207 target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate); | 2203 target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate); |
| 2208 else | 2204 else |
| 2209 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); | 2205 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); |
| 2210 | 2206 |
| 2211 rc->base_frame_target = target_rate; | 2207 rc->base_frame_target = target_rate; |
| 2212 #ifdef LONG_TERM_VBR_CORRECTION | 2208 #ifdef LONG_TERM_VBR_CORRECTION |
| 2213 // Correction to rate target based on prior over or under shoot. | 2209 // Correction to rate target based on prior over or under shoot. |
| 2214 if (cpi->oxcf.rc_mode == VPX_VBR) | 2210 if (cpi->oxcf.rc_mode == VPX_VBR) |
| 2215 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); | 2211 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); |
| 2216 #endif | 2212 #endif |
| 2217 vp9_rc_set_frame_target(cpi, target_rate); | 2213 vp9_rc_set_frame_target(cpi, target_rate); |
| 2218 | 2214 |
| 2219 // Update the total stats remaining structure. | 2215 // Update the total stats remaining structure. |
| 2220 subtract_stats(&twopass->total_left_stats, &this_frame); | 2216 subtract_stats(&twopass->total_left_stats, &this_frame); |
| 2221 | |
| 2222 #if CONFIG_FP_MB_STATS | |
| 2223 if (cpi->use_fp_mb_stats) { | |
| 2224 input_mb_stats(&twopass->this_frame_mb_stats, cm); | |
| 2225 } | |
| 2226 #endif | |
| 2227 } | 2217 } |
| 2228 | 2218 |
| 2229 void vp9_twopass_postencode_update(VP9_COMP *cpi) { | 2219 void vp9_twopass_postencode_update(VP9_COMP *cpi) { |
| 2230 TWO_PASS *const twopass = &cpi->twopass; | 2220 TWO_PASS *const twopass = &cpi->twopass; |
| 2231 RATE_CONTROL *const rc = &cpi->rc; | 2221 RATE_CONTROL *const rc = &cpi->rc; |
| 2232 #ifdef LONG_TERM_VBR_CORRECTION | 2222 #ifdef LONG_TERM_VBR_CORRECTION |
| 2233 // In this experimental mode, the VBR correction is done exclusively through | 2223 // In this experimental mode, the VBR correction is done exclusively through |
| 2234 // rc->vbr_bits_off_target. Based on the sign of this value, a limited % | 2224 // rc->vbr_bits_off_target. Based on the sign of this value, a limited % |
| 2235 // adjustment is made to the target rate of subsequent frames, to try and | 2225 // adjustment is made to the target rate of subsequent frames, to try and |
| 2236 // push it back towards 0. This mode is less likely to suffer from | 2226 // push it back towards 0. This mode is less likely to suffer from |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2268 twopass->kf_group_bits += rc->this_frame_target - bits_used; | 2258 twopass->kf_group_bits += rc->this_frame_target - bits_used; |
| 2269 } else { | 2259 } else { |
| 2270 #endif | 2260 #endif |
| 2271 twopass->kf_group_bits -= bits_used; | 2261 twopass->kf_group_bits -= bits_used; |
| 2272 } | 2262 } |
| 2273 twopass->kf_group_bits = MAX(twopass->kf_group_bits, 0); | 2263 twopass->kf_group_bits = MAX(twopass->kf_group_bits, 0); |
| 2274 | 2264 |
| 2275 // Increment the gf group index ready for the next frame. | 2265 // Increment the gf group index ready for the next frame. |
| 2276 ++twopass->gf_group.index; | 2266 ++twopass->gf_group.index; |
| 2277 } | 2267 } |
| OLD | NEW |