1*09537850SAkhilesh Sanikop // Copyright 2020 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 "tests/block_utils.h"
16*09537850SAkhilesh Sanikop
17*09537850SAkhilesh Sanikop #include <algorithm>
18*09537850SAkhilesh Sanikop #include <cstdint>
19*09537850SAkhilesh Sanikop #include <cstdio>
20*09537850SAkhilesh Sanikop #include <cstring>
21*09537850SAkhilesh Sanikop
22*09537850SAkhilesh Sanikop namespace libgav1 {
23*09537850SAkhilesh Sanikop namespace test_utils {
24*09537850SAkhilesh Sanikop namespace {
25*09537850SAkhilesh Sanikop
26*09537850SAkhilesh Sanikop #define LIBGAV1_DEBUG_FORMAT_CODE "x"
27*09537850SAkhilesh Sanikop template <typename Pixel>
PrintBlockDiff(const Pixel * block1,const Pixel * block2,int width,int height,int stride1,int stride2,const bool print_padding)28*09537850SAkhilesh Sanikop void PrintBlockDiff(const Pixel* block1, const Pixel* block2, int width,
29*09537850SAkhilesh Sanikop int height, int stride1, int stride2,
30*09537850SAkhilesh Sanikop const bool print_padding) {
31*09537850SAkhilesh Sanikop const int print_width = print_padding ? std::min(stride1, stride2) : width;
32*09537850SAkhilesh Sanikop const int field_width = (sizeof(Pixel) == 1) ? 4 : 5;
33*09537850SAkhilesh Sanikop
34*09537850SAkhilesh Sanikop for (int y = 0; y < height; ++y) {
35*09537850SAkhilesh Sanikop printf("[%2d] ", y);
36*09537850SAkhilesh Sanikop for (int x = 0; x < print_width; ++x) {
37*09537850SAkhilesh Sanikop if (x >= width) {
38*09537850SAkhilesh Sanikop if (block1[x] == block2[x]) {
39*09537850SAkhilesh Sanikop printf("[%*" LIBGAV1_DEBUG_FORMAT_CODE "] ", field_width, block1[x]);
40*09537850SAkhilesh Sanikop } else {
41*09537850SAkhilesh Sanikop printf("[*%*" LIBGAV1_DEBUG_FORMAT_CODE "] ", field_width - 1,
42*09537850SAkhilesh Sanikop block1[x]);
43*09537850SAkhilesh Sanikop }
44*09537850SAkhilesh Sanikop } else {
45*09537850SAkhilesh Sanikop if (block1[x] == block2[x]) {
46*09537850SAkhilesh Sanikop printf("%*" LIBGAV1_DEBUG_FORMAT_CODE " ", field_width, block1[x]);
47*09537850SAkhilesh Sanikop } else {
48*09537850SAkhilesh Sanikop printf("*%*" LIBGAV1_DEBUG_FORMAT_CODE " ", field_width - 1,
49*09537850SAkhilesh Sanikop block1[x]);
50*09537850SAkhilesh Sanikop }
51*09537850SAkhilesh Sanikop }
52*09537850SAkhilesh Sanikop }
53*09537850SAkhilesh Sanikop printf("\n");
54*09537850SAkhilesh Sanikop block1 += stride1;
55*09537850SAkhilesh Sanikop block2 += stride2;
56*09537850SAkhilesh Sanikop }
57*09537850SAkhilesh Sanikop }
58*09537850SAkhilesh Sanikop
59*09537850SAkhilesh Sanikop } // namespace
60*09537850SAkhilesh Sanikop
61*09537850SAkhilesh Sanikop template <typename Pixel>
PrintBlock(const Pixel * block,int width,int height,int stride,const bool print_padding)62*09537850SAkhilesh Sanikop void PrintBlock(const Pixel* block, int width, int height, int stride,
63*09537850SAkhilesh Sanikop const bool print_padding /*= false*/) {
64*09537850SAkhilesh Sanikop const int print_width = print_padding ? stride : width;
65*09537850SAkhilesh Sanikop const int field_width = (sizeof(Pixel) == 1) ? 4 : 5;
66*09537850SAkhilesh Sanikop for (int y = 0; y < height; ++y) {
67*09537850SAkhilesh Sanikop printf("[%2d] ", y);
68*09537850SAkhilesh Sanikop for (int x = 0; x < print_width; ++x) {
69*09537850SAkhilesh Sanikop if (x >= width) {
70*09537850SAkhilesh Sanikop printf("[%*" LIBGAV1_DEBUG_FORMAT_CODE "] ", field_width, block[x]);
71*09537850SAkhilesh Sanikop } else {
72*09537850SAkhilesh Sanikop printf("%*" LIBGAV1_DEBUG_FORMAT_CODE " ", field_width, block[x]);
73*09537850SAkhilesh Sanikop }
74*09537850SAkhilesh Sanikop }
75*09537850SAkhilesh Sanikop printf("\n");
76*09537850SAkhilesh Sanikop block += stride;
77*09537850SAkhilesh Sanikop }
78*09537850SAkhilesh Sanikop }
79*09537850SAkhilesh Sanikop #undef LIBGAV1_DEBUG_FORMAT_CODE
80*09537850SAkhilesh Sanikop
81*09537850SAkhilesh Sanikop template void PrintBlock(const uint8_t* block, int width, int height,
82*09537850SAkhilesh Sanikop int stride, bool print_padding /*= false*/);
83*09537850SAkhilesh Sanikop template void PrintBlock(const uint16_t* block, int width, int height,
84*09537850SAkhilesh Sanikop int stride, bool print_padding /*= false*/);
85*09537850SAkhilesh Sanikop template void PrintBlock(const int8_t* block, int width, int height, int stride,
86*09537850SAkhilesh Sanikop bool print_padding /*= false*/);
87*09537850SAkhilesh Sanikop template void PrintBlock(const int16_t* block, int width, int height,
88*09537850SAkhilesh Sanikop int stride, bool print_padding /*= false*/);
89*09537850SAkhilesh Sanikop
90*09537850SAkhilesh Sanikop template <typename Pixel>
CompareBlocks(const Pixel * block1,const Pixel * block2,int width,int height,int stride1,int stride2,const bool check_padding,const bool print_diff)91*09537850SAkhilesh Sanikop bool CompareBlocks(const Pixel* block1, const Pixel* block2, int width,
92*09537850SAkhilesh Sanikop int height, int stride1, int stride2,
93*09537850SAkhilesh Sanikop const bool check_padding, const bool print_diff /*= true*/) {
94*09537850SAkhilesh Sanikop bool ok = true;
95*09537850SAkhilesh Sanikop const int check_width = check_padding ? std::min(stride1, stride2) : width;
96*09537850SAkhilesh Sanikop for (int y = 0; y < height; ++y) {
97*09537850SAkhilesh Sanikop const uint64_t row1 = static_cast<uint64_t>(y) * stride1;
98*09537850SAkhilesh Sanikop const uint64_t row2 = static_cast<uint64_t>(y) * stride2;
99*09537850SAkhilesh Sanikop ok = memcmp(block1 + row1, block2 + row2,
100*09537850SAkhilesh Sanikop sizeof(block1[0]) * check_width) == 0;
101*09537850SAkhilesh Sanikop if (!ok) break;
102*09537850SAkhilesh Sanikop }
103*09537850SAkhilesh Sanikop if (!ok && print_diff) {
104*09537850SAkhilesh Sanikop printf("block1 (width: %d height: %d stride: %d):\n", width, height,
105*09537850SAkhilesh Sanikop stride1);
106*09537850SAkhilesh Sanikop PrintBlockDiff(block1, block2, width, height, stride1, stride2,
107*09537850SAkhilesh Sanikop check_padding);
108*09537850SAkhilesh Sanikop printf("\nblock2 (width: %d height: %d stride: %d):\n", width, height,
109*09537850SAkhilesh Sanikop stride2);
110*09537850SAkhilesh Sanikop PrintBlockDiff(block2, block1, width, height, stride2, stride1,
111*09537850SAkhilesh Sanikop check_padding);
112*09537850SAkhilesh Sanikop }
113*09537850SAkhilesh Sanikop return ok;
114*09537850SAkhilesh Sanikop }
115*09537850SAkhilesh Sanikop
116*09537850SAkhilesh Sanikop template bool CompareBlocks(const uint8_t* block1, const uint8_t* block2,
117*09537850SAkhilesh Sanikop int width, int height, int stride1, int stride2,
118*09537850SAkhilesh Sanikop const bool check_padding,
119*09537850SAkhilesh Sanikop const bool print_diff /*= true*/);
120*09537850SAkhilesh Sanikop template bool CompareBlocks(const uint16_t* block1, const uint16_t* block2,
121*09537850SAkhilesh Sanikop int width, int height, int stride1, int stride2,
122*09537850SAkhilesh Sanikop const bool check_padding,
123*09537850SAkhilesh Sanikop const bool print_diff /*= true*/);
124*09537850SAkhilesh Sanikop template bool CompareBlocks(const int8_t* block1, const int8_t* block2,
125*09537850SAkhilesh Sanikop int width, int height, int stride1, int stride2,
126*09537850SAkhilesh Sanikop const bool check_padding,
127*09537850SAkhilesh Sanikop const bool print_diff /*= true*/);
128*09537850SAkhilesh Sanikop template bool CompareBlocks(const int16_t* block1, const int16_t* block2,
129*09537850SAkhilesh Sanikop int width, int height, int stride1, int stride2,
130*09537850SAkhilesh Sanikop const bool check_padding,
131*09537850SAkhilesh Sanikop const bool print_diff /*= true*/);
132*09537850SAkhilesh Sanikop
133*09537850SAkhilesh Sanikop } // namespace test_utils
134*09537850SAkhilesh Sanikop } // namespace libgav1
135