shithub: libvpx

Download patch

ref: 642f6a195d7c9ec327b2a1445d7dd09dfa4f9bbc
parent: 16935397ee6712c407f0554e80160054d5eb7188
author: angiebird <angiebird@google.com>
date: Fri Jul 17 14:43:06 EDT 2020

Add init version of EncodeFrameWithTargetFrameBits()

Will add a unit test in a followup CL.

Change-Id: I6a6354f307c427e1a352be7c6421927323eb5e1b

--- a/vp9/encoder/vp9_encoder.h
+++ b/vp9/encoder/vp9_encoder.h
@@ -563,16 +563,11 @@
 typedef struct ENCODE_COMMAND {
   int use_external_quantize_index;
   int external_quantize_index;
+  int use_external_target_frame_bits;
+  int target_frame_bits;
   GOP_COMMAND gop_command;
 } ENCODE_COMMAND;
 
-static INLINE void encode_command_init(ENCODE_COMMAND *encode_command) {
-  vp9_zero(*encode_command);
-  encode_command->use_external_quantize_index = 0;
-  encode_command->external_quantize_index = -1;
-  gop_command_off(&encode_command->gop_command);
-}
-
 static INLINE void encode_command_set_gop_command(
     ENCODE_COMMAND *encode_command, GOP_COMMAND gop_command) {
   encode_command->gop_command = gop_command;
@@ -588,6 +583,25 @@
     ENCODE_COMMAND *encode_command) {
   encode_command->use_external_quantize_index = 0;
   encode_command->external_quantize_index = -1;
+}
+
+static INLINE void encode_command_set_target_frame_bits(
+    ENCODE_COMMAND *encode_command, int target_frame_bits) {
+  encode_command->use_external_target_frame_bits = 1;
+  encode_command->target_frame_bits = target_frame_bits;
+}
+
+static INLINE void encode_command_reset_target_frame_bits(
+    ENCODE_COMMAND *encode_command) {
+  encode_command->use_external_target_frame_bits = 0;
+  encode_command->target_frame_bits = -1;
+}
+
+static INLINE void encode_command_init(ENCODE_COMMAND *encode_command) {
+  vp9_zero(*encode_command);
+  encode_command_reset_external_quantize_index(encode_command);
+  encode_command_reset_target_frame_bits(encode_command);
+  gop_command_off(&encode_command->gop_command);
 }
 
 // Returns number of units in size of 4, if not multiple not a multiple of 4,
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -1713,9 +1713,16 @@
 
   // Modify frame size target when down-scaling.
   if (cpi->oxcf.resize_mode == RESIZE_DYNAMIC &&
-      rc->frame_size_selector != UNSCALED)
+      rc->frame_size_selector != UNSCALED) {
     rc->this_frame_target = (int)(rc->this_frame_target *
                                   rate_thresh_mult[rc->frame_size_selector]);
+  }
+
+#if CONFIG_RATE_CTRL
+  if (cpi->encode_command.use_external_target_frame_bits) {
+    rc->this_frame_target = cpi->encode_command.target_frame_bits;
+  }
+#endif
 
   // Target rate per SB64 (including partial SB64s.
   rc->sb64_target_rate = (int)(((int64_t)rc->this_frame_target * 64 * 64) /
--- a/vp9/simple_encode.cc
+++ b/vp9/simple_encode.cc
@@ -1071,6 +1071,14 @@
   encode_command_reset_external_quantize_index(&impl_ptr_->cpi->encode_command);
 }
 
+void SimpleEncode::EncodeFrameWithTargetFrameBits(
+    EncodeFrameResult *encode_frame_result, int target_frame_bits) {
+  encode_command_set_target_frame_bits(&impl_ptr_->cpi->encode_command,
+                                       target_frame_bits);
+  EncodeFrame(encode_frame_result);
+  encode_command_reset_target_frame_bits(&impl_ptr_->cpi->encode_command);
+}
+
 static int GetCodingFrameNumFromGopMap(const std::vector<int> &gop_map) {
   int start_show_index = 0;
   int coding_frame_count = 0;
--- a/vp9/simple_encode.h
+++ b/vp9/simple_encode.h
@@ -382,6 +382,12 @@
   void EncodeFrameWithQuantizeIndex(EncodeFrameResult *encode_frame_result,
                                     int quantize_index);
 
+  // Encode a frame with target frame bits usage.
+  // The encoder will find a quantize index to make the actual frame bits usage
+  // match the target.
+  void EncodeFrameWithTargetFrameBits(EncodeFrameResult *encode_frame_result,
+                                      int target_frame_bits);
+
   // Gets the number of coding frames for the video. The coding frames include
   // show frame and no show frame.
   // This function should be called after ComputeFirstPassStats().