blob: f7376ace0a1a2b4dda7fdaac47fa0edcde1721fa [file] [log] [blame]
/*
* Copyright (c) 2020, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 2 Clause License and
* the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
* was not distributed with this source code in the LICENSE file, you can
* obtain it at www.aomedia.org/license/software. If the Alliance for Open
* Media Patent License 1.0 was not distributed with this source code in the
* PATENTS file, you can obtain it at www.aomedia.org/license/patent.
*/
#include <stdbool.h>
#include "common/stream_iter.h"
#include "third_party/googletest/src/googletest/include/gtest/gtest.h"
namespace {
// Dummy class that increments the width field in the image, which is used
// as a placeholder for the frame number. Stops iterating after N frames.
int dummy_reader(StreamIter *iter, aom_image_t *raw) {
if (iter->current >= iter->n) {
return 0;
}
++iter->current;
raw->w = iter->current;
return 1;
}
void dummy_stream_iter_init(StreamIter *iter, int total) {
iter->current = 0;
iter->n = total;
iter->reader = dummy_reader;
}
class StreamIterTest : public ::testing::Test {};
TEST_F(StreamIterTest, Skip0) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter skip;
skip_stream_iter_init(&skip, &input, 0);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&skip, &img));
EXPECT_EQ(1U, img.w);
EXPECT_TRUE(read_stream_iter(&skip, &img));
EXPECT_EQ(2U, img.w);
EXPECT_TRUE(read_stream_iter(&skip, &img));
EXPECT_EQ(3U, img.w);
EXPECT_FALSE(read_stream_iter(&skip, &img));
}
TEST_F(StreamIterTest, Skip1) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter skip;
skip_stream_iter_init(&skip, &input, 1);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&skip, &img));
EXPECT_EQ(2U, img.w);
EXPECT_TRUE(read_stream_iter(&skip, &img));
EXPECT_EQ(3U, img.w);
EXPECT_FALSE(read_stream_iter(&skip, &img));
}
TEST_F(StreamIterTest, Skip2) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter skip;
skip_stream_iter_init(&skip, &input, 2);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&skip, &img));
EXPECT_EQ(3U, img.w);
EXPECT_FALSE(read_stream_iter(&skip, &img));
}
TEST_F(StreamIterTest, Skip3) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter skip;
skip_stream_iter_init(&skip, &input, 3);
aom_image_t img;
EXPECT_FALSE(read_stream_iter(&skip, &img));
}
TEST_F(StreamIterTest, Skip4) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter skip;
skip_stream_iter_init(&skip, &input, 4);
aom_image_t img;
EXPECT_FALSE(read_stream_iter(&skip, &img));
}
// limit=0 is a special case meaning "no limit."
TEST_F(StreamIterTest, Limit0) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter limit;
limit_stream_iter_init(&limit, &input, 0);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(1U, img.w);
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(2U, img.w);
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(3U, img.w);
EXPECT_FALSE(read_stream_iter(&limit, &img));
}
TEST_F(StreamIterTest, Limit1) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter limit;
limit_stream_iter_init(&limit, &input, 1);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(1U, img.w);
EXPECT_FALSE(read_stream_iter(&limit, &img));
}
TEST_F(StreamIterTest, Limit2) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter limit;
limit_stream_iter_init(&limit, &input, 2);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(1U, img.w);
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(2U, img.w);
EXPECT_FALSE(read_stream_iter(&limit, &img));
}
TEST_F(StreamIterTest, Limit3) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter limit;
limit_stream_iter_init(&limit, &input, 3);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(1U, img.w);
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(2U, img.w);
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(3U, img.w);
EXPECT_FALSE(read_stream_iter(&limit, &img));
}
TEST_F(StreamIterTest, Limit4) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter limit;
limit_stream_iter_init(&limit, &input, 4);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(1U, img.w);
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(2U, img.w);
EXPECT_TRUE(read_stream_iter(&limit, &img));
EXPECT_EQ(3U, img.w);
EXPECT_FALSE(read_stream_iter(&limit, &img));
}
TEST_F(StreamIterTest, Step1) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter step;
step_stream_iter_init(&step, &input, 1);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(1U, img.w);
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(2U, img.w);
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(3U, img.w);
EXPECT_FALSE(read_stream_iter(&step, &img));
}
TEST_F(StreamIterTest, Step2) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter step;
step_stream_iter_init(&step, &input, 2);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(1U, img.w);
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(3U, img.w);
EXPECT_FALSE(read_stream_iter(&step, &img));
}
TEST_F(StreamIterTest, Step3) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter step;
step_stream_iter_init(&step, &input, 3);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(1U, img.w);
EXPECT_FALSE(read_stream_iter(&step, &img));
}
TEST_F(StreamIterTest, Step4) {
StreamIter input;
dummy_stream_iter_init(&input, 3);
StreamIter step;
step_stream_iter_init(&step, &input, 4);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(1U, img.w);
EXPECT_FALSE(read_stream_iter(&step, &img));
}
// Test when the step size is an even divisor of the number of frames.
TEST_F(StreamIterTest, Step5) {
StreamIter input;
dummy_stream_iter_init(&input, 10);
StreamIter step;
step_stream_iter_init(&step, &input, 5);
aom_image_t img;
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(1U, img.w);
EXPECT_TRUE(read_stream_iter(&step, &img));
EXPECT_EQ(6U, img.w);
EXPECT_FALSE(read_stream_iter(&step, &img));
}
} // namespace