aboutsummaryrefslogtreecommitdiff
path: root/src/utils/segmentation_map_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/segmentation_map_test.cc')
-rw-r--r--src/utils/segmentation_map_test.cc120
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