return TRUE;
}
+static BOOL similarRGB(const BYTE* src, const BYTE* dst, size_t size, UINT32 format)
+{
+ size_t x;
+ const UINT32 bpp = GetBytesPerPixel(format);
+ const BOOL alpha = ColorHasAlpha(format);
+
+ for (x = 0; x < size; x++)
+ {
+ UINT32 sColor, dColor;
+ BYTE sR, sG, sB, sA;
+ BYTE dR, dG, dB, dA;
+ sColor = ReadColor(src, format);
+ dColor = ReadColor(dst, format);
+ src += bpp;
+ dst += bpp;
+ SplitColor(sColor, format, &sR, &sG, &sB, &sA, NULL);
+ SplitColor(sColor, format, &dR, &dG, &dB, &dA, NULL);
+
+ if ((abs(sR - dR) > 2) || (abs(sG - dG) > 2) || (abs(sB - dB) > 2))
+ {
+ fprintf(stderr, "Color value mismatch R[%02X %02X], G[%02X %02X], B[%02X %02X] at position %lu",
+ sR, dR, sG, dG, sA, dA, x);
+ return FALSE;
+ }
+
+ if (alpha)
+ {
+ if (abs(sA - dA) > 2)
+ {
+ fprintf(stderr, "Alpha value mismatch %02X %02X at position %lu", sA, dA, x);
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (dA != 0xFF)
+ {
+ fprintf(stderr, "Invalid destination alpha value %02X at position %lu", dA, x);
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
static void get_size(UINT32* width, UINT32* height)
{
winpr_RAND((BYTE*)width, sizeof(*width));
}
static BOOL check_padding(const BYTE* psrc, size_t size, size_t padding,
- const char* buffer)
+ const char* buffer)
{
size_t x;
BOOL rc = TRUE;
x++;
fprintf(stderr, "Buffer underflow detected %02"PRIx8" != %02X %s [%"PRIuz"-%"PRIuz"]\n",
- d, 'A', buffer, start, x);
+ d, 'A', buffer, start, x);
return FALSE;
}
x++;
fprintf(stderr, "Buffer overflow detected %02"PRIx8" != %02X %s [%"PRIuz"-%"PRIuz"]\n",
- d, 'A', buffer, start, x);
+ d, 'A', buffer, start, x);
return FALSE;
}
}
awidth = roi.width + 16 - roi.width % 16;
aheight = roi.height + 16 - roi.height % 16;
fprintf(stderr, "Running YUVCombine on frame size %"PRIu32"x%"PRIu32" [%"PRIu32"x%"PRIu32"]\n",
- roi.width, roi.height, awidth, aheight);
+ roi.width, roi.height, awidth, aheight);
if (!prims || !prims->YUV420CombineToYUV444)
goto fail;
}
if (prims->YUV420CombineToYUV444((const BYTE**)luma, lumaStride,
- (const BYTE**)chroma, chromaStride,
- yuv, yuvStride, &roi) != PRIMITIVES_SUCCESS)
+ (const BYTE**)chroma, chromaStride,
+ yuv, yuvStride, &roi) != PRIMITIVES_SUCCESS)
goto fail;
for (x = 0; x < 3; x++)
}
if (prims->YUV444SplitToYUV420((const BYTE**)yuv, yuvStride, pmain, lumaStride,
- paux, chromaStride, &roi) != PRIMITIVES_SUCCESS)
+ paux, chromaStride, &roi) != PRIMITIVES_SUCCESS)
goto fail;
for (x = 0; x < 3; x++)
}
if (!similar(luma[i] + y * lstride,
- pmain[i] + y * lstride,
- w))
+ pmain[i] + y * lstride,
+ w))
goto fail;
/* Need to ignore lines of destination Y plane,
}
if (!similar(chroma[i] + y * cstride,
- paux[i] + y * cstride,
- w))
+ paux[i] + y * cstride,
+ w))
goto fail;
}
}
size_t uvsize, uvwidth;
size_t padding = 10000;
size_t stride;
+ const UINT32 formats[] =
+ {
+ PIXEL_FORMAT_XRGB32,
+ PIXEL_FORMAT_XBGR32,
+ PIXEL_FORMAT_ARGB32,
+ PIXEL_FORMAT_ABGR32,
+ PIXEL_FORMAT_RGBA32,
+ PIXEL_FORMAT_RGBX32,
+ PIXEL_FORMAT_BGRA32,
+ PIXEL_FORMAT_BGRX32
+ };
get_size(&roi.width, &roi.height);
/* Buffers need to be 16x16 aligned. */
awidth = roi.width + 16 - roi.width % 16;
}
fprintf(stderr, "Running AVC%s on frame size %"PRIu32"x%"PRIu32"\n", use444 ? "444" : "420",
- roi.width, roi.height);
+ roi.width, roi.height);
/* Test RGB to YUV444 conversion and vice versa */
if (!(rgb = set_padding(size * sizeof(UINT32), padding)))
yuv_step[1] = uvwidth;
yuv_step[2] = uvwidth;
- if (use444)
+ for (x = 0; x < sizeof(formats) / sizeof(formats[0]); x++)
{
- if (prims->RGBToYUV444_8u_P3AC4R(rgb, PIXEL_FORMAT_BGRA32,
- stride, yuv, yuv_step,
- &roi) != PRIMITIVES_SUCCESS)
+ const UINT32 DstFormat = formats[x];
+
+ if (use444)
+ {
+ if (prims->RGBToYUV444_8u_P3AC4R(rgb, DstFormat,
+ stride, yuv, yuv_step,
+ &roi) != PRIMITIVES_SUCCESS)
+ goto fail;
+ }
+ else if (prims->RGBToYUV420_8u_P3AC4R(rgb, DstFormat,
+ stride, yuv, yuv_step,
+ &roi) != PRIMITIVES_SUCCESS)
goto fail;
- }
- else if (prims->RGBToYUV420_8u_P3AC4R(rgb, PIXEL_FORMAT_BGRA32,
- stride, yuv, yuv_step,
- &roi) != PRIMITIVES_SUCCESS)
- goto fail;
- if (!check_padding(rgb, size * sizeof(UINT32), padding, "rgb"))
- goto fail;
+ if (!check_padding(rgb, size * sizeof(UINT32), padding, "rgb"))
+ goto fail;
- if ((!check_padding(yuv[0], size, padding, "Y")) ||
- (!check_padding(yuv[1], uvsize, padding, "U")) ||
- (!check_padding(yuv[2], uvsize, padding, "V")))
- goto fail;
+ if ((!check_padding(yuv[0], size, padding, "Y")) ||
+ (!check_padding(yuv[1], uvsize, padding, "U")) ||
+ (!check_padding(yuv[2], uvsize, padding, "V")))
+ goto fail;
- if (use444)
- {
- if (prims->YUV444ToRGB_8u_P3AC4R((const BYTE**)yuv, yuv_step, rgb_dst, stride,
- PIXEL_FORMAT_BGRA32,
- &roi) != PRIMITIVES_SUCCESS)
+ if (use444)
+ {
+ if (prims->YUV444ToRGB_8u_P3AC4R((const BYTE**)yuv, yuv_step, rgb_dst, stride,
+ DstFormat,
+ &roi) != PRIMITIVES_SUCCESS)
+ goto fail;
+ }
+ else if (prims->YUV420ToRGB_8u_P3AC4R((const BYTE**)yuv, yuv_step, rgb_dst,
+ stride, DstFormat, &roi) != PRIMITIVES_SUCCESS)
goto fail;
- }
- else if (prims->YUV420ToRGB_8u_P3AC4R((const BYTE**)yuv, yuv_step, rgb_dst,
- stride, PIXEL_FORMAT_BGRA32, &roi) != PRIMITIVES_SUCCESS)
- goto fail;
- if (!check_padding(rgb_dst, size * sizeof(UINT32), padding, "rgb dst"))
- goto fail;
+ if (!check_padding(rgb_dst, size * sizeof(UINT32), padding, "rgb dst"))
+ goto fail;
- if ((!check_padding(yuv[0], size, padding, "Y")) ||
- (!check_padding(yuv[1], uvsize, padding, "U")) ||
- (!check_padding(yuv[2], uvsize, padding, "V")))
- goto fail;
+ if ((!check_padding(yuv[0], size, padding, "Y")) ||
+ (!check_padding(yuv[1], uvsize, padding, "U")) ||
+ (!check_padding(yuv[2], uvsize, padding, "V")))
+ goto fail;
- for (y = 0; y < roi.height; y++)
- {
- BYTE* srgb = &rgb[y * stride];
- BYTE* drgb = &rgb_dst[y * stride];
+ for (y = 0; y < roi.height; y++)
+ {
+ BYTE* srgb = &rgb[y * stride];
+ BYTE* drgb = &rgb_dst[y * stride];
- if (!similar(srgb, drgb, roi.width * sizeof(UINT32)))
- goto fail;
+ if (!similarRGB(srgb, drgb, roi.width, DstFormat))
+ goto fail;
+ }
}
rc = TRUE;
{
UINT32 x;
int rc = -1;
-
prim_test_setup(FALSE);
for (x = 0; x < 10; x++)