xref: /aosp_15_r20/external/libvpx/test/simple_encode_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2019 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include <math.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <memory>
13*fb1b10abSAndroid Build Coastguard Worker #include <string>
14*fb1b10abSAndroid Build Coastguard Worker #include <vector>
15*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "test/video_source.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vp9/simple_encode.h"
18*fb1b10abSAndroid Build Coastguard Worker 
19*fb1b10abSAndroid Build Coastguard Worker namespace vp9 {
20*fb1b10abSAndroid Build Coastguard Worker namespace {
21*fb1b10abSAndroid Build Coastguard Worker 
GetBitrateInKbps(size_t bit_size,int num_frames,int frame_rate_num,int frame_rate_den)22*fb1b10abSAndroid Build Coastguard Worker double GetBitrateInKbps(size_t bit_size, int num_frames, int frame_rate_num,
23*fb1b10abSAndroid Build Coastguard Worker                         int frame_rate_den) {
24*fb1b10abSAndroid Build Coastguard Worker   return static_cast<double>(bit_size) / num_frames * frame_rate_num /
25*fb1b10abSAndroid Build Coastguard Worker          frame_rate_den / 1000.0;
26*fb1b10abSAndroid Build Coastguard Worker }
27*fb1b10abSAndroid Build Coastguard Worker 
28*fb1b10abSAndroid Build Coastguard Worker // Returns the number of unit in size of 4.
29*fb1b10abSAndroid Build Coastguard Worker // For example, if size is 7, return 2.
GetNumUnit4x4(int size)30*fb1b10abSAndroid Build Coastguard Worker int GetNumUnit4x4(int size) { return (size + 3) >> 2; }
31*fb1b10abSAndroid Build Coastguard Worker 
32*fb1b10abSAndroid Build Coastguard Worker class SimpleEncodeTest : public ::testing::Test {
33*fb1b10abSAndroid Build Coastguard Worker  protected:
34*fb1b10abSAndroid Build Coastguard Worker   const int width_ = 352;
35*fb1b10abSAndroid Build Coastguard Worker   const int height_ = 288;
36*fb1b10abSAndroid Build Coastguard Worker   const int frame_rate_num_ = 30;
37*fb1b10abSAndroid Build Coastguard Worker   const int frame_rate_den_ = 1;
38*fb1b10abSAndroid Build Coastguard Worker   const int target_bitrate_ = 1000;
39*fb1b10abSAndroid Build Coastguard Worker   const int num_frames_ = 17;
40*fb1b10abSAndroid Build Coastguard Worker   const int target_level_ = LEVEL_UNKNOWN;
41*fb1b10abSAndroid Build Coastguard Worker   const std::string in_file_path_str_ =
42*fb1b10abSAndroid Build Coastguard Worker       libvpx_test::GetDataPath() + "/bus_352x288_420_f20_b8.yuv";
43*fb1b10abSAndroid Build Coastguard Worker };
44*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,ComputeFirstPassStats)45*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, ComputeFirstPassStats) {
46*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
47*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
48*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
49*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
50*fb1b10abSAndroid Build Coastguard Worker   std::vector<std::vector<double>> frame_stats =
51*fb1b10abSAndroid Build Coastguard Worker       simple_encode.ObserveFirstPassStats();
52*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(frame_stats.size(), static_cast<size_t>(num_frames_));
53*fb1b10abSAndroid Build Coastguard Worker   const size_t data_num = frame_stats[0].size();
54*fb1b10abSAndroid Build Coastguard Worker   // Read ObserveFirstPassStats before changing FIRSTPASS_STATS.
55*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(data_num, static_cast<size_t>(25));
56*fb1b10abSAndroid Build Coastguard Worker   for (size_t i = 0; i < frame_stats.size(); ++i) {
57*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(frame_stats[i].size(), data_num);
58*fb1b10abSAndroid Build Coastguard Worker     // FIRSTPASS_STATS's first element is frame
59*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(frame_stats[i][0], i);
60*fb1b10abSAndroid Build Coastguard Worker     // FIRSTPASS_STATS's last element is count, and the count is 1 for single
61*fb1b10abSAndroid Build Coastguard Worker     // frame stats
62*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(frame_stats[i][data_num - 1], 1);
63*fb1b10abSAndroid Build Coastguard Worker   }
64*fb1b10abSAndroid Build Coastguard Worker }
65*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,ObserveFirstPassMotionVectors)66*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, ObserveFirstPassMotionVectors) {
67*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
68*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
69*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
70*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
71*fb1b10abSAndroid Build Coastguard Worker   std::vector<std::vector<MotionVectorInfo>> fps_motion_vectors =
72*fb1b10abSAndroid Build Coastguard Worker       simple_encode.ObserveFirstPassMotionVectors();
73*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(fps_motion_vectors.size(), static_cast<size_t>(num_frames_));
74*fb1b10abSAndroid Build Coastguard Worker   const size_t num_blocks = ((width_ + 15) >> 4) * ((height_ + 15) >> 4);
75*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(num_blocks, fps_motion_vectors[0].size());
76*fb1b10abSAndroid Build Coastguard Worker   for (size_t i = 0; i < fps_motion_vectors.size(); ++i) {
77*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(num_blocks, fps_motion_vectors[i].size());
78*fb1b10abSAndroid Build Coastguard Worker     for (size_t j = 0; j < num_blocks; ++j) {
79*fb1b10abSAndroid Build Coastguard Worker       const int mv_count = fps_motion_vectors[i][j].mv_count;
80*fb1b10abSAndroid Build Coastguard Worker       const int ref_count =
81*fb1b10abSAndroid Build Coastguard Worker           (fps_motion_vectors[i][j].ref_frame[0] != kRefFrameTypeNone) +
82*fb1b10abSAndroid Build Coastguard Worker           (fps_motion_vectors[i][j].ref_frame[1] != kRefFrameTypeNone);
83*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(mv_count, ref_count);
84*fb1b10abSAndroid Build Coastguard Worker     }
85*fb1b10abSAndroid Build Coastguard Worker   }
86*fb1b10abSAndroid Build Coastguard Worker }
87*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,GetCodingFrameNum)88*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, GetCodingFrameNum) {
89*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
90*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
91*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
92*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
93*fb1b10abSAndroid Build Coastguard Worker   const int num_coding_frames = simple_encode.GetCodingFrameNum();
94*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(num_coding_frames, 19);
95*fb1b10abSAndroid Build Coastguard Worker }
96*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,EncodeFrame)97*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, EncodeFrame) {
98*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
99*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
100*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
101*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
102*fb1b10abSAndroid Build Coastguard Worker   int num_coding_frames = simple_encode.GetCodingFrameNum();
103*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(num_coding_frames, num_frames_);
104*fb1b10abSAndroid Build Coastguard Worker   simple_encode.StartEncode();
105*fb1b10abSAndroid Build Coastguard Worker   size_t total_data_bit_size = 0;
106*fb1b10abSAndroid Build Coastguard Worker   int coded_show_frame_count = 0;
107*fb1b10abSAndroid Build Coastguard Worker   int frame_coding_index = 0;
108*fb1b10abSAndroid Build Coastguard Worker   while (coded_show_frame_count < num_frames_) {
109*fb1b10abSAndroid Build Coastguard Worker     const GroupOfPicture group_of_picture =
110*fb1b10abSAndroid Build Coastguard Worker         simple_encode.ObserveGroupOfPicture();
111*fb1b10abSAndroid Build Coastguard Worker     const std::vector<EncodeFrameInfo> &encode_frame_list =
112*fb1b10abSAndroid Build Coastguard Worker         group_of_picture.encode_frame_list;
113*fb1b10abSAndroid Build Coastguard Worker     for (size_t group_index = 0; group_index < encode_frame_list.size();
114*fb1b10abSAndroid Build Coastguard Worker          ++group_index) {
115*fb1b10abSAndroid Build Coastguard Worker       EncodeFrameResult encode_frame_result;
116*fb1b10abSAndroid Build Coastguard Worker       simple_encode.EncodeFrame(&encode_frame_result);
117*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.show_idx,
118*fb1b10abSAndroid Build Coastguard Worker                 encode_frame_list[group_index].show_idx);
119*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.frame_type,
120*fb1b10abSAndroid Build Coastguard Worker                 encode_frame_list[group_index].frame_type);
121*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_list[group_index].coding_index,
122*fb1b10abSAndroid Build Coastguard Worker                 frame_coding_index);
123*fb1b10abSAndroid Build Coastguard Worker       EXPECT_GE(encode_frame_result.psnr, 34)
124*fb1b10abSAndroid Build Coastguard Worker           << "The psnr is supposed to be greater than 34 given the "
125*fb1b10abSAndroid Build Coastguard Worker              "target_bitrate 1000 kbps";
126*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.ref_frame_info,
127*fb1b10abSAndroid Build Coastguard Worker                 encode_frame_list[group_index].ref_frame_info);
128*fb1b10abSAndroid Build Coastguard Worker       total_data_bit_size += encode_frame_result.coding_data_bit_size;
129*fb1b10abSAndroid Build Coastguard Worker       ++frame_coding_index;
130*fb1b10abSAndroid Build Coastguard Worker     }
131*fb1b10abSAndroid Build Coastguard Worker     coded_show_frame_count += group_of_picture.show_frame_count;
132*fb1b10abSAndroid Build Coastguard Worker   }
133*fb1b10abSAndroid Build Coastguard Worker   const double bitrate = GetBitrateInKbps(total_data_bit_size, num_frames_,
134*fb1b10abSAndroid Build Coastguard Worker                                           frame_rate_num_, frame_rate_den_);
135*fb1b10abSAndroid Build Coastguard Worker   const double off_target_threshold = 150;
136*fb1b10abSAndroid Build Coastguard Worker   EXPECT_LE(fabs(target_bitrate_ - bitrate), off_target_threshold);
137*fb1b10abSAndroid Build Coastguard Worker   simple_encode.EndEncode();
138*fb1b10abSAndroid Build Coastguard Worker }
139*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,ObserveKeyFrameMap)140*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, ObserveKeyFrameMap) {
141*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
142*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
143*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
144*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
145*fb1b10abSAndroid Build Coastguard Worker   std::vector<int> key_frame_map = simple_encode.ObserveKeyFrameMap();
146*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(key_frame_map.size(), static_cast<size_t>(num_frames_));
147*fb1b10abSAndroid Build Coastguard Worker   simple_encode.StartEncode();
148*fb1b10abSAndroid Build Coastguard Worker   int coded_show_frame_count = 0;
149*fb1b10abSAndroid Build Coastguard Worker   while (coded_show_frame_count < num_frames_) {
150*fb1b10abSAndroid Build Coastguard Worker     const GroupOfPicture group_of_picture =
151*fb1b10abSAndroid Build Coastguard Worker         simple_encode.ObserveGroupOfPicture();
152*fb1b10abSAndroid Build Coastguard Worker     const std::vector<EncodeFrameInfo> &encode_frame_list =
153*fb1b10abSAndroid Build Coastguard Worker         group_of_picture.encode_frame_list;
154*fb1b10abSAndroid Build Coastguard Worker     for (size_t group_index = 0; group_index < encode_frame_list.size();
155*fb1b10abSAndroid Build Coastguard Worker          ++group_index) {
156*fb1b10abSAndroid Build Coastguard Worker       EncodeFrameResult encode_frame_result;
157*fb1b10abSAndroid Build Coastguard Worker       simple_encode.EncodeFrame(&encode_frame_result);
158*fb1b10abSAndroid Build Coastguard Worker       if (encode_frame_result.frame_type == kFrameTypeKey) {
159*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(key_frame_map[encode_frame_result.show_idx], 1);
160*fb1b10abSAndroid Build Coastguard Worker       } else {
161*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(key_frame_map[encode_frame_result.show_idx], 0);
162*fb1b10abSAndroid Build Coastguard Worker       }
163*fb1b10abSAndroid Build Coastguard Worker     }
164*fb1b10abSAndroid Build Coastguard Worker     coded_show_frame_count += group_of_picture.show_frame_count;
165*fb1b10abSAndroid Build Coastguard Worker   }
166*fb1b10abSAndroid Build Coastguard Worker   simple_encode.EndEncode();
167*fb1b10abSAndroid Build Coastguard Worker }
168*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,EncodeFrameWithTargetFrameBits)169*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, EncodeFrameWithTargetFrameBits) {
170*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
171*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
172*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
173*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
174*fb1b10abSAndroid Build Coastguard Worker   const int num_coding_frames = simple_encode.GetCodingFrameNum();
175*fb1b10abSAndroid Build Coastguard Worker   simple_encode.StartEncode();
176*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < num_coding_frames; ++i) {
177*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameInfo encode_frame_info = simple_encode.GetNextEncodeFrameInfo();
178*fb1b10abSAndroid Build Coastguard Worker     int target_frame_bits;
179*fb1b10abSAndroid Build Coastguard Worker     switch (encode_frame_info.frame_type) {
180*fb1b10abSAndroid Build Coastguard Worker       case kFrameTypeInter: target_frame_bits = 20000; break;
181*fb1b10abSAndroid Build Coastguard Worker       case kFrameTypeKey:
182*fb1b10abSAndroid Build Coastguard Worker       case kFrameTypeAltRef:
183*fb1b10abSAndroid Build Coastguard Worker       case kFrameTypeGolden: target_frame_bits = 100000; break;
184*fb1b10abSAndroid Build Coastguard Worker       case kFrameTypeOverlay: target_frame_bits = 2000; break;
185*fb1b10abSAndroid Build Coastguard Worker       default: target_frame_bits = 20000;
186*fb1b10abSAndroid Build Coastguard Worker     }
187*fb1b10abSAndroid Build Coastguard Worker 
188*fb1b10abSAndroid Build Coastguard Worker     double percent_diff = 15;
189*fb1b10abSAndroid Build Coastguard Worker     if (encode_frame_info.frame_type == kFrameTypeOverlay) {
190*fb1b10abSAndroid Build Coastguard Worker       percent_diff = 100;
191*fb1b10abSAndroid Build Coastguard Worker     }
192*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameResult encode_frame_result;
193*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EncodeFrameWithTargetFrameBits(
194*fb1b10abSAndroid Build Coastguard Worker         &encode_frame_result, target_frame_bits, percent_diff);
195*fb1b10abSAndroid Build Coastguard Worker     const int recode_count = encode_frame_result.recode_count;
196*fb1b10abSAndroid Build Coastguard Worker     // TODO(angiebird): Replace 7 by RATE_CTRL_MAX_RECODE_NUM
197*fb1b10abSAndroid Build Coastguard Worker     EXPECT_LE(recode_count, 7);
198*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(recode_count, 1);
199*fb1b10abSAndroid Build Coastguard Worker 
200*fb1b10abSAndroid Build Coastguard Worker     const double diff = fabs((double)encode_frame_result.coding_data_bit_size -
201*fb1b10abSAndroid Build Coastguard Worker                              target_frame_bits);
202*fb1b10abSAndroid Build Coastguard Worker     EXPECT_LE(diff * 100 / target_frame_bits, percent_diff);
203*fb1b10abSAndroid Build Coastguard Worker   }
204*fb1b10abSAndroid Build Coastguard Worker   simple_encode.EndEncode();
205*fb1b10abSAndroid Build Coastguard Worker }
206*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,EncodeFrameWithQuantizeIndex)207*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, EncodeFrameWithQuantizeIndex) {
208*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
209*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
210*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
211*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
212*fb1b10abSAndroid Build Coastguard Worker   const int num_coding_frames = simple_encode.GetCodingFrameNum();
213*fb1b10abSAndroid Build Coastguard Worker   simple_encode.StartEncode();
214*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < num_coding_frames; ++i) {
215*fb1b10abSAndroid Build Coastguard Worker     const int assigned_quantize_index = 100 + i;
216*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameResult encode_frame_result;
217*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EncodeFrameWithQuantizeIndex(&encode_frame_result,
218*fb1b10abSAndroid Build Coastguard Worker                                                assigned_quantize_index);
219*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(encode_frame_result.quantize_index, assigned_quantize_index);
220*fb1b10abSAndroid Build Coastguard Worker   }
221*fb1b10abSAndroid Build Coastguard Worker   simple_encode.EndEncode();
222*fb1b10abSAndroid Build Coastguard Worker }
223*fb1b10abSAndroid Build Coastguard Worker 
224*fb1b10abSAndroid Build Coastguard Worker // This test encodes the video using EncodeFrame(), where quantize indexes
225*fb1b10abSAndroid Build Coastguard Worker // are selected by vp9 rate control.
226*fb1b10abSAndroid Build Coastguard Worker // Encode stats and the quantize_indexes are collected.
227*fb1b10abSAndroid Build Coastguard Worker // Then the test encodes the video again using EncodeFrameWithQuantizeIndex()
228*fb1b10abSAndroid Build Coastguard Worker // using the quantize indexes collected from the first run.
229*fb1b10abSAndroid Build Coastguard Worker // Then test whether the encode stats of the two encoding runs match.
TEST_F(SimpleEncodeTest,EncodeConsistencyTest)230*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, EncodeConsistencyTest) {
231*fb1b10abSAndroid Build Coastguard Worker   std::vector<int> quantize_index_list;
232*fb1b10abSAndroid Build Coastguard Worker   std::vector<uint64_t> ref_sse_list;
233*fb1b10abSAndroid Build Coastguard Worker   std::vector<double> ref_psnr_list;
234*fb1b10abSAndroid Build Coastguard Worker   std::vector<size_t> ref_bit_size_list;
235*fb1b10abSAndroid Build Coastguard Worker   std::vector<FrameType> ref_frame_type_list;
236*fb1b10abSAndroid Build Coastguard Worker   std::vector<int> ref_show_idx_list;
237*fb1b10abSAndroid Build Coastguard Worker   {
238*fb1b10abSAndroid Build Coastguard Worker     // The first encode.
239*fb1b10abSAndroid Build Coastguard Worker     SimpleEncode simple_encode(width_, height_, frame_rate_num_,
240*fb1b10abSAndroid Build Coastguard Worker                                frame_rate_den_, target_bitrate_, num_frames_,
241*fb1b10abSAndroid Build Coastguard Worker                                target_level_, in_file_path_str_.c_str());
242*fb1b10abSAndroid Build Coastguard Worker     simple_encode.ComputeFirstPassStats();
243*fb1b10abSAndroid Build Coastguard Worker     const int num_coding_frames = simple_encode.GetCodingFrameNum();
244*fb1b10abSAndroid Build Coastguard Worker     simple_encode.StartEncode();
245*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < num_coding_frames; ++i) {
246*fb1b10abSAndroid Build Coastguard Worker       EncodeFrameResult encode_frame_result;
247*fb1b10abSAndroid Build Coastguard Worker       simple_encode.EncodeFrame(&encode_frame_result);
248*fb1b10abSAndroid Build Coastguard Worker       quantize_index_list.push_back(encode_frame_result.quantize_index);
249*fb1b10abSAndroid Build Coastguard Worker       ref_sse_list.push_back(encode_frame_result.sse);
250*fb1b10abSAndroid Build Coastguard Worker       ref_psnr_list.push_back(encode_frame_result.psnr);
251*fb1b10abSAndroid Build Coastguard Worker       ref_bit_size_list.push_back(encode_frame_result.coding_data_bit_size);
252*fb1b10abSAndroid Build Coastguard Worker       ref_frame_type_list.push_back(encode_frame_result.frame_type);
253*fb1b10abSAndroid Build Coastguard Worker       ref_show_idx_list.push_back(encode_frame_result.show_idx);
254*fb1b10abSAndroid Build Coastguard Worker     }
255*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EndEncode();
256*fb1b10abSAndroid Build Coastguard Worker   }
257*fb1b10abSAndroid Build Coastguard Worker   {
258*fb1b10abSAndroid Build Coastguard Worker     // The second encode with quantize index got from the first encode.
259*fb1b10abSAndroid Build Coastguard Worker     SimpleEncode simple_encode(width_, height_, frame_rate_num_,
260*fb1b10abSAndroid Build Coastguard Worker                                frame_rate_den_, target_bitrate_, num_frames_,
261*fb1b10abSAndroid Build Coastguard Worker                                target_level_, in_file_path_str_.c_str());
262*fb1b10abSAndroid Build Coastguard Worker     simple_encode.ComputeFirstPassStats();
263*fb1b10abSAndroid Build Coastguard Worker     const int num_coding_frames = simple_encode.GetCodingFrameNum();
264*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<size_t>(num_coding_frames),
265*fb1b10abSAndroid Build Coastguard Worker               quantize_index_list.size());
266*fb1b10abSAndroid Build Coastguard Worker     simple_encode.StartEncode();
267*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < num_coding_frames; ++i) {
268*fb1b10abSAndroid Build Coastguard Worker       EncodeFrameResult encode_frame_result;
269*fb1b10abSAndroid Build Coastguard Worker       simple_encode.EncodeFrameWithQuantizeIndex(&encode_frame_result,
270*fb1b10abSAndroid Build Coastguard Worker                                                  quantize_index_list[i]);
271*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.quantize_index, quantize_index_list[i]);
272*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.sse, ref_sse_list[i]);
273*fb1b10abSAndroid Build Coastguard Worker       EXPECT_DOUBLE_EQ(encode_frame_result.psnr, ref_psnr_list[i]);
274*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.coding_data_bit_size, ref_bit_size_list[i]);
275*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.frame_type, ref_frame_type_list[i]);
276*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.show_idx, ref_show_idx_list[i]);
277*fb1b10abSAndroid Build Coastguard Worker     }
278*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EndEncode();
279*fb1b10abSAndroid Build Coastguard Worker   }
280*fb1b10abSAndroid Build Coastguard Worker }
281*fb1b10abSAndroid Build Coastguard Worker 
282*fb1b10abSAndroid Build Coastguard Worker // Test the information (partition info and motion vector info) stored in
283*fb1b10abSAndroid Build Coastguard Worker // encoder is the same between two encode runs.
TEST_F(SimpleEncodeTest,EncodeConsistencyTest2)284*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, EncodeConsistencyTest2) {
285*fb1b10abSAndroid Build Coastguard Worker   const int num_rows_4x4 = GetNumUnit4x4(width_);
286*fb1b10abSAndroid Build Coastguard Worker   const int num_cols_4x4 = GetNumUnit4x4(height_);
287*fb1b10abSAndroid Build Coastguard Worker   const int num_units_4x4 = num_rows_4x4 * num_cols_4x4;
288*fb1b10abSAndroid Build Coastguard Worker   // The first encode.
289*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
290*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
291*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
292*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
293*fb1b10abSAndroid Build Coastguard Worker   const int num_coding_frames = simple_encode.GetCodingFrameNum();
294*fb1b10abSAndroid Build Coastguard Worker   std::vector<PartitionInfo> partition_info_list(num_units_4x4 *
295*fb1b10abSAndroid Build Coastguard Worker                                                  num_coding_frames);
296*fb1b10abSAndroid Build Coastguard Worker   std::vector<MotionVectorInfo> motion_vector_info_list(num_units_4x4 *
297*fb1b10abSAndroid Build Coastguard Worker                                                         num_coding_frames);
298*fb1b10abSAndroid Build Coastguard Worker   simple_encode.StartEncode();
299*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < num_coding_frames; ++i) {
300*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameResult encode_frame_result;
301*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EncodeFrame(&encode_frame_result);
302*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < num_rows_4x4 * num_cols_4x4; ++j) {
303*fb1b10abSAndroid Build Coastguard Worker       partition_info_list[i * num_units_4x4 + j] =
304*fb1b10abSAndroid Build Coastguard Worker           encode_frame_result.partition_info[j];
305*fb1b10abSAndroid Build Coastguard Worker       motion_vector_info_list[i * num_units_4x4 + j] =
306*fb1b10abSAndroid Build Coastguard Worker           encode_frame_result.motion_vector_info[j];
307*fb1b10abSAndroid Build Coastguard Worker     }
308*fb1b10abSAndroid Build Coastguard Worker   }
309*fb1b10abSAndroid Build Coastguard Worker   simple_encode.EndEncode();
310*fb1b10abSAndroid Build Coastguard Worker   // The second encode.
311*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode_2(width_, height_, frame_rate_num_,
312*fb1b10abSAndroid Build Coastguard Worker                                frame_rate_den_, target_bitrate_, num_frames_,
313*fb1b10abSAndroid Build Coastguard Worker                                target_level_, in_file_path_str_.c_str());
314*fb1b10abSAndroid Build Coastguard Worker   simple_encode_2.ComputeFirstPassStats();
315*fb1b10abSAndroid Build Coastguard Worker   const int num_coding_frames_2 = simple_encode_2.GetCodingFrameNum();
316*fb1b10abSAndroid Build Coastguard Worker   simple_encode_2.StartEncode();
317*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < num_coding_frames_2; ++i) {
318*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameResult encode_frame_result;
319*fb1b10abSAndroid Build Coastguard Worker     simple_encode_2.EncodeFrame(&encode_frame_result);
320*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < num_rows_4x4 * num_cols_4x4; ++j) {
321*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].row,
322*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].row);
323*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].column,
324*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].column);
325*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].row_start,
326*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].row_start);
327*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].column_start,
328*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].column_start);
329*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].width,
330*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].width);
331*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].height,
332*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].height);
333*fb1b10abSAndroid Build Coastguard Worker 
334*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.motion_vector_info[j].mv_count,
335*fb1b10abSAndroid Build Coastguard Worker                 motion_vector_info_list[i * num_units_4x4 + j].mv_count);
336*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.motion_vector_info[j].ref_frame[0],
337*fb1b10abSAndroid Build Coastguard Worker                 motion_vector_info_list[i * num_units_4x4 + j].ref_frame[0]);
338*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.motion_vector_info[j].ref_frame[1],
339*fb1b10abSAndroid Build Coastguard Worker                 motion_vector_info_list[i * num_units_4x4 + j].ref_frame[1]);
340*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.motion_vector_info[j].mv_row[0],
341*fb1b10abSAndroid Build Coastguard Worker                 motion_vector_info_list[i * num_units_4x4 + j].mv_row[0]);
342*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.motion_vector_info[j].mv_column[0],
343*fb1b10abSAndroid Build Coastguard Worker                 motion_vector_info_list[i * num_units_4x4 + j].mv_column[0]);
344*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.motion_vector_info[j].mv_row[1],
345*fb1b10abSAndroid Build Coastguard Worker                 motion_vector_info_list[i * num_units_4x4 + j].mv_row[1]);
346*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.motion_vector_info[j].mv_column[1],
347*fb1b10abSAndroid Build Coastguard Worker                 motion_vector_info_list[i * num_units_4x4 + j].mv_column[1]);
348*fb1b10abSAndroid Build Coastguard Worker     }
349*fb1b10abSAndroid Build Coastguard Worker   }
350*fb1b10abSAndroid Build Coastguard Worker   simple_encode_2.EndEncode();
351*fb1b10abSAndroid Build Coastguard Worker }
352*fb1b10abSAndroid Build Coastguard Worker 
353*fb1b10abSAndroid Build Coastguard Worker // Test the information stored in encoder is the same between two encode runs.
TEST_F(SimpleEncodeTest,EncodeConsistencyTest3)354*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, EncodeConsistencyTest3) {
355*fb1b10abSAndroid Build Coastguard Worker   std::vector<int> quantize_index_list;
356*fb1b10abSAndroid Build Coastguard Worker   const int num_rows_4x4 = GetNumUnit4x4(width_);
357*fb1b10abSAndroid Build Coastguard Worker   const int num_cols_4x4 = GetNumUnit4x4(height_);
358*fb1b10abSAndroid Build Coastguard Worker   const int num_units_4x4 = num_rows_4x4 * num_cols_4x4;
359*fb1b10abSAndroid Build Coastguard Worker   // The first encode.
360*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
361*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
362*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
363*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
364*fb1b10abSAndroid Build Coastguard Worker   const int num_coding_frames = simple_encode.GetCodingFrameNum();
365*fb1b10abSAndroid Build Coastguard Worker   std::vector<PartitionInfo> partition_info_list(num_units_4x4 *
366*fb1b10abSAndroid Build Coastguard Worker                                                  num_coding_frames);
367*fb1b10abSAndroid Build Coastguard Worker   simple_encode.StartEncode();
368*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < num_coding_frames; ++i) {
369*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameResult encode_frame_result;
370*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EncodeFrame(&encode_frame_result);
371*fb1b10abSAndroid Build Coastguard Worker     quantize_index_list.push_back(encode_frame_result.quantize_index);
372*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < num_rows_4x4 * num_cols_4x4; ++j) {
373*fb1b10abSAndroid Build Coastguard Worker       partition_info_list[i * num_units_4x4 + j] =
374*fb1b10abSAndroid Build Coastguard Worker           encode_frame_result.partition_info[j];
375*fb1b10abSAndroid Build Coastguard Worker     }
376*fb1b10abSAndroid Build Coastguard Worker   }
377*fb1b10abSAndroid Build Coastguard Worker   simple_encode.EndEncode();
378*fb1b10abSAndroid Build Coastguard Worker   // The second encode.
379*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode_2(width_, height_, frame_rate_num_,
380*fb1b10abSAndroid Build Coastguard Worker                                frame_rate_den_, target_bitrate_, num_frames_,
381*fb1b10abSAndroid Build Coastguard Worker                                target_level_, in_file_path_str_.c_str());
382*fb1b10abSAndroid Build Coastguard Worker   simple_encode_2.ComputeFirstPassStats();
383*fb1b10abSAndroid Build Coastguard Worker   const int num_coding_frames_2 = simple_encode_2.GetCodingFrameNum();
384*fb1b10abSAndroid Build Coastguard Worker   simple_encode_2.StartEncode();
385*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < num_coding_frames_2; ++i) {
386*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameResult encode_frame_result;
387*fb1b10abSAndroid Build Coastguard Worker     simple_encode_2.EncodeFrameWithQuantizeIndex(&encode_frame_result,
388*fb1b10abSAndroid Build Coastguard Worker                                                  quantize_index_list[i]);
389*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < num_rows_4x4 * num_cols_4x4; ++j) {
390*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].row,
391*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].row);
392*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].column,
393*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].column);
394*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].row_start,
395*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].row_start);
396*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].column_start,
397*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].column_start);
398*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].width,
399*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].width);
400*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.partition_info[j].height,
401*fb1b10abSAndroid Build Coastguard Worker                 partition_info_list[i * num_units_4x4 + j].height);
402*fb1b10abSAndroid Build Coastguard Worker     }
403*fb1b10abSAndroid Build Coastguard Worker   }
404*fb1b10abSAndroid Build Coastguard Worker   simple_encode_2.EndEncode();
405*fb1b10abSAndroid Build Coastguard Worker }
406*fb1b10abSAndroid Build Coastguard Worker 
407*fb1b10abSAndroid Build Coastguard Worker // Encode with default VP9 decision first.
408*fb1b10abSAndroid Build Coastguard Worker // Get QPs and arf locations from the first encode.
409*fb1b10abSAndroid Build Coastguard Worker // Set external arfs and QPs for the second encode.
410*fb1b10abSAndroid Build Coastguard Worker // Expect to get matched results.
TEST_F(SimpleEncodeTest,EncodeConsistencySetExternalGroupOfPicturesMap)411*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, EncodeConsistencySetExternalGroupOfPicturesMap) {
412*fb1b10abSAndroid Build Coastguard Worker   std::vector<int> quantize_index_list;
413*fb1b10abSAndroid Build Coastguard Worker   std::vector<uint64_t> ref_sse_list;
414*fb1b10abSAndroid Build Coastguard Worker   std::vector<double> ref_psnr_list;
415*fb1b10abSAndroid Build Coastguard Worker   std::vector<size_t> ref_bit_size_list;
416*fb1b10abSAndroid Build Coastguard Worker   std::vector<int> gop_map(num_frames_, 0);
417*fb1b10abSAndroid Build Coastguard Worker   {
418*fb1b10abSAndroid Build Coastguard Worker     // The first encode.
419*fb1b10abSAndroid Build Coastguard Worker     SimpleEncode simple_encode(width_, height_, frame_rate_num_,
420*fb1b10abSAndroid Build Coastguard Worker                                frame_rate_den_, target_bitrate_, num_frames_,
421*fb1b10abSAndroid Build Coastguard Worker                                target_level_, in_file_path_str_.c_str());
422*fb1b10abSAndroid Build Coastguard Worker     simple_encode.ComputeFirstPassStats();
423*fb1b10abSAndroid Build Coastguard Worker     simple_encode.StartEncode();
424*fb1b10abSAndroid Build Coastguard Worker 
425*fb1b10abSAndroid Build Coastguard Worker     int coded_show_frame_count = 0;
426*fb1b10abSAndroid Build Coastguard Worker     while (coded_show_frame_count < num_frames_) {
427*fb1b10abSAndroid Build Coastguard Worker       const GroupOfPicture group_of_picture =
428*fb1b10abSAndroid Build Coastguard Worker           simple_encode.ObserveGroupOfPicture();
429*fb1b10abSAndroid Build Coastguard Worker       gop_map[coded_show_frame_count] |= kGopMapFlagStart;
430*fb1b10abSAndroid Build Coastguard Worker       if (group_of_picture.use_alt_ref) {
431*fb1b10abSAndroid Build Coastguard Worker         gop_map[coded_show_frame_count] |= kGopMapFlagUseAltRef;
432*fb1b10abSAndroid Build Coastguard Worker       }
433*fb1b10abSAndroid Build Coastguard Worker       const std::vector<EncodeFrameInfo> &encode_frame_list =
434*fb1b10abSAndroid Build Coastguard Worker           group_of_picture.encode_frame_list;
435*fb1b10abSAndroid Build Coastguard Worker       for (size_t group_index = 0; group_index < encode_frame_list.size();
436*fb1b10abSAndroid Build Coastguard Worker            ++group_index) {
437*fb1b10abSAndroid Build Coastguard Worker         EncodeFrameResult encode_frame_result;
438*fb1b10abSAndroid Build Coastguard Worker         simple_encode.EncodeFrame(&encode_frame_result);
439*fb1b10abSAndroid Build Coastguard Worker         quantize_index_list.push_back(encode_frame_result.quantize_index);
440*fb1b10abSAndroid Build Coastguard Worker         ref_sse_list.push_back(encode_frame_result.sse);
441*fb1b10abSAndroid Build Coastguard Worker         ref_psnr_list.push_back(encode_frame_result.psnr);
442*fb1b10abSAndroid Build Coastguard Worker         ref_bit_size_list.push_back(encode_frame_result.coding_data_bit_size);
443*fb1b10abSAndroid Build Coastguard Worker       }
444*fb1b10abSAndroid Build Coastguard Worker       coded_show_frame_count += group_of_picture.show_frame_count;
445*fb1b10abSAndroid Build Coastguard Worker     }
446*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EndEncode();
447*fb1b10abSAndroid Build Coastguard Worker   }
448*fb1b10abSAndroid Build Coastguard Worker   {
449*fb1b10abSAndroid Build Coastguard Worker     // The second encode with quantize index got from the first encode.
450*fb1b10abSAndroid Build Coastguard Worker     // The external arfs are the same as the first encode.
451*fb1b10abSAndroid Build Coastguard Worker     SimpleEncode simple_encode(width_, height_, frame_rate_num_,
452*fb1b10abSAndroid Build Coastguard Worker                                frame_rate_den_, target_bitrate_, num_frames_,
453*fb1b10abSAndroid Build Coastguard Worker                                target_level_, in_file_path_str_.c_str());
454*fb1b10abSAndroid Build Coastguard Worker     simple_encode.ComputeFirstPassStats();
455*fb1b10abSAndroid Build Coastguard Worker     simple_encode.SetExternalGroupOfPicturesMap(gop_map.data(), gop_map.size());
456*fb1b10abSAndroid Build Coastguard Worker     const int num_coding_frames = simple_encode.GetCodingFrameNum();
457*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<size_t>(num_coding_frames),
458*fb1b10abSAndroid Build Coastguard Worker               quantize_index_list.size());
459*fb1b10abSAndroid Build Coastguard Worker     simple_encode.StartEncode();
460*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < num_coding_frames; ++i) {
461*fb1b10abSAndroid Build Coastguard Worker       EncodeFrameResult encode_frame_result;
462*fb1b10abSAndroid Build Coastguard Worker       simple_encode.EncodeFrameWithQuantizeIndex(&encode_frame_result,
463*fb1b10abSAndroid Build Coastguard Worker                                                  quantize_index_list[i]);
464*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.quantize_index, quantize_index_list[i]);
465*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.sse, ref_sse_list[i]);
466*fb1b10abSAndroid Build Coastguard Worker       EXPECT_DOUBLE_EQ(encode_frame_result.psnr, ref_psnr_list[i]);
467*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(encode_frame_result.coding_data_bit_size, ref_bit_size_list[i]);
468*fb1b10abSAndroid Build Coastguard Worker     }
469*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EndEncode();
470*fb1b10abSAndroid Build Coastguard Worker   }
471*fb1b10abSAndroid Build Coastguard Worker }
472*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,SetExternalGroupOfPicturesMap)473*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, SetExternalGroupOfPicturesMap) {
474*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
475*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
476*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
477*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
478*fb1b10abSAndroid Build Coastguard Worker 
479*fb1b10abSAndroid Build Coastguard Worker   std::vector<int> gop_map(num_frames_, 0);
480*fb1b10abSAndroid Build Coastguard Worker 
481*fb1b10abSAndroid Build Coastguard Worker   // Should be the first gop group.
482*fb1b10abSAndroid Build Coastguard Worker   gop_map[0] = 0;
483*fb1b10abSAndroid Build Coastguard Worker 
484*fb1b10abSAndroid Build Coastguard Worker   // Second gop group with an alt ref.
485*fb1b10abSAndroid Build Coastguard Worker   gop_map[5] |= kGopMapFlagStart | kGopMapFlagUseAltRef;
486*fb1b10abSAndroid Build Coastguard Worker 
487*fb1b10abSAndroid Build Coastguard Worker   // Third gop group without an alt ref.
488*fb1b10abSAndroid Build Coastguard Worker   gop_map[10] |= kGopMapFlagStart;
489*fb1b10abSAndroid Build Coastguard Worker 
490*fb1b10abSAndroid Build Coastguard Worker   // Last gop group.
491*fb1b10abSAndroid Build Coastguard Worker   gop_map[14] |= kGopMapFlagStart | kGopMapFlagUseAltRef;
492*fb1b10abSAndroid Build Coastguard Worker 
493*fb1b10abSAndroid Build Coastguard Worker   simple_encode.SetExternalGroupOfPicturesMap(gop_map.data(), gop_map.size());
494*fb1b10abSAndroid Build Coastguard Worker 
495*fb1b10abSAndroid Build Coastguard Worker   std::vector<int> observed_gop_map =
496*fb1b10abSAndroid Build Coastguard Worker       simple_encode.ObserveExternalGroupOfPicturesMap();
497*fb1b10abSAndroid Build Coastguard Worker 
498*fb1b10abSAndroid Build Coastguard Worker   // First gop group.
499*fb1b10abSAndroid Build Coastguard Worker   // There is always a key frame at show_idx 0 and key frame should always be
500*fb1b10abSAndroid Build Coastguard Worker   // the start of a gop. We expect ObserveExternalGroupOfPicturesMap() will
501*fb1b10abSAndroid Build Coastguard Worker   // insert an extra gop start here.
502*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(observed_gop_map[0], kGopMapFlagStart | kGopMapFlagUseAltRef);
503*fb1b10abSAndroid Build Coastguard Worker 
504*fb1b10abSAndroid Build Coastguard Worker   // Second gop group with an alt ref.
505*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(observed_gop_map[5], kGopMapFlagStart | kGopMapFlagUseAltRef);
506*fb1b10abSAndroid Build Coastguard Worker 
507*fb1b10abSAndroid Build Coastguard Worker   // Third gop group without an alt ref.
508*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(observed_gop_map[10], kGopMapFlagStart);
509*fb1b10abSAndroid Build Coastguard Worker 
510*fb1b10abSAndroid Build Coastguard Worker   // Last gop group. The last gop is not supposed to use an alt ref. We expect
511*fb1b10abSAndroid Build Coastguard Worker   // ObserveExternalGroupOfPicturesMap() will remove the alt ref flag here.
512*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(observed_gop_map[14], kGopMapFlagStart);
513*fb1b10abSAndroid Build Coastguard Worker 
514*fb1b10abSAndroid Build Coastguard Worker   int ref_gop_show_frame_count_list[4] = { 5, 5, 4, 3 };
515*fb1b10abSAndroid Build Coastguard Worker   size_t ref_gop_coded_frame_count_list[4] = { 6, 6, 4, 3 };
516*fb1b10abSAndroid Build Coastguard Worker   int gop_count = 0;
517*fb1b10abSAndroid Build Coastguard Worker 
518*fb1b10abSAndroid Build Coastguard Worker   simple_encode.StartEncode();
519*fb1b10abSAndroid Build Coastguard Worker   int coded_show_frame_count = 0;
520*fb1b10abSAndroid Build Coastguard Worker   while (coded_show_frame_count < num_frames_) {
521*fb1b10abSAndroid Build Coastguard Worker     const GroupOfPicture group_of_picture =
522*fb1b10abSAndroid Build Coastguard Worker         simple_encode.ObserveGroupOfPicture();
523*fb1b10abSAndroid Build Coastguard Worker     const std::vector<EncodeFrameInfo> &encode_frame_list =
524*fb1b10abSAndroid Build Coastguard Worker         group_of_picture.encode_frame_list;
525*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(encode_frame_list.size(),
526*fb1b10abSAndroid Build Coastguard Worker               ref_gop_coded_frame_count_list[gop_count]);
527*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(group_of_picture.show_frame_count,
528*fb1b10abSAndroid Build Coastguard Worker               ref_gop_show_frame_count_list[gop_count]);
529*fb1b10abSAndroid Build Coastguard Worker     for (size_t group_index = 0; group_index < encode_frame_list.size();
530*fb1b10abSAndroid Build Coastguard Worker          ++group_index) {
531*fb1b10abSAndroid Build Coastguard Worker       EncodeFrameResult encode_frame_result;
532*fb1b10abSAndroid Build Coastguard Worker       simple_encode.EncodeFrame(&encode_frame_result);
533*fb1b10abSAndroid Build Coastguard Worker     }
534*fb1b10abSAndroid Build Coastguard Worker     coded_show_frame_count += group_of_picture.show_frame_count;
535*fb1b10abSAndroid Build Coastguard Worker     ++gop_count;
536*fb1b10abSAndroid Build Coastguard Worker   }
537*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(gop_count, 4);
538*fb1b10abSAndroid Build Coastguard Worker   simple_encode.EndEncode();
539*fb1b10abSAndroid Build Coastguard Worker }
540*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,GetEncodeFrameInfo)541*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, GetEncodeFrameInfo) {
542*fb1b10abSAndroid Build Coastguard Worker   // Makes sure that the encode_frame_info obtained from GetEncodeFrameInfo()
543*fb1b10abSAndroid Build Coastguard Worker   // matches the counterpart in encode_frame_result obtained from EncodeFrame()
544*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
545*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
546*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
547*fb1b10abSAndroid Build Coastguard Worker   simple_encode.ComputeFirstPassStats();
548*fb1b10abSAndroid Build Coastguard Worker   const int num_coding_frames = simple_encode.GetCodingFrameNum();
549*fb1b10abSAndroid Build Coastguard Worker   simple_encode.StartEncode();
550*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < num_coding_frames; ++i) {
551*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameInfo encode_frame_info = simple_encode.GetNextEncodeFrameInfo();
552*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameResult encode_frame_result;
553*fb1b10abSAndroid Build Coastguard Worker     simple_encode.EncodeFrame(&encode_frame_result);
554*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(encode_frame_info.show_idx, encode_frame_result.show_idx);
555*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(encode_frame_info.frame_type, encode_frame_result.frame_type);
556*fb1b10abSAndroid Build Coastguard Worker   }
557*fb1b10abSAndroid Build Coastguard Worker   simple_encode.EndEncode();
558*fb1b10abSAndroid Build Coastguard Worker }
559*fb1b10abSAndroid Build Coastguard Worker 
TEST_F(SimpleEncodeTest,GetFramePixelCount)560*fb1b10abSAndroid Build Coastguard Worker TEST_F(SimpleEncodeTest, GetFramePixelCount) {
561*fb1b10abSAndroid Build Coastguard Worker   SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
562*fb1b10abSAndroid Build Coastguard Worker                              target_bitrate_, num_frames_, target_level_,
563*fb1b10abSAndroid Build Coastguard Worker                              in_file_path_str_.c_str());
564*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(simple_encode.GetFramePixelCount(),
565*fb1b10abSAndroid Build Coastguard Worker             static_cast<uint64_t>(width_ * height_ * 3 / 2));
566*fb1b10abSAndroid Build Coastguard Worker }
567*fb1b10abSAndroid Build Coastguard Worker 
568*fb1b10abSAndroid Build Coastguard Worker }  // namespace
569*fb1b10abSAndroid Build Coastguard Worker }  // namespace vp9
570*fb1b10abSAndroid Build Coastguard Worker 
main(int argc,char ** argv)571*fb1b10abSAndroid Build Coastguard Worker int main(int argc, char **argv) {
572*fb1b10abSAndroid Build Coastguard Worker   ::testing::InitGoogleTest(&argc, argv);
573*fb1b10abSAndroid Build Coastguard Worker   return RUN_ALL_TESTS();
574*fb1b10abSAndroid Build Coastguard Worker }
575