ref: 94fb57d3a53861ec39b0a09ce36d551cb8157133
parent: efa05b7cc9d922a6257358b9c5855c187e924d52
author: angiebird <angiebird@google.com>
date: Mon Nov 25 07:26:08 EST 2019
Add GetKeyFrameGroupSize() Makes vp9_get_frames_to_next_key() public. Change-Id: I903cefbb3925d6ffc641412c6d60d95a2ff256a4
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -3068,10 +3068,10 @@
#define MAX_KF_TOT_BOOST 5400
#endif
-static int get_frames_to_next_key(const VP9EncoderConfig *oxcf,
- const FRAME_INFO *frame_info,
- const FIRST_PASS_INFO *first_pass_info,
- int kf_show_idx, int min_gf_interval) {
+int vp9_get_frames_to_next_key(const VP9EncoderConfig *oxcf,
+ const FRAME_INFO *frame_info,
+ const FIRST_PASS_INFO *first_pass_info,
+ int kf_show_idx, int min_gf_interval) {
double recent_loop_decay[FRAMES_TO_CHECK_DECAY];
int j;
int frames_to_key;
@@ -3184,8 +3184,8 @@
kf_mod_err = calc_norm_frame_score(oxcf, frame_info, keyframe_stats,
mean_mod_score, av_err);
- rc->frames_to_key = get_frames_to_next_key(oxcf, frame_info, first_pass_info,
- kf_show_idx, rc->min_gf_interval);
+ rc->frames_to_key = vp9_get_frames_to_next_key(
+ oxcf, frame_info, first_pass_info, kf_show_idx, rc->min_gf_interval);
// If there is a max kf interval set by the user we must obey it.
// We already breakout of the loop above at 2x max.
@@ -3648,7 +3648,7 @@
while (show_idx < first_pass_info->num_frames) {
if (rc.frames_to_key == 0) {
- rc.frames_to_key = get_frames_to_next_key(
+ 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 {
--- a/vp9/encoder/vp9_firstpass.h
+++ b/vp9/encoder/vp9_firstpass.h
@@ -13,9 +13,7 @@
#include <assert.h>
-#if CONFIG_RATE_CTRL
#include "vp9/common/vp9_onyxc_int.h"
-#endif
#include "vp9/encoder/vp9_lookahead.h"
#include "vp9/encoder/vp9_ratectrl.h"
@@ -248,8 +246,12 @@
void calculate_coded_size(struct VP9_COMP *cpi, int *scaled_frame_width,
int *scaled_frame_height);
-#if CONFIG_RATE_CTRL
struct VP9EncoderConfig;
+int vp9_get_frames_to_next_key(const struct VP9EncoderConfig *oxcf,
+ const FRAME_INFO *frame_info,
+ const FIRST_PASS_INFO *first_pass_info,
+ int kf_show_idx, int min_gf_interval);
+#if CONFIG_RATE_CTRL
int vp9_get_coding_frame_num(const struct VP9EncoderConfig *oxcf,
const FRAME_INFO *frame_info,
const FIRST_PASS_INFO *first_pass_info,
--- a/vp9/simple_encode.cc
+++ b/vp9/simple_encode.cc
@@ -221,6 +221,13 @@
rewind(file_);
}
+int SimpleEncode::GetKeyFrameGroupSize(int key_frame_index) const {
+ const VP9_COMP *cpi = impl_ptr_->cpi;
+ return vp9_get_frames_to_next_key(&cpi->oxcf, &cpi->frame_info,
+ &cpi->twopass.first_pass_info,
+ key_frame_index, cpi->rc.min_gf_interval);
+}
+
void SimpleEncode::EncodeFrame(EncodeFrameResult *encode_frame_result) {
VP9_COMP *cpi = impl_ptr_->cpi;
struct lookahead_ctx *lookahead = cpi->lookahead;
--- a/vp9/simple_encode.h
+++ b/vp9/simple_encode.h
@@ -65,6 +65,13 @@
// This function should be called after StartEncode() or EncodeFrame().
void EndEncode();
+ // Given a key_frame_index, computes this key frame group's size.
+ // The key frame group size includes one key frame plus the number of
+ // following inter frames. Note that the key frame group size only counts the
+ // show frames. The number of no show frames like alternate refereces are not
+ // counted.
+ int GetKeyFrameGroupSize(int key_frame_index) const;
+
// Encodes a frame
// This function should be called after StartEncode() and before EndEncode().
void EncodeFrame(EncodeFrameResult *encode_frame_result);