Blame libfreerdp/codec/test/TestFreeRDPCodecInterleaved.c

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 1fb8d4
                                     , PROFILER* profiler_comp, PROFILER* profiler_decomp
Packit 1fb8d4
#endif
Packit 1fb8d4
                                    )
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 1fb8d4
	rc = interleaved_compress(encoder, tmp, &DstSize, w, h, pSrcData,
Packit 1fb8d4
	                          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 1fb8d4
	rc = interleaved_decompress(decoder, tmp, DstSize, w, h, bpp, pDstData,
Packit 1fb8d4
	                            format, step, x, y, w, 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 1fb8d4
		                              , profiler_comp, profiler_decomp
Packit 1fb8d4
#endif
Packit 1fb8d4
		                             ))
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 1fb8d4
int TestFreeRDPCodecInterleaved(int argc, char* argv[])
Packit 1fb8d4
{
Packit 1fb8d4
	BITMAP_INTERLEAVED_CONTEXT* encoder, * decoder;
Packit 1fb8d4
	int rc = -1;
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 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
}