|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
1fb8d4 |
#include "config.h"
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <math.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <winpr/crt.h>
|
|
Packit |
1fb8d4 |
#include <winpr/print.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <freerdp/freerdp.h>
|
|
Packit |
1fb8d4 |
#include <freerdp/codec/color.h>
|
|
Packit |
1fb8d4 |
#include <freerdp/codec/bitmap.h>
|
|
Packit |
1fb8d4 |
#include <freerdp/codec/interleaved.h>
|
|
Packit |
1fb8d4 |
#include <winpr/crypto.h>
|
|
Packit |
1fb8d4 |
#include <freerdp/utils/profiler.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
static BOOL run_encode_decode_single(UINT16 bpp, BITMAP_INTERLEAVED_CONTEXT* encoder,
|
|
Packit |
1fb8d4 |
BITMAP_INTERLEAVED_CONTEXT* decoder
|
|
Packit |
1fb8d4 |
#if defined(WITH_PROFILER)
|
|
Packit Service |
5a9772 |
,
|
|
Packit Service |
5a9772 |
PROFILER* profiler_comp, PROFILER* profiler_decomp
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit Service |
5a9772 |
)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
BOOL rc2 = FALSE;
|
|
Packit |
1fb8d4 |
BOOL rc;
|
|
Packit |
1fb8d4 |
UINT32 i, j;
|
|
Packit |
1fb8d4 |
const UINT32 w = 64;
|
|
Packit |
1fb8d4 |
const UINT32 h = 64;
|
|
Packit |
1fb8d4 |
const UINT32 x = 0;
|
|
Packit |
1fb8d4 |
const UINT32 y = 0;
|
|
Packit |
1fb8d4 |
const UINT32 format = PIXEL_FORMAT_RGBX32;
|
|
Packit |
1fb8d4 |
const UINT32 bstep = GetBytesPerPixel(format);
|
|
Packit |
1fb8d4 |
const size_t step = (w + 13) * 4;
|
|
Packit |
1fb8d4 |
const size_t SrcSize = step * h;
|
|
Packit |
1fb8d4 |
const float maxDiff = 4.0f * ((bpp < 24) ? 2.0f : 1.0f);
|
|
Packit |
1fb8d4 |
UINT32 DstSize = SrcSize;
|
|
Packit |
1fb8d4 |
BYTE* pSrcData = malloc(SrcSize);
|
|
Packit |
1fb8d4 |
BYTE* pDstData = malloc(SrcSize);
|
|
Packit |
1fb8d4 |
BYTE* tmp = malloc(SrcSize);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!pSrcData || !pDstData || !tmp)
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
winpr_RAND(pSrcData, SrcSize);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!bitmap_interleaved_context_reset(encoder) || !bitmap_interleaved_context_reset(decoder))
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
PROFILER_ENTER(profiler_comp);
|
|
Packit Service |
5a9772 |
rc =
|
|
Packit Service |
5a9772 |
interleaved_compress(encoder, tmp, &DstSize, w, h, pSrcData, format, step, x, y, NULL, bpp);
|
|
Packit |
1fb8d4 |
PROFILER_EXIT(profiler_comp);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!rc)
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
PROFILER_ENTER(profiler_decomp);
|
|
Packit Service |
5a9772 |
rc = interleaved_decompress(decoder, tmp, DstSize, w, h, bpp, pDstData, format, step, x, y, w,
|
|
Packit Service |
5a9772 |
h, NULL);
|
|
Packit |
1fb8d4 |
PROFILER_EXIT(profiler_decomp);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!rc)
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (i = 0; i < h; i++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
const BYTE* srcLine = &pSrcData[i * step];
|
|
Packit |
1fb8d4 |
const BYTE* dstLine = &pDstData[i * step];
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (j = 0; j < w; j++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
BYTE r, g, b, dr, dg, db;
|
|
Packit |
1fb8d4 |
const UINT32 srcColor = ReadColor(&srcLine[j * bstep], format);
|
|
Packit |
1fb8d4 |
const UINT32 dstColor = ReadColor(&dstLine[j * bstep], format);
|
|
Packit |
1fb8d4 |
SplitColor(srcColor, format, &r, &g, &b, NULL, NULL);
|
|
Packit |
1fb8d4 |
SplitColor(dstColor, format, &dr, &dg, &db, NULL, NULL);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (fabsf((float)r - dr) > maxDiff)
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (fabsf((float)g - dg) > maxDiff)
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (fabsf((float)b - db) > maxDiff)
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
rc2 = TRUE;
|
|
Packit |
1fb8d4 |
fail:
|
|
Packit |
1fb8d4 |
free(pSrcData);
|
|
Packit |
1fb8d4 |
free(pDstData);
|
|
Packit |
1fb8d4 |
free(tmp);
|
|
Packit |
1fb8d4 |
return rc2;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
static const char* get_profiler_name(BOOL encode, UINT16 bpp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
switch (bpp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
case 24:
|
|
Packit |
1fb8d4 |
if (encode)
|
|
Packit |
1fb8d4 |
return "interleaved_compress 24bpp";
|
|
Packit |
1fb8d4 |
else
|
|
Packit |
1fb8d4 |
return "interleaved_decompress 24bpp";
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
case 16:
|
|
Packit |
1fb8d4 |
if (encode)
|
|
Packit |
1fb8d4 |
return "interleaved_compress 16bpp";
|
|
Packit |
1fb8d4 |
else
|
|
Packit |
1fb8d4 |
return "interleaved_decompress 16bpp";
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
case 15:
|
|
Packit |
1fb8d4 |
if (encode)
|
|
Packit |
1fb8d4 |
return "interleaved_compress 15bpp";
|
|
Packit |
1fb8d4 |
else
|
|
Packit |
1fb8d4 |
return "interleaved_decompress 15bpp";
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
default:
|
|
Packit |
1fb8d4 |
return "configuration error!";
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
static BOOL run_encode_decode(UINT16 bpp, BITMAP_INTERLEAVED_CONTEXT* encoder,
|
|
Packit |
1fb8d4 |
BITMAP_INTERLEAVED_CONTEXT* decoder)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
BOOL rc = FALSE;
|
|
Packit |
1fb8d4 |
UINT32 x;
|
|
Packit |
1fb8d4 |
PROFILER_DEFINE(profiler_comp);
|
|
Packit |
1fb8d4 |
PROFILER_DEFINE(profiler_decomp);
|
|
Packit |
1fb8d4 |
PROFILER_CREATE(profiler_comp, get_profiler_name(TRUE, bpp))
|
|
Packit |
1fb8d4 |
PROFILER_CREATE(profiler_decomp, get_profiler_name(FALSE, bpp))
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (x = 0; x < 500; x++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
if (!run_encode_decode_single(bpp, encoder, decoder
|
|
Packit |
1fb8d4 |
#if defined(WITH_PROFILER)
|
|
Packit Service |
5a9772 |
,
|
|
Packit Service |
5a9772 |
profiler_comp, profiler_decomp
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit Service |
5a9772 |
))
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
rc = TRUE;
|
|
Packit |
1fb8d4 |
fail:
|
|
Packit |
1fb8d4 |
PROFILER_PRINT_HEADER
|
|
Packit |
1fb8d4 |
PROFILER_PRINT(profiler_comp);
|
|
Packit |
1fb8d4 |
PROFILER_PRINT(profiler_decomp);
|
|
Packit |
1fb8d4 |
PROFILER_PRINT_FOOTER
|
|
Packit |
1fb8d4 |
PROFILER_FREE(profiler_comp);
|
|
Packit |
1fb8d4 |
PROFILER_FREE(profiler_decomp);
|
|
Packit |
1fb8d4 |
return rc;
|
|
Packit |
1fb8d4 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static BOOL TestColorConversion(void)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
const UINT32 formats[] = { PIXEL_FORMAT_RGB15, PIXEL_FORMAT_BGR15, PIXEL_FORMAT_ABGR15,
|
|
Packit Service |
5a9772 |
PIXEL_FORMAT_ARGB15, PIXEL_FORMAT_BGR16, PIXEL_FORMAT_RGB16 };
|
|
Packit Service |
5a9772 |
UINT32 x;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
/* Check color conversion 15/16 -> 32bit maps to proper values */
|
|
Packit Service |
5a9772 |
for (x = 0; x < ARRAYSIZE(formats); x++)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
const UINT32 dstFormat = PIXEL_FORMAT_RGBA32;
|
|
Packit Service |
5a9772 |
const UINT32 format = formats[x];
|
|
Packit Service |
5a9772 |
const UINT32 colorLow = FreeRDPGetColor(format, 0, 0, 0, 255);
|
|
Packit Service |
5a9772 |
const UINT32 colorHigh = FreeRDPGetColor(format, 255, 255, 255, 255);
|
|
Packit Service |
5a9772 |
const UINT32 colorLow32 = FreeRDPConvertColor(colorLow, format, dstFormat, NULL);
|
|
Packit Service |
5a9772 |
const UINT32 colorHigh32 = FreeRDPConvertColor(colorHigh, format, dstFormat, NULL);
|
|
Packit Service |
5a9772 |
BYTE r, g, b, a;
|
|
Packit Service |
5a9772 |
SplitColor(colorLow32, dstFormat, &r, &g, &b, &a, NULL);
|
|
Packit Service |
5a9772 |
if ((r != 0) || (g != 0) || (b != 0))
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
SplitColor(colorHigh32, dstFormat, &r, &g, &b, &a, NULL);
|
|
Packit Service |
5a9772 |
if ((r != 255) || (g != 255) || (b != 255))
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
return TRUE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit |
1fb8d4 |
int TestFreeRDPCodecInterleaved(int argc, char* argv[])
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
BITMAP_INTERLEAVED_CONTEXT *encoder, *decoder;
|
|
Packit |
1fb8d4 |
int rc = -1;
|
|
Packit Service |
5a9772 |
WINPR_UNUSED(argc);
|
|
Packit Service |
5a9772 |
WINPR_UNUSED(argv);
|
|
Packit |
1fb8d4 |
encoder = bitmap_interleaved_context_new(TRUE);
|
|
Packit |
1fb8d4 |
decoder = bitmap_interleaved_context_new(FALSE);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!encoder || !decoder)
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!run_encode_decode(24, encoder, decoder))
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!run_encode_decode(16, encoder, decoder))
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!run_encode_decode(15, encoder, decoder))
|
|
Packit |
1fb8d4 |
goto fail;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!TestColorConversion())
|
|
Packit Service |
5a9772 |
goto fail;
|
|
Packit Service |
5a9772 |
|
|
Packit |
1fb8d4 |
rc = 0;
|
|
Packit |
1fb8d4 |
fail:
|
|
Packit |
1fb8d4 |
bitmap_interleaved_context_free(encoder);
|
|
Packit |
1fb8d4 |
bitmap_interleaved_context_free(decoder);
|
|
Packit |
1fb8d4 |
return rc;
|
|
Packit |
1fb8d4 |
}
|