Unified · Split
| @@ -3063,8 +3063,12 @@ static void update_ref_frames(VP9_COMP *cpi) { · 3062 unmodified lines | ||
| 3063 | 3063 | BufferPool *const pool = cm->buffer_pool; |
| 3064 | 3064 | GF_GROUP *const gf_group = &cpi->twopass.gf_group; |
| 3065 | 3065 | |
| 3066 | − // Pop ARF. | |
| 3067 | − if (cm->show_existing_frame) { | |
| 3066 | + if (cpi->rc.show_arf_as_gld) { | |
| 3067 | + int tmp = cpi->alt_fb_idx; | |
| 3068 | + cpi->alt_fb_idx = cpi->gld_fb_idx; | |
| 3069 | + cpi->gld_fb_idx = tmp; | |
| 3070 | + } else if (cm->show_existing_frame) { | |
| 3071 | + // Pop ARF. | |
| 3068 | 3072 | cpi->lst_fb_idx = cpi->alt_fb_idx; |
| 3069 | 3073 | cpi->alt_fb_idx = |
| 3070 | 3074 | stack_pop(gf_group->arf_index_stack, gf_group->stack_size); |
| @@ -2455,6 +2455,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { · 2454 unmodified lines | ||
| 2455 | 2455 | int gf_arf_bits; |
| 2456 | 2456 | const int is_key_frame = frame_is_intra_only(cm); |
| 2457 | 2457 | const int arf_active_or_kf = is_key_frame || rc->source_alt_ref_active; |
| 2458 | + int is_alt_ref_flash = 0; | |
| 2458 | 2459 | |
| 2459 | 2460 | double gop_intra_factor = 1.0; |
| 2460 | 2461 | int gop_frames; |
| @@ -2678,6 +2679,9 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { · 217 unmodified lines | ||
| 2678 | 2679 | // Reset the file position. |
| 2679 | 2680 | reset_fpf_position(twopass, start_pos); |
| 2680 | 2681 | |
| 2682 | + if (rc->source_alt_ref_pending) | |
| 2683 | + is_alt_ref_flash = detect_flash(twopass, rc->baseline_gf_interval); | |
| 2684 | + | |
| 2681 | 2685 | // Calculate the bits to be allocated to the gf/arf group as a whole |
| 2682 | 2686 | gf_group_bits = calculate_total_gf_group_bits(cpi, gf_group_err); |
| 2683 | 2687 | |
| @@ -2755,6 +2759,12 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { · 71 unmodified lines | ||
| 2755 | 2759 | twopass->rolling_arf_group_target_bits = 0; |
| 2756 | 2760 | twopass->rolling_arf_group_actual_bits = 0; |
| 2757 | 2761 | #endif |
| 2762 | + rc->preserve_arf_as_gld = rc->preserve_next_arf_as_gld; | |
| 2763 | + rc->preserve_next_arf_as_gld = 0; | |
| 2764 | + // If alt ref frame is flash do not set preserve_arf_as_gld | |
| 2765 | + if (!is_lossless_requested(&cpi->oxcf) && !cpi->use_svc && | |
| 2766 | + cpi->oxcf.aq_mode == NO_AQ && cpi->multi_layer_arf && !is_alt_ref_flash) | |
| 2767 | + rc->preserve_next_arf_as_gld = 1; | |
| 2758 | 2768 | } |
| 2759 | 2769 | |
| 2760 | 2770 | // Intra / Inter threshold very low |
| @@ -436,6 +436,10 @@ void vp9_rc_init(const VP9EncoderConfig *oxcf, int pass, RATE_CONTROL *rc) { · 435 unmodified lines | ||
| 436 | 436 | rc->use_post_encode_drop = 0; |
| 437 | 437 | rc->ext_use_post_encode_drop = 0; |
| 438 | 438 | rc->arf_active_best_quality_adjustment_factor = 1.0; |
| 439 | + | |
| 440 | + rc->preserve_arf_as_gld = 0; | |
| 441 | + rc->preserve_next_arf_as_gld = 0; | |
| 442 | + rc->show_arf_as_gld = 0; | |
| 439 | 443 | } |
| 440 | 444 | |
| 441 | 445 | static int check_buffer_above_thresh(VP9_COMP *cpi, int drop_mark) { |
| @@ -1574,6 +1578,7 @@ void vp9_configure_buffer_updates(VP9_COMP *cpi, int gf_group_index) { · 1132 unmodified lines | ||
| 1574 | 1578 | |
| 1575 | 1579 | cpi->rc.is_src_frame_alt_ref = 0; |
| 1576 | 1580 | cm->show_existing_frame = 0; |
| 1581 | + cpi->rc.show_arf_as_gld = 0; | |
| 1577 | 1582 | switch (twopass->gf_group.update_type[gf_group_index]) { |
| 1578 | 1583 | case KF_UPDATE: |
| 1579 | 1584 | cpi->refresh_last_frame = 1; |
| @@ -1595,6 +1600,12 @@ void vp9_configure_buffer_updates(VP9_COMP *cpi, int gf_group_index) { · 15 unmodified lines | ||
| 1595 | 1600 | cpi->refresh_golden_frame = 1; |
| 1596 | 1601 | cpi->refresh_alt_ref_frame = 0; |
| 1597 | 1602 | cpi->rc.is_src_frame_alt_ref = 1; |
| 1603 | + if (cpi->rc.preserve_arf_as_gld) { | |
| 1604 | + cpi->rc.show_arf_as_gld = 1; | |
| 1605 | + cpi->refresh_golden_frame = 0; | |
| 1606 | + cm->show_existing_frame = 1; | |
| 1607 | + cm->refresh_frame_context = 0; | |
| 1608 | + } | |
| 1598 | 1609 | break; |
| 1599 | 1610 | case MID_OVERLAY_UPDATE: |
| 1600 | 1611 | cpi->refresh_last_frame = 1; |
| @@ -1716,6 +1727,15 @@ static void update_golden_frame_stats(VP9_COMP *cpi) { · 115 unmodified lines | ||
| 1716 | 1727 | if (rc->frames_till_gf_update_due > 0) rc->frames_till_gf_update_due--; |
| 1717 | 1728 | |
| 1718 | 1729 | rc->frames_since_golden++; |
| 1730 | + | |
| 1731 | + if (rc->show_arf_as_gld) { | |
| 1732 | + rc->frames_since_golden = 0; | |
| 1733 | + // If we are not using alt ref in the up and coming group clear the arf | |
| 1734 | + // active flag. In multi arf group case, if the index is not 0 then | |
| 1735 | + // we are overlaying a mid group arf so should not reset the flag. | |
| 1736 | + if (!rc->source_alt_ref_pending && (cpi->twopass.gf_group.index == 0)) | |
| 1737 | + rc->source_alt_ref_active = 0; | |
| 1738 | + } | |
| 1719 | 1739 | } |
| 1720 | 1740 | } |
| 1721 | 1741 | |
| @@ -199,6 +199,10 @@ typedef struct { · 198 unmodified lines | ||
| 199 | 199 | int damped_adjustment[RATE_FACTOR_LEVELS]; |
| 200 | 200 | double arf_active_best_quality_adjustment_factor; |
| 201 | 201 | int arf_active_best_quality_adjustment_window; |
| 202 | + | |
| 203 | + int preserve_arf_as_gld; | |
| 204 | + int preserve_next_arf_as_gld; | |
| 205 | + int show_arf_as_gld; | |
| 202 | 206 | } RATE_CONTROL; |
| 203 | 207 | |
| 204 | 208 | struct VP9_COMP; |