diff options
Diffstat (limited to 'src/utils/segmentation_map_test.cc')
-rw-r--r-- | src/utils/segmentation_map_test.cc | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/utils/segmentation_map_test.cc b/src/utils/segmentation_map_test.cc new file mode 100644 index 0000000..4d8a7c9 --- /dev/null +++ b/src/utils/segmentation_map_test.cc @@ -0,0 +1,120 @@ +// Copyright 2021 The libgav1 Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/utils/segmentation_map.h" + +#include <cstdint> + +#include "gtest/gtest.h" + +namespace libgav1 { +namespace { + +TEST(SegmentationMapTest, Clear) { + constexpr int32_t kRows4x4 = 60; + constexpr int32_t kColumns4x4 = 80; + SegmentationMap segmentation_map; + ASSERT_TRUE(segmentation_map.Allocate(kRows4x4, kColumns4x4)); + + segmentation_map.Clear(); + for (int row4x4 = 0; row4x4 < kRows4x4; ++row4x4) { + for (int column4x4 = 0; column4x4 < kColumns4x4; ++column4x4) { + EXPECT_EQ(segmentation_map.segment_id(row4x4, column4x4), 0); + } + } +} + +TEST(SegmentationMapTest, FillBlock) { + constexpr int32_t kRows4x4 = 60; + constexpr int32_t kColumns4x4 = 80; + SegmentationMap segmentation_map; + ASSERT_TRUE(segmentation_map.Allocate(kRows4x4, kColumns4x4)); + + // Fill the whole image with 2. + segmentation_map.FillBlock(0, 0, kColumns4x4, kRows4x4, 2); + // Fill a block with 1. + constexpr int kBlockWidth4x4 = 10; + constexpr int kBlockHeight4x4 = 20; + segmentation_map.FillBlock(4, 6, kBlockWidth4x4, kBlockHeight4x4, 1); + for (int row4x4 = 0; row4x4 < kRows4x4; ++row4x4) { + for (int column4x4 = 0; column4x4 < kColumns4x4; ++column4x4) { + if (4 <= row4x4 && row4x4 < 4 + kBlockHeight4x4 && 6 <= column4x4 && + column4x4 < 6 + kBlockWidth4x4) { + // Inside the block. + EXPECT_EQ(segmentation_map.segment_id(row4x4, column4x4), 1); + } else { + // Outside the block. + EXPECT_EQ(segmentation_map.segment_id(row4x4, column4x4), 2); + } + } + } +} + +TEST(SegmentationMapTest, CopyFrom) { + constexpr int32_t kRows4x4 = 60; + constexpr int32_t kColumns4x4 = 80; + SegmentationMap segmentation_map; + ASSERT_TRUE(segmentation_map.Allocate(kRows4x4, kColumns4x4)); + + // Split the segmentation map into four blocks of equal size. + constexpr int kBlockWidth4x4 = 40; + constexpr int kBlockHeight4x4 = 30; + segmentation_map.FillBlock(0, 0, kBlockWidth4x4, kBlockHeight4x4, 1); + segmentation_map.FillBlock(0, kBlockWidth4x4, kBlockWidth4x4, kBlockHeight4x4, + 2); + segmentation_map.FillBlock(kBlockHeight4x4, 0, kBlockWidth4x4, + kBlockHeight4x4, 3); + segmentation_map.FillBlock(kBlockHeight4x4, kBlockWidth4x4, kBlockWidth4x4, + kBlockHeight4x4, 4); + + SegmentationMap segmentation_map2; + ASSERT_TRUE(segmentation_map2.Allocate(kRows4x4, kColumns4x4)); + segmentation_map2.CopyFrom(segmentation_map); + + for (int row4x4 = 0; row4x4 < kBlockHeight4x4; ++row4x4) { + for (int column4x4 = 0; column4x4 < kBlockWidth4x4; ++column4x4) { + EXPECT_EQ(segmentation_map.segment_id(row4x4, column4x4), 1); + EXPECT_EQ(segmentation_map2.segment_id(row4x4, column4x4), 1); + } + } + for (int row4x4 = 0; row4x4 < kBlockHeight4x4; ++row4x4) { + for (int column4x4 = 0; column4x4 < kBlockWidth4x4; ++column4x4) { + EXPECT_EQ(segmentation_map.segment_id(row4x4, kBlockWidth4x4 + column4x4), + 2); + EXPECT_EQ( + segmentation_map2.segment_id(row4x4, kBlockWidth4x4 + column4x4), 2); + } + } + for (int row4x4 = 0; row4x4 < kBlockHeight4x4; ++row4x4) { + for (int column4x4 = 0; column4x4 < kBlockWidth4x4; ++column4x4) { + EXPECT_EQ( + segmentation_map.segment_id(kBlockHeight4x4 + row4x4, column4x4), 3); + EXPECT_EQ( + segmentation_map2.segment_id(kBlockHeight4x4 + row4x4, column4x4), 3); + } + } + for (int row4x4 = 0; row4x4 < kBlockHeight4x4; ++row4x4) { + for (int column4x4 = 0; column4x4 < kBlockWidth4x4; ++column4x4) { + EXPECT_EQ(segmentation_map.segment_id(kBlockHeight4x4 + row4x4, + kBlockWidth4x4 + column4x4), + 4); + EXPECT_EQ(segmentation_map2.segment_id(kBlockHeight4x4 + row4x4, + kBlockWidth4x4 + column4x4), + 4); + } + } +} + +} // namespace +} // namespace libgav1 |