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, srcStride, out_c, format, dstStride, width, height,
56  2, TRUE);
57  PROFILER_EXIT(genericProf)
58 
59  if (status != PRIMITIVES_SUCCESS)
60  goto loop_fail;
61 
62  PROFILER_ENTER(optProf)
63  status = optimized->YCoCgToRGB_8u_AC4R(in, srcStride, out_sse, format, dstStride, width,
64  height, 2, TRUE);
65  PROFILER_EXIT(optProf)
66 
67  if (status != PRIMITIVES_SUCCESS)
68  goto loop_fail;
69 
70  if (memcmp(out_c, out_sse, 1ULL * dstStride * height) != 0)
71  {
72  for (size_t i = 0; i < 1ull * width * height; ++i)
73  {
74  const UINT32 c = FreeRDPReadColor(out_c + 4 * i, format);
75  const UINT32 sse = FreeRDPReadColor(out_sse + 4 * i, format);
76 
77  if (c != sse)
78  {
79  printf("optimized->YCoCgRToRGB FAIL[%s] [%" PRIuz "]: 0x%08" PRIx32
80  " -> C 0x%08" PRIx32 " vs optimized 0x%08" PRIx32 "\n",
81  formatName, i, in[i + 1], c, sse);
82  status = -1;
83  }
84  }
85  }
86 
87  printf("--------------------------- [%s] [%" PRIu32 "x%" PRIu32
88  "] ---------------------------\n",
89  formatName, width, height);
90  PROFILER_PRINT_HEADER
91  PROFILER_PRINT(genericProf)
92  PROFILER_PRINT(optProf)
93  PROFILER_PRINT_FOOTER
94  loop_fail:
95  PROFILER_FREE(genericProf)
96  PROFILER_FREE(optProf)
97 
98  if (status != PRIMITIVES_SUCCESS)
99  goto fail;
100  }
101 
102 fail:
103  winpr_aligned_free(in);
104  winpr_aligned_free(out_c);
105  winpr_aligned_free(out_sse);
106  return status == PRIMITIVES_SUCCESS;
107 }
108 
109 int TestPrimitivesYCoCg(int argc, char* argv[])
110 {
111  WINPR_UNUSED(argc);
112  WINPR_UNUSED(argv);
113  prim_test_setup(FALSE);
114 
115  /* Random resolution tests */
116  if (argc < 2)
117  {
118  for (UINT32 x = 0; x < 10; x++)
119  {
120  UINT32 w = 0;
121  UINT32 h = 0;
122 
123  do
124  {
125  winpr_RAND(&w, sizeof(w));
126  w %= 2048 / 4;
127  } while (w < 16);
128 
129  do
130  {
131  winpr_RAND(&h, sizeof(h));
132  h %= 2048 / 4;
133  } while (h < 16);
134 
135  if (!test_YCoCgRToRGB_8u_AC4R_func(w, h))
136  return 1;
137  }
138  }
139 
140  /* Test once with full HD/4 */
141  if (!test_YCoCgRToRGB_8u_AC4R_func(1920 / 4, 1080 / 4))
142  return 1;
143 
144  return 0;
145 }