2016-03-02 17:16:49 +03:00
|
|
|
|
|
|
|
#include "prim_test.h"
|
|
|
|
|
|
|
|
#include <winpr/wlog.h>
|
|
|
|
#include <winpr/crypto.h>
|
|
|
|
#include <freerdp/primitives.h>
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define TAG __FILE__
|
|
|
|
|
|
|
|
/* YUV to RGB conversion is lossy, so consider every value only
|
|
|
|
* differing by less than 2 abs equal. */
|
|
|
|
static BOOL similar(const BYTE* src, const BYTE* dst, size_t size)
|
|
|
|
{
|
|
|
|
size_t x;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
for (x = 0; x < size; x++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
|
|
|
volatile double val1 = (double)src[x];
|
|
|
|
volatile double val2 = (double)dst[x];
|
|
|
|
volatile double diff = val1 - val2;
|
|
|
|
|
|
|
|
if (abs(diff) > 2)
|
|
|
|
{
|
2016-05-27 16:53:49 +03:00
|
|
|
fprintf(stderr, "%lu %02X : %02X diff=%lf\n", (unsigned long)x, val1, val2, diff);
|
2016-03-02 17:16:49 +03:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void get_size(UINT32* width, UINT32* height)
|
|
|
|
{
|
|
|
|
winpr_RAND((BYTE*)width, sizeof(*width));
|
|
|
|
winpr_RAND((BYTE*)height, sizeof(*height));
|
|
|
|
// TODO: Algorithm only works on even resolutions...
|
|
|
|
*width = (*width % 4000) << 1;
|
|
|
|
*height = (*height % 4000 << 1);
|
|
|
|
}
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
static BOOL check_padding(const BYTE* psrc, size_t size, size_t padding,
|
|
|
|
const char* buffer)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
|
|
|
size_t x;
|
|
|
|
BOOL rc = TRUE;
|
|
|
|
const BYTE* src;
|
|
|
|
const BYTE* esrc;
|
2016-04-05 18:07:45 +03:00
|
|
|
size_t halfPad = (padding + 1) / 2;
|
2016-03-02 17:16:49 +03:00
|
|
|
|
|
|
|
if (!psrc)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
src = psrc - halfPad;
|
|
|
|
esrc = src + size + halfPad;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
|
|
|
for (x = 0; x < halfPad; x++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
|
|
|
const BYTE s = *src++;
|
|
|
|
const BYTE d = *esrc++;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (s != 'A')
|
|
|
|
{
|
|
|
|
size_t start = x;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
|
|
|
while ((x < halfPad) && (*esrc++ != 'A'))
|
2016-03-02 17:16:49 +03:00
|
|
|
x++;
|
|
|
|
|
2016-05-27 16:53:49 +03:00
|
|
|
fprintf(stderr, "Buffer underflow detected %02x != %02X %s [%lu-%lu]\n",
|
|
|
|
d, 'A', buffer, (unsigned long)start, (unsigned long)x);
|
2016-03-02 17:16:49 +03:00
|
|
|
return FALSE;
|
|
|
|
}
|
2016-04-05 18:07:45 +03:00
|
|
|
|
|
|
|
if (d != 'A')
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
|
|
|
size_t start = x;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
|
|
|
while ((x < halfPad) && (*esrc++ != 'A'))
|
2016-03-02 17:16:49 +03:00
|
|
|
x++;
|
|
|
|
|
2016-05-27 16:53:49 +03:00
|
|
|
fprintf(stderr, "Buffer overflow detected %02x != %02X %s [%lu-%lu]\n",
|
|
|
|
d, 'A', buffer, (unsigned long)start, (unsigned long)x);
|
2016-03-02 17:16:49 +03:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void* set_padding(size_t size, size_t padding)
|
|
|
|
{
|
|
|
|
size_t halfPad = (padding + 1) / 2;
|
|
|
|
BYTE* psrc;
|
|
|
|
BYTE* src = calloc(1, size + 2 * halfPad);
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!src)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
memset(&src[0], 'A', halfPad);
|
2016-04-05 18:07:45 +03:00
|
|
|
memset(&src[halfPad + size], 'A', halfPad);
|
2016-03-02 17:16:49 +03:00
|
|
|
psrc = &src[halfPad];
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(psrc, size, padding, "init"))
|
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
free(src);
|
2016-03-02 17:16:49 +03:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return psrc;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void free_padding(void* src, size_t padding)
|
|
|
|
{
|
|
|
|
BYTE* ptr;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!src)
|
|
|
|
return;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
ptr = ((BYTE*)src) - (padding + 1) / 2;
|
2016-03-02 17:16:49 +03:00
|
|
|
free(ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Create 2 pseudo YUV420 frames of same size.
|
|
|
|
* Combine them and check, if the data is at the expected position. */
|
|
|
|
static BOOL TestPrimitiveYUVCombine(void)
|
|
|
|
{
|
|
|
|
UINT32 x, y, i;
|
|
|
|
UINT32 awidth, aheight;
|
|
|
|
BOOL rc = FALSE;
|
|
|
|
BYTE* luma[3] = { 0 };
|
|
|
|
BYTE* chroma[3] = { 0 };
|
|
|
|
BYTE* yuv[3] = { 0 };
|
|
|
|
BYTE* pmain[3] = { 0 };
|
|
|
|
BYTE* paux[3] = { 0 };
|
|
|
|
UINT32 lumaStride[3];
|
|
|
|
UINT32 chromaStride[3];
|
|
|
|
UINT32 yuvStride[3];
|
|
|
|
size_t padding = 10000;
|
|
|
|
prim_size_t roi;
|
|
|
|
primitives_t* prims = primitives_get();
|
|
|
|
get_size(&roi.width, &roi.height);
|
|
|
|
awidth = roi.width + 16 - roi.width % 16;
|
|
|
|
aheight = roi.height + 16 - roi.height % 16;
|
|
|
|
fprintf(stderr, "Running YUVCombine on frame size %lux%lu [%lux%lu]\n",
|
2016-04-05 18:07:45 +03:00
|
|
|
roi.width, roi.height, awidth, aheight);
|
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!prims || !prims->YUV420CombineToYUV444)
|
|
|
|
goto fail;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
for (x = 0; x < 3; x++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
size_t halfStride = ((x > 0) ? awidth / 2 : awidth);
|
2016-03-02 17:16:49 +03:00
|
|
|
size_t size = aheight * awidth;
|
2016-04-05 18:07:45 +03:00
|
|
|
size_t halfSize = ((x > 0) ? halfStride * aheight / 2 : awidth * aheight);
|
2016-03-02 17:16:49 +03:00
|
|
|
yuvStride[x] = awidth;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!(yuv[x] = set_padding(size, padding)))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
lumaStride[x] = halfStride;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!(luma[x] = set_padding(halfSize, padding)))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (!(pmain[x] = set_padding(halfSize, padding)))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
chromaStride[x] = halfStride;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!(chroma[x] = set_padding(halfSize, padding)))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (!(paux[x] = set_padding(halfSize, padding)))
|
|
|
|
goto fail;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
memset(luma[x], 0xAB + 3 * x, halfSize);
|
|
|
|
memset(chroma[x], 0x80 + 2 * x, halfSize);
|
2016-03-02 17:16:49 +03:00
|
|
|
|
|
|
|
if (!check_padding(luma[x], halfSize, padding, "luma"))
|
|
|
|
goto fail;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(chroma[x], halfSize, padding, "chroma"))
|
|
|
|
goto fail;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(pmain[x], halfSize, padding, "main"))
|
|
|
|
goto fail;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(paux[x], halfSize, padding, "aux"))
|
|
|
|
goto fail;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(yuv[x], size, padding, "yuv"))
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (prims->YUV420CombineToYUV444((const BYTE**)luma, lumaStride,
|
2016-04-05 18:07:45 +03:00
|
|
|
(const BYTE**)chroma, chromaStride,
|
2016-03-02 17:16:49 +03:00
|
|
|
yuv, yuvStride, &roi) != PRIMITIVES_SUCCESS)
|
|
|
|
goto fail;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
for (x = 0; x < 3; x++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
size_t halfStride = ((x > 0) ? awidth / 2 : awidth);
|
2016-03-02 17:16:49 +03:00
|
|
|
size_t size = aheight * awidth;
|
2016-04-05 18:07:45 +03:00
|
|
|
size_t halfSize = ((x > 0) ? halfStride * aheight / 2 : awidth * aheight);
|
2016-03-02 17:16:49 +03:00
|
|
|
|
|
|
|
if (!check_padding(luma[x], halfSize, padding, "luma"))
|
|
|
|
goto fail;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(chroma[x], halfSize, padding, "chroma"))
|
|
|
|
goto fail;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(yuv[x], size, padding, "yuv"))
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
if (prims->YUV444SplitToYUV420((const BYTE**)yuv, yuvStride, pmain, lumaStride,
|
2016-03-02 17:16:49 +03:00
|
|
|
paux, chromaStride, &roi) != PRIMITIVES_SUCCESS)
|
|
|
|
goto fail;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
for (x = 0; x < 3; x++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
size_t halfStride = ((x > 0) ? awidth / 2 : awidth);
|
2016-03-02 17:16:49 +03:00
|
|
|
size_t size = aheight * awidth;
|
2016-04-05 18:07:45 +03:00
|
|
|
size_t halfSize = ((x > 0) ? halfStride * aheight / 2 : awidth * aheight);
|
2016-03-02 17:16:49 +03:00
|
|
|
|
|
|
|
if (!check_padding(pmain[x], halfSize, padding, "main"))
|
|
|
|
goto fail;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(paux[x], halfSize, padding, "aux"))
|
|
|
|
goto fail;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!check_padding(yuv[x], size, padding, "yuv"))
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
for (i = 0; i < 3; i++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
for (y = 0; y < roi.height; y++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
|
|
|
UINT32 w = roi.width;
|
|
|
|
UINT32 lstride = lumaStride[i];
|
|
|
|
UINT32 cstride = chromaStride[i];
|
|
|
|
|
|
|
|
if (i > 0)
|
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
w = (roi.width + 3) / 4;
|
|
|
|
|
|
|
|
if (roi.height > (roi.height + 1) / 2)
|
2016-03-02 17:16:49 +03:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!similar(luma[i] + y * lstride,
|
|
|
|
pmain[i] + y * lstride,
|
|
|
|
w))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
/* Need to ignore lines of destination Y plane,
|
|
|
|
* if the lines are not a multiple of 16
|
|
|
|
* as the UV planes are packed in 8 line stripes. */
|
|
|
|
if (i == 0)
|
|
|
|
{
|
|
|
|
/* TODO: This check is not perfect, it does not
|
|
|
|
* include the last V lines packed to the Y
|
|
|
|
* frame. */
|
|
|
|
UINT32 rem = roi.height % 16;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (y > roi.height - rem)
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!similar(chroma[i] + y * cstride,
|
|
|
|
paux[i] + y * cstride,
|
|
|
|
w))
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
rc = TRUE;
|
|
|
|
fail:
|
2016-04-05 18:07:45 +03:00
|
|
|
|
|
|
|
for (x = 0; x < 3; x++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
|
|
|
free_padding(yuv[x], padding);
|
|
|
|
free_padding(luma[x], padding);
|
|
|
|
free_padding(chroma[x], padding);
|
|
|
|
free_padding(pmain[x], padding);
|
|
|
|
free_padding(paux[x], padding);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
static BOOL TestPrimitiveYUV(BOOL use444)
|
|
|
|
{
|
|
|
|
BOOL rc = FALSE;
|
|
|
|
UINT32 x, y;
|
|
|
|
UINT32 awidth, aheight;
|
|
|
|
BYTE* yuv[3] = {0};
|
|
|
|
UINT32 yuv_step[3];
|
|
|
|
prim_size_t roi;
|
|
|
|
BYTE* rgb = NULL;
|
|
|
|
BYTE* rgb_dst = NULL;
|
|
|
|
size_t size;
|
|
|
|
primitives_t* prims = primitives_get();
|
|
|
|
size_t uvsize, uvwidth;
|
|
|
|
size_t padding = 10000;
|
|
|
|
size_t stride;
|
|
|
|
get_size(&roi.width, &roi.height);
|
|
|
|
/* Buffers need to be 16x16 aligned. */
|
|
|
|
awidth = roi.width + 16 - roi.width % 16;
|
|
|
|
aheight = roi.height + 16 - roi.height % 16;
|
|
|
|
stride = awidth * sizeof(UINT32);
|
|
|
|
size = awidth * aheight;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (use444)
|
|
|
|
{
|
|
|
|
uvwidth = awidth;
|
|
|
|
uvsize = size;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!prims || !prims->RGBToYUV444_8u_P3AC4R || !prims->YUV444ToRGB_8u_P3AC4R)
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
uvwidth = (awidth + 1) / 2;
|
|
|
|
uvsize = (aheight + 1) / 2 * uvwidth;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!prims || !prims->RGBToYUV420_8u_P3AC4R || !prims->YUV420ToRGB_8u_P3AC4R)
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(stderr, "Running AVC%s on frame size %lux%lu\n", use444 ? "444" : "420",
|
2016-04-05 18:07:45 +03:00
|
|
|
roi.width, roi.height);
|
2016-03-02 17:16:49 +03:00
|
|
|
|
|
|
|
/* Test RGB to YUV444 conversion and vice versa */
|
|
|
|
if (!(rgb = set_padding(size * sizeof(UINT32), padding)))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (!(rgb_dst = set_padding(size * sizeof(UINT32), padding)))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (!(yuv[0] = set_padding(size, padding)))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (!(yuv[1] = set_padding(uvsize, padding)))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (!(yuv[2] = set_padding(uvsize, padding)))
|
|
|
|
goto fail;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
for (y = 0; y < roi.height; y++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
BYTE* line = &rgb[y * stride];
|
|
|
|
|
|
|
|
for (x = 0; x < roi.width; x++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
line[x * 4 + 0] = 0x81;
|
|
|
|
line[x * 4 + 1] = 0x33;
|
|
|
|
line[x * 4 + 2] = 0xAB;
|
|
|
|
line[x * 4 + 3] = 0xFF;
|
2016-03-02 17:16:49 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
yuv_step[0] = awidth;
|
|
|
|
yuv_step[1] = uvwidth;
|
|
|
|
yuv_step[2] = uvwidth;
|
|
|
|
|
|
|
|
if (use444)
|
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
if (prims->RGBToYUV444_8u_P3AC4R(rgb, stride, yuv, yuv_step,
|
|
|
|
&roi) != PRIMITIVES_SUCCESS)
|
2016-03-02 17:16:49 +03:00
|
|
|
goto fail;
|
|
|
|
}
|
2016-04-05 18:07:45 +03:00
|
|
|
else if (prims->RGBToYUV420_8u_P3AC4R(rgb, stride, yuv, yuv_step,
|
|
|
|
&roi) != PRIMITIVES_SUCCESS)
|
2016-03-02 17:16:49 +03:00
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (!check_padding(rgb, size * sizeof(UINT32), padding, "rgb"))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if ((!check_padding(yuv[0], size, padding, "Y")) ||
|
2016-04-05 18:07:45 +03:00
|
|
|
(!check_padding(yuv[1], uvsize, padding, "U")) ||
|
|
|
|
(!check_padding(yuv[2], uvsize, padding, "V")))
|
2016-03-02 17:16:49 +03:00
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (use444)
|
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
if (prims->YUV444ToRGB_8u_P3AC4R((const BYTE**)yuv, yuv_step, rgb_dst, stride,
|
|
|
|
PIXEL_FORMAT_BGRA32,
|
|
|
|
&roi) != PRIMITIVES_SUCCESS)
|
2016-03-02 17:16:49 +03:00
|
|
|
goto fail;
|
|
|
|
}
|
2016-04-05 18:07:45 +03:00
|
|
|
else if (prims->YUV420ToRGB_8u_P3AC4R((const BYTE**)yuv, yuv_step, rgb_dst,
|
|
|
|
stride, PIXEL_FORMAT_BGRA32, &roi) != PRIMITIVES_SUCCESS)
|
2016-03-02 17:16:49 +03:00
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (!check_padding(rgb_dst, size * sizeof(UINT32), padding, "rgb dst"))
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if ((!check_padding(yuv[0], size, padding, "Y")) ||
|
2016-04-05 18:07:45 +03:00
|
|
|
(!check_padding(yuv[1], uvsize, padding, "U")) ||
|
|
|
|
(!check_padding(yuv[2], uvsize, padding, "V")))
|
2016-03-02 17:16:49 +03:00
|
|
|
goto fail;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
for (y = 0; y < roi.height; y++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
2016-04-05 18:07:45 +03:00
|
|
|
BYTE* srgb = &rgb[y * stride];
|
|
|
|
BYTE* drgb = &rgb_dst[y * stride];
|
2016-03-02 17:16:49 +03:00
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
if (!similar(srgb, drgb, roi.width * sizeof(UINT32)))
|
2016-03-02 17:16:49 +03:00
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
rc = TRUE;
|
|
|
|
fail:
|
2016-04-05 18:07:45 +03:00
|
|
|
free_padding(rgb, padding);
|
|
|
|
free_padding(rgb_dst, padding);
|
|
|
|
free_padding(yuv[0], padding);
|
|
|
|
free_padding(yuv[1], padding);
|
|
|
|
free_padding(yuv[2], padding);
|
2016-03-02 17:16:49 +03:00
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
int TestPrimitivesYUV(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
UINT32 x;
|
|
|
|
int rc = -1;
|
|
|
|
|
2016-04-05 18:07:45 +03:00
|
|
|
for (x = 0; x < 10; x++)
|
2016-03-02 17:16:49 +03:00
|
|
|
{
|
|
|
|
/* TODO: This test fails on value comparison,
|
|
|
|
* there seems to be some issue left with encoder / decoder pass.
|
|
|
|
if (!TestPrimitiveYUV(FALSE))
|
|
|
|
goto end;
|
|
|
|
*/
|
|
|
|
if (!TestPrimitiveYUV(TRUE))
|
|
|
|
goto end;
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
if (!TestPrimitiveYUVCombine())
|
|
|
|
goto end;
|
|
|
|
}
|
2016-04-05 18:07:45 +03:00
|
|
|
|
2016-03-02 17:16:49 +03:00
|
|
|
rc = 0;
|
|
|
|
end:
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|