FreeRDP
TestPrimitivesYCoCg.c
1 /* test_YCoCg.c
2  * vi:ts=4 sw=4
3  *
4  * (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #include <freerdp/config.h>
20 
21 #include <winpr/sysinfo.h>
22 #include "prim_test.h"
23 #include <freerdp/utils/profiler.h>
24 
25 /* ------------------------------------------------------------------------- */
26 static BOOL test_YCoCgRToRGB_8u_AC4R_func(UINT32 width, UINT32 height)
27 {
28  pstatus_t status = -1;
29  BYTE* out_sse = NULL;
30  BYTE* in = NULL;
31  BYTE* out_c = NULL;
32  const UINT32 srcStride = width * 4;
33  const UINT32 size = srcStride * height;
34  const UINT32 formats[] = { PIXEL_FORMAT_ARGB32, PIXEL_FORMAT_ABGR32, PIXEL_FORMAT_RGBA32,
35  PIXEL_FORMAT_RGBX32, PIXEL_FORMAT_BGRA32, PIXEL_FORMAT_BGRX32 };
36  PROFILER_DEFINE(genericProf)
37  PROFILER_DEFINE(optProf)
38  in = winpr_aligned_calloc(1, size, 16);
39  out_c = winpr_aligned_calloc(1, size, 16);
40  out_sse = winpr_aligned_calloc(1, size, 16);
41 
42  if (!in || !out_c || !out_sse)
43  goto fail;
44 
45  winpr_RAND(in, size);
46 
47  for (size_t x = 0; x < sizeof(formats) / sizeof(formats[0]); x++)
48  {
49  const UINT32 format = formats[x];
50  const UINT32 dstStride = width * FreeRDPGetBytesPerPixel(format);
51  const char* formatName = FreeRDPGetColorFormatName(format);
52  PROFILER_CREATE(genericProf, "YCoCgRToRGB_8u_AC4R-GENERIC")
53  PROFILER_CREATE(optProf, "YCoCgRToRGB_8u_AC4R-OPT")
54  PROFILER_ENTER(genericProf)
55  status = generic->YCoCgToRGB_8u_AC4R(in, WINPR_ASSERTING_INT_CAST(int, srcStride), out_c,
56  format, WINPR_ASSERTING_INT_CAST(int, dstStride),
57  width, height, 2, TRUE);
58  PROFILER_EXIT(genericProf)
59 
60  if (status != PRIMITIVES_SUCCESS)
61  goto loop_fail;
62 
63  PROFILER_ENTER(optProf)
64  status = optimized->YCoCgToRGB_8u_AC4R(
65  in, WINPR_ASSERTING_INT_CAST(int, srcStride), out_sse, format,
66  WINPR_ASSERTING_INT_CAST(int, dstStride), width, height, 2, TRUE);
67  PROFILER_EXIT(optProf)
68 
69  if (status != PRIMITIVES_SUCCESS)
70  goto loop_fail;
71 
72  if (memcmp(out_c, out_sse, 1ULL * dstStride * height) != 0)
73  {
74  for (size_t i = 0; i < 1ull * width * height; ++i)
75  {
76  const UINT32 c = FreeRDPReadColor(out_c + 4 * i, format);
77  const UINT32 sse = FreeRDPReadColor(out_sse + 4 * i, format);
78 
79  if (c != sse)
80  {
81  printf("optimized->YCoCgRToRGB FAIL[%s] [%" PRIuz "]: 0x%08" PRIx32
82  " -> C 0x%08" PRIx32 " vs optimized 0x%08" PRIx32 "\n",
83  formatName, i, in[i + 1], c, sse);
84  status = -1;
85  }
86  }
87  }
88 
89  printf("--------------------------- [%s] [%" PRIu32 "x%" PRIu32
90  "] ---------------------------\n",
91  formatName, width, height);
92  PROFILER_PRINT_HEADER
93  PROFILER_PRINT(genericProf)
94  PROFILER_PRINT(optProf)
95  PROFILER_PRINT_FOOTER
96  loop_fail:
97  PROFILER_FREE(genericProf)
98  PROFILER_FREE(optProf)
99 
100  if (status != PRIMITIVES_SUCCESS)
101  goto fail;
102  }
103 
104 fail:
105  winpr_aligned_free(in);
106  winpr_aligned_free(out_c);
107  winpr_aligned_free(out_sse);
108  return status == PRIMITIVES_SUCCESS;
109 }
110 
111 int TestPrimitivesYCoCg(int argc, char* argv[])
112 {
113  WINPR_UNUSED(argc);
114  WINPR_UNUSED(argv);
115  prim_test_setup(FALSE);
116 
117  /* Random resolution tests */
118  if (argc < 2)
119  {
120  for (UINT32 x = 0; x < 10; x++)
121  {
122  UINT32 w = 0;
123  UINT32 h = 0;
124 
125  do
126  {
127  winpr_RAND(&w, sizeof(w));
128  w %= 2048 / 4;
129  } while (w < 16);
130 
131  do
132  {
133  winpr_RAND(&h, sizeof(h));
134  h %= 2048 / 4;
135  } while (h < 16);
136 
137  if (!test_YCoCgRToRGB_8u_AC4R_func(w, h))
138  return 1;
139  }
140  }
141 
142  /* Test once with full HD/4 */
143  if (!test_YCoCgRToRGB_8u_AC4R_func(1920 / 4, 1080 / 4))
144  return 1;
145 
146  return 0;
147 }