FreeRDP
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
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/* ------------------------------------------------------------------------- */
26static 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
104fail:
105 winpr_aligned_free(in);
106 winpr_aligned_free(out_c);
107 winpr_aligned_free(out_sse);
108 return status == PRIMITIVES_SUCCESS;
109}
110
111int 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}