/************************************************************************** * * Copyright 2010 VMware, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * **************************************************************************/ /** * @file * YUV and RGB subsampled formats conversion. * * @author Jose Fonseca <jfonseca@vmware.com> */ #include "util/u_format_yuv.h" void util_format_r8g8_b8g8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { float *dst = dst_row; const uint32_t *src = (const uint32_t *)src_row; uint32_t value; float r, g0, g1, b; for (x = 0; x + 1 < width; x += 2) { value = *src++; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif r = ubyte_to_float((value >> 0) & 0xff); g0 = ubyte_to_float((value >> 8) & 0xff); b = ubyte_to_float((value >> 16) & 0xff); g1 = ubyte_to_float((value >> 24) & 0xff); dst[0] = r; /* r */ dst[1] = g0; /* g */ dst[2] = b; /* b */ dst[3] = 1.0f; /* a */ dst += 4; dst[0] = r; /* r */ dst[1] = g1; /* g */ dst[2] = b; /* b */ dst[3] = 1.0f; /* a */ dst += 4; } if (x < width) { value = *src; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif r = ubyte_to_float((value >> 0) & 0xff); g0 = ubyte_to_float((value >> 8) & 0xff); b = ubyte_to_float((value >> 16) & 0xff); g1 = ubyte_to_float((value >> 24) & 0xff); dst[0] = r; /* r */ dst[1] = g0; /* g */ dst[2] = b; /* b */ dst[3] = 1.0f; /* a */ } src_row += src_stride/sizeof(*src_row); dst_row += dst_stride/sizeof(*dst_row); } } void util_format_r8g8_b8g8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { uint8_t *dst = dst_row; const uint32_t *src = (const uint32_t *)src_row; uint32_t value; uint8_t r, g0, g1, b; for (x = 0; x + 1 < width; x += 2) { value = *src++; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif r = (value >> 0) & 0xff; g0 = (value >> 8) & 0xff; b = (value >> 16) & 0xff; g1 = (value >> 24) & 0xff; dst[0] = r; /* r */ dst[1] = g0; /* g */ dst[2] = b; /* b */ dst[3] = 0xff; /* a */ dst += 4; dst[0] = r; /* r */ dst[1] = g1; /* g */ dst[2] = b; /* b */ dst[3] = 0xff; /* a */ dst += 4; } if (x < width) { value = *src; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif r = (value >> 0) & 0xff; g0 = (value >> 8) & 0xff; b = (value >> 16) & 0xff; g1 = (value >> 24) & 0xff; dst[0] = r; /* r */ dst[1] = g0; /* g */ dst[2] = b; /* b */ dst[3] = 0xff; /* a */ } src_row += src_stride/sizeof(*src_row); dst_row += dst_stride/sizeof(*dst_row); } } void util_format_r8g8_b8g8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { const float *src = src_row; uint32_t *dst = (uint32_t *)dst_row; float r, g0, g1, b; uint32_t value; for (x = 0; x + 1 < width; x += 2) { r = 0.5f*(src[0] + src[4]); g0 = src[1]; g1 = src[5]; b = 0.5f*(src[2] + src[6]); value = float_to_ubyte(r); value |= float_to_ubyte(g0) << 8; value |= float_to_ubyte(b) << 16; value |= float_to_ubyte(g1) << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst++ = value; src += 8; } if (x < width) { r = src[0]; g0 = src[1]; g1 = 0; b = src[2]; value = float_to_ubyte(r); value |= float_to_ubyte(g0) << 8; value |= float_to_ubyte(b) << 16; value |= float_to_ubyte(g1) << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst = value; } dst_row += dst_stride/sizeof(*dst_row); src_row += src_stride/sizeof(*src_row); } } void util_format_r8g8_b8g8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { const uint8_t *src = src_row; uint32_t *dst = (uint32_t *)dst_row; uint32_t r, g0, g1, b; uint32_t value; for (x = 0; x + 1 < width; x += 2) { r = (src[0] + src[4] + 1) >> 1; g0 = src[1]; g1 = src[5]; b = (src[2] + src[6] + 1) >> 1; value = r; value |= g0 << 8; value |= b << 16; value |= g1 << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst++ = value; src += 8; } if (x < width) { r = src[0]; g0 = src[1]; g1 = 0; b = src[2]; value = r; value |= g0 << 8; value |= b << 16; value |= g1 << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst = value; } dst_row += dst_stride/sizeof(*dst_row); src_row += src_stride/sizeof(*src_row); } } void util_format_r8g8_b8g8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) { assert(i < 2); assert(j < 1); dst[0] = ubyte_to_float(src[0]); /* r */ dst[1] = ubyte_to_float(src[1 + 2*i]); /* g */ dst[2] = ubyte_to_float(src[2]); /* b */ dst[3] = 1.0f; /* a */ } void util_format_g8r8_g8b8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { float *dst = dst_row; const uint32_t *src = (const uint32_t *)src_row; uint32_t value; float r, g0, g1, b; for (x = 0; x + 1 < width; x += 2) { value = *src++; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif g0 = ubyte_to_float((value >> 0) & 0xff); r = ubyte_to_float((value >> 8) & 0xff); g1 = ubyte_to_float((value >> 16) & 0xff); b = ubyte_to_float((value >> 24) & 0xff); dst[0] = r; /* r */ dst[1] = g0; /* g */ dst[2] = b; /* b */ dst[3] = 1.0f; /* a */ dst += 4; dst[0] = r; /* r */ dst[1] = g1; /* g */ dst[2] = b; /* b */ dst[3] = 1.0f; /* a */ dst += 4; } if (x < width) { value = *src; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif g0 = ubyte_to_float((value >> 0) & 0xff); r = ubyte_to_float((value >> 8) & 0xff); g1 = ubyte_to_float((value >> 16) & 0xff); b = ubyte_to_float((value >> 24) & 0xff); dst[0] = r; /* r */ dst[1] = g0; /* g */ dst[2] = b; /* b */ dst[3] = 1.0f; /* a */ } src_row += src_stride/sizeof(*src_row); dst_row += dst_stride/sizeof(*dst_row); } } void util_format_g8r8_g8b8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { uint8_t *dst = dst_row; const uint32_t *src = (const uint32_t *)src_row; uint32_t value; uint8_t r, g0, g1, b; for (x = 0; x + 1 < width; x += 2) { value = *src++; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif g0 = (value >> 0) & 0xff; r = (value >> 8) & 0xff; g1 = (value >> 16) & 0xff; b = (value >> 24) & 0xff; dst[0] = r; /* r */ dst[1] = g0; /* g */ dst[2] = b; /* b */ dst[3] = 0xff; /* a */ dst += 4; dst[0] = r; /* r */ dst[1] = g1; /* g */ dst[2] = b; /* b */ dst[3] = 0xff; /* a */ dst += 4; } if (x < width) { value = *src; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif g0 = (value >> 0) & 0xff; r = (value >> 8) & 0xff; g1 = (value >> 16) & 0xff; b = (value >> 24) & 0xff; dst[0] = r; /* r */ dst[1] = g0; /* g */ dst[2] = b; /* b */ dst[3] = 0xff; /* a */ } src_row += src_stride/sizeof(*src_row); dst_row += dst_stride/sizeof(*dst_row); } } void util_format_g8r8_g8b8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { const float *src = src_row; uint32_t *dst = (uint32_t *)dst_row; float r, g0, g1, b; uint32_t value; for (x = 0; x + 1 < width; x += 2) { r = 0.5f*(src[0] + src[4]); g0 = src[1]; g1 = src[5]; b = 0.5f*(src[2] + src[6]); value = float_to_ubyte(g0); value |= float_to_ubyte(r) << 8; value |= float_to_ubyte(g1) << 16; value |= float_to_ubyte(b) << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst++ = value; src += 8; } if (x < width) { r = src[0]; g0 = src[1]; g1 = 0; b = src[2]; value = float_to_ubyte(g0); value |= float_to_ubyte(r) << 8; value |= float_to_ubyte(g1) << 16; value |= float_to_ubyte(b) << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst = value; } dst_row += dst_stride/sizeof(*dst_row); src_row += src_stride/sizeof(*src_row); } } void util_format_g8r8_g8b8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { const uint8_t *src = src_row; uint32_t *dst = (uint32_t *)dst_row; uint32_t r, g0, g1, b; uint32_t value; for (x = 0; x + 1 < width; x += 2) { r = (src[0] + src[4] + 1) >> 1; g0 = src[1]; g1 = src[5]; b = (src[2] + src[6] + 1) >> 1; value = g0; value |= r << 8; value |= g1 << 16; value |= b << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst++ = value; src += 8; } if (x < width) { r = src[0]; g0 = src[1]; g1 = 0; b = src[2]; value = g0; value |= r << 8; value |= g1 << 16; value |= b << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst = value; } dst_row += dst_stride/sizeof(*dst_row); src_row += src_stride/sizeof(*src_row); } } void util_format_g8r8_g8b8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) { assert(i < 2); assert(j < 1); dst[0] = ubyte_to_float(src[1]); /* r */ dst[1] = ubyte_to_float(src[0 + 2*i]); /* g */ dst[2] = ubyte_to_float(src[3]); /* b */ dst[3] = 1.0f; /* a */ } void util_format_uyvy_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { float *dst = dst_row; const uint32_t *src = (const uint32_t *)src_row; uint32_t value; uint8_t y0, y1, u, v; for (x = 0; x + 1 < width; x += 2) { value = *src++; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif u = (value >> 0) & 0xff; y0 = (value >> 8) & 0xff; v = (value >> 16) & 0xff; y1 = (value >> 24) & 0xff; util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 1.0f; /* a */ dst += 4; util_format_yuv_to_rgb_float(y1, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 1.0f; /* a */ dst += 4; } if (x < width) { value = *src; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif u = (value >> 0) & 0xff; y0 = (value >> 8) & 0xff; v = (value >> 16) & 0xff; y1 = (value >> 24) & 0xff; util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 1.0f; /* a */ } src_row += src_stride/sizeof(*src_row); dst_row += dst_stride/sizeof(*dst_row); } } void util_format_uyvy_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { uint8_t *dst = dst_row; const uint32_t *src = (const uint32_t *)src_row; uint32_t value; uint8_t y0, y1, u, v; for (x = 0; x + 1 < width; x += 2) { value = *src++; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif u = (value >> 0) & 0xff; y0 = (value >> 8) & 0xff; v = (value >> 16) & 0xff; y1 = (value >> 24) & 0xff; util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 0xff; /* a */ dst += 4; util_format_yuv_to_rgb_8unorm(y1, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 0xff; /* a */ dst += 4; } if (x < width) { value = *src; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif u = (value >> 0) & 0xff; y0 = (value >> 8) & 0xff; v = (value >> 16) & 0xff; y1 = (value >> 24) & 0xff; util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 0xff; /* a */ } src_row += src_stride/sizeof(*src_row); dst_row += dst_stride/sizeof(*dst_row); } } void util_format_uyvy_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { const float *src = src_row; uint32_t *dst = (uint32_t *)dst_row; uint8_t y0, y1, u, v; uint32_t value; for (x = 0; x + 1 < width; x += 2) { uint8_t y0, y1, u0, u1, v0, v1, u, v; util_format_rgb_float_to_yuv(src[0], src[1], src[2], &y0, &u0, &v0); util_format_rgb_float_to_yuv(src[4], src[5], src[6], &y1, &u1, &v1); u = (u0 + u1 + 1) >> 1; v = (v0 + v1 + 1) >> 1; value = u; value |= y0 << 8; value |= v << 16; value |= y1 << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst++ = value; src += 8; } if (x < width) { util_format_rgb_float_to_yuv(src[0], src[1], src[2], &y0, &u, &v); y1 = 0; value = u; value |= y0 << 8; value |= v << 16; value |= y1 << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst = value; } dst_row += dst_stride/sizeof(*dst_row); src_row += src_stride/sizeof(*src_row); } } void util_format_uyvy_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { const uint8_t *src = src_row; uint32_t *dst = (uint32_t *)dst_row; uint8_t y0, y1, u, v; uint32_t value; for (x = 0; x + 1 < width; x += 2) { uint8_t y0, y1, u0, u1, v0, v1, u, v; util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], &y0, &u0, &v0); util_format_rgb_8unorm_to_yuv(src[4], src[5], src[6], &y1, &u1, &v1); u = (u0 + u1 + 1) >> 1; v = (v0 + v1 + 1) >> 1; value = u; value |= y0 << 8; value |= v << 16; value |= y1 << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst++ = value; src += 8; } if (x < width) { util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], &y0, &u, &v); y1 = 0; value = u; value |= y0 << 8; value |= v << 16; value |= y1 << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst = value; } dst_row += dst_stride/sizeof(*dst_row); src_row += src_stride/sizeof(*src_row); } } void util_format_uyvy_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) { uint8_t y, u, v; assert(i < 2); assert(j < 1); y = src[1 + i*2]; u = src[0]; v = src[2]; util_format_yuv_to_rgb_float(y, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 1.0f; } void util_format_yuyv_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { float *dst = dst_row; const uint32_t *src = (const uint32_t *)src_row; uint32_t value; uint8_t y0, y1, u, v; for (x = 0; x + 1 < width; x += 2) { value = *src++; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif y0 = (value >> 0) & 0xff; u = (value >> 8) & 0xff; y1 = (value >> 16) & 0xff; v = (value >> 24) & 0xff; util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 1.0f; /* a */ dst += 4; util_format_yuv_to_rgb_float(y1, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 1.0f; /* a */ dst += 4; } if (x < width) { value = *src; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif y0 = (value >> 0) & 0xff; u = (value >> 8) & 0xff; y1 = (value >> 16) & 0xff; v = (value >> 24) & 0xff; util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 1.0f; /* a */ } src_row += src_stride/sizeof(*src_row); dst_row += dst_stride/sizeof(*dst_row); } } void util_format_yuyv_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { uint8_t *dst = dst_row; const uint32_t *src = (const uint32_t *)src_row; uint32_t value; uint8_t y0, y1, u, v; for (x = 0; x + 1 < width; x += 2) { value = *src++; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif y0 = (value >> 0) & 0xff; u = (value >> 8) & 0xff; y1 = (value >> 16) & 0xff; v = (value >> 24) & 0xff; util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 0xff; /* a */ dst += 4; util_format_yuv_to_rgb_8unorm(y1, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 0xff; /* a */ dst += 4; } if (x < width) { value = *src; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif y0 = (value >> 0) & 0xff; u = (value >> 8) & 0xff; y1 = (value >> 16) & 0xff; v = (value >> 24) & 0xff; util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 0xff; /* a */ } src_row += src_stride/sizeof(*src_row); dst_row += dst_stride/sizeof(*dst_row); } } void util_format_yuyv_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { const float *src = src_row; uint32_t *dst = (uint32_t *)dst_row; uint8_t y0, y1, u, v; uint32_t value; for (x = 0; x + 1 < width; x += 2) { uint8_t y0, y1, u0, u1, v0, v1, u, v; util_format_rgb_float_to_yuv(src[0], src[1], src[2], &y0, &u0, &v0); util_format_rgb_float_to_yuv(src[4], src[5], src[6], &y1, &u1, &v1); u = (u0 + u1 + 1) >> 1; v = (v0 + v1 + 1) >> 1; value = y0; value |= u << 8; value |= y1 << 16; value |= v << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst++ = value; src += 8; } if (x < width) { util_format_rgb_float_to_yuv(src[0], src[1], src[2], &y0, &u, &v); y1 = 0; value = y0; value |= u << 8; value |= y1 << 16; value |= v << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst = value; } dst_row += dst_stride/sizeof(*dst_row); src_row += src_stride/sizeof(*src_row); } } void util_format_yuyv_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) { unsigned x, y; for (y = 0; y < height; y += 1) { const uint8_t *src = src_row; uint32_t *dst = (uint32_t *)dst_row; uint8_t y0, y1, u, v; uint32_t value; for (x = 0; x + 1 < width; x += 2) { uint8_t y0, y1, u0, u1, v0, v1, u, v; util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], &y0, &u0, &v0); util_format_rgb_8unorm_to_yuv(src[4], src[5], src[6], &y1, &u1, &v1); u = (u0 + u1 + 1) >> 1; v = (v0 + v1 + 1) >> 1; value = y0; value |= u << 8; value |= y1 << 16; value |= v << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst++ = value; src += 8; } if (x < width) { util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], &y0, &u, &v); y1 = 0; value = y0; value |= u << 8; value |= y1 << 16; value |= v << 24; #ifdef PIPE_ARCH_BIG_ENDIAN value = util_bswap32(value); #endif *dst = value; } dst_row += dst_stride/sizeof(*dst_row); src_row += src_stride/sizeof(*src_row); } } void util_format_yuyv_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) { uint8_t y, u, v; assert(i < 2); assert(j < 1); y = src[0 + i*2]; u = src[1]; v = src[3]; util_format_yuv_to_rgb_float(y, u, v, &dst[0], &dst[1], &dst[2]); dst[3] = 1.0f; } /* XXX: Stubbed for now */ void util_format_yv12_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_yv12_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_yv12_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_yv12_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_yv12_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) {} void util_format_yv16_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_yv16_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_yv16_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_yv16_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_yv16_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) {} void util_format_iyuv_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_iyuv_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_iyuv_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_iyuv_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_iyuv_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) {} void util_format_nv12_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_nv12_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_nv12_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_nv12_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_nv12_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) {} void util_format_nv21_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_nv21_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_nv21_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_nv21_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_nv21_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) {} void util_format_r8g8_r8b8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_r8g8_r8b8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_r8g8_r8b8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_r8g8_r8b8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_r8g8_r8b8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) {} void util_format_g8r8_b8r8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_g8r8_b8r8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_g8r8_b8r8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_g8r8_b8r8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) {} void util_format_g8r8_b8r8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) {}