summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/vp9_ext_ratectrl_test.cc5
-rw-r--r--vp9/encoder/vp9_encoder.c4
-rw-r--r--vp9/encoder/vp9_ext_ratectrl.c3
-rw-r--r--vp9/encoder/vp9_ext_ratectrl.h2
-rw-r--r--vpx/vpx_encoder.h4
-rw-r--r--vpx/vpx_ext_ratectrl.h18
6 files changed, 29 insertions, 7 deletions
diff --git a/test/vp9_ext_ratectrl_test.cc b/test/vp9_ext_ratectrl_test.cc
index 01d801996..812a18ed2 100644
--- a/test/vp9_ext_ratectrl_test.cc
+++ b/test/vp9_ext_ratectrl_test.cc
@@ -73,6 +73,7 @@ vpx_rc_status_t rc_get_encodeframe_decision(
EXPECT_EQ(encode_frame_info->coding_index, toy_rate_ctrl->coding_index);
if (encode_frame_info->coding_index == 0) {
+ EXPECT_EQ(encode_frame_info->gop_index, 0);
EXPECT_EQ(encode_frame_info->frame_type, 0 /*kFrameTypeKey*/);
EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
0); // kRefFrameTypeLast
@@ -83,6 +84,7 @@ vpx_rc_status_t rc_get_encodeframe_decision(
}
if (encode_frame_info->coding_index == 1) {
+ EXPECT_EQ(encode_frame_info->gop_index, 1);
EXPECT_EQ(encode_frame_info->frame_type, 2 /*kFrameTypeAltRef*/);
EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
1); // kRefFrameTypeLast
@@ -96,10 +98,13 @@ vpx_rc_status_t rc_get_encodeframe_decision(
if (encode_frame_info->coding_index >= 2 &&
encode_frame_info->coding_index < 5) {
+ // In the first group of pictures, coding_index and gop_index are equal.
+ EXPECT_EQ(encode_frame_info->gop_index, encode_frame_info->coding_index);
EXPECT_EQ(encode_frame_info->frame_type, 1 /*kFrameTypeInter*/);
}
if (encode_frame_info->coding_index == 5) {
+ EXPECT_EQ(encode_frame_info->gop_index, 0);
EXPECT_EQ(encode_frame_info->frame_type, 3 /*kFrameTypeOverlay*/);
EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
1); // kRefFrameTypeLast
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index 8d60a0c00..37f644501 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -4511,8 +4511,8 @@ static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size, uint8_t *dest
get_ref_frame_bufs(cpi, ref_frame_bufs);
vp9_extrc_get_encodeframe_decision(
&cpi->ext_ratectrl, cm->current_video_frame,
- cm->current_frame_coding_index, update_type, ref_frame_bufs,
- ref_frame_flags, &encode_frame_decision);
+ cm->current_frame_coding_index, gf_group->index, update_type,
+ ref_frame_bufs, ref_frame_flags, &encode_frame_decision);
q = encode_frame_decision.q_index;
}
diff --git a/vp9/encoder/vp9_ext_ratectrl.c b/vp9/encoder/vp9_ext_ratectrl.c
index 94c2addd2..a6a3e21d3 100644
--- a/vp9/encoder/vp9_ext_ratectrl.c
+++ b/vp9/encoder/vp9_ext_ratectrl.c
@@ -103,7 +103,7 @@ static int extrc_get_frame_type(FRAME_UPDATE_TYPE update_type) {
}
void vp9_extrc_get_encodeframe_decision(
- EXT_RATECTRL *ext_ratectrl, int show_index, int coding_index,
+ EXT_RATECTRL *ext_ratectrl, int show_index, int coding_index, int gop_index,
FRAME_UPDATE_TYPE update_type,
RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES], int ref_frame_flags,
vpx_rc_encodeframe_decision_t *encode_frame_decision) {
@@ -111,6 +111,7 @@ void vp9_extrc_get_encodeframe_decision(
vpx_rc_encodeframe_info_t encode_frame_info;
encode_frame_info.show_index = show_index;
encode_frame_info.coding_index = coding_index;
+ encode_frame_info.gop_index = gop_index;
encode_frame_info.frame_type = extrc_get_frame_type(update_type);
vp9_get_ref_frame_info(update_type, ref_frame_flags, ref_frame_bufs,
diff --git a/vp9/encoder/vp9_ext_ratectrl.h b/vp9/encoder/vp9_ext_ratectrl.h
index fb6cfe1ac..6a86218da 100644
--- a/vp9/encoder/vp9_ext_ratectrl.h
+++ b/vp9/encoder/vp9_ext_ratectrl.h
@@ -33,7 +33,7 @@ void vp9_extrc_send_firstpass_stats(EXT_RATECTRL *ext_ratectrl,
const FIRST_PASS_INFO *first_pass_info);
void vp9_extrc_get_encodeframe_decision(
- EXT_RATECTRL *ext_ratectrl, int show_index, int coding_index,
+ EXT_RATECTRL *ext_ratectrl, int show_index, int coding_index, int gop_index,
FRAME_UPDATE_TYPE update_type,
RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES], int ref_frame_flags,
vpx_rc_encodeframe_decision_t *encode_frame_decision);
diff --git a/vpx/vpx_encoder.h b/vpx/vpx_encoder.h
index 39b2aef62..da3609577 100644
--- a/vpx/vpx_encoder.h
+++ b/vpx/vpx_encoder.h
@@ -30,6 +30,7 @@ extern "C" {
#endif
#include "./vpx_codec.h"
+#include "./vpx_ext_ratectrl.h"
/*! Temporal Scalability: Maximum length of the sequence defining frame
* layer membership
@@ -57,7 +58,8 @@ extern "C" {
* fields to structures
*/
#define VPX_ENCODER_ABI_VERSION \
- (14 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/
+ (14 + VPX_CODEC_ABI_VERSION + \
+ VPX_EXT_RATECTRL_ABI_VERSION) /**<\hideinitializer*/
/*! \brief Encoder capabilities bitfield
*
diff --git a/vpx/vpx_ext_ratectrl.h b/vpx/vpx_ext_ratectrl.h
index bb3caa614..5c57cf331 100644
--- a/vpx/vpx_ext_ratectrl.h
+++ b/vpx/vpx_ext_ratectrl.h
@@ -17,6 +17,16 @@ extern "C" {
#include "./vpx_integer.h"
+/*!\brief Current ABI version number
+ *
+ * \internal
+ * If this file is altered in any way that changes the ABI, this value
+ * must be bumped. Examples include, but are not limited to, changing
+ * types, removing or reassigning enums, adding/removing/rearranging
+ * fields to structures.
+ */
+#define VPX_EXT_RATECTRL_ABI_VERSION (1)
+
/*!\brief Abstract rate control model handler
*
* The encoder will receive the model handler from create_model() defined in
@@ -48,8 +58,12 @@ typedef struct vpx_rc_encodeframe_info {
* 4: Golden frame
*/
int frame_type;
- int show_index; /**< display index, starts from zero*/
- int coding_index; /**< coding index, starts from zero*/
+ int show_index; /**< display index, starts from zero*/
+ int coding_index; /**< coding index, starts from zero*/
+ /*!
+ * index in group of picture, starts from zero.
+ */
+ int gop_index;
int ref_frame_coding_indexes[3]; /**< three reference frames' coding indices*/
/*!
* The validity of the three reference frames.