FreeRDP
Loading...
Searching...
No Matches
TestFreeRDPCodecCopy.c
1
2#include <math.h>
3#include <string.h>
4#include <stdlib.h>
5#include <errno.h>
6
7#include <winpr/sysinfo.h>
8
9#include <freerdp/freerdp.h>
10#include <freerdp/codec/color.h>
11
12#define TEST_RUNS 2
13
14static BOOL TestFreeRDPImageCopy(UINT32 w, UINT32 h, UINT32 srcFormat, UINT32 dstFormat,
15 size_t runs)
16{
17 BOOL rc = FALSE;
18 const size_t sbpp = FreeRDPGetBytesPerPixel(srcFormat);
19 const size_t dbpp = FreeRDPGetBytesPerPixel(dstFormat);
20 const size_t srcStep = w * sbpp;
21 const size_t dstStep = w * dbpp;
22 char* src = calloc(h, srcStep);
23 char* dst = calloc(h, dstStep);
24 if (!src || !dst)
25 goto fail;
26
27 for (size_t x = 0; x < runs; x++)
28 {
29 if (winpr_RAND_pseudo(src, h * srcStep) < 0)
30 goto fail;
31 const UINT64 start = winpr_GetUnixTimeNS();
32 rc = freerdp_image_copy(dst, dstFormat, dstStep, 0, 0, w, h, src, srcFormat, srcStep, 0, 0,
33 nullptr, 0);
34 const UINT64 end = winpr_GetUnixTimeNS();
35
36 double ms = (double)(end - start);
37 ms /= 1000000.0;
38
39 (void)fprintf(stdout,
40 "[%s] copied %" PRIu32 "x%" PRIu32 " [%-20s] -> [%-20s] in %lf ms [%s]\n",
41 __func__, w, h, FreeRDPGetColorFormatName(srcFormat),
42 FreeRDPGetColorFormatName(dstFormat), ms, rc ? "success" : "failure");
43 if (!rc)
44 break;
45 }
46
47fail:
48 free(src);
49 free(dst);
50 return rc;
51}
52
53static BOOL TestFreeRDPImageCopy_no_overlap(UINT32 w, UINT32 h, UINT32 srcFormat, UINT32 dstFormat,
54 size_t runs)
55{
56 BOOL rc = FALSE;
57 const size_t sbpp = FreeRDPGetBytesPerPixel(srcFormat);
58 const size_t dbpp = FreeRDPGetBytesPerPixel(dstFormat);
59 const size_t srcStep = w * sbpp;
60 const size_t dstStep = w * dbpp;
61 char* src = calloc(h, srcStep);
62 char* dst = calloc(h, dstStep);
63 if (!src || !dst)
64 goto fail;
65
66 for (size_t x = 0; x < runs; x++)
67 {
68 if (winpr_RAND_pseudo(src, h * srcStep) < 0)
69 goto fail;
70 const UINT64 start = winpr_GetUnixTimeNS();
71 rc = freerdp_image_copy_no_overlap(dst, dstFormat, dstStep, 0, 0, w, h, src, srcFormat,
72 srcStep, 0, 0, nullptr, 0);
73 const UINT64 end = winpr_GetUnixTimeNS();
74
75 double ms = (double)(end - start);
76 ms /= 1000000.0;
77
78 (void)fprintf(stdout,
79 "[%s] copied %" PRIu32 "x%" PRIu32 " [%-20s] -> [%-20s] in %lf ms [%s]\n",
80 __func__, w, h, FreeRDPGetColorFormatName(srcFormat),
81 FreeRDPGetColorFormatName(dstFormat), ms, rc ? "success" : "failure");
82 if (!rc)
83 break;
84 }
85
86fail:
87 free(src);
88 free(dst);
89 return rc;
90}
91int TestFreeRDPCodecCopy(int argc, char* argv[])
92{
93 WINPR_UNUSED(argc);
94 WINPR_UNUSED(argv);
95
96 UINT32 width = 192;
97 UINT32 height = 108;
98 const UINT32 formats[] = {
99 PIXEL_FORMAT_ABGR15, PIXEL_FORMAT_ARGB15, PIXEL_FORMAT_BGR15, PIXEL_FORMAT_BGR16,
100 PIXEL_FORMAT_BGR24, PIXEL_FORMAT_RGB15, PIXEL_FORMAT_RGB16, PIXEL_FORMAT_RGB24,
101 PIXEL_FORMAT_ABGR32, PIXEL_FORMAT_ARGB32, PIXEL_FORMAT_XBGR32, PIXEL_FORMAT_XRGB32,
102 PIXEL_FORMAT_BGRA32, PIXEL_FORMAT_RGBA32, PIXEL_FORMAT_BGRX32, PIXEL_FORMAT_RGBX32,
103 };
104
105 if (argc == 3)
106 {
107 errno = 0;
108 width = strtoul(argv[1], nullptr, 0);
109 height = strtoul(argv[2], nullptr, 0);
110 if ((errno != 0) || (width == 0) || (height == 0))
111 {
112 char buffer[128] = WINPR_C_ARRAY_INIT;
113 (void)fprintf(stderr, "%s failed: width=%" PRIu32 ", height=%" PRIu32 ", errno=%s\n",
114 __func__, width, height, winpr_strerror(errno, buffer, sizeof(buffer)));
115 return -1;
116 }
117 }
118 for (size_t x = 0; x < ARRAYSIZE(formats); x++)
119 {
120 const UINT32 SrcFormat = formats[x];
121 for (size_t y = 0; y < ARRAYSIZE(formats); y++)
122 {
123 const UINT32 DstFormat = formats[y];
124 if (!TestFreeRDPImageCopy(width, height, SrcFormat, DstFormat, TEST_RUNS))
125 return -1;
126 if (!TestFreeRDPImageCopy_no_overlap(width, height, SrcFormat, DstFormat, TEST_RUNS))
127 return -1;
128 }
129 }
130
131 return 0;
132}