1*09537850SAkhilesh Sanikop // Copyright 2021 The libgav1 Authors
2*09537850SAkhilesh Sanikop //
3*09537850SAkhilesh Sanikop // Licensed under the Apache License, Version 2.0 (the "License");
4*09537850SAkhilesh Sanikop // you may not use this file except in compliance with the License.
5*09537850SAkhilesh Sanikop // You may obtain a copy of the License at
6*09537850SAkhilesh Sanikop //
7*09537850SAkhilesh Sanikop // http://www.apache.org/licenses/LICENSE-2.0
8*09537850SAkhilesh Sanikop //
9*09537850SAkhilesh Sanikop // Unless required by applicable law or agreed to in writing, software
10*09537850SAkhilesh Sanikop // distributed under the License is distributed on an "AS IS" BASIS,
11*09537850SAkhilesh Sanikop // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*09537850SAkhilesh Sanikop // See the License for the specific language governing permissions and
13*09537850SAkhilesh Sanikop // limitations under the License.
14*09537850SAkhilesh Sanikop
15*09537850SAkhilesh Sanikop #include "src/utils/segmentation_map.h"
16*09537850SAkhilesh Sanikop
17*09537850SAkhilesh Sanikop #include <cstdint>
18*09537850SAkhilesh Sanikop
19*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
20*09537850SAkhilesh Sanikop
21*09537850SAkhilesh Sanikop namespace libgav1 {
22*09537850SAkhilesh Sanikop namespace {
23*09537850SAkhilesh Sanikop
TEST(SegmentationMapTest,Clear)24*09537850SAkhilesh Sanikop TEST(SegmentationMapTest, Clear) {
25*09537850SAkhilesh Sanikop constexpr int32_t kRows4x4 = 60;
26*09537850SAkhilesh Sanikop constexpr int32_t kColumns4x4 = 80;
27*09537850SAkhilesh Sanikop SegmentationMap segmentation_map;
28*09537850SAkhilesh Sanikop ASSERT_TRUE(segmentation_map.Allocate(kRows4x4, kColumns4x4));
29*09537850SAkhilesh Sanikop
30*09537850SAkhilesh Sanikop segmentation_map.Clear();
31*09537850SAkhilesh Sanikop for (int row4x4 = 0; row4x4 < kRows4x4; ++row4x4) {
32*09537850SAkhilesh Sanikop for (int column4x4 = 0; column4x4 < kColumns4x4; ++column4x4) {
33*09537850SAkhilesh Sanikop EXPECT_EQ(segmentation_map.segment_id(row4x4, column4x4), 0);
34*09537850SAkhilesh Sanikop }
35*09537850SAkhilesh Sanikop }
36*09537850SAkhilesh Sanikop }
37*09537850SAkhilesh Sanikop
TEST(SegmentationMapTest,FillBlock)38*09537850SAkhilesh Sanikop TEST(SegmentationMapTest, FillBlock) {
39*09537850SAkhilesh Sanikop constexpr int32_t kRows4x4 = 60;
40*09537850SAkhilesh Sanikop constexpr int32_t kColumns4x4 = 80;
41*09537850SAkhilesh Sanikop SegmentationMap segmentation_map;
42*09537850SAkhilesh Sanikop ASSERT_TRUE(segmentation_map.Allocate(kRows4x4, kColumns4x4));
43*09537850SAkhilesh Sanikop
44*09537850SAkhilesh Sanikop // Fill the whole image with 2.
45*09537850SAkhilesh Sanikop segmentation_map.FillBlock(0, 0, kColumns4x4, kRows4x4, 2);
46*09537850SAkhilesh Sanikop // Fill a block with 1.
47*09537850SAkhilesh Sanikop constexpr int kBlockWidth4x4 = 10;
48*09537850SAkhilesh Sanikop constexpr int kBlockHeight4x4 = 20;
49*09537850SAkhilesh Sanikop segmentation_map.FillBlock(4, 6, kBlockWidth4x4, kBlockHeight4x4, 1);
50*09537850SAkhilesh Sanikop for (int row4x4 = 0; row4x4 < kRows4x4; ++row4x4) {
51*09537850SAkhilesh Sanikop for (int column4x4 = 0; column4x4 < kColumns4x4; ++column4x4) {
52*09537850SAkhilesh Sanikop if (4 <= row4x4 && row4x4 < 4 + kBlockHeight4x4 && 6 <= column4x4 &&
53*09537850SAkhilesh Sanikop column4x4 < 6 + kBlockWidth4x4) {
54*09537850SAkhilesh Sanikop // Inside the block.
55*09537850SAkhilesh Sanikop EXPECT_EQ(segmentation_map.segment_id(row4x4, column4x4), 1);
56*09537850SAkhilesh Sanikop } else {
57*09537850SAkhilesh Sanikop // Outside the block.
58*09537850SAkhilesh Sanikop EXPECT_EQ(segmentation_map.segment_id(row4x4, column4x4), 2);
59*09537850SAkhilesh Sanikop }
60*09537850SAkhilesh Sanikop }
61*09537850SAkhilesh Sanikop }
62*09537850SAkhilesh Sanikop }
63*09537850SAkhilesh Sanikop
TEST(SegmentationMapTest,CopyFrom)64*09537850SAkhilesh Sanikop TEST(SegmentationMapTest, CopyFrom) {
65*09537850SAkhilesh Sanikop constexpr int32_t kRows4x4 = 60;
66*09537850SAkhilesh Sanikop constexpr int32_t kColumns4x4 = 80;
67*09537850SAkhilesh Sanikop SegmentationMap segmentation_map;
68*09537850SAkhilesh Sanikop ASSERT_TRUE(segmentation_map.Allocate(kRows4x4, kColumns4x4));
69*09537850SAkhilesh Sanikop
70*09537850SAkhilesh Sanikop // Split the segmentation map into four blocks of equal size.
71*09537850SAkhilesh Sanikop constexpr int kBlockWidth4x4 = 40;
72*09537850SAkhilesh Sanikop constexpr int kBlockHeight4x4 = 30;
73*09537850SAkhilesh Sanikop segmentation_map.FillBlock(0, 0, kBlockWidth4x4, kBlockHeight4x4, 1);
74*09537850SAkhilesh Sanikop segmentation_map.FillBlock(0, kBlockWidth4x4, kBlockWidth4x4, kBlockHeight4x4,
75*09537850SAkhilesh Sanikop 2);
76*09537850SAkhilesh Sanikop segmentation_map.FillBlock(kBlockHeight4x4, 0, kBlockWidth4x4,
77*09537850SAkhilesh Sanikop kBlockHeight4x4, 3);
78*09537850SAkhilesh Sanikop segmentation_map.FillBlock(kBlockHeight4x4, kBlockWidth4x4, kBlockWidth4x4,
79*09537850SAkhilesh Sanikop kBlockHeight4x4, 4);
80*09537850SAkhilesh Sanikop
81*09537850SAkhilesh Sanikop SegmentationMap segmentation_map2;
82*09537850SAkhilesh Sanikop ASSERT_TRUE(segmentation_map2.Allocate(kRows4x4, kColumns4x4));
83*09537850SAkhilesh Sanikop segmentation_map2.CopyFrom(segmentation_map);
84*09537850SAkhilesh Sanikop
85*09537850SAkhilesh Sanikop for (int row4x4 = 0; row4x4 < kBlockHeight4x4; ++row4x4) {
86*09537850SAkhilesh Sanikop for (int column4x4 = 0; column4x4 < kBlockWidth4x4; ++column4x4) {
87*09537850SAkhilesh Sanikop EXPECT_EQ(segmentation_map.segment_id(row4x4, column4x4), 1);
88*09537850SAkhilesh Sanikop EXPECT_EQ(segmentation_map2.segment_id(row4x4, column4x4), 1);
89*09537850SAkhilesh Sanikop }
90*09537850SAkhilesh Sanikop }
91*09537850SAkhilesh Sanikop for (int row4x4 = 0; row4x4 < kBlockHeight4x4; ++row4x4) {
92*09537850SAkhilesh Sanikop for (int column4x4 = 0; column4x4 < kBlockWidth4x4; ++column4x4) {
93*09537850SAkhilesh Sanikop EXPECT_EQ(segmentation_map.segment_id(row4x4, kBlockWidth4x4 + column4x4),
94*09537850SAkhilesh Sanikop 2);
95*09537850SAkhilesh Sanikop EXPECT_EQ(
96*09537850SAkhilesh Sanikop segmentation_map2.segment_id(row4x4, kBlockWidth4x4 + column4x4), 2);
97*09537850SAkhilesh Sanikop }
98*09537850SAkhilesh Sanikop }
99*09537850SAkhilesh Sanikop for (int row4x4 = 0; row4x4 < kBlockHeight4x4; ++row4x4) {
100*09537850SAkhilesh Sanikop for (int column4x4 = 0; column4x4 < kBlockWidth4x4; ++column4x4) {
101*09537850SAkhilesh Sanikop EXPECT_EQ(
102*09537850SAkhilesh Sanikop segmentation_map.segment_id(kBlockHeight4x4 + row4x4, column4x4), 3);
103*09537850SAkhilesh Sanikop EXPECT_EQ(
104*09537850SAkhilesh Sanikop segmentation_map2.segment_id(kBlockHeight4x4 + row4x4, column4x4), 3);
105*09537850SAkhilesh Sanikop }
106*09537850SAkhilesh Sanikop }
107*09537850SAkhilesh Sanikop for (int row4x4 = 0; row4x4 < kBlockHeight4x4; ++row4x4) {
108*09537850SAkhilesh Sanikop for (int column4x4 = 0; column4x4 < kBlockWidth4x4; ++column4x4) {
109*09537850SAkhilesh Sanikop EXPECT_EQ(segmentation_map.segment_id(kBlockHeight4x4 + row4x4,
110*09537850SAkhilesh Sanikop kBlockWidth4x4 + column4x4),
111*09537850SAkhilesh Sanikop 4);
112*09537850SAkhilesh Sanikop EXPECT_EQ(segmentation_map2.segment_id(kBlockHeight4x4 + row4x4,
113*09537850SAkhilesh Sanikop kBlockWidth4x4 + column4x4),
114*09537850SAkhilesh Sanikop 4);
115*09537850SAkhilesh Sanikop }
116*09537850SAkhilesh Sanikop }
117*09537850SAkhilesh Sanikop }
118*09537850SAkhilesh Sanikop
119*09537850SAkhilesh Sanikop } // namespace
120*09537850SAkhilesh Sanikop } // namespace libgav1
121