/**************************************************************************
 *
 * 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) {}
