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