xref: /aosp_15_r20/external/libvpx/test/buffer.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2016 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_TEST_BUFFER_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_TEST_BUFFER_H_
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include <stdio.h>
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include <limits>
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
19*fb1b10abSAndroid Build Coastguard Worker 
20*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker namespace libvpx_test {
25*fb1b10abSAndroid Build Coastguard Worker 
26*fb1b10abSAndroid Build Coastguard Worker template <typename T>
27*fb1b10abSAndroid Build Coastguard Worker class Buffer {
28*fb1b10abSAndroid Build Coastguard Worker  public:
Buffer(int width,int height,int top_padding,int left_padding,int right_padding,int bottom_padding)29*fb1b10abSAndroid Build Coastguard Worker   Buffer(int width, int height, int top_padding, int left_padding,
30*fb1b10abSAndroid Build Coastguard Worker          int right_padding, int bottom_padding)
31*fb1b10abSAndroid Build Coastguard Worker       : width_(width), height_(height), top_padding_(top_padding),
32*fb1b10abSAndroid Build Coastguard Worker         left_padding_(left_padding), right_padding_(right_padding),
33*fb1b10abSAndroid Build Coastguard Worker         bottom_padding_(bottom_padding), alignment_(0), padding_value_(0),
34*fb1b10abSAndroid Build Coastguard Worker         stride_(0), raw_size_(0), num_elements_(0), raw_buffer_(nullptr) {}
35*fb1b10abSAndroid Build Coastguard Worker 
Buffer(int width,int height,int top_padding,int left_padding,int right_padding,int bottom_padding,unsigned int alignment)36*fb1b10abSAndroid Build Coastguard Worker   Buffer(int width, int height, int top_padding, int left_padding,
37*fb1b10abSAndroid Build Coastguard Worker          int right_padding, int bottom_padding, unsigned int alignment)
38*fb1b10abSAndroid Build Coastguard Worker       : width_(width), height_(height), top_padding_(top_padding),
39*fb1b10abSAndroid Build Coastguard Worker         left_padding_(left_padding), right_padding_(right_padding),
40*fb1b10abSAndroid Build Coastguard Worker         bottom_padding_(bottom_padding), alignment_(alignment),
41*fb1b10abSAndroid Build Coastguard Worker         padding_value_(0), stride_(0), raw_size_(0), num_elements_(0),
42*fb1b10abSAndroid Build Coastguard Worker         raw_buffer_(nullptr) {}
43*fb1b10abSAndroid Build Coastguard Worker 
Buffer(int width,int height,int padding)44*fb1b10abSAndroid Build Coastguard Worker   Buffer(int width, int height, int padding)
45*fb1b10abSAndroid Build Coastguard Worker       : width_(width), height_(height), top_padding_(padding),
46*fb1b10abSAndroid Build Coastguard Worker         left_padding_(padding), right_padding_(padding),
47*fb1b10abSAndroid Build Coastguard Worker         bottom_padding_(padding), alignment_(0), padding_value_(0), stride_(0),
48*fb1b10abSAndroid Build Coastguard Worker         raw_size_(0), num_elements_(0), raw_buffer_(nullptr) {}
49*fb1b10abSAndroid Build Coastguard Worker 
Buffer(int width,int height,int padding,unsigned int alignment)50*fb1b10abSAndroid Build Coastguard Worker   Buffer(int width, int height, int padding, unsigned int alignment)
51*fb1b10abSAndroid Build Coastguard Worker       : width_(width), height_(height), top_padding_(padding),
52*fb1b10abSAndroid Build Coastguard Worker         left_padding_(padding), right_padding_(padding),
53*fb1b10abSAndroid Build Coastguard Worker         bottom_padding_(padding), alignment_(alignment), padding_value_(0),
54*fb1b10abSAndroid Build Coastguard Worker         stride_(0), raw_size_(0), num_elements_(0), raw_buffer_(nullptr) {}
55*fb1b10abSAndroid Build Coastguard Worker 
~Buffer()56*fb1b10abSAndroid Build Coastguard Worker   ~Buffer() {
57*fb1b10abSAndroid Build Coastguard Worker     if (alignment_) {
58*fb1b10abSAndroid Build Coastguard Worker       vpx_free(raw_buffer_);
59*fb1b10abSAndroid Build Coastguard Worker     } else {
60*fb1b10abSAndroid Build Coastguard Worker       delete[] raw_buffer_;
61*fb1b10abSAndroid Build Coastguard Worker     }
62*fb1b10abSAndroid Build Coastguard Worker   }
63*fb1b10abSAndroid Build Coastguard Worker 
64*fb1b10abSAndroid Build Coastguard Worker   T *TopLeftPixel() const;
65*fb1b10abSAndroid Build Coastguard Worker 
stride()66*fb1b10abSAndroid Build Coastguard Worker   int stride() const { return stride_; }
67*fb1b10abSAndroid Build Coastguard Worker 
68*fb1b10abSAndroid Build Coastguard Worker   // Set the buffer (excluding padding) to 'value'.
69*fb1b10abSAndroid Build Coastguard Worker   void Set(const T value);
70*fb1b10abSAndroid Build Coastguard Worker 
71*fb1b10abSAndroid Build Coastguard Worker   // Set the buffer (excluding padding) to the output of ACMRandom function
72*fb1b10abSAndroid Build Coastguard Worker   // 'rand_func'.
73*fb1b10abSAndroid Build Coastguard Worker   void Set(ACMRandom *rand_class, T (ACMRandom::*rand_func)());
74*fb1b10abSAndroid Build Coastguard Worker 
75*fb1b10abSAndroid Build Coastguard Worker   // Set the buffer (excluding padding) to the output of ACMRandom function
76*fb1b10abSAndroid Build Coastguard Worker   // 'RandRange' with range 'low' to 'high' which typically must be within
77*fb1b10abSAndroid Build Coastguard Worker   // testing::internal::Random::kMaxRange (1u << 31). However, because we want
78*fb1b10abSAndroid Build Coastguard Worker   // to allow negative low (and high) values, it is restricted to INT32_MAX
79*fb1b10abSAndroid Build Coastguard Worker   // here.
80*fb1b10abSAndroid Build Coastguard Worker   void Set(ACMRandom *rand_class, const T low, const T high);
81*fb1b10abSAndroid Build Coastguard Worker 
82*fb1b10abSAndroid Build Coastguard Worker   // Copy the contents of Buffer 'a' (excluding padding).
83*fb1b10abSAndroid Build Coastguard Worker   void CopyFrom(const Buffer<T> &a);
84*fb1b10abSAndroid Build Coastguard Worker 
85*fb1b10abSAndroid Build Coastguard Worker   void DumpBuffer() const;
86*fb1b10abSAndroid Build Coastguard Worker 
87*fb1b10abSAndroid Build Coastguard Worker   // Highlight the differences between two buffers if they are the same size.
88*fb1b10abSAndroid Build Coastguard Worker   void PrintDifference(const Buffer<T> &a) const;
89*fb1b10abSAndroid Build Coastguard Worker 
90*fb1b10abSAndroid Build Coastguard Worker   bool HasPadding() const;
91*fb1b10abSAndroid Build Coastguard Worker 
92*fb1b10abSAndroid Build Coastguard Worker   // Sets all the values in the buffer to 'padding_value'.
93*fb1b10abSAndroid Build Coastguard Worker   void SetPadding(const T padding_value);
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker   // Checks if all the values (excluding padding) are equal to 'value' if the
96*fb1b10abSAndroid Build Coastguard Worker   // Buffers are the same size.
97*fb1b10abSAndroid Build Coastguard Worker   bool CheckValues(const T value) const;
98*fb1b10abSAndroid Build Coastguard Worker 
99*fb1b10abSAndroid Build Coastguard Worker   // Check that padding matches the expected value or there is no padding.
100*fb1b10abSAndroid Build Coastguard Worker   bool CheckPadding() const;
101*fb1b10abSAndroid Build Coastguard Worker 
102*fb1b10abSAndroid Build Coastguard Worker   // Compare the non-padding portion of two buffers if they are the same size.
103*fb1b10abSAndroid Build Coastguard Worker   bool CheckValues(const Buffer<T> &a) const;
104*fb1b10abSAndroid Build Coastguard Worker 
Init()105*fb1b10abSAndroid Build Coastguard Worker   bool Init() {
106*fb1b10abSAndroid Build Coastguard Worker     if (raw_buffer_ != nullptr) return false;
107*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GT(width_, 0);
108*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GT(height_, 0);
109*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(top_padding_, 0);
110*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(left_padding_, 0);
111*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(right_padding_, 0);
112*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(bottom_padding_, 0);
113*fb1b10abSAndroid Build Coastguard Worker     stride_ = left_padding_ + width_ + right_padding_;
114*fb1b10abSAndroid Build Coastguard Worker     num_elements_ = stride_ * (top_padding_ + height_ + bottom_padding_);
115*fb1b10abSAndroid Build Coastguard Worker     raw_size_ = num_elements_ * sizeof(T);
116*fb1b10abSAndroid Build Coastguard Worker     if (alignment_) {
117*fb1b10abSAndroid Build Coastguard Worker       EXPECT_GE(alignment_, sizeof(T));
118*fb1b10abSAndroid Build Coastguard Worker       // Ensure alignment of the first value will be preserved.
119*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ((left_padding_ * sizeof(T)) % alignment_, 0u);
120*fb1b10abSAndroid Build Coastguard Worker       // Ensure alignment of the subsequent rows will be preserved when there is
121*fb1b10abSAndroid Build Coastguard Worker       // a stride.
122*fb1b10abSAndroid Build Coastguard Worker       if (stride_ != width_) {
123*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ((stride_ * sizeof(T)) % alignment_, 0u);
124*fb1b10abSAndroid Build Coastguard Worker       }
125*fb1b10abSAndroid Build Coastguard Worker       raw_buffer_ = reinterpret_cast<T *>(vpx_memalign(alignment_, raw_size_));
126*fb1b10abSAndroid Build Coastguard Worker     } else {
127*fb1b10abSAndroid Build Coastguard Worker       raw_buffer_ = new (std::nothrow) T[num_elements_];
128*fb1b10abSAndroid Build Coastguard Worker     }
129*fb1b10abSAndroid Build Coastguard Worker     EXPECT_NE(raw_buffer_, nullptr);
130*fb1b10abSAndroid Build Coastguard Worker     SetPadding(std::numeric_limits<T>::max());
131*fb1b10abSAndroid Build Coastguard Worker     return !::testing::Test::HasFailure();
132*fb1b10abSAndroid Build Coastguard Worker   }
133*fb1b10abSAndroid Build Coastguard Worker 
134*fb1b10abSAndroid Build Coastguard Worker  private:
135*fb1b10abSAndroid Build Coastguard Worker   bool BufferSizesMatch(const Buffer<T> &a) const;
136*fb1b10abSAndroid Build Coastguard Worker 
137*fb1b10abSAndroid Build Coastguard Worker   const int width_;
138*fb1b10abSAndroid Build Coastguard Worker   const int height_;
139*fb1b10abSAndroid Build Coastguard Worker   const int top_padding_;
140*fb1b10abSAndroid Build Coastguard Worker   const int left_padding_;
141*fb1b10abSAndroid Build Coastguard Worker   const int right_padding_;
142*fb1b10abSAndroid Build Coastguard Worker   const int bottom_padding_;
143*fb1b10abSAndroid Build Coastguard Worker   const unsigned int alignment_;
144*fb1b10abSAndroid Build Coastguard Worker   T padding_value_;
145*fb1b10abSAndroid Build Coastguard Worker   int stride_;
146*fb1b10abSAndroid Build Coastguard Worker   int raw_size_;
147*fb1b10abSAndroid Build Coastguard Worker   int num_elements_;
148*fb1b10abSAndroid Build Coastguard Worker   T *raw_buffer_;
149*fb1b10abSAndroid Build Coastguard Worker };
150*fb1b10abSAndroid Build Coastguard Worker 
151*fb1b10abSAndroid Build Coastguard Worker template <typename T>
TopLeftPixel()152*fb1b10abSAndroid Build Coastguard Worker T *Buffer<T>::TopLeftPixel() const {
153*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return nullptr;
154*fb1b10abSAndroid Build Coastguard Worker   return raw_buffer_ + (top_padding_ * stride_) + left_padding_;
155*fb1b10abSAndroid Build Coastguard Worker }
156*fb1b10abSAndroid Build Coastguard Worker 
157*fb1b10abSAndroid Build Coastguard Worker template <typename T>
Set(const T value)158*fb1b10abSAndroid Build Coastguard Worker void Buffer<T>::Set(const T value) {
159*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return;
160*fb1b10abSAndroid Build Coastguard Worker   T *src = TopLeftPixel();
161*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
162*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < width_; ++width) {
163*fb1b10abSAndroid Build Coastguard Worker       src[width] = value;
164*fb1b10abSAndroid Build Coastguard Worker     }
165*fb1b10abSAndroid Build Coastguard Worker     src += stride_;
166*fb1b10abSAndroid Build Coastguard Worker   }
167*fb1b10abSAndroid Build Coastguard Worker }
168*fb1b10abSAndroid Build Coastguard Worker 
169*fb1b10abSAndroid Build Coastguard Worker template <typename T>
Set(ACMRandom * rand_class,T (ACMRandom::* rand_func)())170*fb1b10abSAndroid Build Coastguard Worker void Buffer<T>::Set(ACMRandom *rand_class, T (ACMRandom::*rand_func)()) {
171*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return;
172*fb1b10abSAndroid Build Coastguard Worker   T *src = TopLeftPixel();
173*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
174*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < width_; ++width) {
175*fb1b10abSAndroid Build Coastguard Worker       src[width] = (*rand_class.*rand_func)();
176*fb1b10abSAndroid Build Coastguard Worker     }
177*fb1b10abSAndroid Build Coastguard Worker     src += stride_;
178*fb1b10abSAndroid Build Coastguard Worker   }
179*fb1b10abSAndroid Build Coastguard Worker }
180*fb1b10abSAndroid Build Coastguard Worker 
181*fb1b10abSAndroid Build Coastguard Worker template <typename T>
Set(ACMRandom * rand_class,const T low,const T high)182*fb1b10abSAndroid Build Coastguard Worker void Buffer<T>::Set(ACMRandom *rand_class, const T low, const T high) {
183*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return;
184*fb1b10abSAndroid Build Coastguard Worker 
185*fb1b10abSAndroid Build Coastguard Worker   EXPECT_LE(low, high);
186*fb1b10abSAndroid Build Coastguard Worker   EXPECT_LE(static_cast<int64_t>(high) - low,
187*fb1b10abSAndroid Build Coastguard Worker             std::numeric_limits<int32_t>::max());
188*fb1b10abSAndroid Build Coastguard Worker 
189*fb1b10abSAndroid Build Coastguard Worker   T *src = TopLeftPixel();
190*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
191*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < width_; ++width) {
192*fb1b10abSAndroid Build Coastguard Worker       // 'low' will be promoted to unsigned given the return type of RandRange.
193*fb1b10abSAndroid Build Coastguard Worker       // Store the value as an int to avoid unsigned overflow warnings when
194*fb1b10abSAndroid Build Coastguard Worker       // 'low' is negative.
195*fb1b10abSAndroid Build Coastguard Worker       const int32_t value =
196*fb1b10abSAndroid Build Coastguard Worker           static_cast<int32_t>((*rand_class).RandRange(high - low));
197*fb1b10abSAndroid Build Coastguard Worker       src[width] = static_cast<T>(value + low);
198*fb1b10abSAndroid Build Coastguard Worker     }
199*fb1b10abSAndroid Build Coastguard Worker     src += stride_;
200*fb1b10abSAndroid Build Coastguard Worker   }
201*fb1b10abSAndroid Build Coastguard Worker }
202*fb1b10abSAndroid Build Coastguard Worker 
203*fb1b10abSAndroid Build Coastguard Worker template <typename T>
CopyFrom(const Buffer<T> & a)204*fb1b10abSAndroid Build Coastguard Worker void Buffer<T>::CopyFrom(const Buffer<T> &a) {
205*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return;
206*fb1b10abSAndroid Build Coastguard Worker   if (!BufferSizesMatch(a)) return;
207*fb1b10abSAndroid Build Coastguard Worker 
208*fb1b10abSAndroid Build Coastguard Worker   T *a_src = a.TopLeftPixel();
209*fb1b10abSAndroid Build Coastguard Worker   T *b_src = this->TopLeftPixel();
210*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
211*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < width_; ++width) {
212*fb1b10abSAndroid Build Coastguard Worker       b_src[width] = a_src[width];
213*fb1b10abSAndroid Build Coastguard Worker     }
214*fb1b10abSAndroid Build Coastguard Worker     a_src += a.stride();
215*fb1b10abSAndroid Build Coastguard Worker     b_src += this->stride();
216*fb1b10abSAndroid Build Coastguard Worker   }
217*fb1b10abSAndroid Build Coastguard Worker }
218*fb1b10abSAndroid Build Coastguard Worker 
219*fb1b10abSAndroid Build Coastguard Worker template <typename T>
DumpBuffer()220*fb1b10abSAndroid Build Coastguard Worker void Buffer<T>::DumpBuffer() const {
221*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return;
222*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_ + top_padding_ + bottom_padding_;
223*fb1b10abSAndroid Build Coastguard Worker        ++height) {
224*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < stride_; ++width) {
225*fb1b10abSAndroid Build Coastguard Worker       printf("%4d", raw_buffer_[height + width * stride_]);
226*fb1b10abSAndroid Build Coastguard Worker     }
227*fb1b10abSAndroid Build Coastguard Worker     printf("\n");
228*fb1b10abSAndroid Build Coastguard Worker   }
229*fb1b10abSAndroid Build Coastguard Worker }
230*fb1b10abSAndroid Build Coastguard Worker 
231*fb1b10abSAndroid Build Coastguard Worker template <typename T>
HasPadding()232*fb1b10abSAndroid Build Coastguard Worker bool Buffer<T>::HasPadding() const {
233*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return false;
234*fb1b10abSAndroid Build Coastguard Worker   return top_padding_ || left_padding_ || right_padding_ || bottom_padding_;
235*fb1b10abSAndroid Build Coastguard Worker }
236*fb1b10abSAndroid Build Coastguard Worker 
237*fb1b10abSAndroid Build Coastguard Worker template <typename T>
PrintDifference(const Buffer<T> & a)238*fb1b10abSAndroid Build Coastguard Worker void Buffer<T>::PrintDifference(const Buffer<T> &a) const {
239*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return;
240*fb1b10abSAndroid Build Coastguard Worker   if (!BufferSizesMatch(a)) return;
241*fb1b10abSAndroid Build Coastguard Worker 
242*fb1b10abSAndroid Build Coastguard Worker   T *a_src = a.TopLeftPixel();
243*fb1b10abSAndroid Build Coastguard Worker   T *b_src = TopLeftPixel();
244*fb1b10abSAndroid Build Coastguard Worker 
245*fb1b10abSAndroid Build Coastguard Worker   printf("This buffer:\n");
246*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
247*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < width_; ++width) {
248*fb1b10abSAndroid Build Coastguard Worker       if (a_src[width] != b_src[width]) {
249*fb1b10abSAndroid Build Coastguard Worker         printf("*%3d", b_src[width]);
250*fb1b10abSAndroid Build Coastguard Worker       } else {
251*fb1b10abSAndroid Build Coastguard Worker         printf("%4d", b_src[width]);
252*fb1b10abSAndroid Build Coastguard Worker       }
253*fb1b10abSAndroid Build Coastguard Worker     }
254*fb1b10abSAndroid Build Coastguard Worker     printf("\n");
255*fb1b10abSAndroid Build Coastguard Worker     a_src += a.stride();
256*fb1b10abSAndroid Build Coastguard Worker     b_src += this->stride();
257*fb1b10abSAndroid Build Coastguard Worker   }
258*fb1b10abSAndroid Build Coastguard Worker 
259*fb1b10abSAndroid Build Coastguard Worker   a_src = a.TopLeftPixel();
260*fb1b10abSAndroid Build Coastguard Worker   b_src = TopLeftPixel();
261*fb1b10abSAndroid Build Coastguard Worker 
262*fb1b10abSAndroid Build Coastguard Worker   printf("Reference buffer:\n");
263*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
264*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < width_; ++width) {
265*fb1b10abSAndroid Build Coastguard Worker       if (a_src[width] != b_src[width]) {
266*fb1b10abSAndroid Build Coastguard Worker         printf("*%3d", a_src[width]);
267*fb1b10abSAndroid Build Coastguard Worker       } else {
268*fb1b10abSAndroid Build Coastguard Worker         printf("%4d", a_src[width]);
269*fb1b10abSAndroid Build Coastguard Worker       }
270*fb1b10abSAndroid Build Coastguard Worker     }
271*fb1b10abSAndroid Build Coastguard Worker     printf("\n");
272*fb1b10abSAndroid Build Coastguard Worker     a_src += a.stride();
273*fb1b10abSAndroid Build Coastguard Worker     b_src += this->stride();
274*fb1b10abSAndroid Build Coastguard Worker   }
275*fb1b10abSAndroid Build Coastguard Worker }
276*fb1b10abSAndroid Build Coastguard Worker 
277*fb1b10abSAndroid Build Coastguard Worker template <typename T>
SetPadding(const T padding_value)278*fb1b10abSAndroid Build Coastguard Worker void Buffer<T>::SetPadding(const T padding_value) {
279*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return;
280*fb1b10abSAndroid Build Coastguard Worker   padding_value_ = padding_value;
281*fb1b10abSAndroid Build Coastguard Worker 
282*fb1b10abSAndroid Build Coastguard Worker   T *src = raw_buffer_;
283*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < num_elements_; ++i) {
284*fb1b10abSAndroid Build Coastguard Worker     src[i] = padding_value;
285*fb1b10abSAndroid Build Coastguard Worker   }
286*fb1b10abSAndroid Build Coastguard Worker }
287*fb1b10abSAndroid Build Coastguard Worker 
288*fb1b10abSAndroid Build Coastguard Worker template <typename T>
CheckValues(const T value)289*fb1b10abSAndroid Build Coastguard Worker bool Buffer<T>::CheckValues(const T value) const {
290*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return false;
291*fb1b10abSAndroid Build Coastguard Worker   T *src = TopLeftPixel();
292*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
293*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < width_; ++width) {
294*fb1b10abSAndroid Build Coastguard Worker       if (value != src[width]) {
295*fb1b10abSAndroid Build Coastguard Worker         return false;
296*fb1b10abSAndroid Build Coastguard Worker       }
297*fb1b10abSAndroid Build Coastguard Worker     }
298*fb1b10abSAndroid Build Coastguard Worker     src += stride_;
299*fb1b10abSAndroid Build Coastguard Worker   }
300*fb1b10abSAndroid Build Coastguard Worker   return true;
301*fb1b10abSAndroid Build Coastguard Worker }
302*fb1b10abSAndroid Build Coastguard Worker 
303*fb1b10abSAndroid Build Coastguard Worker template <typename T>
CheckPadding()304*fb1b10abSAndroid Build Coastguard Worker bool Buffer<T>::CheckPadding() const {
305*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return false;
306*fb1b10abSAndroid Build Coastguard Worker   if (!HasPadding()) return true;
307*fb1b10abSAndroid Build Coastguard Worker 
308*fb1b10abSAndroid Build Coastguard Worker   // Top padding.
309*fb1b10abSAndroid Build Coastguard Worker   T const *top = raw_buffer_;
310*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < stride_ * top_padding_; ++i) {
311*fb1b10abSAndroid Build Coastguard Worker     if (padding_value_ != top[i]) {
312*fb1b10abSAndroid Build Coastguard Worker       return false;
313*fb1b10abSAndroid Build Coastguard Worker     }
314*fb1b10abSAndroid Build Coastguard Worker   }
315*fb1b10abSAndroid Build Coastguard Worker 
316*fb1b10abSAndroid Build Coastguard Worker   // Left padding.
317*fb1b10abSAndroid Build Coastguard Worker   T const *left = TopLeftPixel() - left_padding_;
318*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
319*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < left_padding_; ++width) {
320*fb1b10abSAndroid Build Coastguard Worker       if (padding_value_ != left[width]) {
321*fb1b10abSAndroid Build Coastguard Worker         return false;
322*fb1b10abSAndroid Build Coastguard Worker       }
323*fb1b10abSAndroid Build Coastguard Worker     }
324*fb1b10abSAndroid Build Coastguard Worker     left += stride_;
325*fb1b10abSAndroid Build Coastguard Worker   }
326*fb1b10abSAndroid Build Coastguard Worker 
327*fb1b10abSAndroid Build Coastguard Worker   // Right padding.
328*fb1b10abSAndroid Build Coastguard Worker   T const *right = TopLeftPixel() + width_;
329*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
330*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < right_padding_; ++width) {
331*fb1b10abSAndroid Build Coastguard Worker       if (padding_value_ != right[width]) {
332*fb1b10abSAndroid Build Coastguard Worker         return false;
333*fb1b10abSAndroid Build Coastguard Worker       }
334*fb1b10abSAndroid Build Coastguard Worker     }
335*fb1b10abSAndroid Build Coastguard Worker     right += stride_;
336*fb1b10abSAndroid Build Coastguard Worker   }
337*fb1b10abSAndroid Build Coastguard Worker 
338*fb1b10abSAndroid Build Coastguard Worker   // Bottom padding
339*fb1b10abSAndroid Build Coastguard Worker   T const *bottom = raw_buffer_ + (top_padding_ + height_) * stride_;
340*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < stride_ * bottom_padding_; ++i) {
341*fb1b10abSAndroid Build Coastguard Worker     if (padding_value_ != bottom[i]) {
342*fb1b10abSAndroid Build Coastguard Worker       return false;
343*fb1b10abSAndroid Build Coastguard Worker     }
344*fb1b10abSAndroid Build Coastguard Worker   }
345*fb1b10abSAndroid Build Coastguard Worker 
346*fb1b10abSAndroid Build Coastguard Worker   return true;
347*fb1b10abSAndroid Build Coastguard Worker }
348*fb1b10abSAndroid Build Coastguard Worker 
349*fb1b10abSAndroid Build Coastguard Worker template <typename T>
CheckValues(const Buffer<T> & a)350*fb1b10abSAndroid Build Coastguard Worker bool Buffer<T>::CheckValues(const Buffer<T> &a) const {
351*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return false;
352*fb1b10abSAndroid Build Coastguard Worker   if (!BufferSizesMatch(a)) return false;
353*fb1b10abSAndroid Build Coastguard Worker 
354*fb1b10abSAndroid Build Coastguard Worker   T *a_src = a.TopLeftPixel();
355*fb1b10abSAndroid Build Coastguard Worker   T *b_src = this->TopLeftPixel();
356*fb1b10abSAndroid Build Coastguard Worker   for (int height = 0; height < height_; ++height) {
357*fb1b10abSAndroid Build Coastguard Worker     for (int width = 0; width < width_; ++width) {
358*fb1b10abSAndroid Build Coastguard Worker       if (a_src[width] != b_src[width]) {
359*fb1b10abSAndroid Build Coastguard Worker         return false;
360*fb1b10abSAndroid Build Coastguard Worker       }
361*fb1b10abSAndroid Build Coastguard Worker     }
362*fb1b10abSAndroid Build Coastguard Worker     a_src += a.stride();
363*fb1b10abSAndroid Build Coastguard Worker     b_src += this->stride();
364*fb1b10abSAndroid Build Coastguard Worker   }
365*fb1b10abSAndroid Build Coastguard Worker   return true;
366*fb1b10abSAndroid Build Coastguard Worker }
367*fb1b10abSAndroid Build Coastguard Worker 
368*fb1b10abSAndroid Build Coastguard Worker template <typename T>
BufferSizesMatch(const Buffer<T> & a)369*fb1b10abSAndroid Build Coastguard Worker bool Buffer<T>::BufferSizesMatch(const Buffer<T> &a) const {
370*fb1b10abSAndroid Build Coastguard Worker   if (!raw_buffer_) return false;
371*fb1b10abSAndroid Build Coastguard Worker   if (a.width_ != this->width_ || a.height_ != this->height_) {
372*fb1b10abSAndroid Build Coastguard Worker     printf(
373*fb1b10abSAndroid Build Coastguard Worker         "Reference buffer of size %dx%d does not match this buffer which is "
374*fb1b10abSAndroid Build Coastguard Worker         "size %dx%d\n",
375*fb1b10abSAndroid Build Coastguard Worker         a.width_, a.height_, this->width_, this->height_);
376*fb1b10abSAndroid Build Coastguard Worker     return false;
377*fb1b10abSAndroid Build Coastguard Worker   }
378*fb1b10abSAndroid Build Coastguard Worker 
379*fb1b10abSAndroid Build Coastguard Worker   return true;
380*fb1b10abSAndroid Build Coastguard Worker }
381*fb1b10abSAndroid Build Coastguard Worker }  // namespace libvpx_test
382*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_TEST_BUFFER_H_
383