template <bool align> void BgrToYuv420p(const uint8_t * bgr, size_t width, size_t height, size_t bgrStride, uint8_t * y, size_t yStride, uint8_t * u, size_t uStride, uint8_t * v, size_t vStride) { assert((width % 2 == 0) && (height % 2 == 0) && (width >= DA) && (height >= 2)); if (align) { assert(Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride)); assert(Aligned(v) && Aligned(vStride) && Aligned(bgr) && Aligned(bgrStride)); } size_t alignedWidth = AlignLo(width, DA); const size_t A6 = A * 6; for (size_t row = 0; row < height; row += 2) { Storer<align> _y0(y), _y1(y + yStride), _u(u), _v(v); BgrToYuv420p<align, true>(bgr, bgrStride, _y0, _y1, _u, _v); for (size_t col = DA, colBgr = A6; col < alignedWidth; col += DA, colBgr += A6) BgrToYuv420p<align, false>(bgr + colBgr, bgrStride, _y0, _y1, _u, _v); Flush(_y0, _y1, _u, _v); if (width != alignedWidth) { size_t offset = width - DA; Storer<false> _y0(y + offset), _y1(y + offset + yStride), _u(u + offset / 2), _v(v + offset / 2); BgrToYuv420p<false, true>(bgr + offset * 3, bgrStride, _y0, _y1, _u, _v); Flush(_y0, _y1, _u, _v); } y += 2 * yStride; u += uStride; v += vStride; bgr += 2 * bgrStride; } }
void test_y0(void) { ieee_double tested; ieee_double expected; ieee_double result; expected.l = 0; errno = 0xDEADBEEF; tested.l = 0xFFFFFFFFFFFFFFFFLL; expected.l = 0xFFFFFFFFFFFFFFFFLL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0xFFF8000000000001LL; expected.l = 0xFFF8000000000001LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0xFFF8000000000000LL; expected.l = 0xFFF8000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0xFFF7FFFFFFFFFFFFLL; expected.l = 0xFFFFFFFFFFFFFFFFLL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0xFFF0000000000001LL; expected.l = 0xFFF8000000000001LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0xFFF0000000000000LL; expected.l = 0xFFF8000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0xFFEFFFFFFFFFFFFFLL; expected.l = 0xFFF8000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x8010000000000000LL; expected.l = 0xFFF8000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x800FFFFFFFFFFFFFLL; expected.l = 0xFFF8000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x8000000000000001LL; expected.l = 0xFFF8000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x8000000000000000LL; expected.l = 0xFFF0000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == ERANGE, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x0000000000000000LL; expected.l = 0xFFF0000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == ERANGE, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x0000000000000001LL; expected.l = 0xC07D9FFC3469E1B3LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == 0xDEADBEEF, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x000FFFFFFFFFFFFFLL; expected.l = 0xC07C30D8F820740ELL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == 0xDEADBEEF, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x0010000000000000LL; expected.l = 0xC07C30D8F820740ELL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == 0xDEADBEEF, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x7FEFFFFFFFFFFFFFLL; expected.l = 0x9FD5A36F8428F58BLL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == 0xDEADBEEF, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x7FF0000000000000LL; expected.l = 0xFFF8000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x7FF0000000000001LL; expected.l = 0x7FF8000000000001LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x7FF7FFFFFFFFFFFFLL; expected.l = 0x7FFFFFFFFFFFFFFFLL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x7FF8000000000000LL; expected.l = 0x7FF8000000000000LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); errno = 0xDEADBEEF; tested.l = 0x7FFFFFFFFFFFFFFFLL; expected.l = 0x7FFFFFFFFFFFFFFFLL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == EDOM, "errno: %d\n", errno); /* MSDN example */ errno = 0xDEADBEEF; tested.d = 2.387000; expected.l = 0x3FE05FB1B1E49E66LL; result.d = _y0(tested.d); ok(result.l == expected.l, "_y0 returned: %I64x\n", result.l); ok(errno == 0xDEADBEEF, "errno: %d\n", errno); }