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