blob: 4d8a7c9aecee40e543db437011dad36993e4fb71 [file] [log] [blame]
// 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