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