xref: /aosp_15_r20/external/libaom/test/firstpass_test.cc (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2021, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker  *
4*77c1e3ccSAndroid Build Coastguard Worker  * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker  * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker  * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker  */
11*77c1e3ccSAndroid Build Coastguard Worker 
12*77c1e3ccSAndroid Build Coastguard Worker #include <stddef.h>
13*77c1e3ccSAndroid Build Coastguard Worker 
14*77c1e3ccSAndroid Build Coastguard Worker #include "av1/common/common.h"
15*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/firstpass.h"
16*77c1e3ccSAndroid Build Coastguard Worker #include "gtest/gtest.h"
17*77c1e3ccSAndroid Build Coastguard Worker 
18*77c1e3ccSAndroid Build Coastguard Worker namespace {
19*77c1e3ccSAndroid Build Coastguard Worker 
TEST(FirstpassTest,FirstpassInfoInitWithExtBuf)20*77c1e3ccSAndroid Build Coastguard Worker TEST(FirstpassTest, FirstpassInfoInitWithExtBuf) {
21*77c1e3ccSAndroid Build Coastguard Worker   FIRSTPASS_INFO firstpass_info;
22*77c1e3ccSAndroid Build Coastguard Worker   FIRSTPASS_STATS ext_stats_buf[10];
23*77c1e3ccSAndroid Build Coastguard Worker   const int ref_stats_size = 10;
24*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < ref_stats_size; ++i) {
25*77c1e3ccSAndroid Build Coastguard Worker     av1_zero(ext_stats_buf[i]);
26*77c1e3ccSAndroid Build Coastguard Worker     ext_stats_buf[i].frame = i;
27*77c1e3ccSAndroid Build Coastguard Worker   }
28*77c1e3ccSAndroid Build Coastguard Worker   aom_codec_err_t ret =
29*77c1e3ccSAndroid Build Coastguard Worker       av1_firstpass_info_init(&firstpass_info, ext_stats_buf, 10);
30*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_count, ref_stats_size);
31*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.future_stats_count + firstpass_info.past_stats_count,
32*77c1e3ccSAndroid Build Coastguard Worker             firstpass_info.stats_count);
33*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.cur_index, 0);
34*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(ret, AOM_CODEC_OK);
35*77c1e3ccSAndroid Build Coastguard Worker }
36*77c1e3ccSAndroid Build Coastguard Worker 
TEST(FirstpassTest,FirstpassInfoInitWithStaticBuf)37*77c1e3ccSAndroid Build Coastguard Worker TEST(FirstpassTest, FirstpassInfoInitWithStaticBuf) {
38*77c1e3ccSAndroid Build Coastguard Worker   FIRSTPASS_INFO firstpass_info;
39*77c1e3ccSAndroid Build Coastguard Worker   aom_codec_err_t ret = av1_firstpass_info_init(&firstpass_info, nullptr, 0);
40*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_count, 0);
41*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.cur_index, 0);
42*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(ret, AOM_CODEC_OK);
43*77c1e3ccSAndroid Build Coastguard Worker }
44*77c1e3ccSAndroid Build Coastguard Worker 
TEST(FirstpassTest,FirstpassInfoPushPop)45*77c1e3ccSAndroid Build Coastguard Worker TEST(FirstpassTest, FirstpassInfoPushPop) {
46*77c1e3ccSAndroid Build Coastguard Worker   FIRSTPASS_INFO firstpass_info;
47*77c1e3ccSAndroid Build Coastguard Worker   av1_firstpass_info_init(&firstpass_info, nullptr, 0);
48*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_buf_size, FIRSTPASS_INFO_STATIC_BUF_SIZE);
49*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < FIRSTPASS_INFO_STATIC_BUF_SIZE; ++i) {
50*77c1e3ccSAndroid Build Coastguard Worker     FIRSTPASS_STATS stats;
51*77c1e3ccSAndroid Build Coastguard Worker     av1_zero(stats);
52*77c1e3ccSAndroid Build Coastguard Worker     stats.frame = i;
53*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret = av1_firstpass_info_push(&firstpass_info, &stats);
54*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_OK);
55*77c1e3ccSAndroid Build Coastguard Worker   }
56*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_count, FIRSTPASS_INFO_STATIC_BUF_SIZE);
57*77c1e3ccSAndroid Build Coastguard Worker   const int pop_count = FIRSTPASS_INFO_STATIC_BUF_SIZE / 2;
58*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < pop_count; ++i) {
59*77c1e3ccSAndroid Build Coastguard Worker     const FIRSTPASS_STATS *stats = av1_firstpass_info_peek(&firstpass_info, 0);
60*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret =
61*77c1e3ccSAndroid Build Coastguard Worker         av1_firstpass_info_move_cur_index_and_pop(&firstpass_info);
62*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_NE(stats, nullptr);
63*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(stats->frame, i);
64*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_OK);
65*77c1e3ccSAndroid Build Coastguard Worker   }
66*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_count,
67*77c1e3ccSAndroid Build Coastguard Worker             FIRSTPASS_INFO_STATIC_BUF_SIZE - pop_count);
68*77c1e3ccSAndroid Build Coastguard Worker 
69*77c1e3ccSAndroid Build Coastguard Worker   const int push_count = FIRSTPASS_INFO_STATIC_BUF_SIZE / 2;
70*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < push_count; ++i) {
71*77c1e3ccSAndroid Build Coastguard Worker     FIRSTPASS_STATS stats;
72*77c1e3ccSAndroid Build Coastguard Worker     av1_zero(stats);
73*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret = av1_firstpass_info_push(&firstpass_info, &stats);
74*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_OK);
75*77c1e3ccSAndroid Build Coastguard Worker   }
76*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_count, FIRSTPASS_INFO_STATIC_BUF_SIZE);
77*77c1e3ccSAndroid Build Coastguard Worker 
78*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_count, firstpass_info.stats_buf_size);
79*77c1e3ccSAndroid Build Coastguard Worker   {
80*77c1e3ccSAndroid Build Coastguard Worker     // Push the stats when the queue is full.
81*77c1e3ccSAndroid Build Coastguard Worker     FIRSTPASS_STATS stats;
82*77c1e3ccSAndroid Build Coastguard Worker     av1_zero(stats);
83*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret = av1_firstpass_info_push(&firstpass_info, &stats);
84*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_ERROR);
85*77c1e3ccSAndroid Build Coastguard Worker   }
86*77c1e3ccSAndroid Build Coastguard Worker }
87*77c1e3ccSAndroid Build Coastguard Worker 
TEST(FirstpassTest,FirstpassInfoTotalStats)88*77c1e3ccSAndroid Build Coastguard Worker TEST(FirstpassTest, FirstpassInfoTotalStats) {
89*77c1e3ccSAndroid Build Coastguard Worker   FIRSTPASS_INFO firstpass_info;
90*77c1e3ccSAndroid Build Coastguard Worker   av1_firstpass_info_init(&firstpass_info, nullptr, 0);
91*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.total_stats.frame, 0);
92*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 10; ++i) {
93*77c1e3ccSAndroid Build Coastguard Worker     FIRSTPASS_STATS stats;
94*77c1e3ccSAndroid Build Coastguard Worker     av1_zero(stats);
95*77c1e3ccSAndroid Build Coastguard Worker     stats.count = 1;
96*77c1e3ccSAndroid Build Coastguard Worker     av1_firstpass_info_push(&firstpass_info, &stats);
97*77c1e3ccSAndroid Build Coastguard Worker   }
98*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.total_stats.count, 10);
99*77c1e3ccSAndroid Build Coastguard Worker }
100*77c1e3ccSAndroid Build Coastguard Worker 
TEST(FirstpassTest,FirstpassInfoMoveCurr)101*77c1e3ccSAndroid Build Coastguard Worker TEST(FirstpassTest, FirstpassInfoMoveCurr) {
102*77c1e3ccSAndroid Build Coastguard Worker   FIRSTPASS_INFO firstpass_info;
103*77c1e3ccSAndroid Build Coastguard Worker   av1_firstpass_info_init(&firstpass_info, nullptr, 0);
104*77c1e3ccSAndroid Build Coastguard Worker   int frame_cnt = 0;
105*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_buf_size, FIRSTPASS_INFO_STATIC_BUF_SIZE);
106*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < FIRSTPASS_INFO_STATIC_BUF_SIZE; ++i) {
107*77c1e3ccSAndroid Build Coastguard Worker     FIRSTPASS_STATS stats;
108*77c1e3ccSAndroid Build Coastguard Worker     av1_zero(stats);
109*77c1e3ccSAndroid Build Coastguard Worker     stats.frame = frame_cnt;
110*77c1e3ccSAndroid Build Coastguard Worker     ++frame_cnt;
111*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret = av1_firstpass_info_push(&firstpass_info, &stats);
112*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_OK);
113*77c1e3ccSAndroid Build Coastguard Worker   }
114*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.cur_index, firstpass_info.start_index);
115*77c1e3ccSAndroid Build Coastguard Worker   {
116*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret = av1_firstpass_info_pop(&firstpass_info);
117*77c1e3ccSAndroid Build Coastguard Worker     // We cannot pop when cur_index == start_index
118*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_ERROR);
119*77c1e3ccSAndroid Build Coastguard Worker   }
120*77c1e3ccSAndroid Build Coastguard Worker   int ref_frame_cnt = 0;
121*77c1e3ccSAndroid Build Coastguard Worker   const int move_count = FIRSTPASS_INFO_STATIC_BUF_SIZE * 2 / 3;
122*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < move_count; ++i) {
123*77c1e3ccSAndroid Build Coastguard Worker     const FIRSTPASS_STATS *this_stats =
124*77c1e3ccSAndroid Build Coastguard Worker         av1_firstpass_info_peek(&firstpass_info, 0);
125*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(this_stats->frame, ref_frame_cnt);
126*77c1e3ccSAndroid Build Coastguard Worker     ++ref_frame_cnt;
127*77c1e3ccSAndroid Build Coastguard Worker     av1_firstpass_info_move_cur_index(&firstpass_info);
128*77c1e3ccSAndroid Build Coastguard Worker   }
129*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.future_stats_count,
130*77c1e3ccSAndroid Build Coastguard Worker             FIRSTPASS_INFO_STATIC_BUF_SIZE - move_count);
131*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.past_stats_count, move_count);
132*77c1e3ccSAndroid Build Coastguard Worker   EXPECT_EQ(firstpass_info.stats_count, FIRSTPASS_INFO_STATIC_BUF_SIZE);
133*77c1e3ccSAndroid Build Coastguard Worker 
134*77c1e3ccSAndroid Build Coastguard Worker   const int test_count = FIRSTPASS_INFO_STATIC_BUF_SIZE / 2;
135*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < test_count; ++i) {
136*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret = av1_firstpass_info_pop(&firstpass_info);
137*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_OK);
138*77c1e3ccSAndroid Build Coastguard Worker   }
139*77c1e3ccSAndroid Build Coastguard Worker 
140*77c1e3ccSAndroid Build Coastguard Worker   // Pop #test_count stats
141*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < test_count; ++i) {
142*77c1e3ccSAndroid Build Coastguard Worker     FIRSTPASS_STATS stats;
143*77c1e3ccSAndroid Build Coastguard Worker     av1_zero(stats);
144*77c1e3ccSAndroid Build Coastguard Worker     stats.frame = frame_cnt;
145*77c1e3ccSAndroid Build Coastguard Worker     ++frame_cnt;
146*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret = av1_firstpass_info_push(&firstpass_info, &stats);
147*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_OK);
148*77c1e3ccSAndroid Build Coastguard Worker   }
149*77c1e3ccSAndroid Build Coastguard Worker 
150*77c1e3ccSAndroid Build Coastguard Worker   // peek and move #test_count stats
151*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < test_count; ++i) {
152*77c1e3ccSAndroid Build Coastguard Worker     const FIRSTPASS_STATS *this_stats =
153*77c1e3ccSAndroid Build Coastguard Worker         av1_firstpass_info_peek(&firstpass_info, 0);
154*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(this_stats->frame, ref_frame_cnt);
155*77c1e3ccSAndroid Build Coastguard Worker     ++ref_frame_cnt;
156*77c1e3ccSAndroid Build Coastguard Worker     av1_firstpass_info_move_cur_index(&firstpass_info);
157*77c1e3ccSAndroid Build Coastguard Worker   }
158*77c1e3ccSAndroid Build Coastguard Worker 
159*77c1e3ccSAndroid Build Coastguard Worker   // pop #test_count stats
160*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < test_count; ++i) {
161*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_err_t ret = av1_firstpass_info_pop(&firstpass_info);
162*77c1e3ccSAndroid Build Coastguard Worker     EXPECT_EQ(ret, AOM_CODEC_OK);
163*77c1e3ccSAndroid Build Coastguard Worker   }
164*77c1e3ccSAndroid Build Coastguard Worker }
165*77c1e3ccSAndroid Build Coastguard Worker 
166*77c1e3ccSAndroid Build Coastguard Worker }  // namespace
167