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 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 int intercount = 0; | 425 int intercount = 0; |
426 int second_ref_count = 0; | 426 int second_ref_count = 0; |
427 int intrapenalty = 256; | 427 int intrapenalty = 256; |
428 int neutral_count = 0; | 428 int neutral_count = 0; |
429 int new_mv_count = 0; | 429 int new_mv_count = 0; |
430 int sum_in_vectors = 0; | 430 int sum_in_vectors = 0; |
431 uint32_t lastmv_as_int = 0; | 431 uint32_t lastmv_as_int = 0; |
432 TWO_PASS *twopass = &cpi->twopass; | 432 TWO_PASS *twopass = &cpi->twopass; |
433 const MV zero_mv = {0, 0}; | 433 const MV zero_mv = {0, 0}; |
434 const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; | 434 const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; |
| 435 LAYER_CONTEXT *const lc = is_spatial_svc(cpi) ? |
| 436 &cpi->svc.layer_context[cpi->svc.spatial_layer_id] : 0; |
435 | 437 |
436 #if CONFIG_FP_MB_STATS | 438 #if CONFIG_FP_MB_STATS |
437 if (cpi->use_fp_mb_stats) { | 439 if (cpi->use_fp_mb_stats) { |
438 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->MBs); | 440 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->MBs); |
439 } | 441 } |
440 #endif | 442 #endif |
441 | 443 |
442 vp9_clear_system_state(); | 444 vp9_clear_system_state(); |
443 | 445 |
444 set_first_pass_params(cpi); | 446 set_first_pass_params(cpi); |
445 vp9_set_quantizer(cm, find_fp_qindex()); | 447 vp9_set_quantizer(cm, find_fp_qindex()); |
446 | 448 |
447 if (is_spatial_svc(cpi)) { | 449 if (lc != NULL) { |
448 MV_REFERENCE_FRAME ref_frame = LAST_FRAME; | 450 MV_REFERENCE_FRAME ref_frame = LAST_FRAME; |
449 const YV12_BUFFER_CONFIG *scaled_ref_buf = NULL; | 451 const YV12_BUFFER_CONFIG *scaled_ref_buf = NULL; |
450 twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass; | 452 twopass = &lc->twopass; |
451 | 453 |
452 if (cpi->common.current_video_frame == 0) { | 454 if (cpi->common.current_video_frame == 0) { |
453 cpi->ref_frame_flags = 0; | 455 cpi->ref_frame_flags = 0; |
454 } else { | 456 } else { |
455 LAYER_CONTEXT *lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; | |
456 if (lc->current_video_frame_in_layer == 0) | 457 if (lc->current_video_frame_in_layer == 0) |
457 cpi->ref_frame_flags = VP9_GOLD_FLAG; | 458 cpi->ref_frame_flags = VP9_GOLD_FLAG; |
458 else | 459 else |
459 cpi->ref_frame_flags = VP9_LAST_FLAG | VP9_GOLD_FLAG; | 460 cpi->ref_frame_flags = VP9_LAST_FLAG | VP9_GOLD_FLAG; |
460 } | 461 } |
461 | 462 |
462 vp9_scale_references(cpi); | 463 vp9_scale_references(cpi); |
463 | 464 |
464 // Use either last frame or alt frame for motion search. | 465 // Use either last frame or alt frame for motion search. |
465 if (cpi->ref_frame_flags & VP9_LAST_FLAG) { | 466 if (cpi->ref_frame_flags & VP9_LAST_FLAG) { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 // frame as the reference. Skip the further motion search on | 607 // frame as the reference. Skip the further motion search on |
607 // reconstructed frame if this error is small. | 608 // reconstructed frame if this error is small. |
608 unscaled_last_source_buf_2d.buf = | 609 unscaled_last_source_buf_2d.buf = |
609 cpi->unscaled_last_source->y_buffer + recon_yoffset; | 610 cpi->unscaled_last_source->y_buffer + recon_yoffset; |
610 unscaled_last_source_buf_2d.stride = | 611 unscaled_last_source_buf_2d.stride = |
611 cpi->unscaled_last_source->y_stride; | 612 cpi->unscaled_last_source->y_stride; |
612 raw_motion_error = get_prediction_error(bsize, &x->plane[0].src, | 613 raw_motion_error = get_prediction_error(bsize, &x->plane[0].src, |
613 &unscaled_last_source_buf_2d); | 614 &unscaled_last_source_buf_2d); |
614 | 615 |
615 // TODO(pengchong): Replace the hard-coded threshold | 616 // TODO(pengchong): Replace the hard-coded threshold |
616 if (raw_motion_error > 25 || is_spatial_svc(cpi)) { | 617 if (raw_motion_error > 25 || lc != NULL) { |
617 // Test last reference frame using the previous best mv as the | 618 // Test last reference frame using the previous best mv as the |
618 // starting point (best reference) for the search. | 619 // starting point (best reference) for the search. |
619 first_pass_motion_search(cpi, x, &best_ref_mv.as_mv, &mv.as_mv, | 620 first_pass_motion_search(cpi, x, &best_ref_mv.as_mv, &mv.as_mv, |
620 &motion_error); | 621 &motion_error); |
621 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { | 622 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |
622 vp9_clear_system_state(); | 623 vp9_clear_system_state(); |
623 motion_error = (int)(motion_error * error_weight); | 624 motion_error = (int)(motion_error * error_weight); |
624 } | 625 } |
625 | 626 |
626 // If the current best reference mv is not centered on 0,0 then do a | 627 // If the current best reference mv is not centered on 0,0 then do a |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
888 if (gld_yv12 != NULL) { | 889 if (gld_yv12 != NULL) { |
889 vp8_yv12_copy_frame(lst_yv12, gld_yv12); | 890 vp8_yv12_copy_frame(lst_yv12, gld_yv12); |
890 } | 891 } |
891 twopass->sr_update_lag = 1; | 892 twopass->sr_update_lag = 1; |
892 } else { | 893 } else { |
893 ++twopass->sr_update_lag; | 894 ++twopass->sr_update_lag; |
894 } | 895 } |
895 | 896 |
896 vp9_extend_frame_borders(new_yv12); | 897 vp9_extend_frame_borders(new_yv12); |
897 | 898 |
898 if (is_spatial_svc(cpi)) { | 899 if (lc != NULL) { |
899 vp9_update_reference_frames(cpi); | 900 vp9_update_reference_frames(cpi); |
900 } else { | 901 } else { |
901 // Swap frame pointers so last frame refers to the frame we just compressed. | 902 // Swap frame pointers so last frame refers to the frame we just compressed. |
902 swap_yv12(lst_yv12, new_yv12); | 903 swap_yv12(lst_yv12, new_yv12); |
903 } | 904 } |
904 | 905 |
905 // Special case for the first frame. Copy into the GF buffer as a second | 906 // Special case for the first frame. Copy into the GF buffer as a second |
906 // reference. | 907 // reference. |
907 if (cm->current_video_frame == 0 && gld_yv12 != NULL) { | 908 if (cm->current_video_frame == 0 && gld_yv12 != NULL) { |
908 vp8_yv12_copy_frame(lst_yv12, gld_yv12); | 909 vp8_yv12_copy_frame(lst_yv12, gld_yv12); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 next_frame->coded_error) / cm->MBs; | 1075 next_frame->coded_error) / cm->MBs; |
1075 const double second_ref_decay = mb_sr_err_diff <= 512.0 | 1076 const double second_ref_decay = mb_sr_err_diff <= 512.0 |
1076 ? fclamp(pow(1.0 - (mb_sr_err_diff / 512.0), 0.5), 0.85, 1.0) | 1077 ? fclamp(pow(1.0 - (mb_sr_err_diff / 512.0), 0.5), 0.85, 1.0) |
1077 : 0.85; | 1078 : 0.85; |
1078 | 1079 |
1079 return MIN(second_ref_decay, next_frame->pcnt_inter); | 1080 return MIN(second_ref_decay, next_frame->pcnt_inter); |
1080 } | 1081 } |
1081 | 1082 |
1082 // This function gives an estimate of how badly we believe the prediction | 1083 // This function gives an estimate of how badly we believe the prediction |
1083 // quality is decaying from frame to frame. | 1084 // quality is decaying from frame to frame. |
1084 static double get_zero_motion_factor(const VP9_COMMON *cm, | 1085 static double get_zero_motion_factor(const FIRSTPASS_STATS *frame) { |
1085 const FIRSTPASS_STATS *frame) { | |
1086 const double sr_ratio = frame->coded_error / | 1086 const double sr_ratio = frame->coded_error / |
1087 DOUBLE_DIVIDE_CHECK(frame->sr_coded_error); | 1087 DOUBLE_DIVIDE_CHECK(frame->sr_coded_error); |
1088 const double zero_motion_pct = frame->pcnt_inter - | 1088 const double zero_motion_pct = frame->pcnt_inter - |
1089 frame->pcnt_motion; | 1089 frame->pcnt_motion; |
1090 | 1090 |
1091 return MIN(sr_ratio, zero_motion_pct); | 1091 return MIN(sr_ratio, zero_motion_pct); |
1092 } | 1092 } |
1093 | 1093 |
1094 | 1094 |
1095 // Function to test for a condition where a complex transition is followed | 1095 // Function to test for a condition where a complex transition is followed |
1096 // by a static section. For example in slide shows where there is a fade | 1096 // by a static section. For example in slide shows where there is a fade |
1097 // between slides. This is to help with more optimal kf and gf positioning. | 1097 // between slides. This is to help with more optimal kf and gf positioning. |
1098 static int detect_transition_to_still(TWO_PASS *twopass, | 1098 static int detect_transition_to_still(const TWO_PASS *twopass, |
1099 int frame_interval, int still_interval, | 1099 int frame_interval, int still_interval, |
1100 double loop_decay_rate, | 1100 double loop_decay_rate, |
1101 double last_decay_rate) { | 1101 double last_decay_rate) { |
1102 int trans_to_still = 0; | |
1103 | |
1104 // Break clause to detect very still sections after motion | 1102 // Break clause to detect very still sections after motion |
1105 // For example a static image after a fade or other transition | 1103 // For example a static image after a fade or other transition |
1106 // instead of a clean scene cut. | 1104 // instead of a clean scene cut. |
1107 if (frame_interval > MIN_GF_INTERVAL && | 1105 if (frame_interval > MIN_GF_INTERVAL && |
1108 loop_decay_rate >= 0.999 && | 1106 loop_decay_rate >= 0.999 && |
1109 last_decay_rate < 0.9) { | 1107 last_decay_rate < 0.9) { |
1110 int j; | 1108 int j; |
1111 const FIRSTPASS_STATS *position = twopass->stats_in; | |
1112 FIRSTPASS_STATS tmp_next_frame; | |
1113 | 1109 |
1114 // Look ahead a few frames to see if static condition persists... | 1110 // Look ahead a few frames to see if static condition persists... |
1115 for (j = 0; j < still_interval; ++j) { | 1111 for (j = 0; j < still_interval; ++j) { |
1116 if (EOF == input_stats(twopass, &tmp_next_frame)) | 1112 const FIRSTPASS_STATS *stats = &twopass->stats_in[j]; |
| 1113 if (stats >= twopass->stats_in_end) |
1117 break; | 1114 break; |
1118 | 1115 |
1119 if (tmp_next_frame.pcnt_inter - tmp_next_frame.pcnt_motion < 0.999) | 1116 if (stats->pcnt_inter - stats->pcnt_motion < 0.999) |
1120 break; | 1117 break; |
1121 } | 1118 } |
1122 | 1119 |
1123 reset_fpf_position(twopass, position); | |
1124 | |
1125 // Only if it does do we signal a transition to still. | 1120 // Only if it does do we signal a transition to still. |
1126 if (j == still_interval) | 1121 return j == still_interval; |
1127 trans_to_still = 1; | |
1128 } | 1122 } |
1129 | 1123 |
1130 return trans_to_still; | 1124 return 0; |
1131 } | 1125 } |
1132 | 1126 |
1133 // This function detects a flash through the high relative pcnt_second_ref | 1127 // This function detects a flash through the high relative pcnt_second_ref |
1134 // score in the frame following a flash frame. The offset passed in should | 1128 // score in the frame following a flash frame. The offset passed in should |
1135 // reflect this. | 1129 // reflect this. |
1136 static int detect_flash(const TWO_PASS *twopass, int offset) { | 1130 static int detect_flash(const TWO_PASS *twopass, int offset) { |
1137 const FIRSTPASS_STATS *const next_frame = read_frame_stats(twopass, offset); | 1131 const FIRSTPASS_STATS *const next_frame = read_frame_stats(twopass, offset); |
1138 | 1132 |
1139 // What we are looking for here is a situation where there is a | 1133 // What we are looking for here is a situation where there is a |
1140 // brief break in prediction (such as a flash) but subsequent frames | 1134 // brief break in prediction (such as a flash) but subsequent frames |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1366 // the integration process with other codec features that swap buffers around. | 1360 // the integration process with other codec features that swap buffers around. |
1367 static void get_arf_buffer_indices(unsigned char *arf_buffer_indices) { | 1361 static void get_arf_buffer_indices(unsigned char *arf_buffer_indices) { |
1368 arf_buffer_indices[0] = ARF_SLOT1; | 1362 arf_buffer_indices[0] = ARF_SLOT1; |
1369 arf_buffer_indices[1] = ARF_SLOT2; | 1363 arf_buffer_indices[1] = ARF_SLOT2; |
1370 } | 1364 } |
1371 | 1365 |
1372 static void allocate_gf_group_bits(VP9_COMP *cpi, int64_t gf_group_bits, | 1366 static void allocate_gf_group_bits(VP9_COMP *cpi, int64_t gf_group_bits, |
1373 double group_error, int gf_arf_bits) { | 1367 double group_error, int gf_arf_bits) { |
1374 RATE_CONTROL *const rc = &cpi->rc; | 1368 RATE_CONTROL *const rc = &cpi->rc; |
1375 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 1369 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
1376 TWO_PASS *twopass = &cpi->twopass; | 1370 TWO_PASS *const twopass = &cpi->twopass; |
| 1371 GF_GROUP *const gf_group = &twopass->gf_group; |
1377 FIRSTPASS_STATS frame_stats; | 1372 FIRSTPASS_STATS frame_stats; |
1378 int i; | 1373 int i; |
1379 int frame_index = 1; | 1374 int frame_index = 1; |
1380 int target_frame_size; | 1375 int target_frame_size; |
1381 int key_frame; | 1376 int key_frame; |
1382 const int max_bits = frame_max_bits(&cpi->rc, &cpi->oxcf); | 1377 const int max_bits = frame_max_bits(&cpi->rc, &cpi->oxcf); |
1383 int64_t total_group_bits = gf_group_bits; | 1378 int64_t total_group_bits = gf_group_bits; |
1384 double modified_err = 0.0; | 1379 double modified_err = 0.0; |
1385 double err_fraction; | 1380 double err_fraction; |
1386 int mid_boost_bits = 0; | 1381 int mid_boost_bits = 0; |
1387 int mid_frame_idx; | 1382 int mid_frame_idx; |
1388 unsigned char arf_buffer_indices[MAX_ACTIVE_ARFS]; | 1383 unsigned char arf_buffer_indices[MAX_ACTIVE_ARFS]; |
1389 | 1384 |
1390 key_frame = cpi->common.frame_type == KEY_FRAME || | 1385 key_frame = cpi->common.frame_type == KEY_FRAME || |
1391 vp9_is_upper_layer_key_frame(cpi); | 1386 vp9_is_upper_layer_key_frame(cpi); |
1392 | 1387 |
1393 get_arf_buffer_indices(arf_buffer_indices); | 1388 get_arf_buffer_indices(arf_buffer_indices); |
1394 | 1389 |
1395 // For key frames the frame target rate is already set and it | 1390 // For key frames the frame target rate is already set and it |
1396 // is also the golden frame. | 1391 // is also the golden frame. |
1397 if (!key_frame) { | 1392 if (!key_frame) { |
1398 if (rc->source_alt_ref_active) { | 1393 if (rc->source_alt_ref_active) { |
1399 twopass->gf_group.update_type[0] = OVERLAY_UPDATE; | 1394 gf_group->update_type[0] = OVERLAY_UPDATE; |
1400 twopass->gf_group.rf_level[0] = INTER_NORMAL; | 1395 gf_group->rf_level[0] = INTER_NORMAL; |
1401 twopass->gf_group.bit_allocation[0] = 0; | 1396 gf_group->bit_allocation[0] = 0; |
1402 twopass->gf_group.arf_update_idx[0] = arf_buffer_indices[0]; | 1397 gf_group->arf_update_idx[0] = arf_buffer_indices[0]; |
1403 twopass->gf_group.arf_ref_idx[0] = arf_buffer_indices[0]; | 1398 gf_group->arf_ref_idx[0] = arf_buffer_indices[0]; |
1404 } else { | 1399 } else { |
1405 twopass->gf_group.update_type[0] = GF_UPDATE; | 1400 gf_group->update_type[0] = GF_UPDATE; |
1406 twopass->gf_group.rf_level[0] = GF_ARF_STD; | 1401 gf_group->rf_level[0] = GF_ARF_STD; |
1407 twopass->gf_group.bit_allocation[0] = gf_arf_bits; | 1402 gf_group->bit_allocation[0] = gf_arf_bits; |
1408 twopass->gf_group.arf_update_idx[0] = arf_buffer_indices[0]; | 1403 gf_group->arf_update_idx[0] = arf_buffer_indices[0]; |
1409 twopass->gf_group.arf_ref_idx[0] = arf_buffer_indices[0]; | 1404 gf_group->arf_ref_idx[0] = arf_buffer_indices[0]; |
1410 } | 1405 } |
1411 | 1406 |
1412 // Step over the golden frame / overlay frame | 1407 // Step over the golden frame / overlay frame |
1413 if (EOF == input_stats(twopass, &frame_stats)) | 1408 if (EOF == input_stats(twopass, &frame_stats)) |
1414 return; | 1409 return; |
1415 } | 1410 } |
1416 | 1411 |
1417 // Deduct the boost bits for arf (or gf if it is not a key frame) | 1412 // Deduct the boost bits for arf (or gf if it is not a key frame) |
1418 // from the group total. | 1413 // from the group total. |
1419 if (rc->source_alt_ref_pending || !key_frame) | 1414 if (rc->source_alt_ref_pending || !key_frame) |
1420 total_group_bits -= gf_arf_bits; | 1415 total_group_bits -= gf_arf_bits; |
1421 | 1416 |
1422 // Store the bits to spend on the ARF if there is one. | 1417 // Store the bits to spend on the ARF if there is one. |
1423 if (rc->source_alt_ref_pending) { | 1418 if (rc->source_alt_ref_pending) { |
1424 twopass->gf_group.update_type[frame_index] = ARF_UPDATE; | 1419 gf_group->update_type[frame_index] = ARF_UPDATE; |
1425 twopass->gf_group.rf_level[frame_index] = GF_ARF_STD; | 1420 gf_group->rf_level[frame_index] = GF_ARF_STD; |
1426 twopass->gf_group.bit_allocation[frame_index] = gf_arf_bits; | 1421 gf_group->bit_allocation[frame_index] = gf_arf_bits; |
1427 twopass->gf_group.arf_src_offset[frame_index] = | 1422 gf_group->arf_src_offset[frame_index] = |
1428 (unsigned char)(rc->baseline_gf_interval - 1); | 1423 (unsigned char)(rc->baseline_gf_interval - 1); |
1429 twopass->gf_group.arf_update_idx[frame_index] = arf_buffer_indices[0]; | 1424 gf_group->arf_update_idx[frame_index] = arf_buffer_indices[0]; |
1430 twopass->gf_group.arf_ref_idx[frame_index] = | 1425 gf_group->arf_ref_idx[frame_index] = |
1431 arf_buffer_indices[cpi->multi_arf_last_grp_enabled && | 1426 arf_buffer_indices[cpi->multi_arf_last_grp_enabled && |
1432 rc->source_alt_ref_active]; | 1427 rc->source_alt_ref_active]; |
1433 ++frame_index; | 1428 ++frame_index; |
1434 | 1429 |
1435 if (cpi->multi_arf_enabled) { | 1430 if (cpi->multi_arf_enabled) { |
1436 // Set aside a slot for a level 1 arf. | 1431 // Set aside a slot for a level 1 arf. |
1437 twopass->gf_group.update_type[frame_index] = ARF_UPDATE; | 1432 gf_group->update_type[frame_index] = ARF_UPDATE; |
1438 twopass->gf_group.rf_level[frame_index] = GF_ARF_LOW; | 1433 gf_group->rf_level[frame_index] = GF_ARF_LOW; |
1439 twopass->gf_group.arf_src_offset[frame_index] = | 1434 gf_group->arf_src_offset[frame_index] = |
1440 (unsigned char)((rc->baseline_gf_interval >> 1) - 1); | 1435 (unsigned char)((rc->baseline_gf_interval >> 1) - 1); |
1441 twopass->gf_group.arf_update_idx[frame_index] = arf_buffer_indices[1]; | 1436 gf_group->arf_update_idx[frame_index] = arf_buffer_indices[1]; |
1442 twopass->gf_group.arf_ref_idx[frame_index] = arf_buffer_indices[0]; | 1437 gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[0]; |
1443 ++frame_index; | 1438 ++frame_index; |
1444 } | 1439 } |
1445 } | 1440 } |
1446 | 1441 |
1447 // Define middle frame | 1442 // Define middle frame |
1448 mid_frame_idx = frame_index + (rc->baseline_gf_interval >> 1) - 1; | 1443 mid_frame_idx = frame_index + (rc->baseline_gf_interval >> 1) - 1; |
1449 | 1444 |
1450 // Allocate bits to the other frames in the group. | 1445 // Allocate bits to the other frames in the group. |
1451 for (i = 0; i < rc->baseline_gf_interval - 1; ++i) { | 1446 for (i = 0; i < rc->baseline_gf_interval - 1; ++i) { |
1452 int arf_idx = 0; | 1447 int arf_idx = 0; |
1453 if (EOF == input_stats(twopass, &frame_stats)) | 1448 if (EOF == input_stats(twopass, &frame_stats)) |
1454 break; | 1449 break; |
1455 | 1450 |
1456 modified_err = calculate_modified_err(twopass, oxcf, &frame_stats); | 1451 modified_err = calculate_modified_err(twopass, oxcf, &frame_stats); |
1457 | 1452 |
1458 if (group_error > 0) | 1453 if (group_error > 0) |
1459 err_fraction = modified_err / DOUBLE_DIVIDE_CHECK(group_error); | 1454 err_fraction = modified_err / DOUBLE_DIVIDE_CHECK(group_error); |
1460 else | 1455 else |
1461 err_fraction = 0.0; | 1456 err_fraction = 0.0; |
1462 | 1457 |
1463 target_frame_size = (int)((double)total_group_bits * err_fraction); | 1458 target_frame_size = (int)((double)total_group_bits * err_fraction); |
1464 | 1459 |
1465 if (rc->source_alt_ref_pending && cpi->multi_arf_enabled) { | 1460 if (rc->source_alt_ref_pending && cpi->multi_arf_enabled) { |
1466 mid_boost_bits += (target_frame_size >> 4); | 1461 mid_boost_bits += (target_frame_size >> 4); |
1467 target_frame_size -= (target_frame_size >> 4); | 1462 target_frame_size -= (target_frame_size >> 4); |
1468 | 1463 |
1469 if (frame_index <= mid_frame_idx) | 1464 if (frame_index <= mid_frame_idx) |
1470 arf_idx = 1; | 1465 arf_idx = 1; |
1471 } | 1466 } |
1472 twopass->gf_group.arf_update_idx[frame_index] = arf_buffer_indices[arf_idx]; | 1467 gf_group->arf_update_idx[frame_index] = arf_buffer_indices[arf_idx]; |
1473 twopass->gf_group.arf_ref_idx[frame_index] = arf_buffer_indices[arf_idx]; | 1468 gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[arf_idx]; |
1474 | 1469 |
1475 target_frame_size = clamp(target_frame_size, 0, | 1470 target_frame_size = clamp(target_frame_size, 0, |
1476 MIN(max_bits, (int)total_group_bits)); | 1471 MIN(max_bits, (int)total_group_bits)); |
1477 | 1472 |
1478 twopass->gf_group.update_type[frame_index] = LF_UPDATE; | 1473 gf_group->update_type[frame_index] = LF_UPDATE; |
1479 twopass->gf_group.rf_level[frame_index] = INTER_NORMAL; | 1474 gf_group->rf_level[frame_index] = INTER_NORMAL; |
1480 | 1475 |
1481 twopass->gf_group.bit_allocation[frame_index] = target_frame_size; | 1476 gf_group->bit_allocation[frame_index] = target_frame_size; |
1482 ++frame_index; | 1477 ++frame_index; |
1483 } | 1478 } |
1484 | 1479 |
1485 // Note: | 1480 // Note: |
1486 // We need to configure the frame at the end of the sequence + 1 that will be | 1481 // We need to configure the frame at the end of the sequence + 1 that will be |
1487 // the start frame for the next group. Otherwise prior to the call to | 1482 // the start frame for the next group. Otherwise prior to the call to |
1488 // vp9_rc_get_second_pass_params() the data will be undefined. | 1483 // vp9_rc_get_second_pass_params() the data will be undefined. |
1489 twopass->gf_group.arf_update_idx[frame_index] = arf_buffer_indices[0]; | 1484 gf_group->arf_update_idx[frame_index] = arf_buffer_indices[0]; |
1490 twopass->gf_group.arf_ref_idx[frame_index] = arf_buffer_indices[0]; | 1485 gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[0]; |
1491 | 1486 |
1492 if (rc->source_alt_ref_pending) { | 1487 if (rc->source_alt_ref_pending) { |
1493 twopass->gf_group.update_type[frame_index] = OVERLAY_UPDATE; | 1488 gf_group->update_type[frame_index] = OVERLAY_UPDATE; |
1494 twopass->gf_group.rf_level[frame_index] = INTER_NORMAL; | 1489 gf_group->rf_level[frame_index] = INTER_NORMAL; |
1495 | 1490 |
1496 // Final setup for second arf and its overlay. | 1491 // Final setup for second arf and its overlay. |
1497 if (cpi->multi_arf_enabled) { | 1492 if (cpi->multi_arf_enabled) { |
1498 twopass->gf_group.bit_allocation[2] = | 1493 gf_group->bit_allocation[2] = |
1499 twopass->gf_group.bit_allocation[mid_frame_idx] + mid_boost_bits; | 1494 gf_group->bit_allocation[mid_frame_idx] + mid_boost_bits; |
1500 twopass->gf_group.update_type[mid_frame_idx] = OVERLAY_UPDATE; | 1495 gf_group->update_type[mid_frame_idx] = OVERLAY_UPDATE; |
1501 twopass->gf_group.bit_allocation[mid_frame_idx] = 0; | 1496 gf_group->bit_allocation[mid_frame_idx] = 0; |
1502 } | 1497 } |
1503 } else { | 1498 } else { |
1504 twopass->gf_group.update_type[frame_index] = GF_UPDATE; | 1499 gf_group->update_type[frame_index] = GF_UPDATE; |
1505 twopass->gf_group.rf_level[frame_index] = GF_ARF_STD; | 1500 gf_group->rf_level[frame_index] = GF_ARF_STD; |
1506 } | 1501 } |
1507 | 1502 |
1508 // Note whether multi-arf was enabled this group for next time. | 1503 // Note whether multi-arf was enabled this group for next time. |
1509 cpi->multi_arf_last_grp_enabled = cpi->multi_arf_enabled; | 1504 cpi->multi_arf_last_grp_enabled = cpi->multi_arf_enabled; |
1510 } | 1505 } |
1511 | 1506 |
1512 // Analyse and define a gf/arf group. | 1507 // Analyse and define a gf/arf group. |
1513 static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { | 1508 static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { |
1514 RATE_CONTROL *const rc = &cpi->rc; | 1509 RATE_CONTROL *const rc = &cpi->rc; |
1515 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 1510 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 | 1542 |
1548 // Reset the GF group data structures unless this is a key | 1543 // Reset the GF group data structures unless this is a key |
1549 // frame in which case it will already have been done. | 1544 // frame in which case it will already have been done. |
1550 if (cpi->common.frame_type != KEY_FRAME) { | 1545 if (cpi->common.frame_type != KEY_FRAME) { |
1551 vp9_zero(twopass->gf_group); | 1546 vp9_zero(twopass->gf_group); |
1552 } | 1547 } |
1553 | 1548 |
1554 vp9_clear_system_state(); | 1549 vp9_clear_system_state(); |
1555 vp9_zero(next_frame); | 1550 vp9_zero(next_frame); |
1556 | 1551 |
1557 gf_group_bits = 0; | |
1558 | |
1559 // Load stats for the current frame. | 1552 // Load stats for the current frame. |
1560 mod_frame_err = calculate_modified_err(twopass, oxcf, this_frame); | 1553 mod_frame_err = calculate_modified_err(twopass, oxcf, this_frame); |
1561 | 1554 |
1562 // Note the error of the frame at the start of the group. This will be | 1555 // Note the error of the frame at the start of the group. This will be |
1563 // the GF frame error if we code a normal gf. | 1556 // the GF frame error if we code a normal gf. |
1564 gf_first_frame_err = mod_frame_err; | 1557 gf_first_frame_err = mod_frame_err; |
1565 | 1558 |
1566 // If this is a key frame or the overlay from a previous arf then | 1559 // If this is a key frame or the overlay from a previous arf then |
1567 // the error score / cost of this frame has already been accounted for. | 1560 // the error score / cost of this frame has already been accounted for. |
1568 if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) | 1561 if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1608 &abs_mv_in_out_accumulator, | 1601 &abs_mv_in_out_accumulator, |
1609 &mv_ratio_accumulator); | 1602 &mv_ratio_accumulator); |
1610 | 1603 |
1611 // Accumulate the effect of prediction quality decay. | 1604 // Accumulate the effect of prediction quality decay. |
1612 if (!flash_detected) { | 1605 if (!flash_detected) { |
1613 last_loop_decay_rate = loop_decay_rate; | 1606 last_loop_decay_rate = loop_decay_rate; |
1614 loop_decay_rate = get_prediction_decay_rate(&cpi->common, &next_frame); | 1607 loop_decay_rate = get_prediction_decay_rate(&cpi->common, &next_frame); |
1615 decay_accumulator = decay_accumulator * loop_decay_rate; | 1608 decay_accumulator = decay_accumulator * loop_decay_rate; |
1616 | 1609 |
1617 // Monitor for static sections. | 1610 // Monitor for static sections. |
1618 zero_motion_accumulator = | 1611 zero_motion_accumulator = MIN(zero_motion_accumulator, |
1619 MIN(zero_motion_accumulator, | 1612 get_zero_motion_factor(&next_frame)); |
1620 get_zero_motion_factor(&cpi->common, &next_frame)); | |
1621 | 1613 |
1622 // Break clause to detect very still sections after motion. For example, | 1614 // Break clause to detect very still sections after motion. For example, |
1623 // a static image after a fade or other transition. | 1615 // a static image after a fade or other transition. |
1624 if (detect_transition_to_still(twopass, i, 5, loop_decay_rate, | 1616 if (detect_transition_to_still(twopass, i, 5, loop_decay_rate, |
1625 last_loop_decay_rate)) { | 1617 last_loop_decay_rate)) { |
1626 allow_alt_ref = 0; | 1618 allow_alt_ref = 0; |
1627 break; | 1619 break; |
1628 } | 1620 } |
1629 } | 1621 } |
1630 | 1622 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1824 } | 1816 } |
1825 } | 1817 } |
1826 | 1818 |
1827 return is_viable_kf; | 1819 return is_viable_kf; |
1828 } | 1820 } |
1829 | 1821 |
1830 static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { | 1822 static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { |
1831 int i, j; | 1823 int i, j; |
1832 RATE_CONTROL *const rc = &cpi->rc; | 1824 RATE_CONTROL *const rc = &cpi->rc; |
1833 TWO_PASS *const twopass = &cpi->twopass; | 1825 TWO_PASS *const twopass = &cpi->twopass; |
| 1826 GF_GROUP *const gf_group = &twopass->gf_group; |
1834 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 1827 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
1835 const FIRSTPASS_STATS first_frame = *this_frame; | 1828 const FIRSTPASS_STATS first_frame = *this_frame; |
1836 const FIRSTPASS_STATS *const start_position = twopass->stats_in; | 1829 const FIRSTPASS_STATS *const start_position = twopass->stats_in; |
1837 FIRSTPASS_STATS next_frame; | 1830 FIRSTPASS_STATS next_frame; |
1838 FIRSTPASS_STATS last_frame; | 1831 FIRSTPASS_STATS last_frame; |
1839 int kf_bits = 0; | 1832 int kf_bits = 0; |
1840 double decay_accumulator = 1.0; | 1833 double decay_accumulator = 1.0; |
1841 double zero_motion_accumulator = 1.0; | 1834 double zero_motion_accumulator = 1.0; |
1842 double boost_score = 0.0; | 1835 double boost_score = 0.0; |
1843 double kf_mod_err = 0.0; | 1836 double kf_mod_err = 0.0; |
1844 double kf_group_err = 0.0; | 1837 double kf_group_err = 0.0; |
1845 double recent_loop_decay[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; | 1838 double recent_loop_decay[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; |
1846 | 1839 |
1847 vp9_zero(next_frame); | 1840 vp9_zero(next_frame); |
1848 | 1841 |
1849 cpi->common.frame_type = KEY_FRAME; | 1842 cpi->common.frame_type = KEY_FRAME; |
1850 | 1843 |
1851 // Reset the GF group data structures. | 1844 // Reset the GF group data structures. |
1852 vp9_zero(twopass->gf_group); | 1845 vp9_zero(*gf_group); |
1853 | 1846 |
1854 // Is this a forced key frame by interval. | 1847 // Is this a forced key frame by interval. |
1855 rc->this_key_frame_forced = rc->next_key_frame_forced; | 1848 rc->this_key_frame_forced = rc->next_key_frame_forced; |
1856 | 1849 |
1857 // Clear the alt ref active flag and last group multi arf flags as they | 1850 // Clear the alt ref active flag and last group multi arf flags as they |
1858 // can never be set for a key frame. | 1851 // can never be set for a key frame. |
1859 rc->source_alt_ref_active = 0; | 1852 rc->source_alt_ref_active = 0; |
1860 cpi->multi_arf_last_grp_enabled = 0; | 1853 cpi->multi_arf_last_grp_enabled = 0; |
1861 | 1854 |
1862 // KF is always a GF so clear frames till next gf counter. | 1855 // KF is always a GF so clear frames till next gf counter. |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1980 | 1973 |
1981 // Scan through the kf group collating various stats used to deteermine | 1974 // Scan through the kf group collating various stats used to deteermine |
1982 // how many bits to spend on it. | 1975 // how many bits to spend on it. |
1983 decay_accumulator = 1.0; | 1976 decay_accumulator = 1.0; |
1984 boost_score = 0.0; | 1977 boost_score = 0.0; |
1985 for (i = 0; i < rc->frames_to_key; ++i) { | 1978 for (i = 0; i < rc->frames_to_key; ++i) { |
1986 if (EOF == input_stats(twopass, &next_frame)) | 1979 if (EOF == input_stats(twopass, &next_frame)) |
1987 break; | 1980 break; |
1988 | 1981 |
1989 // Monitor for static sections. | 1982 // Monitor for static sections. |
1990 zero_motion_accumulator = | 1983 zero_motion_accumulator =MIN(zero_motion_accumulator, |
1991 MIN(zero_motion_accumulator, | 1984 get_zero_motion_factor(&next_frame)); |
1992 get_zero_motion_factor(&cpi->common, &next_frame)); | |
1993 | 1985 |
1994 // For the first few frames collect data to decide kf boost. | 1986 // For the first few frames collect data to decide kf boost. |
1995 if (i <= (rc->max_gf_interval * 2)) { | 1987 if (i <= (rc->max_gf_interval * 2)) { |
1996 double r; | 1988 double r; |
1997 if (next_frame.intra_error > twopass->kf_intra_err_min) | 1989 if (next_frame.intra_error > twopass->kf_intra_err_min) |
1998 r = (IIKFACTOR2 * next_frame.intra_error / | 1990 r = (IIKFACTOR2 * next_frame.intra_error / |
1999 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); | 1991 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); |
2000 else | 1992 else |
2001 r = (IIKFACTOR2 * twopass->kf_intra_err_min / | 1993 r = (IIKFACTOR2 * twopass->kf_intra_err_min / |
2002 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); | 1994 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); |
(...skipping 30 matching lines...) Expand all Loading... |
2033 rc->kf_boost = (rc->frames_to_key * 3); | 2025 rc->kf_boost = (rc->frames_to_key * 3); |
2034 if (rc->kf_boost < MIN_KF_BOOST) | 2026 if (rc->kf_boost < MIN_KF_BOOST) |
2035 rc->kf_boost = MIN_KF_BOOST; | 2027 rc->kf_boost = MIN_KF_BOOST; |
2036 | 2028 |
2037 kf_bits = calculate_boost_bits((rc->frames_to_key - 1), | 2029 kf_bits = calculate_boost_bits((rc->frames_to_key - 1), |
2038 rc->kf_boost, twopass->kf_group_bits); | 2030 rc->kf_boost, twopass->kf_group_bits); |
2039 | 2031 |
2040 twopass->kf_group_bits -= kf_bits; | 2032 twopass->kf_group_bits -= kf_bits; |
2041 | 2033 |
2042 // Save the bits to spend on the key frame. | 2034 // Save the bits to spend on the key frame. |
2043 twopass->gf_group.bit_allocation[0] = kf_bits; | 2035 gf_group->bit_allocation[0] = kf_bits; |
2044 twopass->gf_group.update_type[0] = KF_UPDATE; | 2036 gf_group->update_type[0] = KF_UPDATE; |
2045 twopass->gf_group.rf_level[0] = KF_STD; | 2037 gf_group->rf_level[0] = KF_STD; |
2046 | 2038 |
2047 // Note the total error score of the kf group minus the key frame itself. | 2039 // Note the total error score of the kf group minus the key frame itself. |
2048 twopass->kf_group_error_left = (int)(kf_group_err - kf_mod_err); | 2040 twopass->kf_group_error_left = (int)(kf_group_err - kf_mod_err); |
2049 | 2041 |
2050 // Adjust the count of total modified error left. | 2042 // Adjust the count of total modified error left. |
2051 // The count of bits left is adjusted elsewhere based on real coded frame | 2043 // The count of bits left is adjusted elsewhere based on real coded frame |
2052 // sizes. | 2044 // sizes. |
2053 twopass->modified_error_left -= kf_group_err; | 2045 twopass->modified_error_left -= kf_group_err; |
2054 } | 2046 } |
2055 | 2047 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2112 if (cpi->alt_ref_source == NULL) | 2104 if (cpi->alt_ref_source == NULL) |
2113 cpi->refresh_alt_ref_frame = 0; | 2105 cpi->refresh_alt_ref_frame = 0; |
2114 } | 2106 } |
2115 } | 2107 } |
2116 | 2108 |
2117 | 2109 |
2118 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { | 2110 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { |
2119 VP9_COMMON *const cm = &cpi->common; | 2111 VP9_COMMON *const cm = &cpi->common; |
2120 RATE_CONTROL *const rc = &cpi->rc; | 2112 RATE_CONTROL *const rc = &cpi->rc; |
2121 TWO_PASS *const twopass = &cpi->twopass; | 2113 TWO_PASS *const twopass = &cpi->twopass; |
| 2114 GF_GROUP *const gf_group = &twopass->gf_group; |
2122 int frames_left; | 2115 int frames_left; |
2123 FIRSTPASS_STATS this_frame; | 2116 FIRSTPASS_STATS this_frame; |
2124 FIRSTPASS_STATS this_frame_copy; | 2117 FIRSTPASS_STATS this_frame_copy; |
2125 | 2118 |
2126 int target_rate; | 2119 int target_rate; |
2127 LAYER_CONTEXT *lc = NULL; | 2120 LAYER_CONTEXT *const lc = is_spatial_svc(cpi) ? |
| 2121 &cpi->svc.layer_context[cpi->svc.spatial_layer_id] : 0; |
2128 | 2122 |
2129 if (is_spatial_svc(cpi)) { | 2123 if (lc != NULL) { |
2130 lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; | |
2131 frames_left = (int)(twopass->total_stats.count - | 2124 frames_left = (int)(twopass->total_stats.count - |
2132 lc->current_video_frame_in_layer); | 2125 lc->current_video_frame_in_layer); |
2133 } else { | 2126 } else { |
2134 frames_left = (int)(twopass->total_stats.count - | 2127 frames_left = (int)(twopass->total_stats.count - |
2135 cm->current_video_frame); | 2128 cm->current_video_frame); |
2136 } | 2129 } |
2137 | 2130 |
2138 if (!twopass->stats_in) | 2131 if (!twopass->stats_in) |
2139 return; | 2132 return; |
2140 | 2133 |
2141 // If this is an arf frame then we dont want to read the stats file or | 2134 // If this is an arf frame then we dont want to read the stats file or |
2142 // advance the input pointer as we already have what we need. | 2135 // advance the input pointer as we already have what we need. |
2143 if (twopass->gf_group.update_type[twopass->gf_group.index] == ARF_UPDATE) { | 2136 if (gf_group->update_type[gf_group->index] == ARF_UPDATE) { |
2144 int target_rate; | 2137 int target_rate; |
2145 configure_buffer_updates(cpi); | 2138 configure_buffer_updates(cpi); |
2146 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; | 2139 target_rate = gf_group->bit_allocation[gf_group->index]; |
2147 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); | 2140 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); |
2148 rc->base_frame_target = target_rate; | 2141 rc->base_frame_target = target_rate; |
2149 | 2142 |
2150 // Correction to rate target based on prior over or under shoot. | 2143 // Correction to rate target based on prior over or under shoot. |
2151 if (cpi->oxcf.rc_mode == VPX_VBR) | 2144 if (cpi->oxcf.rc_mode == VPX_VBR) |
2152 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); | 2145 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); |
2153 | 2146 |
2154 vp9_rc_set_frame_target(cpi, target_rate); | 2147 vp9_rc_set_frame_target(cpi, target_rate); |
2155 cm->frame_type = INTER_FRAME; | 2148 cm->frame_type = INTER_FRAME; |
2156 | 2149 |
2157 if (is_spatial_svc(cpi)) { | 2150 if (lc != NULL) { |
2158 if (cpi->svc.spatial_layer_id == 0) { | 2151 if (cpi->svc.spatial_layer_id == 0) { |
2159 lc->is_key_frame = 0; | 2152 lc->is_key_frame = 0; |
2160 } else { | 2153 } else { |
2161 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; | 2154 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; |
2162 | 2155 |
2163 if (lc->is_key_frame) | 2156 if (lc->is_key_frame) |
2164 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); | 2157 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); |
2165 } | 2158 } |
2166 } | 2159 } |
2167 | 2160 |
2168 return; | 2161 return; |
2169 } | 2162 } |
2170 | 2163 |
2171 vp9_clear_system_state(); | 2164 vp9_clear_system_state(); |
2172 | 2165 |
2173 if (is_spatial_svc(cpi) && twopass->kf_intra_err_min == 0) { | 2166 if (lc != NULL && twopass->kf_intra_err_min == 0) { |
2174 twopass->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; | 2167 twopass->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; |
2175 twopass->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; | 2168 twopass->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; |
2176 } | 2169 } |
2177 | 2170 |
2178 if (cpi->oxcf.rc_mode == VPX_Q) { | 2171 if (cpi->oxcf.rc_mode == VPX_Q) { |
2179 twopass->active_worst_quality = cpi->oxcf.cq_level; | 2172 twopass->active_worst_quality = cpi->oxcf.cq_level; |
2180 } else if (cm->current_video_frame == 0 || | 2173 } else if (cm->current_video_frame == 0 || |
2181 (is_spatial_svc(cpi) && | 2174 (lc != NULL && lc->current_video_frame_in_layer == 0)) { |
2182 lc->current_video_frame_in_layer == 0)) { | |
2183 // Special case code for first frame. | 2175 // Special case code for first frame. |
2184 const int section_target_bandwidth = (int)(twopass->bits_left / | 2176 const int section_target_bandwidth = (int)(twopass->bits_left / |
2185 frames_left); | 2177 frames_left); |
2186 const int tmp_q = get_twopass_worst_quality(cpi, &twopass->total_left_stats, | 2178 const int tmp_q = get_twopass_worst_quality(cpi, &twopass->total_left_stats, |
2187 section_target_bandwidth); | 2179 section_target_bandwidth); |
2188 twopass->active_worst_quality = tmp_q; | 2180 twopass->active_worst_quality = tmp_q; |
2189 rc->ni_av_qi = tmp_q; | 2181 rc->ni_av_qi = tmp_q; |
2190 rc->avg_q = vp9_convert_qindex_to_q(tmp_q); | 2182 rc->avg_q = vp9_convert_qindex_to_q(tmp_q); |
2191 } | 2183 } |
2192 vp9_zero(this_frame); | 2184 vp9_zero(this_frame); |
2193 if (EOF == input_stats(twopass, &this_frame)) | 2185 if (EOF == input_stats(twopass, &this_frame)) |
2194 return; | 2186 return; |
2195 | 2187 |
2196 // Local copy of the current frame's first pass stats. | 2188 // Local copy of the current frame's first pass stats. |
2197 this_frame_copy = this_frame; | 2189 this_frame_copy = this_frame; |
2198 | 2190 |
2199 // Keyframe and section processing. | 2191 // Keyframe and section processing. |
2200 if (rc->frames_to_key == 0 || | 2192 if (rc->frames_to_key == 0 || |
2201 (cpi->frame_flags & FRAMEFLAGS_KEY)) { | 2193 (cpi->frame_flags & FRAMEFLAGS_KEY)) { |
2202 // Define next KF group and assign bits to it. | 2194 // Define next KF group and assign bits to it. |
2203 find_next_key_frame(cpi, &this_frame_copy); | 2195 find_next_key_frame(cpi, &this_frame_copy); |
2204 } else { | 2196 } else { |
2205 cm->frame_type = INTER_FRAME; | 2197 cm->frame_type = INTER_FRAME; |
2206 } | 2198 } |
2207 | 2199 |
2208 if (is_spatial_svc(cpi)) { | 2200 if (lc != NULL) { |
2209 if (cpi->svc.spatial_layer_id == 0) { | 2201 if (cpi->svc.spatial_layer_id == 0) { |
2210 lc->is_key_frame = (cm->frame_type == KEY_FRAME); | 2202 lc->is_key_frame = (cm->frame_type == KEY_FRAME); |
2211 if (lc->is_key_frame) | 2203 if (lc->is_key_frame) |
2212 cpi->ref_frame_flags &= | 2204 cpi->ref_frame_flags &= |
2213 (~VP9_LAST_FLAG & ~VP9_GOLD_FLAG & ~VP9_ALT_FLAG); | 2205 (~VP9_LAST_FLAG & ~VP9_GOLD_FLAG & ~VP9_ALT_FLAG); |
2214 } else { | 2206 } else { |
2215 cm->frame_type = INTER_FRAME; | 2207 cm->frame_type = INTER_FRAME; |
2216 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; | 2208 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; |
2217 | 2209 |
2218 if (lc->is_key_frame) { | 2210 if (lc->is_key_frame) { |
(...skipping 10 matching lines...) Expand all Loading... |
2229 // As long as max_thresh for encode breakout is small enough, it is ok | 2221 // As long as max_thresh for encode breakout is small enough, it is ok |
2230 // to enable it for show frame, i.e. set allow_encode_breakout to | 2222 // to enable it for show frame, i.e. set allow_encode_breakout to |
2231 // ENCODE_BREAKOUT_LIMITED. | 2223 // ENCODE_BREAKOUT_LIMITED. |
2232 if (!cm->show_frame) | 2224 if (!cm->show_frame) |
2233 cpi->allow_encode_breakout = ENCODE_BREAKOUT_DISABLED; | 2225 cpi->allow_encode_breakout = ENCODE_BREAKOUT_DISABLED; |
2234 else | 2226 else |
2235 cpi->allow_encode_breakout = ENCODE_BREAKOUT_LIMITED; | 2227 cpi->allow_encode_breakout = ENCODE_BREAKOUT_LIMITED; |
2236 } | 2228 } |
2237 | 2229 |
2238 rc->frames_till_gf_update_due = rc->baseline_gf_interval; | 2230 rc->frames_till_gf_update_due = rc->baseline_gf_interval; |
2239 if (!is_spatial_svc(cpi)) | 2231 if (lc != NULL) |
2240 cpi->refresh_golden_frame = 1; | 2232 cpi->refresh_golden_frame = 1; |
2241 } | 2233 } |
2242 | 2234 |
2243 configure_buffer_updates(cpi); | 2235 configure_buffer_updates(cpi); |
2244 | 2236 |
2245 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; | 2237 target_rate = gf_group->bit_allocation[gf_group->index]; |
2246 if (cpi->common.frame_type == KEY_FRAME) | 2238 if (cpi->common.frame_type == KEY_FRAME) |
2247 target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate); | 2239 target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate); |
2248 else | 2240 else |
2249 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); | 2241 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); |
2250 | 2242 |
2251 rc->base_frame_target = target_rate; | 2243 rc->base_frame_target = target_rate; |
2252 | 2244 |
2253 // Correction to rate target based on prior over or under shoot. | 2245 // Correction to rate target based on prior over or under shoot. |
2254 if (cpi->oxcf.rc_mode == VPX_VBR) | 2246 if (cpi->oxcf.rc_mode == VPX_VBR) |
2255 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); | 2247 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); |
(...skipping 20 matching lines...) Expand all Loading... |
2276 | 2268 |
2277 if (cpi->common.frame_type != KEY_FRAME && | 2269 if (cpi->common.frame_type != KEY_FRAME && |
2278 !vp9_is_upper_layer_key_frame(cpi)) { | 2270 !vp9_is_upper_layer_key_frame(cpi)) { |
2279 twopass->kf_group_bits -= bits_used; | 2271 twopass->kf_group_bits -= bits_used; |
2280 } | 2272 } |
2281 twopass->kf_group_bits = MAX(twopass->kf_group_bits, 0); | 2273 twopass->kf_group_bits = MAX(twopass->kf_group_bits, 0); |
2282 | 2274 |
2283 // Increment the gf group index ready for the next frame. | 2275 // Increment the gf group index ready for the next frame. |
2284 ++twopass->gf_group.index; | 2276 ++twopass->gf_group.index; |
2285 } | 2277 } |
OLD | NEW |