xref: /aosp_15_r20/external/libgav1/src/residual_buffer_pool_test.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
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/residual_buffer_pool.h"
16*09537850SAkhilesh Sanikop 
17*09537850SAkhilesh Sanikop #include <cstdint>
18*09537850SAkhilesh Sanikop #include <memory>
19*09537850SAkhilesh Sanikop #include <utility>
20*09537850SAkhilesh Sanikop 
21*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
22*09537850SAkhilesh Sanikop #include "src/utils/constants.h"
23*09537850SAkhilesh Sanikop #include "src/utils/queue.h"
24*09537850SAkhilesh Sanikop #include "src/utils/types.h"
25*09537850SAkhilesh Sanikop 
26*09537850SAkhilesh Sanikop namespace libgav1 {
27*09537850SAkhilesh Sanikop namespace {
28*09537850SAkhilesh Sanikop 
TEST(ResidualBufferTest,TestUsage)29*09537850SAkhilesh Sanikop TEST(ResidualBufferTest, TestUsage) {
30*09537850SAkhilesh Sanikop   ResidualBufferPool pool(true, 1, 1, sizeof(int16_t));
31*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 0);
32*09537850SAkhilesh Sanikop   // Get one buffer.
33*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer1 = pool.Get();
34*09537850SAkhilesh Sanikop   uint8_t* const buffer1_ptr = buffer1->buffer();
35*09537850SAkhilesh Sanikop   ASSERT_NE(buffer1_ptr, nullptr);
36*09537850SAkhilesh Sanikop   // Get another buffer (while holding on to the first one).
37*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer2 = pool.Get();
38*09537850SAkhilesh Sanikop   uint8_t* const buffer2_ptr = buffer2->buffer();
39*09537850SAkhilesh Sanikop   ASSERT_NE(buffer2_ptr, nullptr);
40*09537850SAkhilesh Sanikop   EXPECT_NE(buffer1_ptr, buffer2_ptr);
41*09537850SAkhilesh Sanikop   // Return the second buffer.
42*09537850SAkhilesh Sanikop   pool.Release(std::move(buffer2));
43*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 1);
44*09537850SAkhilesh Sanikop   // Get another buffer (this one should be the same as the buffer2).
45*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer3 = pool.Get();
46*09537850SAkhilesh Sanikop   uint8_t* const buffer3_ptr = buffer3->buffer();
47*09537850SAkhilesh Sanikop   ASSERT_NE(buffer3_ptr, nullptr);
48*09537850SAkhilesh Sanikop   EXPECT_EQ(buffer3_ptr, buffer2_ptr);
49*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 0);
50*09537850SAkhilesh Sanikop   // Get another buffer (this one will be a new buffer).
51*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer4 = pool.Get();
52*09537850SAkhilesh Sanikop   uint8_t* const buffer4_ptr = buffer4->buffer();
53*09537850SAkhilesh Sanikop   ASSERT_NE(buffer4_ptr, nullptr);
54*09537850SAkhilesh Sanikop   EXPECT_NE(buffer4_ptr, buffer1_ptr);
55*09537850SAkhilesh Sanikop   EXPECT_NE(buffer4_ptr, buffer3_ptr);
56*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 0);
57*09537850SAkhilesh Sanikop   // Return all the buffers.
58*09537850SAkhilesh Sanikop   pool.Release(std::move(buffer1));
59*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 1);
60*09537850SAkhilesh Sanikop   pool.Release(std::move(buffer3));
61*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 2);
62*09537850SAkhilesh Sanikop   pool.Release(std::move(buffer4));
63*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 3);
64*09537850SAkhilesh Sanikop   // Reset the buffer with same parameters.
65*09537850SAkhilesh Sanikop   pool.Reset(true, 1, 1, sizeof(int16_t));
66*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 3);
67*09537850SAkhilesh Sanikop   // Reset the buffer size with different parameters.
68*09537850SAkhilesh Sanikop   pool.Reset(true, 0, 1, sizeof(int32_t));
69*09537850SAkhilesh Sanikop   // The existing buffers should now have been invalidated.
70*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 0);
71*09537850SAkhilesh Sanikop   // Get and return a buffer.
72*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer5 = pool.Get();
73*09537850SAkhilesh Sanikop   uint8_t* const buffer5_ptr = buffer5->buffer();
74*09537850SAkhilesh Sanikop   ASSERT_NE(buffer5_ptr, nullptr);
75*09537850SAkhilesh Sanikop   pool.Release(std::move(buffer5));
76*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 1);
77*09537850SAkhilesh Sanikop   // Reset the buffer with different value for use128x128_superblock.
78*09537850SAkhilesh Sanikop   pool.Reset(false, 0, 1, sizeof(int32_t));
79*09537850SAkhilesh Sanikop   // The existing buffers should now have been invalidated.
80*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 0);
81*09537850SAkhilesh Sanikop }
82*09537850SAkhilesh Sanikop 
TEST(ResidualBufferTest,TestQueue)83*09537850SAkhilesh Sanikop TEST(ResidualBufferTest, TestQueue) {
84*09537850SAkhilesh Sanikop   ResidualBufferPool pool(true, 1, 1, sizeof(int16_t));
85*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 0);
86*09537850SAkhilesh Sanikop   // Get one buffer.
87*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer1 = pool.Get();
88*09537850SAkhilesh Sanikop   uint8_t* const buffer1_ptr = buffer1->buffer();
89*09537850SAkhilesh Sanikop   ASSERT_NE(buffer1_ptr, nullptr);
90*09537850SAkhilesh Sanikop   auto* queue1 = buffer1->transform_parameters();
91*09537850SAkhilesh Sanikop   queue1->Push(TransformParameters(kTransformTypeAdstAdst, 10));
92*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Size(), 1);
93*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Front().type, kTransformTypeAdstAdst);
94*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Front().non_zero_coeff_count, 10);
95*09537850SAkhilesh Sanikop   queue1->Push(TransformParameters(kTransformTypeDctDct, 20));
96*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Size(), 2);
97*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Front().type, kTransformTypeAdstAdst);
98*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Front().non_zero_coeff_count, 10);
99*09537850SAkhilesh Sanikop   queue1->Pop();
100*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Size(), 1);
101*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Front().type, kTransformTypeDctDct);
102*09537850SAkhilesh Sanikop   EXPECT_EQ(queue1->Front().non_zero_coeff_count, 20);
103*09537850SAkhilesh Sanikop   // Return the buffer.
104*09537850SAkhilesh Sanikop   pool.Release(std::move(buffer1));
105*09537850SAkhilesh Sanikop   EXPECT_EQ(pool.Size(), 1);
106*09537850SAkhilesh Sanikop   // Get another buffer (should be the same as buffer1).
107*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer2 = pool.Get();
108*09537850SAkhilesh Sanikop   uint8_t* const buffer2_ptr = buffer2->buffer();
109*09537850SAkhilesh Sanikop   ASSERT_NE(buffer2_ptr, nullptr);
110*09537850SAkhilesh Sanikop   EXPECT_EQ(buffer1_ptr, buffer2_ptr);
111*09537850SAkhilesh Sanikop   // Releasing the buffer should've cleared the queue.
112*09537850SAkhilesh Sanikop   EXPECT_EQ(buffer2->transform_parameters()->Size(), 0);
113*09537850SAkhilesh Sanikop }
114*09537850SAkhilesh Sanikop 
TEST(ResidualBufferTest,TestStackPushPop)115*09537850SAkhilesh Sanikop TEST(ResidualBufferTest, TestStackPushPop) {
116*09537850SAkhilesh Sanikop   ResidualBufferStack buffers;
117*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 0);
118*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Pop(), nullptr);
119*09537850SAkhilesh Sanikop 
120*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer0 = ResidualBuffer::Create(128, 128);
121*09537850SAkhilesh Sanikop   ResidualBuffer* const buffer0_ptr = buffer0.get();
122*09537850SAkhilesh Sanikop   EXPECT_NE(buffer0_ptr, nullptr);
123*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer1 = ResidualBuffer::Create(128, 128);
124*09537850SAkhilesh Sanikop   ResidualBuffer* const buffer1_ptr = buffer1.get();
125*09537850SAkhilesh Sanikop   EXPECT_NE(buffer1_ptr, nullptr);
126*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer2 = ResidualBuffer::Create(128, 128);
127*09537850SAkhilesh Sanikop   ResidualBuffer* const buffer2_ptr = buffer2.get();
128*09537850SAkhilesh Sanikop   EXPECT_NE(buffer2_ptr, nullptr);
129*09537850SAkhilesh Sanikop 
130*09537850SAkhilesh Sanikop   // Push two buffers onto the stack.
131*09537850SAkhilesh Sanikop   buffers.Push(std::move(buffer0));
132*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 1);
133*09537850SAkhilesh Sanikop   buffers.Push(std::move(buffer1));
134*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 2);
135*09537850SAkhilesh Sanikop 
136*09537850SAkhilesh Sanikop   // Pop one buffer off the stack.
137*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> top = buffers.Pop();
138*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 1);
139*09537850SAkhilesh Sanikop   EXPECT_EQ(top.get(), buffer1_ptr);
140*09537850SAkhilesh Sanikop 
141*09537850SAkhilesh Sanikop   // Push one buffer onto the stack.
142*09537850SAkhilesh Sanikop   buffers.Push(std::move(buffer2));
143*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 2);
144*09537850SAkhilesh Sanikop 
145*09537850SAkhilesh Sanikop   // Pop two buffers off the stack
146*09537850SAkhilesh Sanikop   top = buffers.Pop();
147*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 1);
148*09537850SAkhilesh Sanikop   EXPECT_EQ(top.get(), buffer2_ptr);
149*09537850SAkhilesh Sanikop   top = buffers.Pop();
150*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 0);
151*09537850SAkhilesh Sanikop   EXPECT_EQ(top.get(), buffer0_ptr);
152*09537850SAkhilesh Sanikop 
153*09537850SAkhilesh Sanikop   // Try to pop a buffer off an empty stack.
154*09537850SAkhilesh Sanikop   top = buffers.Pop();
155*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 0);
156*09537850SAkhilesh Sanikop   EXPECT_EQ(top, nullptr);
157*09537850SAkhilesh Sanikop }
158*09537850SAkhilesh Sanikop 
TEST(ResidualBufferTest,TestStackSwap)159*09537850SAkhilesh Sanikop TEST(ResidualBufferTest, TestStackSwap) {
160*09537850SAkhilesh Sanikop   ResidualBufferStack buffers;
161*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 0);
162*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Pop(), nullptr);
163*09537850SAkhilesh Sanikop 
164*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer0 = ResidualBuffer::Create(128, 128);
165*09537850SAkhilesh Sanikop   ResidualBuffer* const buffer0_ptr = buffer0.get();
166*09537850SAkhilesh Sanikop   EXPECT_NE(buffer0_ptr, nullptr);
167*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer1 = ResidualBuffer::Create(128, 128);
168*09537850SAkhilesh Sanikop   ResidualBuffer* const buffer1_ptr = buffer1.get();
169*09537850SAkhilesh Sanikop   EXPECT_NE(buffer1_ptr, nullptr);
170*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> buffer2 = ResidualBuffer::Create(128, 128);
171*09537850SAkhilesh Sanikop   ResidualBuffer* const buffer2_ptr = buffer2.get();
172*09537850SAkhilesh Sanikop   EXPECT_NE(buffer2_ptr, nullptr);
173*09537850SAkhilesh Sanikop 
174*09537850SAkhilesh Sanikop   // Push three buffers onto the stack.
175*09537850SAkhilesh Sanikop   buffers.Push(std::move(buffer0));
176*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 1);
177*09537850SAkhilesh Sanikop   buffers.Push(std::move(buffer1));
178*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 2);
179*09537850SAkhilesh Sanikop   buffers.Push(std::move(buffer2));
180*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 3);
181*09537850SAkhilesh Sanikop 
182*09537850SAkhilesh Sanikop   // Swap the contents of the stacks.
183*09537850SAkhilesh Sanikop   ResidualBufferStack swapped;
184*09537850SAkhilesh Sanikop   swapped.Swap(&buffers);
185*09537850SAkhilesh Sanikop   EXPECT_EQ(buffers.Size(), 0);
186*09537850SAkhilesh Sanikop   EXPECT_EQ(swapped.Size(), 3);
187*09537850SAkhilesh Sanikop 
188*09537850SAkhilesh Sanikop   // Pop three buffers off the swapped stack.
189*09537850SAkhilesh Sanikop   std::unique_ptr<ResidualBuffer> top = swapped.Pop();
190*09537850SAkhilesh Sanikop   EXPECT_EQ(swapped.Size(), 2);
191*09537850SAkhilesh Sanikop   EXPECT_EQ(top.get(), buffer2_ptr);
192*09537850SAkhilesh Sanikop   top = swapped.Pop();
193*09537850SAkhilesh Sanikop   EXPECT_EQ(swapped.Size(), 1);
194*09537850SAkhilesh Sanikop   EXPECT_EQ(top.get(), buffer1_ptr);
195*09537850SAkhilesh Sanikop   top = swapped.Pop();
196*09537850SAkhilesh Sanikop   EXPECT_EQ(swapped.Size(), 0);
197*09537850SAkhilesh Sanikop   EXPECT_EQ(top.get(), buffer0_ptr);
198*09537850SAkhilesh Sanikop }
199*09537850SAkhilesh Sanikop 
200*09537850SAkhilesh Sanikop }  // namespace
201*09537850SAkhilesh Sanikop }  // namespace libgav1
202