From: angiebird Date: Sat, 7 Dec 2019 01:24:27 +0000 (-0800) Subject: Add vp9_get_gop_coding_frame_count() X-Git-Tag: v1.9.0-rc1~128^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c33f859615ee467e94adb7bca22e1f3882344e50;p=libvpx Add vp9_get_gop_coding_frame_count() Call this function before coding a new group of picture to get information about it. Change-Id: I3d88d719dd27c6d7383eb8f92307a93096b30706 --- diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 57ab583cf..d2225f206 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -3627,56 +3627,65 @@ void vp9_twopass_postencode_update(VP9_COMP *cpi) { } #if CONFIG_RATE_CTRL +int vp9_get_gop_coding_frame_count( + int *use_alt_ref, const VP9EncoderConfig *oxcf, + const FRAME_INFO *frame_info, const FIRST_PASS_INFO *first_pass_info, + const RATE_CONTROL *rc, int show_idx, int multi_layer_arf, + int allow_alt_ref, int first_is_key_frame, int last_gop_use_alt_ref) { + int frame_count; + double gop_intra_factor; + const int arf_active_or_kf = last_gop_use_alt_ref || first_is_key_frame; + RANGE active_gf_interval = get_active_gf_inverval_range( + frame_info, rc, arf_active_or_kf, show_idx, /*active_worst_quality=*/0, + /*last_boosted_qindex=*/0); + + const int arf_layers = get_arf_layers(multi_layer_arf, oxcf->enable_auto_arf, + active_gf_interval.max); + if (multi_layer_arf) { + gop_intra_factor = 1.0 + 0.25 * arf_layers; + } else { + gop_intra_factor = 1.0; + } + + frame_count = get_gop_coding_frame_num( + use_alt_ref, frame_info, first_pass_info, rc, show_idx, + &active_gf_interval, gop_intra_factor, oxcf->lag_in_frames); + *use_alt_ref &= allow_alt_ref; + return frame_count; +} + // Under CONFIG_RATE_CTRL, once the first_pass_info is ready, the number of // coding frames (including show frame and alt ref) can be determined. -int vp9_get_coding_frame_num(const struct VP9EncoderConfig *oxcf, +int vp9_get_coding_frame_num(const VP9EncoderConfig *oxcf, const FRAME_INFO *frame_info, const FIRST_PASS_INFO *first_pass_info, int multi_layer_arf, int allow_alt_ref) { int coding_frame_num = 0; RATE_CONTROL rc; - RANGE active_gf_interval; - int arf_layers; - double gop_intra_factor; - int use_alt_ref; - int gop_coding_frames; + int gop_coding_frame_count; int gop_show_frames; int show_idx = 0; - int arf_active_or_kf = 1; + int last_gop_use_alt_ref = 0; rc.static_scene_max_gf_interval = 250; vp9_rc_init(oxcf, 1, &rc); while (show_idx < first_pass_info->num_frames) { + int use_alt_ref; + int first_is_key_frame = 0; if (rc.frames_to_key == 0) { rc.frames_to_key = vp9_get_frames_to_next_key( oxcf, frame_info, first_pass_info, show_idx, rc.min_gf_interval); - arf_active_or_kf = 1; - } else { - } - - { - int dummy = 0; - active_gf_interval = get_active_gf_inverval_range( - frame_info, &rc, arf_active_or_kf, show_idx, dummy, dummy); + first_is_key_frame = 1; } - arf_layers = get_arf_layers(multi_layer_arf, oxcf->enable_auto_arf, - active_gf_interval.max); - if (multi_layer_arf) { - gop_intra_factor = 1.0 + 0.25 * arf_layers; - } else { - gop_intra_factor = 1.0; - } - - gop_coding_frames = get_gop_coding_frame_num( - &use_alt_ref, frame_info, first_pass_info, &rc, show_idx, - &active_gf_interval, gop_intra_factor, oxcf->lag_in_frames); - - use_alt_ref &= allow_alt_ref; + gop_coding_frame_count = vp9_get_gop_coding_frame_count( + &use_alt_ref, oxcf, frame_info, first_pass_info, &rc, show_idx, + multi_layer_arf, allow_alt_ref, first_is_key_frame, + last_gop_use_alt_ref); rc.source_alt_ref_active = use_alt_ref; - arf_active_or_kf = use_alt_ref; - gop_show_frames = gop_coding_frames - use_alt_ref; + last_gop_use_alt_ref = use_alt_ref; + gop_show_frames = gop_coding_frame_count - use_alt_ref; rc.frames_to_key -= gop_show_frames; rc.frames_since_key += gop_show_frames; show_idx += gop_show_frames; diff --git a/vp9/encoder/vp9_firstpass.h b/vp9/encoder/vp9_firstpass.h index cfbc143c3..712a840d5 100644 --- a/vp9/encoder/vp9_firstpass.h +++ b/vp9/encoder/vp9_firstpass.h @@ -252,6 +252,28 @@ int vp9_get_frames_to_next_key(const struct VP9EncoderConfig *oxcf, const FIRST_PASS_INFO *first_pass_info, int kf_show_idx, int min_gf_interval); #if CONFIG_RATE_CTRL +/*!\brief Call this function before coding a new group of pictures to get + * information about it. + * \param[in] oxcf Encoder config + * \param[in] frame_info Frame info + * \param[in] first_pass_info First pass stats + * \param[in] rc Rate control state + * \param[in] show_idx Show index of the first frame in the group + * \param[in] multi_layer_arf Is multi-layer alternate reference used + * \param[in] allow_alt_ref Is alternate reference allowed + * \param[in] first_is_key_frame Is the first frame in the group a key frame + * \param[in] last_gop_use_alt_ref Does the last group use alternate reference + * + * \param[out] use_alt_ref Does this group use alternate reference + * + * \return Returns coding frame count + */ +int vp9_get_gop_coding_frame_count( + int *use_alt_ref, const struct VP9EncoderConfig *oxcf, + const FRAME_INFO *frame_info, const FIRST_PASS_INFO *first_pass_info, + const RATE_CONTROL *rc, int show_idx, int multi_layer_arf, + int allow_alt_ref, int first_is_key_frame, int last_gop_use_alt_ref); + int vp9_get_coding_frame_num(const struct VP9EncoderConfig *oxcf, const FRAME_INFO *frame_info, const FIRST_PASS_INFO *first_pass_info,