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