| /* |
| * 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 |