shithub: libvpx

Download patch

ref: 0ffa76d41d0e819f9ca480ad50929190e6a15e0d
parent: a6ff3abbe631e6d8805714e1534a421e52404509
parent: db900e5268e4bed46d67f12c8528b83b1a5cecf9
author: Cheng Chen <chengchen@google.com>
date: Mon Jan 27 17:49:58 EST 2020

Merge "Consistency test for partition info"

--- a/test/simple_encode_test.cc
+++ b/test/simple_encode_test.cc
@@ -32,6 +32,10 @@
          frame_rate_den / 1000.0;
 }
 
+// Returns the number of unit in size of 4.
+// For example, if size is 7, return 2.
+int GetNumUnit4x4(int size) { return (size + 3) >> 2; }
+
 TEST(SimpleEncode, ComputeFirstPassStats) {
   SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
                              target_bitrate, num_frames, infile_path);
@@ -124,6 +128,7 @@
   std::vector<double> ref_psnr_list;
   std::vector<size_t> ref_bit_size_list;
   {
+    // The first encode.
     SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
                                target_bitrate, num_frames, infile_path);
     simple_encode.ComputeFirstPassStats();
@@ -140,6 +145,7 @@
     simple_encode.EndEncode();
   }
   {
+    // The second encode with quantize index got from the first encode.
     SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
                                target_bitrate, num_frames, infile_path);
     simple_encode.ComputeFirstPassStats();
@@ -158,6 +164,55 @@
     }
     simple_encode.EndEncode();
   }
+}
+
+// Test the information stored in encoder is the same between two encode runs.
+TEST(SimpleEncode, EncodeConsistencyTest2) {
+  const int num_rows_4x4 = GetNumUnit4x4(w);
+  const int num_cols_4x4 = GetNumUnit4x4(h);
+  const int num_units_4x4 = num_rows_4x4 * num_cols_4x4;
+  // The first encode.
+  SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
+                             target_bitrate, num_frames, infile_path);
+  simple_encode.ComputeFirstPassStats();
+  const int num_coding_frames = simple_encode.GetCodingFrameNum();
+  std::vector<PartitionInfo> partition_info_list(num_units_4x4 *
+                                                 num_coding_frames);
+  simple_encode.StartEncode();
+  for (int i = 0; i < num_coding_frames; ++i) {
+    EncodeFrameResult encode_frame_result;
+    simple_encode.EncodeFrame(&encode_frame_result);
+    for (int j = 0; j < num_rows_4x4 * num_cols_4x4; ++j) {
+      partition_info_list[i * num_units_4x4 + j] =
+          encode_frame_result.partition_info[j];
+    }
+  }
+  simple_encode.EndEncode();
+  // The second encode.
+  SimpleEncode simple_encode_2(w, h, frame_rate_num, frame_rate_den,
+                               target_bitrate, num_frames, infile_path);
+  simple_encode_2.ComputeFirstPassStats();
+  const int num_coding_frames_2 = simple_encode_2.GetCodingFrameNum();
+  simple_encode_2.StartEncode();
+  for (int i = 0; i < num_coding_frames_2; ++i) {
+    EncodeFrameResult encode_frame_result;
+    simple_encode_2.EncodeFrame(&encode_frame_result);
+    for (int j = 0; j < num_rows_4x4 * num_cols_4x4; ++j) {
+      EXPECT_EQ(encode_frame_result.partition_info[j].row,
+                partition_info_list[i * num_units_4x4 + j].row);
+      EXPECT_EQ(encode_frame_result.partition_info[j].column,
+                partition_info_list[i * num_units_4x4 + j].column);
+      EXPECT_EQ(encode_frame_result.partition_info[j].row_start,
+                partition_info_list[i * num_units_4x4 + j].row_start);
+      EXPECT_EQ(encode_frame_result.partition_info[j].column_start,
+                partition_info_list[i * num_units_4x4 + j].column_start);
+      EXPECT_EQ(encode_frame_result.partition_info[j].width,
+                partition_info_list[i * num_units_4x4 + j].width);
+      EXPECT_EQ(encode_frame_result.partition_info[j].height,
+                partition_info_list[i * num_units_4x4 + j].height);
+    }
+  }
+  simple_encode_2.EndEncode();
 }
 
 TEST(SimpleEncode, GetEncodeFrameInfo) {
--- a/vp9/encoder/vp9_encoder.h
+++ b/vp9/encoder/vp9_encoder.h
@@ -551,7 +551,7 @@
 }
 
 // Returns number of units in size of 4, if not multiple not a multiple of 4,
-// round it up. For example, size is 7, return 3.
+// round it up. For example, size is 7, return 2.
 static INLINE int get_num_unit_4x4(int size) { return (size + 3) >> 2; }
 #endif  // CONFIG_RATE_CTRL