/* GStreamer
 * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
 * Library       <2002> Ronald Bultje <rbultje@ronald.bitfreak.net>
 * Copyright (C) 2007 David A. Schleef <ds@schleef.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#include <string.h>
#include <stdio.h>

#include "video-format.h"
#include "video-orc.h"

#ifndef restrict
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* restrict should be available */
#elif defined(__GNUC__) && __GNUC__ >= 4
#define restrict __restrict__
#elif defined(_MSC_VER) &&  _MSC_VER >= 1500
#define restrict __restrict
#else
#define restrict                /* no op */
#endif
#endif

/* Line conversion to AYUV */

#define GET_PLANE_STRIDE(plane) (stride(plane))
#define GET_PLANE_LINE(plane, line) \
  (gpointer)(((guint8*)(data[plane])) + stride[plane] * (line))

#define GET_COMP_STRIDE(comp) \
  GST_VIDEO_FORMAT_INFO_STRIDE (info, stride, comp)
#define GET_COMP_DATA(comp) \
  GST_VIDEO_FORMAT_INFO_DATA (info, data, comp)

#define GET_COMP_LINE(comp, line) \
  (gpointer)(((guint8*)GET_COMP_DATA (comp)) + \
      GET_COMP_STRIDE(comp) * (line))

#define GET_LINE(line)               GET_PLANE_LINE (0, line)

#define GET_Y_LINE(line)             GET_COMP_LINE(GST_VIDEO_COMP_Y, line)
#define GET_U_LINE(line)             GET_COMP_LINE(GST_VIDEO_COMP_U, line)
#define GET_V_LINE(line)             GET_COMP_LINE(GST_VIDEO_COMP_V, line)

#define GET_R_LINE(line)             GET_COMP_LINE(GST_VIDEO_COMP_R, line)
#define GET_G_LINE(line)             GET_COMP_LINE(GST_VIDEO_COMP_G, line)
#define GET_B_LINE(line)             GET_COMP_LINE(GST_VIDEO_COMP_B, line)

#define GET_A_LINE(line)             GET_COMP_LINE(GST_VIDEO_COMP_A, line)

#define GET_UV_420(line, flags)                 \
  (flags & GST_VIDEO_PACK_FLAG_INTERLACED ?     \
   ((line & ~3) >> 1) + (line & 1) :            \
   line >> 1)
#define GET_UV_410(line, flags)                 \
  (flags & GST_VIDEO_PACK_FLAG_INTERLACED ?     \
   ((line & ~7) >> 2) + (line & 1) :            \
   line >> 2)

#define IS_CHROMA_LINE_420(line, flags)         \
  (flags & GST_VIDEO_PACK_FLAG_INTERLACED ?     \
   !(line & 2) : !(line & 1))
#define IS_CHROMA_LINE_410(line, flags)         \
  (flags & GST_VIDEO_PACK_FLAG_INTERLACED ?     \
   !(line & 6) : !(line & 3))

#define IS_ALIGNED(x,n) ((((guintptr)(x)&((n)-1))) == 0)

#define PACK_420 GST_VIDEO_FORMAT_AYUV, unpack_planar_420, 1, pack_planar_420
static void
unpack_planar_420 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  gint uv = GET_UV_420 (y, flags);
  const guint8 *restrict sy = GET_Y_LINE (y);
  const guint8 *restrict su = GET_U_LINE (uv);
  const guint8 *restrict sv = GET_V_LINE (uv);
  guint8 *restrict d = dest;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  if (x & 1) {
    d[0] = 0xff;
    d[1] = *sy++;
    d[2] = *su++;
    d[3] = *sv++;
    width--;
    d += 4;
  }
  video_orc_unpack_I420 (d, sy, su, sv, width);
}

static void
pack_planar_420 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  gint uv = GET_UV_420 (y, flags);
  guint8 *dy = GET_Y_LINE (y);
  guint8 *du = GET_U_LINE (uv);
  guint8 *dv = GET_V_LINE (uv);
  const guint8 *s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    if (IS_ALIGNED (s, 8))
      video_orc_pack_I420 (dy, du, dv, s, width / 2);
    else {
      gint i;

      for (i = 0; i < width / 2; i++) {
        dy[i * 2 + 0] = s[i * 8 + 1];
        dy[i * 2 + 1] = s[i * 8 + 5];
        du[i] = s[i * 8 + 2];
        dv[i] = s[i * 8 + 3];
      }
    }
    if (width & 1) {
      gint i = width - 1;

      dy[i] = s[i * 4 + 1];
      du[i >> 1] = s[i * 4 + 2];
      dv[i >> 1] = s[i * 4 + 3];
    }
  } else
    video_orc_pack_Y (dy, s, width);
}

#define PACK_YUY2 GST_VIDEO_FORMAT_AYUV, unpack_YUY2, 1, pack_YUY2
static void
unpack_YUY2 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict s = GET_LINE (y);
  guint8 *restrict d = dest;

  s += (x & ~1) << 1;
  if (x & 1) {
    d[0] = 0xff;
    d[1] = s[2];
    d[2] = s[1];
    d[3] = s[3];
    s += 4;
    d += 4;
    width--;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_YUY2 (d, s, width / 2);
  else {
    gint i;

    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = s[i * 4 + 0];
      d[i * 8 + 2] = s[i * 4 + 1];
      d[i * 8 + 3] = s[i * 4 + 3];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = s[i * 4 + 2];
      d[i * 8 + 6] = s[i * 4 + 1];
      d[i * 8 + 7] = s[i * 4 + 3];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[i * 2 + 0];
    d[i * 4 + 2] = s[i * 2 + 1];
    d[i * 4 + 3] = s[i * 2 + 3];
  }
}

static void
pack_YUY2 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  if (IS_ALIGNED (s, 8))
    video_orc_pack_YUY2 (d, s, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 4 + 0] = s[i * 8 + 1];
      d[i * 4 + 1] = s[i * 8 + 2];
      d[i * 4 + 2] = s[i * 8 + 5];
      d[i * 4 + 3] = s[i * 8 + 3];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 2 + 0] = s[i * 4 + 1];
    d[i * 2 + 1] = s[i * 4 + 2];
    d[i * 2 + 3] = s[i * 4 + 3];
  }
}

#define PACK_UYVY GST_VIDEO_FORMAT_AYUV, unpack_UYVY, 1, pack_UYVY
static void
unpack_UYVY (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *s = GET_LINE (y);
  guint8 *d = dest;

  s += (x & ~1) << 1;
  if (x & 1) {
    d[0] = 0xff;
    d[1] = s[3];
    d[2] = s[0];
    d[3] = s[2];
    s += 4;
    d += 4;
    width--;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_UYVY (d, s, width / 2);
  else {
    gint i;

    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = s[i * 4 + 1];
      d[i * 8 + 2] = s[i * 4 + 0];
      d[i * 8 + 3] = s[i * 4 + 2];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = s[i * 4 + 3];
      d[i * 8 + 6] = s[i * 4 + 0];
      d[i * 8 + 7] = s[i * 4 + 2];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[i * 2 + 1];
    d[i * 4 + 2] = s[i * 2 + 0];
    d[i * 4 + 3] = s[i * 2 + 2];
  }
}

static void
pack_UYVY (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  if (IS_ALIGNED (s, 8))
    video_orc_pack_UYVY (d, s, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 4 + 0] = s[i * 8 + 2];
      d[i * 4 + 1] = s[i * 8 + 1];
      d[i * 4 + 2] = s[i * 8 + 3];
      d[i * 4 + 3] = s[i * 8 + 5];
    }
  }
  if (width & 1) {
    gint i = width - 1;

    d[i * 2 + 0] = s[i * 4 + 2];
    d[i * 2 + 1] = s[i * 4 + 1];
    d[i * 2 + 2] = s[i * 4 + 3];
  }
}

#define PACK_VYUY GST_VIDEO_FORMAT_AYUV, unpack_VYUY, 1, pack_VYUY
static void
unpack_VYUY (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *s = GET_LINE (y);
  guint8 *d = dest;

  s += (x & ~1) << 1;
  if (x & 1) {
    d[0] = 0xff;
    d[1] = s[3];
    d[2] = s[0];
    d[3] = s[2];
    s += 4;
    d += 4;
    width--;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_VYUY (d, s, width / 2);
  else {
    gint i;

    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = s[i * 4 + 1];
      d[i * 8 + 2] = s[i * 4 + 0];
      d[i * 8 + 3] = s[i * 4 + 2];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = s[i * 4 + 3];
      d[i * 8 + 6] = s[i * 4 + 0];
      d[i * 8 + 7] = s[i * 4 + 2];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[i * 2 + 1];
    d[i * 4 + 2] = s[i * 2 + 0];
    d[i * 4 + 3] = s[i * 2 + 2];
  }
}

static void
pack_VYUY (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  if (IS_ALIGNED (s, 8))
    video_orc_pack_VYUY (d, s, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 4 + 0] = s[i * 8 + 2];
      d[i * 4 + 1] = s[i * 8 + 1];
      d[i * 4 + 2] = s[i * 8 + 3];
      d[i * 4 + 3] = s[i * 8 + 5];
    }
  }
  if (width & 1) {
    gint i = width - 1;

    d[i * 2 + 0] = s[i * 4 + 2];
    d[i * 2 + 1] = s[i * 4 + 1];
    d[i * 2 + 2] = s[i * 4 + 3];
  }
}

#define PACK_YVYU GST_VIDEO_FORMAT_AYUV, unpack_YVYU, 1, pack_YVYU
static void
unpack_YVYU (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict s = GET_LINE (y);
  guint8 *restrict d = dest;

  s += (x & ~1) << 1;
  if (x & 1) {
    d[0] = 0xff;
    d[1] = s[2];
    d[2] = s[3];
    d[3] = s[1];
    s += 4;
    d += 4;
    width--;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_YVYU (d, s, width / 2);
  else {
    gint i;

    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = s[i * 4 + 0];
      d[i * 8 + 2] = s[i * 4 + 3];
      d[i * 8 + 3] = s[i * 4 + 1];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = s[i * 4 + 2];
      d[i * 8 + 6] = s[i * 4 + 3];
      d[i * 8 + 7] = s[i * 4 + 1];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[i * 2 + 0];
    d[i * 4 + 2] = s[i * 2 + 3];
    d[i * 4 + 3] = s[i * 2 + 1];
  }
}

static void
pack_YVYU (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  if (IS_ALIGNED (s, 8))
    video_orc_pack_YVYU (d, s, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 4 + 0] = s[i * 8 + 1];
      d[i * 4 + 1] = s[i * 8 + 3];
      d[i * 4 + 2] = s[i * 8 + 5];
      d[i * 4 + 3] = s[i * 8 + 2];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 2 + 0] = s[i * 4 + 1];
    d[i * 2 + 1] = s[i * 4 + 3];
    d[i * 2 + 3] = s[i * 4 + 2];
  }
}

#define PACK_v308 GST_VIDEO_FORMAT_AYUV, unpack_v308, 1, pack_v308
static void
unpack_v308 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint8 *restrict d = dest;

  s += x * 3;

  for (i = 0; i < width; i++) {
    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[i * 3 + 0];
    d[i * 4 + 2] = s[i * 3 + 1];
    d[i * 4 + 3] = s[i * 3 + 2];
  }
}

static void
pack_v308 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  for (i = 0; i < width; i++) {
    d[i * 3 + 0] = s[i * 4 + 1];
    d[i * 3 + 1] = s[i * 4 + 2];
    d[i * 3 + 2] = s[i * 4 + 3];
  }
}

#define PACK_IYU2 GST_VIDEO_FORMAT_AYUV, unpack_IYU2, 1, pack_IYU2
static void
unpack_IYU2 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint8 *restrict d = dest;

  s += x * 3;

  for (i = 0; i < width; i++) {
    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[i * 3 + 1];
    d[i * 4 + 2] = s[i * 3 + 0];
    d[i * 4 + 3] = s[i * 3 + 2];
  }
}

static void
pack_IYU2 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  for (i = 0; i < width; i++) {
    d[i * 3 + 0] = s[i * 4 + 2];
    d[i * 3 + 1] = s[i * 4 + 1];
    d[i * 3 + 2] = s[i * 4 + 3];
  }
}

#define PACK_AYUV GST_VIDEO_FORMAT_AYUV, unpack_copy4, 1, pack_copy4
#define PACK_ARGB GST_VIDEO_FORMAT_ARGB, unpack_copy4, 1, pack_copy4
static void
unpack_copy4 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict s = GET_LINE (y);

  s += x * 4;

  memcpy (dest, s, width * 4);
}

static void
pack_copy4 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);

  memcpy (d, src, width * 4);
}

#define PACK_v210 GST_VIDEO_FORMAT_AYUV64, unpack_v210, 1, pack_v210
static void
unpack_v210 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint16 *restrict d = dest;
  guint32 a0, a1, a2, a3;
  guint16 y0, y1, y2, y3, y4, y5;
  guint16 u0, u2, u4;
  guint16 v0, v2, v4;

  /* FIXME */
  s += x * 2;

  for (i = 0; i < width; i += 6) {
    a0 = GST_READ_UINT32_LE (s + (i / 6) * 16 + 0);
    a1 = GST_READ_UINT32_LE (s + (i / 6) * 16 + 4);
    a2 = GST_READ_UINT32_LE (s + (i / 6) * 16 + 8);
    a3 = GST_READ_UINT32_LE (s + (i / 6) * 16 + 12);

    u0 = ((a0 >> 0) & 0x3ff) << 6;
    y0 = ((a0 >> 10) & 0x3ff) << 6;
    v0 = ((a0 >> 20) & 0x3ff) << 6;
    y1 = ((a1 >> 0) & 0x3ff) << 6;

    u2 = ((a1 >> 10) & 0x3ff) << 6;
    y2 = ((a1 >> 20) & 0x3ff) << 6;
    v2 = ((a2 >> 0) & 0x3ff) << 6;
    y3 = ((a2 >> 10) & 0x3ff) << 6;

    u4 = ((a2 >> 20) & 0x3ff) << 6;
    y4 = ((a3 >> 0) & 0x3ff) << 6;
    v4 = ((a3 >> 10) & 0x3ff) << 6;
    y5 = ((a3 >> 20) & 0x3ff) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      y0 |= (y0 >> 10);
      y1 |= (y1 >> 10);
      u0 |= (u0 >> 10);
      v0 |= (v0 >> 10);

      y2 |= (y2 >> 10);
      y3 |= (y3 >> 10);
      u2 |= (u2 >> 10);
      v2 |= (v2 >> 10);

      y4 |= (y4 >> 10);
      y5 |= (y5 >> 10);
      u4 |= (u4 >> 10);
      v4 |= (v4 >> 10);
    }

    d[4 * (i + 0) + 0] = 0xffff;
    d[4 * (i + 0) + 1] = y0;
    d[4 * (i + 0) + 2] = u0;
    d[4 * (i + 0) + 3] = v0;

    if (i < width - 1) {
      d[4 * (i + 1) + 0] = 0xffff;
      d[4 * (i + 1) + 1] = y1;
      d[4 * (i + 1) + 2] = u0;
      d[4 * (i + 1) + 3] = v0;
    }
    if (i < width - 2) {
      d[4 * (i + 2) + 0] = 0xffff;
      d[4 * (i + 2) + 1] = y2;
      d[4 * (i + 2) + 2] = u2;
      d[4 * (i + 2) + 3] = v2;
    }
    if (i < width - 3) {
      d[4 * (i + 3) + 0] = 0xffff;
      d[4 * (i + 3) + 1] = y3;
      d[4 * (i + 3) + 2] = u2;
      d[4 * (i + 3) + 3] = v2;
    }
    if (i < width - 4) {
      d[4 * (i + 4) + 0] = 0xffff;
      d[4 * (i + 4) + 1] = y4;
      d[4 * (i + 4) + 2] = u4;
      d[4 * (i + 4) + 3] = v4;
    }
    if (i < width - 5) {
      d[4 * (i + 5) + 0] = 0xffff;
      d[4 * (i + 5) + 1] = y5;
      d[4 * (i + 5) + 2] = u4;
      d[4 * (i + 5) + 3] = v4;
    }
  }
}

static void
pack_v210 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint16 *restrict s = src;
  guint32 a0, a1, a2, a3;
  guint16 y0, y1, y2, y3, y4, y5;
  guint16 u0, u1, u2;
  guint16 v0, v1, v2;

  for (i = 0; i < width - 5; i += 6) {
    y0 = s[4 * (i + 0) + 1] >> 6;
    y1 = s[4 * (i + 1) + 1] >> 6;
    y2 = s[4 * (i + 2) + 1] >> 6;
    y3 = s[4 * (i + 3) + 1] >> 6;
    y4 = s[4 * (i + 4) + 1] >> 6;
    y5 = s[4 * (i + 5) + 1] >> 6;

    u0 = s[4 * (i + 0) + 2] >> 6;
    u1 = s[4 * (i + 2) + 2] >> 6;
    u2 = s[4 * (i + 4) + 2] >> 6;

    v0 = s[4 * (i + 0) + 3] >> 6;
    v1 = s[4 * (i + 2) + 3] >> 6;
    v2 = s[4 * (i + 4) + 3] >> 6;

    a0 = u0 | (y0 << 10) | (v0 << 20);
    a1 = y1 | (u1 << 10) | (y2 << 20);
    a2 = v1 | (y3 << 10) | (u2 << 20);
    a3 = y4 | (v2 << 10) | (y5 << 20);

    GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 0, a0);
    GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 4, a1);
    GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 8, a2);
    GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 12, a3);
  }
  if (i < width) {
    y0 = s[4 * (i + 0) + 1] >> 6;
    u0 = s[4 * (i + 0) + 2] >> 6;
    v0 = s[4 * (i + 0) + 3] >> 6;
    if (i < width - 1)
      y1 = s[4 * (i + 1) + 1] >> 6;
    else
      y1 = y0;
    if (i < width - 2) {
      y2 = s[4 * (i + 2) + 1] >> 6;
      u1 = s[4 * (i + 2) + 2] >> 6;
      v1 = s[4 * (i + 2) + 3] >> 6;
    } else {
      y2 = y1;
      u1 = u0;
      v1 = v0;
    }
    if (i < width - 3)
      y3 = s[4 * (i + 3) + 1] >> 6;
    else
      y3 = y2;
    if (i < width - 4) {
      y4 = s[4 * (i + 4) + 1] >> 6;
      u2 = s[4 * (i + 4) + 2] >> 6;
      v2 = s[4 * (i + 4) + 3] >> 6;
    } else {
      y4 = y3;
      u2 = u1;
      v2 = v1;
    }
    y5 = y4;

    a0 = u0 | (y0 << 10) | (v0 << 20);
    a1 = y1 | (u1 << 10) | (y2 << 20);
    a2 = v1 | (y3 << 10) | (u2 << 20);
    a3 = y4 | (v2 << 10) | (y5 << 20);

    GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 0, a0);
    GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 4, a1);
    GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 8, a2);
    GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 12, a3);
  }
}

#define PACK_v216 GST_VIDEO_FORMAT_AYUV64, unpack_v216, 1, pack_v216
static void
unpack_v216 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint16 *restrict d = dest;

  s += (x & ~1) << 2;
  if (x & 1) {
    d[0] = 0xffff;
    d[1] = GST_READ_UINT16_LE (s + 6);
    d[2] = GST_READ_UINT16_LE (s + 0);
    d[3] = GST_READ_UINT16_LE (s + 4);
    s += 8;
    d += 4;
    width--;
  }

  for (i = 0; i < width; i++) {
    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = GST_READ_UINT16_LE (s + i * 4 + 2);
    d[i * 4 + 2] = GST_READ_UINT16_LE (s + (i >> 1) * 8 + 0);
    d[i * 4 + 3] = GST_READ_UINT16_LE (s + (i >> 1) * 8 + 4);
  }
}

static void
pack_v216 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint16 *restrict s = src;

  for (i = 0; i < width - 1; i += 2) {
    GST_WRITE_UINT16_LE (d + i * 4 + 0, s[(i + 0) * 4 + 2]);
    GST_WRITE_UINT16_LE (d + i * 4 + 2, s[(i + 0) * 4 + 1]);
    GST_WRITE_UINT16_LE (d + i * 4 + 4, s[(i + 0) * 4 + 3]);
    GST_WRITE_UINT16_LE (d + i * 4 + 6, s[(i + 1) * 4 + 1]);
  }
  if (i == width - 1) {
    GST_WRITE_UINT16_LE (d + i * 4 + 0, s[i * 4 + 2]);
    GST_WRITE_UINT16_LE (d + i * 4 + 2, s[i * 4 + 1]);
    GST_WRITE_UINT16_LE (d + i * 4 + 4, s[i * 4 + 3]);
    GST_WRITE_UINT16_LE (d + i * 4 + 6, s[i * 4 + 1]);
  }
}

#define PACK_Y41B GST_VIDEO_FORMAT_AYUV, unpack_Y41B, 1, pack_Y41B
static void
unpack_Y41B (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict sy = GET_Y_LINE (y);
  const guint8 *restrict su = GET_U_LINE (y);
  const guint8 *restrict sv = GET_V_LINE (y);
  guint8 *restrict d = dest;

  sy += x;
  su += x >> 2;
  sv += x >> 2;

  if (x & 3) {
    for (; x & 3; x++) {
      d[0] = 0xff;
      d[1] = *sy++;
      d[2] = *su;
      d[3] = *sv;
      width--;
      d += 4;
    }
    su++;
    sy++;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_YUV9 (d, sy, su, sv, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = sy[i * 2 + 0];
      d[i * 8 + 2] = su[i >> 1];
      d[i * 8 + 3] = sv[i >> 1];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = sy[i * 2 + 1];
      d[i * 8 + 6] = su[i >> 1];
      d[i * 8 + 7] = sv[i >> 1];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = sy[i];
    d[i * 4 + 2] = su[i >> 2];
    d[i * 4 + 3] = sv[i >> 2];
  }
}

static void
pack_Y41B (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict dy = GET_Y_LINE (y);
  guint8 *restrict du = GET_U_LINE (y);
  guint8 *restrict dv = GET_V_LINE (y);
  const guint8 *restrict s = src;

  for (i = 0; i < width - 3; i += 4) {
    dy[i] = s[i * 4 + 1];
    dy[i + 1] = s[i * 4 + 5];
    dy[i + 2] = s[i * 4 + 9];
    dy[i + 3] = s[i * 4 + 13];

    du[i >> 2] = s[i * 4 + 2];
    dv[i >> 2] = s[i * 4 + 3];
  }
  if (i < width) {
    dy[i] = s[i * 4 + 1];
    du[i >> 2] = s[i * 4 + 2];
    dv[i >> 2] = s[i * 4 + 3];
    if (i < width - 1)
      dy[i + 1] = s[i * 4 + 5];
    if (i < width - 2)
      dy[i + 2] = s[i * 4 + 9];
  }
}

#define PACK_Y42B GST_VIDEO_FORMAT_AYUV, unpack_Y42B, 1, pack_Y42B
static void
unpack_Y42B (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict sy = GET_Y_LINE (y);
  const guint8 *restrict su = GET_U_LINE (y);
  const guint8 *restrict sv = GET_V_LINE (y);
  guint8 *restrict d = dest;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  if (x & 1) {
    d[0] = 0xff;
    d[1] = *sy++;
    d[2] = *su++;
    d[3] = *sv++;
    width--;
    d += 4;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_Y42B (d, sy, su, sv, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = sy[i * 2 + 0];
      d[i * 8 + 2] = su[i];
      d[i * 8 + 3] = sv[i];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = sy[i * 2 + 1];
      d[i * 8 + 6] = su[i];
      d[i * 8 + 7] = sv[i];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = sy[i];
    d[i * 4 + 2] = su[i >> 1];
    d[i * 4 + 3] = sv[i >> 1];
  }
}

static void
pack_Y42B (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict dy = GET_Y_LINE (y);
  guint8 *restrict du = GET_U_LINE (y);
  guint8 *restrict dv = GET_V_LINE (y);
  const guint8 *restrict s = src;

  if (IS_ALIGNED (s, 8))
    video_orc_pack_Y42B (dy, du, dv, s, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      dy[i * 2 + 0] = s[i * 8 + 1];
      dy[i * 2 + 1] = s[i * 8 + 5];
      du[i] = s[i * 8 + 2];
      dv[i] = s[i * 8 + 3];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    dy[i] = s[i * 4 + 1];
    du[i >> 1] = s[i * 4 + 2];
    dv[i >> 1] = s[i * 4 + 3];
  }
}

#define PACK_Y444 GST_VIDEO_FORMAT_AYUV, unpack_Y444, 1, pack_Y444
static void
unpack_Y444 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict sy = GET_Y_LINE (y);
  const guint8 *restrict su = GET_U_LINE (y);
  const guint8 *restrict sv = GET_V_LINE (y);

  sy += x;
  su += x;
  sv += x;

  video_orc_unpack_Y444 (dest, sy, su, sv, width);
}

static void
pack_Y444 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict dy = GET_Y_LINE (y);
  guint8 *restrict du = GET_U_LINE (y);
  guint8 *restrict dv = GET_V_LINE (y);

  video_orc_pack_Y444 (dy, du, dv, src, width);
}

#define PACK_GBR GST_VIDEO_FORMAT_ARGB, unpack_GBR, 1, pack_GBR
static void
unpack_GBR (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict sr = GET_R_LINE (y);
  const guint8 *restrict sg = GET_G_LINE (y);
  const guint8 *restrict sb = GET_B_LINE (y);

  sr += x;
  sg += x;
  sb += x;

  video_orc_unpack_Y444 (dest, sr, sg, sb, width);
}

static void
pack_GBR (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict dr = GET_R_LINE (y);
  guint8 *restrict dg = GET_G_LINE (y);
  guint8 *restrict db = GET_B_LINE (y);

  video_orc_pack_Y444 (dr, dg, db, src, width);
}

#define PACK_GBRA GST_VIDEO_FORMAT_ARGB, unpack_GBRA, 1, pack_GBRA
static void
unpack_GBRA (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *sg = GET_G_LINE (y);
  const guint8 *sb = GET_B_LINE (y);
  const guint8 *sr = GET_R_LINE (y);
  const guint8 *sa = GET_A_LINE (y);
  guint8 *d = dest, G, B, R, A;

  sg += x;
  sb += x;
  sr += x;
  sa += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT8 (sg + i);
    B = GST_READ_UINT8 (sb + i);
    R = GST_READ_UINT8 (sr + i);
    A = GST_READ_UINT8 (sa + i);

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBRA (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict dg = GET_G_LINE (y);
  guint8 *restrict db = GET_B_LINE (y);
  guint8 *restrict dr = GET_R_LINE (y);
  guint8 *restrict da = GET_A_LINE (y);
  guint8 G, B, R, A;
  const guint8 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = (s[i * 4 + 2]);
    B = (s[i * 4 + 3]);
    R = (s[i * 4 + 1]);
    A = (s[i * 4 + 0]);

    GST_WRITE_UINT8 (dg + i, G);
    GST_WRITE_UINT8 (db + i, B);
    GST_WRITE_UINT8 (dr + i, R);
    GST_WRITE_UINT8 (da + i, A);
  }
}

#define PACK_GRAY8 GST_VIDEO_FORMAT_AYUV, unpack_GRAY8, 1, pack_GRAY8
static void
unpack_GRAY8 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict s = GET_LINE (y);

  s += x;

  video_orc_unpack_GRAY8 (dest, s, width);
}

static void
pack_GRAY8 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);

  video_orc_pack_GRAY8 (d, src, width);
}

#define PACK_GRAY16_BE GST_VIDEO_FORMAT_AYUV64, unpack_GRAY16_BE, 1, pack_GRAY16_BE
static void
unpack_GRAY16_BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict s = GET_LINE (y);
  guint16 *restrict d = dest;

  s += x;

  for (i = 0; i < width; i++) {
    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = GST_READ_UINT16_BE (s + i);
    d[i * 4 + 2] = 0x8000;
    d[i * 4 + 3] = 0x8000;
  }
}

static void
pack_GRAY16_BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict d = GET_LINE (y);
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    GST_WRITE_UINT16_BE (d + i, s[i * 4 + 1]);
  }
}

#define PACK_GRAY16_LE GST_VIDEO_FORMAT_AYUV64, unpack_GRAY16_LE, 1, pack_GRAY16_LE
static void
unpack_GRAY16_LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict s = GET_LINE (y);
  guint16 *restrict d = dest;

  s += x;

  for (i = 0; i < width; i++) {
    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = GST_READ_UINT16_LE (s + i);
    d[i * 4 + 2] = 0x8000;
    d[i * 4 + 3] = 0x8000;
  }
}

static void
pack_GRAY16_LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict d = GET_LINE (y);
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    GST_WRITE_UINT16_LE (d + i, s[i * 4 + 1]);
  }
}

#define PACK_RGB16 GST_VIDEO_FORMAT_ARGB, unpack_RGB16, 1, pack_RGB16
static void
unpack_RGB16 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint16 *restrict s = GET_LINE (y);

  if (flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)
    video_orc_unpack_RGB16_trunc (dest, s + x, width);
  else
    video_orc_unpack_RGB16 (dest, s + x, width);
}

static void
pack_RGB16 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint16 *restrict d = GET_LINE (y);

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  video_orc_pack_RGB16_le (d, src, width);
#else
  video_orc_pack_RGB16_be (d, src, width);
#endif
}

#define PACK_BGR16 GST_VIDEO_FORMAT_ARGB, unpack_BGR16, 1, pack_BGR16
static void
unpack_BGR16 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint16 *restrict s = GET_LINE (y);

  if (flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)
    video_orc_unpack_BGR16_trunc (dest, s + x, width);
  else
    video_orc_unpack_BGR16 (dest, s + x, width);
}

static void
pack_BGR16 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint16 *restrict d = GET_LINE (y);

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  video_orc_pack_BGR16_le (d, src, width);
#else
  video_orc_pack_BGR16_be (d, src, width);
#endif
}

#define PACK_RGB15 GST_VIDEO_FORMAT_ARGB, unpack_RGB15, 1, pack_RGB15
static void
unpack_RGB15 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint16 *restrict s = GET_LINE (y);

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  if (flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)
    video_orc_unpack_RGB15_le_trunc (dest, s + x, width);
  else
    video_orc_unpack_RGB15_le (dest, s + x, width);
#else
  if (flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)
    video_orc_unpack_RGB15_be_trunc (dest, s + x, width);
  else
    video_orc_unpack_RGB15_be (dest, s + x, width);
#endif
}

static void
pack_RGB15 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint16 *restrict d = GET_LINE (y);

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  video_orc_pack_RGB15_le (d, src, width);
#else
  video_orc_pack_RGB15_be (d, src, width);
#endif
}

#define PACK_BGR15 GST_VIDEO_FORMAT_ARGB, unpack_BGR15, 1, pack_BGR15
static void
unpack_BGR15 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint16 *restrict s = GET_LINE (y);

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  if (flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)
    video_orc_unpack_BGR15_le_trunc (dest, s + x, width);
  else
    video_orc_unpack_BGR15_le (dest, s + x, width);
#else
  if (flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)
    video_orc_unpack_BGR15_be_trunc (dest, s + x, width);
  else
    video_orc_unpack_BGR15_be (dest, s + x, width);
#endif
}

static void
pack_BGR15 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint16 *restrict d = GET_LINE (y);

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  video_orc_pack_BGR15_le (d, src, width);
#else
  video_orc_pack_BGR15_be (d, src, width);
#endif
}

#define PACK_BGRA GST_VIDEO_FORMAT_ARGB, unpack_BGRA, 1, pack_BGRA
static void
unpack_BGRA (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict s = GET_LINE (y);

  s += x * 4;

  video_orc_unpack_BGRA (dest, s, width);
}

static void
pack_BGRA (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);

  video_orc_pack_BGRA (d, src, width);
}

#define PACK_ABGR GST_VIDEO_FORMAT_ARGB, unpack_ABGR, 1, pack_ABGR
static void
unpack_ABGR (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict s = GET_LINE (y);

  s += x * 4;

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  video_orc_unpack_ABGR_le (dest, s, width);
#else
  video_orc_unpack_ABGR_be (dest, s, width);
#endif
}

static void
pack_ABGR (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  video_orc_pack_ABGR_le (d, src, width);
#else
  video_orc_pack_ABGR_be (d, src, width);
#endif
}

#define PACK_RGBA GST_VIDEO_FORMAT_ARGB, unpack_RGBA, 1, pack_RGBA
static void
unpack_RGBA (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict s = GET_LINE (y);

  s += x * 4;

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  video_orc_unpack_RGBA_le (dest, s, width);
#else
  video_orc_unpack_RGBA_be (dest, s, width);
#endif
}

static void
pack_RGBA (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  video_orc_pack_RGBA_le (d, src, width);
#else
  video_orc_pack_RGBA_be (d, src, width);
#endif
}

#define PACK_RGB GST_VIDEO_FORMAT_ARGB, unpack_RGB, 1, pack_RGB
static void
unpack_RGB (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint8 *restrict d = dest;

  s += x * 3;

  for (i = 0; i < width; i++) {
    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[i * 3 + 0];
    d[i * 4 + 2] = s[i * 3 + 1];
    d[i * 4 + 3] = s[i * 3 + 2];
  }
}

static void
pack_RGB (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  for (i = 0; i < width; i++) {
    d[i * 3 + 0] = s[i * 4 + 1];
    d[i * 3 + 1] = s[i * 4 + 2];
    d[i * 3 + 2] = s[i * 4 + 3];
  }
}

#define PACK_BGR GST_VIDEO_FORMAT_ARGB, unpack_BGR, 1, pack_BGR
static void
unpack_BGR (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint8 *restrict d = dest;

  s += x * 3;

  for (i = 0; i < width; i++) {
    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[i * 3 + 2];
    d[i * 4 + 2] = s[i * 3 + 1];
    d[i * 4 + 3] = s[i * 3 + 0];
  }
}

static void
pack_BGR (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  for (i = 0; i < width; i++) {
    d[i * 3 + 0] = s[i * 4 + 3];
    d[i * 3 + 1] = s[i * 4 + 2];
    d[i * 3 + 2] = s[i * 4 + 1];
  }
}

#define PACK_NV12 GST_VIDEO_FORMAT_AYUV, unpack_NV12, 1, pack_NV12
static void
unpack_NV12 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  gint uv = GET_UV_420 (y, flags);
  const guint8 *restrict sy = GET_PLANE_LINE (0, y);
  const guint8 *restrict suv = GET_PLANE_LINE (1, uv);
  guint8 *restrict d = dest;

  sy += x;
  suv += (x & ~1);

  if (x & 1) {
    d[0] = 0xff;
    d[1] = *sy++;
    d[2] = suv[0];
    d[3] = suv[1];
    width--;
    d += 4;
    suv += 2;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_NV12 (d, sy, suv, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = sy[i * 2 + 0];
      d[i * 8 + 2] = suv[i * 2 + 0];
      d[i * 8 + 3] = suv[i * 2 + 1];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = sy[i * 2 + 1];
      d[i * 8 + 6] = suv[i * 2 + 0];
      d[i * 8 + 7] = suv[i * 2 + 1];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = sy[i];
    d[i * 4 + 2] = suv[i + 0];
    d[i * 4 + 3] = suv[i + 1];
  }
}

static void
pack_NV12 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  gint uv = GET_UV_420 (y, flags);
  guint8 *restrict dy = GET_PLANE_LINE (0, y);
  guint8 *restrict duv = GET_PLANE_LINE (1, uv);
  const guint8 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    if (IS_ALIGNED (s, 8))
      video_orc_pack_NV12 (dy, duv, s, width / 2);
    else {
      gint i;
      for (i = 0; i < width / 2; i++) {
        dy[i * 2 + 0] = s[i * 8 + 1];
        dy[i * 2 + 1] = s[i * 8 + 5];
        duv[i * 2 + 0] = s[i * 8 + 2];
        duv[i * 2 + 1] = s[i * 8 + 3];
      }
    }
    if (width & 1) {
      gint i = width - 1;

      dy[i] = s[i * 4 + 1];
      duv[i + 0] = s[i * 4 + 2];
      duv[i + 1] = s[i * 4 + 3];
    }
  } else
    video_orc_pack_Y (dy, s, width);
}

#define PACK_NV21 GST_VIDEO_FORMAT_AYUV, unpack_NV21, 1, pack_NV21
static void
unpack_NV21 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  gint uv = GET_UV_420 (y, flags);
  const guint8 *restrict sy = GET_PLANE_LINE (0, y);
  const guint8 *restrict suv = GET_PLANE_LINE (1, uv);
  guint8 *restrict d = dest;

  sy += x;
  suv += (x & ~1);

  if (x & 1) {
    d[0] = 0xff;
    d[1] = *sy++;
    d[2] = suv[1];
    d[3] = suv[0];
    width--;
    d += 4;
    suv += 2;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_NV21 (d, sy, suv, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = sy[i * 2 + 0];
      d[i * 8 + 2] = suv[i * 2 + 1];
      d[i * 8 + 3] = suv[i * 2 + 0];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = sy[i * 2 + 1];
      d[i * 8 + 6] = suv[i * 2 + 1];
      d[i * 8 + 7] = suv[i * 2 + 0];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = sy[i];
    d[i * 4 + 2] = suv[i + 1];
    d[i * 4 + 3] = suv[i + 0];
  }
}

static void
pack_NV21 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  gint uv = GET_UV_420 (y, flags);
  guint8 *restrict dy = GET_PLANE_LINE (0, y);
  guint8 *restrict duv = GET_PLANE_LINE (1, uv);
  const guint8 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    if (IS_ALIGNED (s, 8))
      video_orc_pack_NV21 (dy, duv, s, width / 2);
    else {
      gint i;
      for (i = 0; i < width / 2; i++) {
        dy[i * 2 + 0] = s[i * 8 + 1];
        dy[i * 2 + 1] = s[i * 8 + 5];
        duv[i * 2 + 0] = s[i * 8 + 3];
        duv[i * 2 + 1] = s[i * 8 + 2];
      }
    }
    if (width & 1) {
      gint i = width - 1;

      dy[i] = s[i * 4 + 1];
      duv[i + 0] = s[i * 4 + 3];
      duv[i + 1] = s[i * 4 + 2];
    }
  } else
    video_orc_pack_Y (dy, s, width);
}

#define PACK_NV16 GST_VIDEO_FORMAT_AYUV, unpack_NV16, 1, pack_NV16
static void
unpack_NV16 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict sy = GET_PLANE_LINE (0, y);
  const guint8 *restrict suv = GET_PLANE_LINE (1, y);
  guint8 *restrict d = dest;

  sy += x;
  suv += (x & ~1);

  if (x & 1) {
    d[0] = 0xff;
    d[1] = *sy++;
    d[2] = suv[0];
    d[3] = suv[1];
    width--;
    d += 4;
    suv += 2;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_NV12 (d, sy, suv, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = sy[i * 2 + 0];
      d[i * 8 + 2] = suv[i * 2 + 0];
      d[i * 8 + 3] = suv[i * 2 + 1];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = sy[i * 2 + 1];
      d[i * 8 + 6] = suv[i * 2 + 0];
      d[i * 8 + 7] = suv[i * 2 + 1];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = sy[i];
    d[i * 4 + 2] = suv[i + 0];
    d[i * 4 + 3] = suv[i + 1];
  }
}

static void
pack_NV16 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict dy = GET_PLANE_LINE (0, y);
  guint8 *restrict duv = GET_PLANE_LINE (1, y);
  const guint8 *restrict s = src;

  if (IS_ALIGNED (s, 8))
    video_orc_pack_NV12 (dy, duv, s, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      dy[i * 2 + 0] = s[i * 8 + 1];
      dy[i * 2 + 1] = s[i * 8 + 5];
      duv[i * 2 + 0] = s[i * 8 + 2];
      duv[i * 2 + 1] = s[i * 8 + 3];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    dy[i] = s[i * 4 + 1];
    duv[i + 0] = s[i * 4 + 2];
    duv[i + 1] = s[i * 4 + 3];
  }
}

#define PACK_NV61 GST_VIDEO_FORMAT_AYUV, unpack_NV61, 1, pack_NV61
static void
unpack_NV61 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict sy = GET_PLANE_LINE (0, y);
  const guint8 *restrict svu = GET_PLANE_LINE (1, y);
  guint8 *restrict d = dest;

  sy += x;
  svu += (x & ~1);

  if (x & 1) {
    d[0] = 0xff;
    d[1] = *sy++;
    d[2] = svu[1];
    d[3] = svu[0];
    width--;
    d += 4;
    svu += 2;
  }

  if (IS_ALIGNED (d, 8)) {
    video_orc_unpack_NV21 (d, sy, svu, width / 2);
  } else {
    gint i;

    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = sy[i * 2 + 0];
      d[i * 8 + 2] = svu[i * 2 + 1];
      d[i * 8 + 3] = svu[i * 2 + 0];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = sy[i * 2 + 1];
      d[i * 8 + 6] = svu[i * 2 + 1];
      d[i * 8 + 7] = svu[i * 2 + 0];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = sy[i];
    d[i * 4 + 2] = svu[i + 1];
    d[i * 4 + 3] = svu[i + 0];
  }
}

static void
pack_NV61 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  const guint8 *restrict s = src;
  guint8 *restrict dy = GET_PLANE_LINE (0, y);
  guint8 *restrict dvu = GET_PLANE_LINE (1, y);

  if (IS_ALIGNED (s, 8)) {
    video_orc_pack_NV21 (dy, dvu, s, width / 2);
  } else {
    gint i;

    for (i = 0; i < width / 2; i++) {
      dy[i * 2 + 0] = s[i * 8 + 1];
      dy[i * 2 + 1] = s[i * 8 + 5];
      dvu[i * 2 + 0] = s[i * 8 + 3];
      dvu[i * 2 + 1] = s[i * 8 + 2];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    dy[i] = s[i * 4 + 1];
    dvu[i + 0] = s[i * 4 + 2];
    dvu[i + 1] = s[i * 4 + 3];
  }
}

#define PACK_NV24 GST_VIDEO_FORMAT_AYUV, unpack_NV24, 1, pack_NV24
static void
unpack_NV24 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *restrict sy = GET_PLANE_LINE (0, y);
  const guint8 *restrict suv = GET_PLANE_LINE (1, y);

  sy += x;
  suv += x << 1;

  video_orc_unpack_NV24 (dest, sy, suv, width);
}

static void
pack_NV24 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict dy = GET_PLANE_LINE (0, y);
  guint8 *restrict duv = GET_PLANE_LINE (1, y);

  video_orc_pack_NV24 (dy, duv, src, width);
}

#define PACK_UYVP GST_VIDEO_FORMAT_AYUV64, unpack_UYVP, 1, pack_UYVP
static void
unpack_UYVP (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint16 *restrict d = dest;

  /* FIXME */
  s += x << 1;

  for (i = 0; i < width; i += 2) {
    guint16 y0, y1;
    guint16 u0;
    guint16 v0;

    u0 = ((s[(i / 2) * 5 + 0] << 2) | (s[(i / 2) * 5 + 1] >> 6)) << 6;
    y0 = (((s[(i / 2) * 5 + 1] & 0x3f) << 4) | (s[(i / 2) * 5 + 2] >> 4)) << 6;
    v0 = (((s[(i / 2) * 5 + 2] & 0x0f) << 6) | (s[(i / 2) * 5 + 3] >> 2)) << 6;
    y1 = (((s[(i / 2) * 5 + 3] & 0x03) << 8) | s[(i / 2) * 5 + 4]) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      y0 |= (y0 >> 10);
      y1 |= (y1 >> 10);
      u0 |= (u0 >> 10);
      v0 |= (v0 >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = y0;
    d[i * 4 + 2] = u0;
    d[i * 4 + 3] = v0;

    if (i < width - 1) {
      d[i * 4 + 4] = 0xffff;
      d[i * 4 + 5] = y1;
      d[i * 4 + 6] = u0;
      d[i * 4 + 7] = v0;
    }
  }
}

static void
pack_UYVP (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint16 *restrict s = src;

  for (i = 0; i < width; i += 2) {
    guint16 y0, y1;
    guint16 u0;
    guint16 v0;

    y0 = s[4 * (i + 0) + 1];
    if (i < width - 1)
      y1 = s[4 * (i + 1) + 1];
    else
      y1 = y0;

    u0 = s[4 * (i + 0) + 2];
    v0 = s[4 * (i + 0) + 3];

    d[(i / 2) * 5 + 0] = u0 >> 8;
    d[(i / 2) * 5 + 1] = (u0 & 0xc0) | y0 >> 10;
    d[(i / 2) * 5 + 2] = ((y0 & 0x3c0) >> 2) | (v0 >> 12);
    d[(i / 2) * 5 + 3] = ((v0 & 0xfc0) >> 4) | (y1 >> 14);
    d[(i / 2) * 5 + 4] = (y1 >> 6);
  }
}

#define PACK_A420 GST_VIDEO_FORMAT_AYUV, unpack_A420, 1, pack_A420
static void
unpack_A420 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  gint uv = GET_UV_420 (y, flags);
  const guint8 *restrict sy = GET_Y_LINE (y);
  const guint8 *restrict su = GET_U_LINE (uv);
  const guint8 *restrict sv = GET_V_LINE (uv);
  const guint8 *restrict sa = GET_A_LINE (y);
  guint8 *restrict d = dest;

  sy += x;
  su += x >> 1;
  sv += x >> 1;
  sa += x;

  if (x & 1) {
    d[0] = *sa++;
    d[1] = *sy++;
    d[2] = *su++;
    d[3] = *sv++;
    width--;
    d += 4;
  }
  video_orc_unpack_A420 (d, sy, su, sv, sa, width);
}

static void
pack_A420 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  gint uv = GET_UV_420 (y, flags);
  guint8 *restrict dy = GET_Y_LINE (y);
  guint8 *restrict du = GET_U_LINE (uv);
  guint8 *restrict dv = GET_V_LINE (uv);
  guint8 *restrict da = GET_A_LINE (y);
  const guint8 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    if (IS_ALIGNED (s, 8))
      video_orc_pack_A420 (dy, du, dv, da, s, width / 2);
    else {
      gint i;
      for (i = 0; i < width / 2; i++) {
        da[i * 2 + 0] = s[i * 8 + 0];
        dy[i * 2 + 0] = s[i * 8 + 1];
        da[i * 2 + 1] = s[i * 8 + 4];
        dy[i * 2 + 1] = s[i * 8 + 5];
        du[i] = s[i * 8 + 2];
        dv[i] = s[i * 8 + 3];
      }
    }

    if (width & 1) {
      gint i = width - 1;

      da[i] = s[i * 4 + 0];
      dy[i] = s[i * 4 + 1];
      du[i >> 1] = s[i * 4 + 2];
      dv[i >> 1] = s[i * 4 + 3];
    }
  } else
    video_orc_pack_AY (dy, da, s, width);
}

#define PACK_RGB8P GST_VIDEO_FORMAT_ARGB, unpack_RGB8P, 1, pack_RGB8P
static void
unpack_RGB8P (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  const guint32 *restrict p = data[1];
  guint8 *restrict d = dest;

  s += x;

  for (i = 0; i < width; i++) {
    guint32 v = p[s[i]];
    d[i * 4 + 0] = (v >> 24) & 0xff;
    d[i * 4 + 1] = (v >> 16) & 0xff;
    d[i * 4 + 2] = (v >> 8) & 0xff;
    d[i * 4 + 3] = (v) & 0xff;
  }
}

static const guint32 std_palette_RGB8P[] = {
  0xff000000, 0xff000033, 0xff000066, 0xff000099, 0xff0000cc, 0xff0000ff,
  0xff003300, 0xff003333, 0xff003366, 0xff003399, 0xff0033cc, 0xff0033ff,
  0xff006600, 0xff006633, 0xff006666, 0xff006699, 0xff0066cc, 0xff0066ff,
  0xff009900, 0xff009933, 0xff009966, 0xff009999, 0xff0099cc, 0xff0099ff,
  0xff00cc00, 0xff00cc33, 0xff00cc66, 0xff00cc99, 0xff00cccc, 0xff00ccff,
  0xff00ff00, 0xff00ff33, 0xff00ff66, 0xff00ff99, 0xff00ffcc, 0xff00ffff,
  0xff330000, 0xff330033, 0xff330066, 0xff330099, 0xff3300cc, 0xff3300ff,
  0xff333300, 0xff333333, 0xff333366, 0xff333399, 0xff3333cc, 0xff3333ff,
  0xff336600, 0xff336633, 0xff336666, 0xff336699, 0xff3366cc, 0xff3366ff,
  0xff339900, 0xff339933, 0xff339966, 0xff339999, 0xff3399cc, 0xff3399ff,
  0xff33cc00, 0xff33cc33, 0xff33cc66, 0xff33cc99, 0xff33cccc, 0xff33ccff,
  0xff33ff00, 0xff33ff33, 0xff33ff66, 0xff33ff99, 0xff33ffcc, 0xff33ffff,
  0xff660000, 0xff660033, 0xff660066, 0xff660099, 0xff6600cc, 0xff6600ff,
  0xff663300, 0xff663333, 0xff663366, 0xff663399, 0xff6633cc, 0xff6633ff,
  0xff666600, 0xff666633, 0xff666666, 0xff666699, 0xff6666cc, 0xff6666ff,
  0xff669900, 0xff669933, 0xff669966, 0xff669999, 0xff6699cc, 0xff6699ff,
  0xff66cc00, 0xff66cc33, 0xff66cc66, 0xff66cc99, 0xff66cccc, 0xff66ccff,
  0xff66ff00, 0xff66ff33, 0xff66ff66, 0xff66ff99, 0xff66ffcc, 0xff66ffff,
  0xff990000, 0xff990033, 0xff990066, 0xff990099, 0xff9900cc, 0xff9900ff,
  0xff993300, 0xff993333, 0xff993366, 0xff993399, 0xff9933cc, 0xff9933ff,
  0xff996600, 0xff996633, 0xff996666, 0xff996699, 0xff9966cc, 0xff9966ff,
  0xff999900, 0xff999933, 0xff999966, 0xff999999, 0xff9999cc, 0xff9999ff,
  0xff99cc00, 0xff99cc33, 0xff99cc66, 0xff99cc99, 0xff99cccc, 0xff99ccff,
  0xff99ff00, 0xff99ff33, 0xff99ff66, 0xff99ff99, 0xff99ffcc, 0xff99ffff,
  0xffcc0000, 0xffcc0033, 0xffcc0066, 0xffcc0099, 0xffcc00cc, 0xffcc00ff,
  0xffcc3300, 0xffcc3333, 0xffcc3366, 0xffcc3399, 0xffcc33cc, 0xffcc33ff,
  0xffcc6600, 0xffcc6633, 0xffcc6666, 0xffcc6699, 0xffcc66cc, 0xffcc66ff,
  0xffcc9900, 0xffcc9933, 0xffcc9966, 0xffcc9999, 0xffcc99cc, 0xffcc99ff,
  0xffcccc00, 0xffcccc33, 0xffcccc66, 0xffcccc99, 0xffcccccc, 0xffccccff,
  0xffccff00, 0xffccff33, 0xffccff66, 0xffccff99, 0xffccffcc, 0xffccffff,
  0xffff0000, 0xffff0033, 0xffff0066, 0xffff0099, 0xffff00cc, 0xffff00ff,
  0xffff3300, 0xffff3333, 0xffff3366, 0xffff3399, 0xffff33cc, 0xffff33ff,
  0xffff6600, 0xffff6633, 0xffff6666, 0xffff6699, 0xffff66cc, 0xffff66ff,
  0xffff9900, 0xffff9933, 0xffff9966, 0xffff9999, 0xffff99cc, 0xffff99ff,
  0xffffcc00, 0xffffcc33, 0xffffcc66, 0xffffcc99, 0xffffcccc, 0xffffccff,
  0xffffff00, 0xffffff33, 0xffffff66, 0xffffff99, 0xffffffcc, 0xffffffff,
  0x00000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
  0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
  0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
  0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
  0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
  0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
  0xff000000, 0xff000000, 0xff000000, 0xff000000
};

static void
pack_RGB8P (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  /* Use our poor man's palette, taken from ffmpegcolorspace too */
  for (i = 0; i < width; i++) {
    /* crude approximation for alpha ! */
    if (s[i * 4 + 0] < 0x80)
      d[i] = 6 * 6 * 6;
    else
      d[i] =
          ((((s[i * 4 + 1]) / 47) % 6) * 6 * 6 + (((s[i * 4 +
                          2]) / 47) % 6) * 6 + (((s[i * 4 + 3]) / 47) % 6));
  }
}

#define PACK_410 GST_VIDEO_FORMAT_AYUV, unpack_410, 1, pack_410
static void
unpack_410 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  gint uv = GET_UV_410 (y, flags);
  const guint8 *restrict sy = GET_Y_LINE (y);
  const guint8 *restrict su = GET_U_LINE (uv);
  const guint8 *restrict sv = GET_V_LINE (uv);
  guint8 *restrict d = dest;

  sy += x;
  su += x >> 2;
  sv += x >> 2;

  if (x & 3) {
    for (; x & 3; x++) {
      d[0] = 0xff;
      d[1] = *sy++;
      d[2] = *su;
      d[3] = *sv;
      width--;
      d += 4;
    }
    su++;
    sy++;
  }

  if (IS_ALIGNED (d, 8))
    video_orc_unpack_YUV9 (d, sy, su, sv, width / 2);
  else {
    gint i;
    for (i = 0; i < width / 2; i++) {
      d[i * 8 + 0] = 0xff;
      d[i * 8 + 1] = sy[i * 2 + 0];
      d[i * 8 + 2] = su[i >> 1];
      d[i * 8 + 3] = sv[i >> 1];
      d[i * 8 + 4] = 0xff;
      d[i * 8 + 5] = sy[i * 2 + 1];
      d[i * 8 + 6] = su[i >> 1];
      d[i * 8 + 7] = sv[i >> 1];
    }
  }

  if (width & 1) {
    gint i = width - 1;

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = sy[i];
    d[i * 4 + 2] = su[i >> 2];
    d[i * 4 + 3] = sv[i >> 2];
  }
}

static void
pack_410 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_410 (y, flags);
  guint8 *restrict dy = GET_Y_LINE (y);
  guint8 *restrict du = GET_U_LINE (uv);
  guint8 *restrict dv = GET_V_LINE (uv);
  const guint8 *restrict s = src;

  for (i = 0; i < width - 3; i += 4) {
    dy[i] = s[i * 4 + 1];
    dy[i + 1] = s[i * 4 + 5];
    dy[i + 2] = s[i * 4 + 9];
    dy[i + 3] = s[i * 4 + 13];
    if (IS_CHROMA_LINE_410 (y, flags)) {
      du[i >> 2] = s[i * 4 + 2];
      dv[i >> 2] = s[i * 4 + 3];
    }
  }
  if (i < width) {
    dy[i] = s[i * 4 + 1];
    if (IS_CHROMA_LINE_410 (y, flags)) {
      du[i >> 2] = s[i * 4 + 2];
      dv[i >> 2] = s[i * 4 + 3];
    }
    if (i < width - 1)
      dy[i + 1] = s[i * 4 + 5];
    if (i < width - 2)
      dy[i + 2] = s[i * 4 + 9];
  }
}

#define PACK_IYU1 GST_VIDEO_FORMAT_AYUV, unpack_IYU1, 1, pack_IYU1
static void
unpack_IYU1 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint8 *restrict d = dest;
  guint8 y0, y1, y2, y3;
  guint8 u0;
  guint8 v0;

  /* FIXME */
  s += x * 4;

  for (i = 0; i < width - 3; i += 4) {
    y0 = s[(i >> 2) * 6 + 1];
    y1 = s[(i >> 2) * 6 + 2];
    y2 = s[(i >> 2) * 6 + 4];
    y3 = s[(i >> 2) * 6 + 5];

    u0 = s[(i >> 2) * 6 + 0];
    v0 = s[(i >> 2) * 6 + 3];

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = y0;
    d[i * 4 + 2] = u0;
    d[i * 4 + 3] = v0;

    d[i * 4 + 4] = 0xff;
    d[i * 4 + 5] = y1;
    d[i * 4 + 6] = u0;
    d[i * 4 + 7] = v0;

    d[i * 4 + 8] = 0xff;
    d[i * 4 + 9] = y2;
    d[i * 4 + 10] = u0;
    d[i * 4 + 11] = v0;

    d[i * 4 + 12] = 0xff;
    d[i * 4 + 13] = y3;
    d[i * 4 + 14] = u0;
    d[i * 4 + 15] = v0;
  }
  if (i < width) {
    u0 = s[(i >> 2) * 6 + 0];
    v0 = s[(i >> 2) * 6 + 3];

    d[i * 4 + 0] = 0xff;
    d[i * 4 + 1] = s[(i >> 2) * 6 + 1];
    d[i * 4 + 2] = u0;
    d[i * 4 + 3] = v0;

    if (i < width - 1) {
      d[i * 4 + 4] = 0xff;
      d[i * 4 + 5] = s[(i >> 2) * 6 + 2];
      d[i * 4 + 6] = u0;
      d[i * 4 + 7] = v0;
    }
    if (i < width - 2) {
      d[i * 4 + 8] = 0xff;
      d[i * 4 + 9] = s[(i >> 2) * 6 + 4];
      d[i * 4 + 10] = u0;
      d[i * 4 + 11] = v0;
    }
  }
}

static void
pack_IYU1 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint8 *restrict s = src;

  for (i = 0; i < width - 3; i += 4) {
    d[(i >> 2) * 6 + 0] = s[i * 4 + 2];
    d[(i >> 2) * 6 + 1] = s[i * 4 + 1];
    d[(i >> 2) * 6 + 2] = s[i * 4 + 5];
    d[(i >> 2) * 6 + 3] = s[i * 4 + 3];
    d[(i >> 2) * 6 + 4] = s[i * 4 + 9];
    d[(i >> 2) * 6 + 5] = s[i * 4 + 13];
  }
  if (i < width) {
    d[(i >> 2) * 6 + 1] = s[i * 4 + 1];
    d[(i >> 2) * 6 + 0] = s[i * 4 + 2];
    d[(i >> 2) * 6 + 3] = s[i * 4 + 3];
    if (i < width - 1)
      d[(i >> 2) * 6 + 2] = s[i * 4 + 5];
    if (i < width - 2)
      d[(i >> 2) * 6 + 4] = s[i * 4 + 9];
  }
}

#define PACK_ARGB64 GST_VIDEO_FORMAT_ARGB64, unpack_copy8, 1, pack_copy8
#define PACK_AYUV64 GST_VIDEO_FORMAT_AYUV64, unpack_copy8, 1, pack_copy8
static void
unpack_copy8 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const guint8 *s = GET_LINE (y);

  s += x * 8;

  memcpy (dest, s, width * 8);
}

static void
pack_copy8 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  guint8 *restrict d = GET_LINE (y);

  memcpy (d, src, width * 8);
}

#define PACK_r210 GST_VIDEO_FORMAT_ARGB64, unpack_r210, 1, pack_r210
static void
unpack_r210 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint8 *restrict s = GET_LINE (y);
  guint16 *restrict d = dest, R, G, B;

  s += x * 4;

  for (i = 0; i < width; i++) {
    guint32 x = GST_READ_UINT32_BE (s + i * 4);

    R = ((x >> 14) & 0xffc0);
    G = ((x >> 4) & 0xffc0);
    B = ((x << 6) & 0xffc0);

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      R |= (R >> 10);
      G |= (G >> 10);
      B |= (B >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_r210 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint8 *restrict d = GET_LINE (y);
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    guint32 x = 0;
    x |= (s[i * 4 + 1] & 0xffc0) << 14;
    x |= (s[i * 4 + 2] & 0xffc0) << 4;
    x |= (s[i * 4 + 3] & 0xffc0) >> 6;
    GST_WRITE_UINT32_BE (d + i * 4, x);
  }
}

#define PACK_GBR_10LE GST_VIDEO_FORMAT_ARGB64, unpack_GBR_10LE, 1, pack_GBR_10LE
static void
unpack_GBR_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *sg = GET_G_LINE (y);
  const guint16 *sb = GET_B_LINE (y);
  const guint16 *sr = GET_R_LINE (y);
  guint16 *d = dest, G, B, R;

  sg += x;
  sb += x;
  sr += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT16_LE (sg + i) << 6;
    B = GST_READ_UINT16_LE (sb + i) << 6;
    R = GST_READ_UINT16_LE (sr + i) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      R |= (R >> 10);
      G |= (G >> 10);
      B |= (B >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBR_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dg = GET_G_LINE (y);
  guint16 *restrict db = GET_B_LINE (y);
  guint16 *restrict dr = GET_R_LINE (y);
  guint16 G, B, R;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = (s[i * 4 + 2]) >> 6;
    B = (s[i * 4 + 3]) >> 6;
    R = (s[i * 4 + 1]) >> 6;

    GST_WRITE_UINT16_LE (dg + i, G);
    GST_WRITE_UINT16_LE (db + i, B);
    GST_WRITE_UINT16_LE (dr + i, R);
  }
}

#define PACK_GBR_10BE GST_VIDEO_FORMAT_ARGB64, unpack_GBR_10BE, 1, pack_GBR_10BE
static void
unpack_GBR_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sg = GET_G_LINE (y);
  const guint16 *restrict sb = GET_B_LINE (y);
  const guint16 *restrict sr = GET_R_LINE (y);
  guint16 *restrict d = dest, G, B, R;

  sg += x;
  sb += x;
  sr += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT16_BE (sg + i) << 6;
    B = GST_READ_UINT16_BE (sb + i) << 6;
    R = GST_READ_UINT16_BE (sr + i) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      R |= (R >> 10);
      G |= (G >> 10);
      B |= (B >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBR_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dg = GET_G_LINE (y);
  guint16 *restrict db = GET_B_LINE (y);
  guint16 *restrict dr = GET_R_LINE (y);
  guint16 G, B, R;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = s[i * 4 + 2] >> 6;
    B = s[i * 4 + 3] >> 6;
    R = s[i * 4 + 1] >> 6;

    GST_WRITE_UINT16_BE (dg + i, G);
    GST_WRITE_UINT16_BE (db + i, B);
    GST_WRITE_UINT16_BE (dr + i, R);
  }
}

#define PACK_GBRA_10LE GST_VIDEO_FORMAT_ARGB64, unpack_GBRA_10LE, 1, pack_GBRA_10LE
static void
unpack_GBRA_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *sg = GET_G_LINE (y);
  const guint16 *sb = GET_B_LINE (y);
  const guint16 *sr = GET_R_LINE (y);
  const guint16 *sa = GET_A_LINE (y);
  guint16 *d = dest, G, B, R, A;

  sg += x;
  sb += x;
  sr += x;
  sa += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT16_LE (sg + i) << 6;
    B = GST_READ_UINT16_LE (sb + i) << 6;
    R = GST_READ_UINT16_LE (sr + i) << 6;
    A = GST_READ_UINT16_LE (sa + i) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      R |= (R >> 10);
      G |= (G >> 10);
      B |= (B >> 10);
      A |= (A >> 10);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBRA_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dg = GET_G_LINE (y);
  guint16 *restrict db = GET_B_LINE (y);
  guint16 *restrict dr = GET_R_LINE (y);
  guint16 *restrict da = GET_A_LINE (y);
  guint16 G, B, R, A;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = (s[i * 4 + 2]) >> 6;
    B = (s[i * 4 + 3]) >> 6;
    R = (s[i * 4 + 1]) >> 6;
    A = (s[i * 4 + 0]) >> 6;

    GST_WRITE_UINT16_LE (dg + i, G);
    GST_WRITE_UINT16_LE (db + i, B);
    GST_WRITE_UINT16_LE (dr + i, R);
    GST_WRITE_UINT16_LE (da + i, A);
  }
}

#define PACK_GBRA_10BE GST_VIDEO_FORMAT_ARGB64, unpack_GBRA_10BE, 1, pack_GBRA_10BE
static void
unpack_GBRA_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sg = GET_G_LINE (y);
  const guint16 *restrict sb = GET_B_LINE (y);
  const guint16 *restrict sr = GET_R_LINE (y);
  const guint16 *restrict sa = GET_A_LINE (y);
  guint16 *restrict d = dest, G, B, R, A;

  sg += x;
  sb += x;
  sr += x;
  sa += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT16_BE (sg + i) << 6;
    B = GST_READ_UINT16_BE (sb + i) << 6;
    R = GST_READ_UINT16_BE (sr + i) << 6;
    A = GST_READ_UINT16_BE (sa + i) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      R |= (R >> 10);
      G |= (G >> 10);
      B |= (B >> 10);
      A |= (A >> 10);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBRA_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dg = GET_G_LINE (y);
  guint16 *restrict db = GET_B_LINE (y);
  guint16 *restrict dr = GET_R_LINE (y);
  guint16 *restrict da = GET_A_LINE (y);
  guint16 G, B, R, A;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = s[i * 4 + 2] >> 6;
    B = s[i * 4 + 3] >> 6;
    R = s[i * 4 + 1] >> 6;
    A = s[i * 4 + 0] >> 6;

    GST_WRITE_UINT16_BE (dg + i, G);
    GST_WRITE_UINT16_BE (db + i, B);
    GST_WRITE_UINT16_BE (dr + i, R);
    GST_WRITE_UINT16_BE (da + i, A);
  }
}

#define PACK_GBR_12LE GST_VIDEO_FORMAT_ARGB64, unpack_GBR_12LE, 1, pack_GBR_12LE
static void
unpack_GBR_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *sg = GET_G_LINE (y);
  const guint16 *sb = GET_B_LINE (y);
  const guint16 *sr = GET_R_LINE (y);
  guint16 *d = dest, G, B, R;

  sg += x;
  sb += x;
  sr += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT16_LE (sg + i) << 4;
    B = GST_READ_UINT16_LE (sb + i) << 4;
    R = GST_READ_UINT16_LE (sr + i) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      R |= (R >> 12);
      G |= (G >> 12);
      B |= (B >> 12);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBR_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dg = GET_G_LINE (y);
  guint16 *restrict db = GET_B_LINE (y);
  guint16 *restrict dr = GET_R_LINE (y);
  guint16 G, B, R;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = (s[i * 4 + 2]) >> 4;
    B = (s[i * 4 + 3]) >> 4;
    R = (s[i * 4 + 1]) >> 4;

    GST_WRITE_UINT16_LE (dg + i, G);
    GST_WRITE_UINT16_LE (db + i, B);
    GST_WRITE_UINT16_LE (dr + i, R);
  }
}

#define PACK_GBR_12BE GST_VIDEO_FORMAT_ARGB64, unpack_GBR_12BE, 1, pack_GBR_12BE
static void
unpack_GBR_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sg = GET_G_LINE (y);
  const guint16 *restrict sb = GET_B_LINE (y);
  const guint16 *restrict sr = GET_R_LINE (y);
  guint16 *restrict d = dest, G, B, R;

  sg += x;
  sb += x;
  sr += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT16_BE (sg + i) << 4;
    B = GST_READ_UINT16_BE (sb + i) << 4;
    R = GST_READ_UINT16_BE (sr + i) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      R |= (R >> 12);
      G |= (G >> 12);
      B |= (B >> 12);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBR_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dg = GET_G_LINE (y);
  guint16 *restrict db = GET_B_LINE (y);
  guint16 *restrict dr = GET_R_LINE (y);
  guint16 G, B, R;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = s[i * 4 + 2] >> 4;
    B = s[i * 4 + 3] >> 4;
    R = s[i * 4 + 1] >> 4;

    GST_WRITE_UINT16_BE (dg + i, G);
    GST_WRITE_UINT16_BE (db + i, B);
    GST_WRITE_UINT16_BE (dr + i, R);
  }
}

#define PACK_GBRA_12LE GST_VIDEO_FORMAT_ARGB64, unpack_GBRA_12LE, 1, pack_GBRA_12LE
static void
unpack_GBRA_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *sg = GET_G_LINE (y);
  const guint16 *sb = GET_B_LINE (y);
  const guint16 *sr = GET_R_LINE (y);
  const guint16 *sa = GET_A_LINE (y);
  guint16 *d = dest, G, B, R, A;

  sg += x;
  sb += x;
  sr += x;
  sa += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT16_LE (sg + i) << 4;
    B = GST_READ_UINT16_LE (sb + i) << 4;
    R = GST_READ_UINT16_LE (sr + i) << 4;
    A = GST_READ_UINT16_LE (sa + i) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      A |= (A >> 12);
      R |= (R >> 12);
      G |= (G >> 12);
      B |= (B >> 12);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBRA_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dg = GET_G_LINE (y);
  guint16 *restrict db = GET_B_LINE (y);
  guint16 *restrict dr = GET_R_LINE (y);
  guint16 *restrict da = GET_A_LINE (y);
  guint16 G, B, R, A;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = (s[i * 4 + 2]) >> 4;
    B = (s[i * 4 + 3]) >> 4;
    R = (s[i * 4 + 1]) >> 4;
    A = (s[i * 4 + 0]) >> 4;

    GST_WRITE_UINT16_LE (dg + i, G);
    GST_WRITE_UINT16_LE (db + i, B);
    GST_WRITE_UINT16_LE (dr + i, R);
    GST_WRITE_UINT16_LE (da + i, A);
  }
}

#define PACK_GBRA_12BE GST_VIDEO_FORMAT_ARGB64, unpack_GBRA_12BE, 1, pack_GBRA_12BE
static void
unpack_GBRA_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sg = GET_G_LINE (y);
  const guint16 *restrict sb = GET_B_LINE (y);
  const guint16 *restrict sr = GET_R_LINE (y);
  const guint16 *restrict sa = GET_A_LINE (y);
  guint16 *restrict d = dest, G, B, R, A;

  sg += x;
  sb += x;
  sr += x;
  sa += x;

  for (i = 0; i < width; i++) {
    G = GST_READ_UINT16_BE (sg + i) << 4;
    B = GST_READ_UINT16_BE (sb + i) << 4;
    R = GST_READ_UINT16_BE (sr + i) << 4;
    A = GST_READ_UINT16_BE (sa + i) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      R |= (R >> 12);
      G |= (G >> 12);
      B |= (B >> 12);
      A |= (A >> 12);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = R;
    d[i * 4 + 2] = G;
    d[i * 4 + 3] = B;
  }
}

static void
pack_GBRA_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dg = GET_G_LINE (y);
  guint16 *restrict db = GET_B_LINE (y);
  guint16 *restrict dr = GET_R_LINE (y);
  guint16 *restrict da = GET_A_LINE (y);
  guint16 G, B, R, A;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    G = s[i * 4 + 2] >> 4;
    B = s[i * 4 + 3] >> 4;
    R = s[i * 4 + 1] >> 4;
    A = s[i * 4 + 0] >> 4;

    GST_WRITE_UINT16_BE (dg + i, G);
    GST_WRITE_UINT16_BE (db + i, B);
    GST_WRITE_UINT16_BE (dr + i, R);
    GST_WRITE_UINT16_BE (da + i, A);
  }
}

#define PACK_Y444_10LE GST_VIDEO_FORMAT_AYUV64, unpack_Y444_10LE, 1, pack_Y444_10LE
static void
unpack_Y444_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  guint16 *restrict sy = GET_Y_LINE (y);
  guint16 *restrict su = GET_U_LINE (y);
  guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x;
  sv += x;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_LE (sy + i) << 6;
    U = GST_READ_UINT16_LE (su + i) << 6;
    V = GST_READ_UINT16_LE (sv + i) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;
  }
}

static void
pack_Y444_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 Y, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    Y = (s[i * 4 + 1]) >> 6;
    U = (s[i * 4 + 2]) >> 6;
    V = (s[i * 4 + 3]) >> 6;

    GST_WRITE_UINT16_LE (dy + i, Y);
    GST_WRITE_UINT16_LE (du + i, U);
    GST_WRITE_UINT16_LE (dv + i, V);
  }
}

#define PACK_Y444_10BE GST_VIDEO_FORMAT_AYUV64, unpack_Y444_10BE, 1, pack_Y444_10BE
static void
unpack_Y444_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x;
  sv += x;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_BE (sy + i) << 6;
    U = GST_READ_UINT16_BE (su + i) << 6;
    V = GST_READ_UINT16_BE (sv + i) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;
  }
}

static void
pack_Y444_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 Y, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    Y = s[i * 4 + 1] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_BE (dy + i, Y);
    GST_WRITE_UINT16_BE (du + i, U);
    GST_WRITE_UINT16_BE (dv + i, V);
  }
}

#define PACK_I420_10LE GST_VIDEO_FORMAT_AYUV64, unpack_I420_10LE, 1, pack_I420_10LE
static void
unpack_I420_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (uv);
  const guint16 *restrict sv = GET_V_LINE (uv);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_LE (sy + i) << 6;
    U = GST_READ_UINT16_LE (su + (i >> 1)) << 6;
    V = GST_READ_UINT16_LE (sv + (i >> 1)) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_I420_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (uv);
  guint16 *restrict dv = GET_V_LINE (uv);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    for (i = 0; i < width - 1; i += 2) {
      Y0 = s[i * 4 + 1] >> 6;
      Y1 = s[i * 4 + 5] >> 6;
      U = s[i * 4 + 2] >> 6;
      V = s[i * 4 + 3] >> 6;

      GST_WRITE_UINT16_LE (dy + i + 0, Y0);
      GST_WRITE_UINT16_LE (dy + i + 1, Y1);
      GST_WRITE_UINT16_LE (du + (i >> 1), U);
      GST_WRITE_UINT16_LE (dv + (i >> 1), V);
    }
    if (i == width - 1) {
      Y0 = s[i * 4 + 1] >> 6;
      U = s[i * 4 + 2] >> 6;
      V = s[i * 4 + 3] >> 6;

      GST_WRITE_UINT16_LE (dy + i, Y0);
      GST_WRITE_UINT16_LE (du + (i >> 1), U);
      GST_WRITE_UINT16_LE (dv + (i >> 1), V);
    }
  } else {
    for (i = 0; i < width; i++) {
      Y0 = s[i * 4 + 1] >> 6;
      GST_WRITE_UINT16_LE (dy + i, Y0);
    }
  }
}

#define PACK_I420_10BE GST_VIDEO_FORMAT_AYUV64, unpack_I420_10BE, 1, pack_I420_10BE
static void
unpack_I420_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (uv);
  const guint16 *restrict sv = GET_V_LINE (uv);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_BE (sy + i) << 6;
    U = GST_READ_UINT16_BE (su + (i >> 1)) << 6;
    V = GST_READ_UINT16_BE (sv + (i >> 1)) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_I420_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (uv);
  guint16 *restrict dv = GET_V_LINE (uv);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    for (i = 0; i < width - 1; i += 2) {
      Y0 = s[i * 4 + 1] >> 6;
      Y1 = s[i * 4 + 5] >> 6;
      U = s[i * 4 + 2] >> 6;
      V = s[i * 4 + 3] >> 6;

      GST_WRITE_UINT16_BE (dy + i + 0, Y0);
      GST_WRITE_UINT16_BE (dy + i + 1, Y1);
      GST_WRITE_UINT16_BE (du + (i >> 1), U);
      GST_WRITE_UINT16_BE (dv + (i >> 1), V);
    }
    if (i == width - 1) {
      Y0 = s[i * 4 + 1] >> 6;
      U = s[i * 4 + 2] >> 6;
      V = s[i * 4 + 3] >> 6;

      GST_WRITE_UINT16_BE (dy + i, Y0);
      GST_WRITE_UINT16_BE (du + (i >> 1), U);
      GST_WRITE_UINT16_BE (dv + (i >> 1), V);
    }
  } else {
    for (i = 0; i < width; i++) {
      Y0 = s[i * 4 + 1] >> 6;
      GST_WRITE_UINT16_BE (dy + i, Y0);
    }
  }
}

#define PACK_I422_10LE GST_VIDEO_FORMAT_AYUV64, unpack_I422_10LE, 1, pack_I422_10LE
static void
unpack_I422_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_LE (sy + i) << 6;
    U = GST_READ_UINT16_LE (su + (i >> 1)) << 6;
    V = GST_READ_UINT16_LE (sv + (i >> 1)) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_I422_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width - 1; i += 2) {
    Y0 = s[i * 4 + 1] >> 6;
    Y1 = s[i * 4 + 5] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_LE (dy + i + 0, Y0);
    GST_WRITE_UINT16_LE (dy + i + 1, Y1);
    GST_WRITE_UINT16_LE (du + (i >> 1), U);
    GST_WRITE_UINT16_LE (dv + (i >> 1), V);
  }
  if (i == width - 1) {
    Y0 = s[i * 4 + 1] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_LE (dy + i, Y0);
    GST_WRITE_UINT16_LE (du + (i >> 1), U);
    GST_WRITE_UINT16_LE (dv + (i >> 1), V);
  }
}

#define PACK_I422_10BE GST_VIDEO_FORMAT_AYUV64, unpack_I422_10BE, 1, pack_I422_10BE
static void
unpack_I422_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_BE (sy + i) << 6;
    U = GST_READ_UINT16_BE (su + (i >> 1)) << 6;
    V = GST_READ_UINT16_BE (sv + (i >> 1)) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_I422_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width - 1; i += 2) {
    Y0 = s[i * 4 + 1] >> 6;
    Y1 = s[i * 4 + 5] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_BE (dy + i + 0, Y0);
    GST_WRITE_UINT16_BE (dy + i + 1, Y1);
    GST_WRITE_UINT16_BE (du + (i >> 1), U);
    GST_WRITE_UINT16_BE (dv + (i >> 1), V);
  }
  if (i == width - 1) {
    Y0 = s[i * 4 + 1] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_BE (dy + i, Y0);
    GST_WRITE_UINT16_BE (du + (i >> 1), U);
    GST_WRITE_UINT16_BE (dv + (i >> 1), V);
  }
}

#define PACK_Y444_12LE GST_VIDEO_FORMAT_AYUV64, unpack_Y444_12LE, 1, pack_Y444_12LE
static void
unpack_Y444_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  guint16 *restrict sy = GET_Y_LINE (y);
  guint16 *restrict su = GET_U_LINE (y);
  guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x;
  sv += x;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_LE (sy + i) << 4;
    U = GST_READ_UINT16_LE (su + i) << 4;
    V = GST_READ_UINT16_LE (sv + i) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 12);
      U |= (U >> 12);
      V |= (V >> 12);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;
  }
}

static void
pack_Y444_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 Y, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    Y = (s[i * 4 + 1]) >> 4;
    U = (s[i * 4 + 2]) >> 4;
    V = (s[i * 4 + 3]) >> 4;

    GST_WRITE_UINT16_LE (dy + i, Y);
    GST_WRITE_UINT16_LE (du + i, U);
    GST_WRITE_UINT16_LE (dv + i, V);
  }
}

#define PACK_Y444_12BE GST_VIDEO_FORMAT_AYUV64, unpack_Y444_12BE, 1, pack_Y444_12BE
static void
unpack_Y444_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x;
  sv += x;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_BE (sy + i) << 4;
    U = GST_READ_UINT16_BE (su + i) << 4;
    V = GST_READ_UINT16_BE (sv + i) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 12);
      U |= (U >> 12);
      V |= (V >> 12);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;
  }
}

static void
pack_Y444_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 Y, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    Y = s[i * 4 + 1] >> 4;
    U = s[i * 4 + 2] >> 4;
    V = s[i * 4 + 3] >> 4;

    GST_WRITE_UINT16_BE (dy + i, Y);
    GST_WRITE_UINT16_BE (du + i, U);
    GST_WRITE_UINT16_BE (dv + i, V);
  }
}

#define PACK_I420_12LE GST_VIDEO_FORMAT_AYUV64, unpack_I420_12LE, 1, pack_I420_12LE
static void
unpack_I420_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (uv);
  const guint16 *restrict sv = GET_V_LINE (uv);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_LE (sy + i) << 4;
    U = GST_READ_UINT16_LE (su + (i >> 1)) << 4;
    V = GST_READ_UINT16_LE (sv + (i >> 1)) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 12);
      U |= (U >> 12);
      V |= (V >> 12);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_I420_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (uv);
  guint16 *restrict dv = GET_V_LINE (uv);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    for (i = 0; i < width - 1; i += 2) {
      Y0 = s[i * 4 + 1] >> 4;
      Y1 = s[i * 4 + 5] >> 4;
      U = s[i * 4 + 2] >> 4;
      V = s[i * 4 + 3] >> 4;

      GST_WRITE_UINT16_LE (dy + i + 0, Y0);
      GST_WRITE_UINT16_LE (dy + i + 1, Y1);
      GST_WRITE_UINT16_LE (du + (i >> 1), U);
      GST_WRITE_UINT16_LE (dv + (i >> 1), V);
    }
    if (i == width - 1) {
      Y0 = s[i * 4 + 1] >> 4;
      U = s[i * 4 + 2] >> 4;
      V = s[i * 4 + 3] >> 4;

      GST_WRITE_UINT16_LE (dy + i, Y0);
      GST_WRITE_UINT16_LE (du + (i >> 1), U);
      GST_WRITE_UINT16_LE (dv + (i >> 1), V);
    }
  } else {
    for (i = 0; i < width; i++) {
      Y0 = s[i * 4 + 1] >> 4;
      GST_WRITE_UINT16_LE (dy + i, Y0);
    }
  }
}

#define PACK_I420_12BE GST_VIDEO_FORMAT_AYUV64, unpack_I420_12BE, 1, pack_I420_12BE
static void
unpack_I420_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (uv);
  const guint16 *restrict sv = GET_V_LINE (uv);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_BE (sy + i) << 4;
    U = GST_READ_UINT16_BE (su + (i >> 1)) << 4;
    V = GST_READ_UINT16_BE (sv + (i >> 1)) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 12);
      U |= (U >> 12);
      V |= (V >> 12);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_I420_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (uv);
  guint16 *restrict dv = GET_V_LINE (uv);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    for (i = 0; i < width - 1; i += 2) {
      Y0 = s[i * 4 + 1] >> 4;
      Y1 = s[i * 4 + 5] >> 4;
      U = s[i * 4 + 2] >> 4;
      V = s[i * 4 + 3] >> 4;

      GST_WRITE_UINT16_BE (dy + i + 0, Y0);
      GST_WRITE_UINT16_BE (dy + i + 1, Y1);
      GST_WRITE_UINT16_BE (du + (i >> 1), U);
      GST_WRITE_UINT16_BE (dv + (i >> 1), V);
    }
    if (i == width - 1) {
      Y0 = s[i * 4 + 1] >> 4;
      U = s[i * 4 + 2] >> 4;
      V = s[i * 4 + 3] >> 4;

      GST_WRITE_UINT16_BE (dy + i, Y0);
      GST_WRITE_UINT16_BE (du + (i >> 1), U);
      GST_WRITE_UINT16_BE (dv + (i >> 1), V);
    }
  } else {
    for (i = 0; i < width; i++) {
      Y0 = s[i * 4 + 1] >> 4;
      GST_WRITE_UINT16_BE (dy + i, Y0);
    }
  }
}

#define PACK_I422_12LE GST_VIDEO_FORMAT_AYUV64, unpack_I422_12LE, 1, pack_I422_12LE
static void
unpack_I422_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_LE (sy + i) << 4;
    U = GST_READ_UINT16_LE (su + (i >> 1)) << 4;
    V = GST_READ_UINT16_LE (sv + (i >> 1)) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 12);
      U |= (U >> 12);
      V |= (V >> 12);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_I422_12LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width - 1; i += 2) {
    Y0 = s[i * 4 + 1] >> 4;
    Y1 = s[i * 4 + 5] >> 4;
    U = s[i * 4 + 2] >> 4;
    V = s[i * 4 + 3] >> 4;

    GST_WRITE_UINT16_LE (dy + i + 0, Y0);
    GST_WRITE_UINT16_LE (dy + i + 1, Y1);
    GST_WRITE_UINT16_LE (du + (i >> 1), U);
    GST_WRITE_UINT16_LE (dv + (i >> 1), V);
  }
  if (i == width - 1) {
    Y0 = s[i * 4 + 1] >> 4;
    U = s[i * 4 + 2] >> 4;
    V = s[i * 4 + 3] >> 4;

    GST_WRITE_UINT16_LE (dy + i, Y0);
    GST_WRITE_UINT16_LE (du + (i >> 1), U);
    GST_WRITE_UINT16_LE (dv + (i >> 1), V);
  }
}

#define PACK_I422_12BE GST_VIDEO_FORMAT_AYUV64, unpack_I422_12BE, 1, pack_I422_12BE
static void
unpack_I422_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, Y, U, V;

  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    Y = GST_READ_UINT16_BE (sy + i) << 4;
    U = GST_READ_UINT16_BE (su + (i >> 1)) << 4;
    V = GST_READ_UINT16_BE (sv + (i >> 1)) << 4;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y |= (Y >> 12);
      U |= (U >> 12);
      V |= (V >> 12);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_I422_12BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width - 1; i += 2) {
    Y0 = s[i * 4 + 1] >> 4;
    Y1 = s[i * 4 + 5] >> 4;
    U = s[i * 4 + 2] >> 4;
    V = s[i * 4 + 3] >> 4;

    GST_WRITE_UINT16_BE (dy + i + 0, Y0);
    GST_WRITE_UINT16_BE (dy + i + 1, Y1);
    GST_WRITE_UINT16_BE (du + (i >> 1), U);
    GST_WRITE_UINT16_BE (dv + (i >> 1), V);
  }
  if (i == width - 1) {
    Y0 = s[i * 4 + 1] >> 4;
    U = s[i * 4 + 2] >> 4;
    V = s[i * 4 + 3] >> 4;

    GST_WRITE_UINT16_BE (dy + i, Y0);
    GST_WRITE_UINT16_BE (du + (i >> 1), U);
    GST_WRITE_UINT16_BE (dv + (i >> 1), V);
  }
}

#define PACK_A444_10LE GST_VIDEO_FORMAT_AYUV64, unpack_A444_10LE, 1, pack_A444_10LE
static void
unpack_A444_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  guint16 *restrict sa = GET_A_LINE (y);
  guint16 *restrict sy = GET_Y_LINE (y);
  guint16 *restrict su = GET_U_LINE (y);
  guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, A, Y, U, V;

  sa += x;
  sy += x;
  su += x;
  sv += x;

  for (i = 0; i < width; i++) {
    A = GST_READ_UINT16_LE (sa + i) << 6;
    Y = GST_READ_UINT16_LE (sy + i) << 6;
    U = GST_READ_UINT16_LE (su + i) << 6;
    V = GST_READ_UINT16_LE (sv + i) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      A |= (A >> 10);
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;
  }
}

static void
pack_A444_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict da = GET_A_LINE (y);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 A, Y, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    A = (s[i * 4 + 0]) >> 6;
    Y = (s[i * 4 + 1]) >> 6;
    U = (s[i * 4 + 2]) >> 6;
    V = (s[i * 4 + 3]) >> 6;

    GST_WRITE_UINT16_LE (da + i, A);
    GST_WRITE_UINT16_LE (dy + i, Y);
    GST_WRITE_UINT16_LE (du + i, U);
    GST_WRITE_UINT16_LE (dv + i, V);
  }
}

#define PACK_A444_10BE GST_VIDEO_FORMAT_AYUV64, unpack_A444_10BE, 1, pack_A444_10BE
static void
unpack_A444_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sa = GET_A_LINE (y);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, A, Y, U, V;

  sa += x;
  sy += x;
  su += x;
  sv += x;

  for (i = 0; i < width; i++) {
    A = GST_READ_UINT16_BE (sa + i) << 6;
    Y = GST_READ_UINT16_BE (sy + i) << 6;
    U = GST_READ_UINT16_BE (su + i) << 6;
    V = GST_READ_UINT16_BE (sv + i) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      A |= (A >> 10);
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;
  }
}

static void
pack_A444_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict da = GET_A_LINE (y);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 A, Y, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width; i++) {
    A = s[i * 4 + 0] >> 6;
    Y = s[i * 4 + 1] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_BE (da + i, A);
    GST_WRITE_UINT16_BE (dy + i, Y);
    GST_WRITE_UINT16_BE (du + i, U);
    GST_WRITE_UINT16_BE (dv + i, V);
  }
}

#define PACK_A420_10LE GST_VIDEO_FORMAT_AYUV64, unpack_A420_10LE, 1, pack_A420_10LE
static void
unpack_A420_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  const guint16 *restrict sa = GET_A_LINE (y);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (uv);
  const guint16 *restrict sv = GET_V_LINE (uv);
  guint16 *restrict d = dest, A, Y, U, V;

  sa += x;
  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    A = GST_READ_UINT16_LE (sa + i) << 6;
    Y = GST_READ_UINT16_LE (sy + i) << 6;
    U = GST_READ_UINT16_LE (su + (i >> 1)) << 6;
    V = GST_READ_UINT16_LE (sv + (i >> 1)) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      A |= (A >> 10);
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_A420_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  guint16 *restrict da = GET_A_LINE (y);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (uv);
  guint16 *restrict dv = GET_V_LINE (uv);
  guint16 A0, Y0, A1, Y1, U, V;
  const guint16 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    for (i = 0; i < width - 1; i += 2) {
      A0 = s[i * 4 + 0] >> 6;
      Y0 = s[i * 4 + 1] >> 6;
      A1 = s[i * 4 + 4] >> 6;
      Y1 = s[i * 4 + 5] >> 6;
      U = s[i * 4 + 2] >> 6;
      V = s[i * 4 + 3] >> 6;

      GST_WRITE_UINT16_LE (da + i + 0, A0);
      GST_WRITE_UINT16_LE (dy + i + 0, Y0);
      GST_WRITE_UINT16_LE (da + i + 1, A1);
      GST_WRITE_UINT16_LE (dy + i + 1, Y1);
      GST_WRITE_UINT16_LE (du + (i >> 1), U);
      GST_WRITE_UINT16_LE (dv + (i >> 1), V);
    }
    if (i == width - 1) {
      A0 = s[i * 4 + 0] >> 6;
      Y0 = s[i * 4 + 1] >> 6;
      U = s[i * 4 + 2] >> 6;
      V = s[i * 4 + 3] >> 6;

      GST_WRITE_UINT16_LE (da + i, A0);
      GST_WRITE_UINT16_LE (dy + i, Y0);
      GST_WRITE_UINT16_LE (du + (i >> 1), U);
      GST_WRITE_UINT16_LE (dv + (i >> 1), V);
    }
  } else {
    for (i = 0; i < width; i++) {
      A0 = s[i * 4 + 0] >> 6;
      Y0 = s[i * 4 + 1] >> 6;
      GST_WRITE_UINT16_LE (da + i, A0);
      GST_WRITE_UINT16_LE (dy + i, Y0);
    }
  }
}

#define PACK_A420_10BE GST_VIDEO_FORMAT_AYUV64, unpack_A420_10BE, 1, pack_A420_10BE
static void
unpack_A420_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  const guint16 *restrict sa = GET_A_LINE (y);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (uv);
  const guint16 *restrict sv = GET_V_LINE (uv);
  guint16 *restrict d = dest, A, Y, U, V;

  sa += x;
  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    A = GST_READ_UINT16_BE (sa + i) << 6;
    Y = GST_READ_UINT16_BE (sy + i) << 6;
    U = GST_READ_UINT16_BE (su + (i >> 1)) << 6;
    V = GST_READ_UINT16_BE (sv + (i >> 1)) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      A |= (A >> 10);
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_A420_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  guint16 *restrict da = GET_A_LINE (y);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (uv);
  guint16 *restrict dv = GET_V_LINE (uv);
  guint16 A0, Y0, A1, Y1, U, V;
  const guint16 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    for (i = 0; i < width - 1; i += 2) {
      A0 = s[i * 4 + 0] >> 6;
      Y0 = s[i * 4 + 1] >> 6;
      A1 = s[i * 4 + 4] >> 6;
      Y1 = s[i * 4 + 5] >> 6;
      U = s[i * 4 + 2] >> 6;
      V = s[i * 4 + 3] >> 6;

      GST_WRITE_UINT16_BE (da + i + 0, A0);
      GST_WRITE_UINT16_BE (dy + i + 0, Y0);
      GST_WRITE_UINT16_BE (da + i + 1, A1);
      GST_WRITE_UINT16_BE (dy + i + 1, Y1);
      GST_WRITE_UINT16_BE (du + (i >> 1), U);
      GST_WRITE_UINT16_BE (dv + (i >> 1), V);
    }
    if (i == width - 1) {
      A0 = s[i * 4 + 0] >> 6;
      Y0 = s[i * 4 + 1] >> 6;
      U = s[i * 4 + 2] >> 6;
      V = s[i * 4 + 3] >> 6;

      GST_WRITE_UINT16_BE (da + i, A0);
      GST_WRITE_UINT16_BE (dy + i, Y0);
      GST_WRITE_UINT16_BE (du + (i >> 1), U);
      GST_WRITE_UINT16_BE (dv + (i >> 1), V);
    }
  } else {
    for (i = 0; i < width; i++) {
      A0 = s[i * 4 + 0] >> 6;
      Y0 = s[i * 4 + 1] >> 6;
      GST_WRITE_UINT16_BE (da + i, A0);
      GST_WRITE_UINT16_BE (dy + i, Y0);
    }
  }
}

#define PACK_A422_10LE GST_VIDEO_FORMAT_AYUV64, unpack_A422_10LE, 1, pack_A422_10LE
static void
unpack_A422_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sa = GET_A_LINE (y);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, A, Y, U, V;

  sa += x;
  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    A = GST_READ_UINT16_LE (sa + i) << 6;
    Y = GST_READ_UINT16_LE (sy + i) << 6;
    U = GST_READ_UINT16_LE (su + (i >> 1)) << 6;
    V = GST_READ_UINT16_LE (sv + (i >> 1)) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      A |= (A >> 10);
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_A422_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict da = GET_A_LINE (y);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 A0, Y0, A1, Y1, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width - 1; i += 2) {
    A0 = s[i * 4 + 0] >> 6;
    Y0 = s[i * 4 + 1] >> 6;
    A1 = s[i * 4 + 4] >> 6;
    Y1 = s[i * 4 + 5] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_LE (da + i + 0, A0);
    GST_WRITE_UINT16_LE (dy + i + 0, Y0);
    GST_WRITE_UINT16_LE (da + i + 1, A1);
    GST_WRITE_UINT16_LE (dy + i + 1, Y1);
    GST_WRITE_UINT16_LE (du + (i >> 1), U);
    GST_WRITE_UINT16_LE (dv + (i >> 1), V);
  }
  if (i == width - 1) {
    A0 = s[i * 4 + 0] >> 6;
    Y0 = s[i * 4 + 1] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_LE (da + i, A0);
    GST_WRITE_UINT16_LE (dy + i, Y0);
    GST_WRITE_UINT16_LE (du + (i >> 1), U);
    GST_WRITE_UINT16_LE (dv + (i >> 1), V);
  }
}

#define PACK_A422_10BE GST_VIDEO_FORMAT_AYUV64, unpack_A422_10BE, 1, pack_A422_10BE
static void
unpack_A422_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  const guint16 *restrict sa = GET_A_LINE (y);
  const guint16 *restrict sy = GET_Y_LINE (y);
  const guint16 *restrict su = GET_U_LINE (y);
  const guint16 *restrict sv = GET_V_LINE (y);
  guint16 *restrict d = dest, A, Y, U, V;

  sa += x;
  sy += x;
  su += x >> 1;
  sv += x >> 1;

  for (i = 0; i < width; i++) {
    A = GST_READ_UINT16_BE (sa + i) << 6;
    Y = GST_READ_UINT16_BE (sy + i) << 6;
    U = GST_READ_UINT16_BE (su + (i >> 1)) << 6;
    V = GST_READ_UINT16_BE (sv + (i >> 1)) << 6;

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      A |= (A >> 10);
      Y |= (Y >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = A;
    d[i * 4 + 1] = Y;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;

    if (x & 1) {
      x = 0;
      su++;
      sv++;
    }
  }
}

static void
pack_A422_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  guint16 *restrict da = GET_A_LINE (y);
  guint16 *restrict dy = GET_Y_LINE (y);
  guint16 *restrict du = GET_U_LINE (y);
  guint16 *restrict dv = GET_V_LINE (y);
  guint16 A0, Y0, A1, Y1, U, V;
  const guint16 *restrict s = src;

  for (i = 0; i < width - 1; i += 2) {
    A0 = s[i * 4 + 0] >> 6;
    Y0 = s[i * 4 + 1] >> 6;
    A1 = s[i * 4 + 4] >> 6;
    Y1 = s[i * 4 + 5] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_BE (da + i + 0, A0);
    GST_WRITE_UINT16_BE (dy + i + 0, Y0);
    GST_WRITE_UINT16_BE (da + i + 1, A1);
    GST_WRITE_UINT16_BE (dy + i + 1, Y1);
    GST_WRITE_UINT16_BE (du + (i >> 1), U);
    GST_WRITE_UINT16_BE (dv + (i >> 1), V);
  }
  if (i == width - 1) {
    A0 = s[i * 4 + 0] >> 6;
    Y0 = s[i * 4 + 1] >> 6;
    U = s[i * 4 + 2] >> 6;
    V = s[i * 4 + 3] >> 6;

    GST_WRITE_UINT16_BE (da + i, A0);
    GST_WRITE_UINT16_BE (dy + i, Y0);
    GST_WRITE_UINT16_BE (du + (i >> 1), U);
    GST_WRITE_UINT16_BE (dv + (i >> 1), V);
  }
}

static void
get_tile_NV12 (gint tile_width, gint ts, gint tx, gint ty,
    const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES],
    gpointer tile_data[GST_VIDEO_MAX_PLANES],
    gint tile_stride[GST_VIDEO_MAX_PLANES])
{
  gsize offset;

  /* index of Y tile */
  offset = gst_video_tile_get_index (GST_VIDEO_TILE_MODE_ZFLIPZ_2X2,
      tx, ty, GST_VIDEO_TILE_X_TILES (stride[0]),
      GST_VIDEO_TILE_Y_TILES (stride[0]));
  offset <<= ts;
  tile_data[0] = ((guint8 *) data[0]) + offset;

  /* index of UV tile */
  offset = gst_video_tile_get_index (GST_VIDEO_TILE_MODE_ZFLIPZ_2X2,
      tx, ty >> 1, GST_VIDEO_TILE_X_TILES (stride[1]),
      GST_VIDEO_TILE_Y_TILES (stride[1]));
  offset <<= ts;
  /* On odd rows we return the second part of the UV tile */
  offset |= (ty & 1) << (ts - 1);
  tile_data[1] = ((guint8 *) data[1]) + offset;

  tile_stride[0] = tile_stride[1] = tile_width;
}

#define PACK_NV12_64Z32 GST_VIDEO_FORMAT_AYUV, unpack_NV12_64Z32, 1, pack_NV12_64Z32
static void
unpack_NV12_64Z32 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  const GstVideoFormatInfo *unpack_info, *finfo;
  guint8 *line = dest;
  gint ws, hs, ts, tile_width;
  gint ntx, tx, ty;
  gint unpack_pstride;

  ws = GST_VIDEO_FORMAT_INFO_TILE_WS (info);
  hs = GST_VIDEO_FORMAT_INFO_TILE_HS (info);
  ts = ws + hs;

  tile_width = 1 << ws;

  /* we reuse these unpack functions */
  finfo = gst_video_format_get_info (GST_VIDEO_FORMAT_NV12);

  /* get pstride of unpacked format */
  unpack_info = gst_video_format_get_info (info->unpack_format);
  unpack_pstride = GST_VIDEO_FORMAT_INFO_PSTRIDE (unpack_info, 0);

  /* first x tile to convert */
  tx = x >> ws;
  /* Last tile to convert */
  ntx = ((x + width - 1) >> ws) + 1;
  /* The row we are going to convert */
  ty = y >> hs;

  /* y position in a tile */
  y = y & ((1 << hs) - 1);
  /* x position in a tile */
  x = x & (tile_width - 1);

  for (; tx < ntx; tx++) {
    gpointer tdata[GST_VIDEO_MAX_PLANES];
    gint tstride[GST_VIDEO_MAX_PLANES];
    gint unpack_width;

    get_tile_NV12 (tile_width, ts, tx, ty, data, stride, tdata, tstride);

    /* the number of bytes left to unpack */
    unpack_width = MIN (width - x, tile_width - x);

    finfo->unpack_func (finfo, flags, line, tdata, tstride, x, y, unpack_width);

    x = 0;
    width -= unpack_width;
    line += unpack_width * unpack_pstride;
  }
}

static void
pack_NV12_64Z32 (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  const GstVideoFormatInfo *pack_info, *finfo;
  guint8 *line = src;
  gint ws, hs, ts, tile_width;
  gint ntx, tx, ty;
  gint pack_pstride;

  ws = GST_VIDEO_FORMAT_INFO_TILE_WS (info);
  hs = GST_VIDEO_FORMAT_INFO_TILE_HS (info);
  ts = ws + hs;

  tile_width = 1 << ws;

  /* we reuse these pack functions */
  finfo = gst_video_format_get_info (GST_VIDEO_FORMAT_NV12);

  /* get pstride of packed format */
  pack_info = gst_video_format_get_info (info->unpack_format);
  pack_pstride = GST_VIDEO_FORMAT_INFO_PSTRIDE (pack_info, 0);

  /* Last tile to convert */
  ntx = ((width - 1) >> ws) + 1;
  /* The row we are going to convert */
  ty = y >> hs;

  /* y position in a tile */
  y = y & ((1 << hs) - 1);

  for (tx = 0; tx < ntx; tx++) {
    gpointer tdata[GST_VIDEO_MAX_PLANES];
    gint tstride[GST_VIDEO_MAX_PLANES];
    gint pack_width;

    get_tile_NV12 (tile_width, ts, tx, ty, data, stride, tdata, tstride);

    /* the number of bytes left to pack */
    pack_width = MIN (width, tile_width);

    finfo->pack_func (finfo, flags, line, sstride, tdata, tstride,
        chroma_site, y, pack_width);

    width -= pack_width;
    line += pack_width * pack_pstride;
  }
}

#define PACK_P010_10BE GST_VIDEO_FORMAT_AYUV64, unpack_P010_10BE, 1, pack_P010_10BE
static void
unpack_P010_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  const guint16 *restrict sy = GET_PLANE_LINE (0, y);
  const guint16 *restrict suv = GET_PLANE_LINE (1, uv);
  guint16 *restrict d = dest, Y0, Y1, U, V;

  sy += x;
  suv += (x & ~1);

  if (x & 1) {
    Y0 = GST_READ_UINT16_BE (sy);
    U = GST_READ_UINT16_BE (suv);
    V = GST_READ_UINT16_BE (suv + 1);

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y0 |= (Y0 >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[0] = 0xffff;
    d[1] = Y0;
    d[2] = U;
    d[3] = V;
    width--;
    d += 4;
    sy += 1;
    suv += 2;
  }

  for (i = 0; i < width / 2; i++) {
    Y0 = GST_READ_UINT16_BE (sy + 2 * i);
    Y1 = GST_READ_UINT16_BE (sy + 2 * i + 1);
    U = GST_READ_UINT16_BE (suv + 2 * i);
    V = GST_READ_UINT16_BE (suv + 2 * i + 1);

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y0 |= (Y0 >> 10);
      Y1 |= (Y1 >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 8 + 0] = 0xffff;
    d[i * 8 + 1] = Y0;
    d[i * 8 + 2] = U;
    d[i * 8 + 3] = V;
    d[i * 8 + 4] = 0xffff;
    d[i * 8 + 5] = Y1;
    d[i * 8 + 6] = U;
    d[i * 8 + 7] = V;
  }

  if (width & 1) {
    gint i = width - 1;

    Y0 = GST_READ_UINT16_BE (sy + i);
    U = GST_READ_UINT16_BE (suv + i);
    V = GST_READ_UINT16_BE (suv + i + 1);

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y0 |= (Y0 >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y0;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;
  }
}

static void
pack_P010_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  guint16 *restrict dy = GET_PLANE_LINE (0, y);
  guint16 *restrict duv = GET_PLANE_LINE (1, uv);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    for (i = 0; i < width / 2; i++) {
      Y0 = s[i * 8 + 1] & 0xffc0;
      Y1 = s[i * 8 + 5] & 0xffc0;
      U = s[i * 8 + 2] & 0xffc0;
      V = s[i * 8 + 3] & 0xffc0;

      GST_WRITE_UINT16_BE (dy + i * 2 + 0, Y0);
      GST_WRITE_UINT16_BE (dy + i * 2 + 1, Y1);
      GST_WRITE_UINT16_BE (duv + i * 2 + 0, U);
      GST_WRITE_UINT16_BE (duv + i * 2 + 1, V);
    }
    if (width & 1) {
      gint i = width - 1;

      Y0 = s[i * 4 + 1] & 0xffc0;
      U = s[i * 4 + 2] & 0xffc0;
      V = s[i * 4 + 3] & 0xffc0;

      GST_WRITE_UINT16_BE (dy + i, Y0);
      GST_WRITE_UINT16_BE (duv + i + 0, U);
      GST_WRITE_UINT16_BE (duv + i + 1, V);
    }
  } else {
    for (i = 0; i < width; i++) {
      Y0 = s[i * 4 + 1] & 0xffc0;
      GST_WRITE_UINT16_BE (dy + i, Y0);
    }
  }
}

#define PACK_P010_10LE GST_VIDEO_FORMAT_AYUV64, unpack_P010_10LE, 1, pack_P010_10LE
static void
unpack_P010_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  const guint16 *restrict sy = GET_PLANE_LINE (0, y);
  const guint16 *restrict suv = GET_PLANE_LINE (1, uv);
  guint16 *restrict d = dest, Y0, Y1, U, V;

  sy += x;
  suv += (x & ~1);

  if (x & 1) {
    Y0 = GST_READ_UINT16_LE (sy);
    U = GST_READ_UINT16_LE (suv);
    V = GST_READ_UINT16_LE (suv + 1);

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y0 |= (Y0 >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[0] = 0xffff;
    d[1] = Y0;
    d[2] = U;
    d[3] = V;
    width--;
    d += 4;
    sy += 1;
    suv += 2;
  }

  for (i = 0; i < width / 2; i++) {
    Y0 = GST_READ_UINT16_LE (sy + 2 * i);
    Y1 = GST_READ_UINT16_LE (sy + 2 * i + 1);
    U = GST_READ_UINT16_LE (suv + 2 * i);
    V = GST_READ_UINT16_LE (suv + 2 * i + 1);

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y0 |= (Y0 >> 10);
      Y1 |= (Y1 >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 8 + 0] = 0xffff;
    d[i * 8 + 1] = Y0;
    d[i * 8 + 2] = U;
    d[i * 8 + 3] = V;
    d[i * 8 + 4] = 0xffff;
    d[i * 8 + 5] = Y1;
    d[i * 8 + 6] = U;
    d[i * 8 + 7] = V;
  }

  if (width & 1) {
    gint i = width - 1;

    Y0 = GST_READ_UINT16_LE (sy + i);
    U = GST_READ_UINT16_LE (suv + i);
    V = GST_READ_UINT16_LE (suv + i + 1);

    if (!(flags & GST_VIDEO_PACK_FLAG_TRUNCATE_RANGE)) {
      Y0 |= (Y0 >> 10);
      U |= (U >> 10);
      V |= (V >> 10);
    }

    d[i * 4 + 0] = 0xffff;
    d[i * 4 + 1] = Y0;
    d[i * 4 + 2] = U;
    d[i * 4 + 3] = V;
  }
}

static void
pack_P010_10LE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
    const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES],
    const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site,
    gint y, gint width)
{
  int i;
  gint uv = GET_UV_420 (y, flags);
  guint16 *restrict dy = GET_PLANE_LINE (0, y);
  guint16 *restrict duv = GET_PLANE_LINE (1, uv);
  guint16 Y0, Y1, U, V;
  const guint16 *restrict s = src;

  if (IS_CHROMA_LINE_420 (y, flags)) {
    for (i = 0; i < width / 2; i++) {
      Y0 = s[i * 8 + 1] & 0xffc0;
      Y1 = s[i * 8 + 5] & 0xffc0;
      U = s[i * 8 + 2] & 0xffc0;
      V = s[i * 8 + 3] & 0xffc0;

      GST_WRITE_UINT16_LE (dy + i * 2 + 0, Y0);
      GST_WRITE_UINT16_LE (dy + i * 2 + 1, Y1);
      GST_WRITE_UINT16_LE (duv + i * 2 + 0, U);
      GST_WRITE_UINT16_LE (duv + i * 2 + 1, V);
    }
    if (width & 1) {
      gint i = width - 1;

      Y0 = s[i * 4 + 1] & 0xffc0;
      U = s[i * 4 + 2] & 0xffc0;
      V = s[i * 4 + 3] & 0xffc0;

      GST_WRITE_UINT16_LE (dy + i, Y0);
      GST_WRITE_UINT16_LE (duv + i + 0, U);
      GST_WRITE_UINT16_LE (duv + i + 1, V);
    }
  } else {
    for (i = 0; i < width; i++) {
      Y0 = s[i * 4 + 1] & 0xffc0;
      GST_WRITE_UINT16_LE (dy + i, Y0);
    }
  }
}

typedef struct
{
  guint32 fourcc;
  GstVideoFormatInfo info;
} VideoFormat;

/* depths: bits, n_components, shift, depth */
#define DPTH0            0, 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
#define DPTH8            8, 1, { 0, 0, 0, 0 }, { 8, 0, 0, 0 }
#define DPTH8_32         8, 2, { 0, 0, 0, 0 }, { 8, 32, 0, 0 }
#define DPTH888          8, 3, { 0, 0, 0, 0 }, { 8, 8, 8, 0 }
#define DPTH8888         8, 4, { 0, 0, 0, 0 }, { 8, 8, 8, 8 }
#define DPTH8880         8, 4, { 0, 0, 0, 0 }, { 8, 8, 8, 0 }
#define DPTH10_10_10     10, 3, { 0, 0, 0, 0 }, { 10, 10, 10, 0 }
#define DPTH10_10_10_10  10, 4, { 0, 0, 0, 0 }, { 10, 10, 10, 10 }
#define DPTH10_10_10_HI  16, 3, { 6, 6, 6, 0 }, { 10, 10, 10, 0 }
#define DPTH12_12_12     12, 3, { 0, 0, 0, 0 }, { 12, 12, 12, 0 }
#define DPTH12_12_12_12  12, 4, { 0, 0, 0, 0 }, { 12, 12, 12, 12 }
#define DPTH16           16, 1, { 0, 0, 0, 0 }, { 16, 0, 0, 0 }
#define DPTH16_16_16     16, 3, { 0, 0, 0, 0 }, { 16, 16, 16, 0 }
#define DPTH16_16_16_16  16, 4, { 0, 0, 0, 0 }, { 16, 16, 16, 16 }
#define DPTH555          16, 3, { 10, 5, 0, 0 }, { 5, 5, 5, 0 }
#define DPTH565          16, 3, { 11, 5, 0, 0 }, { 5, 6, 5, 0 }

/* pixel strides */
#define PSTR0             { 0, 0, 0, 0 }
#define PSTR1             { 1, 0, 0, 0 }
#define PSTR14            { 1, 4, 0, 0 }
#define PSTR111           { 1, 1, 1, 0 }
#define PSTR1111          { 1, 1, 1, 1 }
#define PSTR122           { 1, 2, 2, 0 }
#define PSTR2             { 2, 0, 0, 0 }
#define PSTR222           { 2, 2, 2, 0 }
#define PSTR2222          { 2, 2, 2, 2 }
#define PSTR244           { 2, 4, 4, 0 }
#define PSTR444           { 4, 4, 4, 0 }
#define PSTR4444          { 4, 4, 4, 4 }
#define PSTR333           { 3, 3, 3, 0 }
#define PSTR488           { 4, 8, 8, 0 }
#define PSTR8888          { 8, 8, 8, 8 }

/* planes, in what plane do we find component N */
#define PLANE_NA          0, { 0, 0, 0, 0 }
#define PLANE0            1, { 0, 0, 0, 0 }
#define PLANE01           2, { 0, 1, 0, 0 }
#define PLANE011          2, { 0, 1, 1, 0 }
#define PLANE012          3, { 0, 1, 2, 0 }
#define PLANE0123         4, { 0, 1, 2, 3 }
#define PLANE021          3, { 0, 2, 1, 0 }
#define PLANE201          3, { 2, 0, 1, 0 }
#define PLANE2013         4, { 2, 0, 1, 3 }

/* offsets */
#define OFFS0             { 0, 0, 0, 0 }
#define OFFS013           { 0, 1, 3, 0 }
#define OFFS102           { 1, 0, 2, 0 }
#define OFFS1230          { 1, 2, 3, 0 }
#define OFFS012           { 0, 1, 2, 0 }
#define OFFS210           { 2, 1, 0, 0 }
#define OFFS123           { 1, 2, 3, 0 }
#define OFFS321           { 3, 2, 1, 0 }
#define OFFS0123          { 0, 1, 2, 3 }
#define OFFS2103          { 2, 1, 0, 3 }
#define OFFS3210          { 3, 2, 1, 0 }
#define OFFS031           { 0, 3, 1, 0 }
#define OFFS204           { 2, 0, 4, 0 }
#define OFFS001           { 0, 0, 1, 0 }
#define OFFS010           { 0, 1, 0, 0 }
#define OFFS104           { 1, 0, 4, 0 }
#define OFFS2460          { 2, 4, 6, 0 }

/* subsampling, w_sub, h_sub */
#define SUB410            { 0, 2, 2, 0 }, { 0, 2, 2, 0 }
#define SUB411            { 0, 2, 2, 0 }, { 0, 0, 0, 0 }
#define SUB420            { 0, 1, 1, 0 }, { 0, 1, 1, 0 }
#define SUB422            { 0, 1, 1, 0 }, { 0, 0, 0, 0 }
#define SUB4              { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
#define SUB44             { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
#define SUB444            { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
#define SUB4444           { 0, 0, 0, 0 }, { 0, 0, 0, 0 }
#define SUB4204           { 0, 1, 1, 0 }, { 0, 1, 1, 0 }
#define SUB4224           { 0, 1, 1, 0 }, { 0, 0, 0, 0 }

/* tile_mode, tile_width, tile_height */
#define TILE_64x32(mode) GST_VIDEO_TILE_MODE_ ##mode, 6, 5

#define MAKE_YUV_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack ) \
 { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV, depth, pstride, plane, offs, sub, pack } }
#define MAKE_YUV_LE_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack ) \
 { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } }
#define MAKE_YUVA_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack) \
 { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub, pack } }
#define MAKE_YUVA_LE_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack ) \
 { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_ALPHA | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } }
#define MAKE_YUVA_PACK_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack) \
 { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_ALPHA | GST_VIDEO_FORMAT_FLAG_UNPACK, depth, pstride, plane, offs, sub, pack } }
#define MAKE_YUVA_LE_PACK_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack) \
 { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_ALPHA | GST_VIDEO_FORMAT_FLAG_UNPACK | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } }
#define MAKE_YUV_C_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack) \
 { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_COMPLEX, depth, pstride, plane, offs, sub, pack } }
#define MAKE_YUV_T_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack, tile) \
 { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_COMPLEX | GST_VIDEO_FORMAT_FLAG_TILED, depth, pstride, plane, offs, sub, pack, tile } }

#define MAKE_RGB_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB, depth, pstride, plane, offs, sub, pack } }
#define MAKE_RGB_LE_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } }
#define MAKE_RGBA_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub, pack } }
#define MAKE_RGBA_LE_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } }
#define MAKE_RGBAP_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA | GST_VIDEO_FORMAT_FLAG_PALETTE, depth, pstride, plane, offs, sub, pack } }
#define MAKE_RGBA_PACK_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA | GST_VIDEO_FORMAT_FLAG_UNPACK, depth, pstride, plane, offs, sub, pack } }
#define MAKE_RGBA_LE_PACK_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA | GST_VIDEO_FORMAT_FLAG_UNPACK | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } }

#define MAKE_GRAY_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_GRAY, depth, pstride, plane, offs, sub, pack } }
#define MAKE_GRAY_LE_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \
 { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_GRAY | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } }

static const VideoFormat formats[] = {
  {0x00000000, {GST_VIDEO_FORMAT_UNKNOWN, "UNKNOWN", "unknown video", 0, DPTH0,
          PSTR0, PLANE_NA, OFFS0}},
  {0x00000000, {GST_VIDEO_FORMAT_ENCODED, "ENCODED", "encoded video",
          GST_VIDEO_FORMAT_FLAG_COMPLEX, DPTH0, PSTR0, PLANE_NA, OFFS0}},

  MAKE_YUV_FORMAT (I420, "raw video", GST_MAKE_FOURCC ('I', '4', '2', '0'),
      DPTH888, PSTR111, PLANE012, OFFS0, SUB420, PACK_420),
  MAKE_YUV_FORMAT (YV12, "raw video", GST_MAKE_FOURCC ('Y', 'V', '1', '2'),
      DPTH888, PSTR111, PLANE021, OFFS0, SUB420, PACK_420),
  MAKE_YUV_FORMAT (YUY2, "raw video", GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
      DPTH888, PSTR244, PLANE0, OFFS013, SUB422, PACK_YUY2),
  MAKE_YUV_FORMAT (UYVY, "raw video", GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'),
      DPTH888, PSTR244, PLANE0, OFFS102, SUB422, PACK_UYVY),
  MAKE_YUVA_PACK_FORMAT (AYUV, "raw video", GST_MAKE_FOURCC ('A', 'Y', 'U',
          'V'), DPTH8888, PSTR4444, PLANE0, OFFS1230, SUB4444, PACK_AYUV),
  MAKE_RGB_FORMAT (RGBx, "raw video", DPTH888, PSTR444, PLANE0, OFFS012,
      SUB444, PACK_RGBA),
  MAKE_RGB_FORMAT (BGRx, "raw video", DPTH888, PSTR444, PLANE0, OFFS210,
      SUB444, PACK_BGRA),
  MAKE_RGB_FORMAT (xRGB, "raw video", DPTH888, PSTR444, PLANE0, OFFS123,
      SUB444, PACK_ARGB),
  MAKE_RGB_FORMAT (xBGR, "raw video", DPTH888, PSTR444, PLANE0, OFFS321,
      SUB444, PACK_ABGR),
  MAKE_RGBA_FORMAT (RGBA, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS0123,
      SUB4444, PACK_RGBA),
  MAKE_RGBA_FORMAT (BGRA, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS2103,
      SUB4444, PACK_BGRA),
  MAKE_RGBA_PACK_FORMAT (ARGB, "raw video", DPTH8888, PSTR4444, PLANE0,
      OFFS1230, SUB4444, PACK_ARGB),
  MAKE_RGBA_FORMAT (ABGR, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS3210,
      SUB4444, PACK_ABGR),
  MAKE_RGB_FORMAT (RGB, "raw video", DPTH888, PSTR333, PLANE0, OFFS012, SUB444,
      PACK_RGB),
  MAKE_RGB_FORMAT (BGR, "raw video", DPTH888, PSTR333, PLANE0, OFFS210, SUB444,
      PACK_BGR),

  MAKE_YUV_FORMAT (Y41B, "raw video", GST_MAKE_FOURCC ('Y', '4', '1', 'B'),
      DPTH888, PSTR111, PLANE012, OFFS0, SUB411, PACK_Y41B),
  MAKE_YUV_FORMAT (Y42B, "raw video", GST_MAKE_FOURCC ('Y', '4', '2', 'B'),
      DPTH888, PSTR111, PLANE012, OFFS0, SUB422, PACK_Y42B),
  MAKE_YUV_FORMAT (YVYU, "raw video", GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'),
      DPTH888, PSTR244, PLANE0, OFFS031, SUB422, PACK_YVYU),
  MAKE_YUV_FORMAT (Y444, "raw video", GST_MAKE_FOURCC ('Y', '4', '4', '4'),
      DPTH888, PSTR111, PLANE012, OFFS0, SUB444, PACK_Y444),
  MAKE_YUV_C_FORMAT (v210, "raw video", GST_MAKE_FOURCC ('v', '2', '1', '0'),
      DPTH10_10_10, PSTR0, PLANE0, OFFS0, SUB422, PACK_v210),
  MAKE_YUV_FORMAT (v216, "raw video", GST_MAKE_FOURCC ('v', '2', '1', '6'),
      DPTH16_16_16, PSTR488, PLANE0, OFFS204, SUB422, PACK_v216),
  MAKE_YUV_FORMAT (NV12, "raw video", GST_MAKE_FOURCC ('N', 'V', '1', '2'),
      DPTH888, PSTR122, PLANE011, OFFS001, SUB420, PACK_NV12),
  MAKE_YUV_FORMAT (NV21, "raw video", GST_MAKE_FOURCC ('N', 'V', '2', '1'),
      DPTH888, PSTR122, PLANE011, OFFS010, SUB420, PACK_NV21),

  MAKE_GRAY_FORMAT (GRAY8, "raw video", DPTH8, PSTR1, PLANE0, OFFS0, SUB4,
      PACK_GRAY8),
  MAKE_GRAY_FORMAT (GRAY16_BE, "raw video", DPTH16, PSTR2, PLANE0, OFFS0, SUB4,
      PACK_GRAY16_BE),
  MAKE_GRAY_LE_FORMAT (GRAY16_LE, "raw video", DPTH16, PSTR2, PLANE0, OFFS0,
      SUB4, PACK_GRAY16_LE),

  MAKE_YUV_FORMAT (v308, "raw video", GST_MAKE_FOURCC ('v', '3', '0', '8'),
      DPTH888, PSTR333, PLANE0, OFFS012, SUB444, PACK_v308),

#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  MAKE_RGB_LE_FORMAT (RGB16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0,
      SUB444, PACK_RGB16),
  MAKE_RGB_LE_FORMAT (BGR16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0,
      SUB444, PACK_BGR16),
  MAKE_RGB_LE_FORMAT (RGB15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0,
      SUB444, PACK_RGB15),
  MAKE_RGB_LE_FORMAT (BGR15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0,
      SUB444, PACK_BGR15),
#else
  MAKE_RGB_FORMAT (RGB16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, SUB444,
      PACK_RGB16),
  MAKE_RGB_FORMAT (BGR16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, SUB444,
      PACK_BGR16),
  MAKE_RGB_FORMAT (RGB15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, SUB444,
      PACK_RGB15),
  MAKE_RGB_FORMAT (BGR15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, SUB444,
      PACK_BGR15),
#endif

  MAKE_YUV_C_FORMAT (UYVP, "raw video", GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'),
      DPTH10_10_10, PSTR0, PLANE0, OFFS0, SUB422, PACK_UYVP),
  MAKE_YUVA_FORMAT (A420, "raw video", GST_MAKE_FOURCC ('A', '4', '2', '0'),
      DPTH8888, PSTR1111, PLANE0123, OFFS0, SUB4204, PACK_A420),
  MAKE_RGBAP_FORMAT (RGB8P, "raw video", DPTH8_32, PSTR14, PLANE01,
      OFFS0, SUB44, PACK_RGB8P),
  MAKE_YUV_FORMAT (YUV9, "raw video", GST_MAKE_FOURCC ('Y', 'U', 'V', '9'),
      DPTH888, PSTR111, PLANE012, OFFS0, SUB410, PACK_410),
  MAKE_YUV_FORMAT (YVU9, "raw video", GST_MAKE_FOURCC ('Y', 'V', 'U', '9'),
      DPTH888, PSTR111, PLANE021, OFFS0, SUB410, PACK_410),
  MAKE_YUV_FORMAT (IYU1, "raw video", GST_MAKE_FOURCC ('I', 'Y', 'U', '1'),
      DPTH888, PSTR0, PLANE0, OFFS104, SUB411, PACK_IYU1),
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  MAKE_RGBA_LE_PACK_FORMAT (ARGB64, "raw video", DPTH16_16_16_16, PSTR8888,
      PLANE0,
      OFFS2460, SUB444, PACK_ARGB64),
  MAKE_YUVA_LE_PACK_FORMAT (AYUV64, "raw video", 0x00000000, DPTH16_16_16_16,
      PSTR8888, PLANE0, OFFS2460, SUB444, PACK_AYUV64),
#else
  MAKE_RGBA_PACK_FORMAT (ARGB64, "raw video", DPTH16_16_16_16, PSTR8888, PLANE0,
      OFFS2460, SUB444, PACK_ARGB64),
  MAKE_YUVA_PACK_FORMAT (AYUV64, "raw video", 0x00000000, DPTH16_16_16_16,
      PSTR8888, PLANE0, OFFS2460, SUB444, PACK_AYUV64),
#endif
  MAKE_RGB_FORMAT (r210, "raw video", DPTH10_10_10, PSTR444, PLANE0, OFFS0,
      SUB444, PACK_r210),
  MAKE_YUV_FORMAT (I420_10BE, "raw video", 0x00000000, DPTH10_10_10,
      PSTR222, PLANE012, OFFS0, SUB420, PACK_I420_10BE),
  MAKE_YUV_LE_FORMAT (I420_10LE, "raw video", 0x00000000, DPTH10_10_10,
      PSTR222, PLANE012, OFFS0, SUB420, PACK_I420_10LE),
  MAKE_YUV_FORMAT (I422_10BE, "raw video", 0x00000000, DPTH10_10_10,
      PSTR222, PLANE012, OFFS0, SUB422, PACK_I422_10BE),
  MAKE_YUV_LE_FORMAT (I422_10LE, "raw video", 0x00000000, DPTH10_10_10,
      PSTR222, PLANE012, OFFS0, SUB422, PACK_I422_10LE),
  MAKE_YUV_FORMAT (Y444_10BE, "raw video", 0x00000000, DPTH10_10_10,
      PSTR222, PLANE012, OFFS0, SUB444, PACK_Y444_10BE),
  MAKE_YUV_LE_FORMAT (Y444_10LE, "raw video", 0x00000000, DPTH10_10_10,
      PSTR222, PLANE012, OFFS0, SUB444, PACK_Y444_10LE),
  MAKE_RGB_FORMAT (GBR, "raw video", DPTH888, PSTR111, PLANE201, OFFS0, SUB444,
      PACK_GBR),
  MAKE_RGB_FORMAT (GBR_10BE, "raw video", DPTH10_10_10, PSTR222, PLANE201,
      OFFS0, SUB444, PACK_GBR_10BE),
  MAKE_RGB_LE_FORMAT (GBR_10LE, "raw video", DPTH10_10_10, PSTR222, PLANE201,
      OFFS0, SUB444, PACK_GBR_10LE),
  MAKE_YUV_FORMAT (NV16, "raw video", GST_MAKE_FOURCC ('N', 'V', '1', '6'),
      DPTH888, PSTR122, PLANE011, OFFS001, SUB422, PACK_NV16),
  MAKE_YUV_FORMAT (NV24, "raw video", GST_MAKE_FOURCC ('N', 'V', '2', '4'),
      DPTH888, PSTR122, PLANE011, OFFS001, SUB444, PACK_NV24),
  MAKE_YUV_T_FORMAT (NV12_64Z32, "raw video",
      GST_MAKE_FOURCC ('T', 'M', '1', '2'), DPTH8880, PSTR122, PLANE011,
      OFFS001, SUB420, PACK_NV12_64Z32, TILE_64x32 (ZFLIPZ_2X2)),
  MAKE_YUVA_FORMAT (A420_10BE, "raw video", 0x00000000, DPTH10_10_10_10,
      PSTR2222, PLANE0123, OFFS0, SUB4204, PACK_A420_10BE),
  MAKE_YUVA_LE_FORMAT (A420_10LE, "raw video", 0x00000000, DPTH10_10_10_10,
      PSTR2222, PLANE0123, OFFS0, SUB4204, PACK_A420_10LE),
  MAKE_YUVA_FORMAT (A422_10BE, "raw video", 0x00000000, DPTH10_10_10_10,
      PSTR2222, PLANE0123, OFFS0, SUB4224, PACK_A422_10BE),
  MAKE_YUVA_LE_FORMAT (A422_10LE, "raw video", 0x00000000, DPTH10_10_10_10,
      PSTR2222, PLANE0123, OFFS0, SUB4224, PACK_A422_10LE),
  MAKE_YUVA_FORMAT (A444_10BE, "raw video", 0x00000000, DPTH10_10_10_10,
      PSTR2222, PLANE0123, OFFS0, SUB4444, PACK_A444_10BE),
  MAKE_YUVA_LE_FORMAT (A444_10LE, "raw video", 0x00000000, DPTH10_10_10_10,
      PSTR2222, PLANE0123, OFFS0, SUB4444, PACK_A444_10LE),
  MAKE_YUV_FORMAT (NV61, "raw video", GST_MAKE_FOURCC ('N', 'V', '6', '1'),
      DPTH888, PSTR122, PLANE011, OFFS010, SUB422, PACK_NV61),
  MAKE_YUV_FORMAT (P010_10BE, "raw video", 0x00000000, DPTH10_10_10_HI,
      PSTR244, PLANE011, OFFS001, SUB420, PACK_P010_10BE),
  MAKE_YUV_LE_FORMAT (P010_10LE, "raw video", 0x00000000, DPTH10_10_10_HI,
      PSTR244, PLANE011, OFFS001, SUB420, PACK_P010_10LE),
  /* FIXME: support mscale hdr10 video format */
  MAKE_YUV_LE_FORMAT (NV12_10LE, "raw video", 0x00000000, DPTH10_10_10,
      PSTR244, PLANE011, OFFS001, SUB420, PACK_P010_10LE),
  MAKE_YUV_FORMAT (IYU2, "raw video", GST_MAKE_FOURCC ('I', 'Y', 'U', '2'),
      DPTH888, PSTR333, PLANE0, OFFS102, SUB444, PACK_IYU2),
  MAKE_YUV_FORMAT (VYUY, "raw video", GST_MAKE_FOURCC ('V', 'Y', 'U', 'Y'),
      DPTH888, PSTR244, PLANE0, OFFS102, SUB422, PACK_VYUY),
  MAKE_RGBA_FORMAT (GBRA, "raw video", DPTH8888, PSTR1111, PLANE2013,
      OFFS0, SUB4444, PACK_GBRA),
  MAKE_RGBA_FORMAT (GBRA_10BE, "raw video", DPTH10_10_10_10, PSTR222, PLANE2013,
      OFFS0, SUB4444, PACK_GBRA_10BE),
  MAKE_RGBA_LE_FORMAT (GBRA_10LE, "raw video", DPTH10_10_10_10, PSTR222,
      PLANE2013,
      OFFS0, SUB4444, PACK_GBRA_10LE),
  MAKE_RGB_FORMAT (GBR_12BE, "raw video", DPTH12_12_12, PSTR222, PLANE201,
      OFFS0, SUB444, PACK_GBR_12BE),
  MAKE_RGB_LE_FORMAT (GBR_12LE, "raw video", DPTH12_12_12, PSTR222, PLANE201,
      OFFS0, SUB444, PACK_GBR_12LE),
  MAKE_RGBA_FORMAT (GBRA_12BE, "raw video", DPTH12_12_12_12, PSTR222, PLANE2013,
      OFFS0, SUB4444, PACK_GBRA_12BE),
  MAKE_RGBA_LE_PACK_FORMAT (GBRA_12LE, "raw video", DPTH12_12_12_12, PSTR222,
      PLANE2013, OFFS0, SUB4444, PACK_GBRA_12LE),
  MAKE_YUV_FORMAT (I420_12BE, "raw video", 0x00000000, DPTH12_12_12,
      PSTR222, PLANE012, OFFS0, SUB420, PACK_I420_12BE),
  MAKE_YUV_LE_FORMAT (I420_12LE, "raw video", 0x00000000, DPTH12_12_12,
      PSTR222, PLANE012, OFFS0, SUB420, PACK_I420_12LE),
  MAKE_YUV_FORMAT (I422_12BE, "raw video", 0x00000000, DPTH12_12_12,
      PSTR222, PLANE012, OFFS0, SUB422, PACK_I422_12BE),
  MAKE_YUV_LE_FORMAT (I422_12LE, "raw video", 0x00000000, DPTH12_12_12,
      PSTR222, PLANE012, OFFS0, SUB422, PACK_I422_12LE),
  MAKE_YUV_FORMAT (Y444_12BE, "raw video", 0x00000000, DPTH12_12_12,
      PSTR222, PLANE012, OFFS0, SUB444, PACK_Y444_12BE),
  MAKE_YUV_LE_FORMAT (Y444_12LE, "raw video", 0x00000000, DPTH12_12_12,
      PSTR222, PLANE012, OFFS0, SUB444, PACK_Y444_12LE),
};

static GstVideoFormat
gst_video_format_from_rgb32_masks (int red_mask, int green_mask, int blue_mask)
{
  if (red_mask == 0xff000000 && green_mask == 0x00ff0000 &&
      blue_mask == 0x0000ff00) {
    return GST_VIDEO_FORMAT_RGBx;
  }
  if (red_mask == 0x0000ff00 && green_mask == 0x00ff0000 &&
      blue_mask == 0xff000000) {
    return GST_VIDEO_FORMAT_BGRx;
  }
  if (red_mask == 0x00ff0000 && green_mask == 0x0000ff00 &&
      blue_mask == 0x000000ff) {
    return GST_VIDEO_FORMAT_xRGB;
  }
  if (red_mask == 0x000000ff && green_mask == 0x0000ff00 &&
      blue_mask == 0x00ff0000) {
    return GST_VIDEO_FORMAT_xBGR;
  }

  return GST_VIDEO_FORMAT_UNKNOWN;
}

static GstVideoFormat
gst_video_format_from_rgba32_masks (int red_mask, int green_mask,
    int blue_mask, int alpha_mask)
{
  if (red_mask == 0xff000000 && green_mask == 0x00ff0000 &&
      blue_mask == 0x0000ff00 && alpha_mask == 0x000000ff) {
    return GST_VIDEO_FORMAT_RGBA;
  }
  if (red_mask == 0x0000ff00 && green_mask == 0x00ff0000 &&
      blue_mask == 0xff000000 && alpha_mask == 0x000000ff) {
    return GST_VIDEO_FORMAT_BGRA;
  }
  if (red_mask == 0x00ff0000 && green_mask == 0x0000ff00 &&
      blue_mask == 0x000000ff && alpha_mask == 0xff000000) {
    return GST_VIDEO_FORMAT_ARGB;
  }
  if (red_mask == 0x000000ff && green_mask == 0x0000ff00 &&
      blue_mask == 0x00ff0000 && alpha_mask == 0xff000000) {
    return GST_VIDEO_FORMAT_ABGR;
  }
  return GST_VIDEO_FORMAT_UNKNOWN;
}

static GstVideoFormat
gst_video_format_from_rgb24_masks (int red_mask, int green_mask, int blue_mask)
{
  if (red_mask == 0xff0000 && green_mask == 0x00ff00 && blue_mask == 0x0000ff) {
    return GST_VIDEO_FORMAT_RGB;
  }
  if (red_mask == 0x0000ff && green_mask == 0x00ff00 && blue_mask == 0xff0000) {
    return GST_VIDEO_FORMAT_BGR;
  }

  return GST_VIDEO_FORMAT_UNKNOWN;
}

#define GST_VIDEO_COMP1_MASK_16_INT 0xf800
#define GST_VIDEO_COMP2_MASK_16_INT 0x07e0
#define GST_VIDEO_COMP3_MASK_16_INT 0x001f

#define GST_VIDEO_COMP1_MASK_15_INT 0x7c00
#define GST_VIDEO_COMP2_MASK_15_INT 0x03e0
#define GST_VIDEO_COMP3_MASK_15_INT 0x001f

static GstVideoFormat
gst_video_format_from_rgb16_masks (int red_mask, int green_mask, int blue_mask)
{
  if (red_mask == GST_VIDEO_COMP1_MASK_16_INT
      && green_mask == GST_VIDEO_COMP2_MASK_16_INT
      && blue_mask == GST_VIDEO_COMP3_MASK_16_INT) {
    return GST_VIDEO_FORMAT_RGB16;
  }
  if (red_mask == GST_VIDEO_COMP3_MASK_16_INT
      && green_mask == GST_VIDEO_COMP2_MASK_16_INT
      && blue_mask == GST_VIDEO_COMP1_MASK_16_INT) {
    return GST_VIDEO_FORMAT_BGR16;
  }
  if (red_mask == GST_VIDEO_COMP1_MASK_15_INT
      && green_mask == GST_VIDEO_COMP2_MASK_15_INT
      && blue_mask == GST_VIDEO_COMP3_MASK_15_INT) {
    return GST_VIDEO_FORMAT_RGB15;
  }
  if (red_mask == GST_VIDEO_COMP3_MASK_15_INT
      && green_mask == GST_VIDEO_COMP2_MASK_15_INT
      && blue_mask == GST_VIDEO_COMP1_MASK_15_INT) {
    return GST_VIDEO_FORMAT_BGR15;
  }
  return GST_VIDEO_FORMAT_UNKNOWN;
}

/**
 * gst_video_format_from_masks:
 * @depth: the amount of bits used for a pixel
 * @bpp: the amount of bits used to store a pixel. This value is bigger than
 *   @depth
 * @endianness: the endianness of the masks, #G_LITTLE_ENDIAN or #G_BIG_ENDIAN
 * @red_mask: the red mask
 * @green_mask: the green mask
 * @blue_mask: the blue mask
 * @alpha_mask: the alpha mask, or 0 if no alpha mask
 *
 * Find the #GstVideoFormat for the given parameters.
 *
 * Returns: a #GstVideoFormat or GST_VIDEO_FORMAT_UNKNOWN when the parameters to
 * not specify a known format.
 */
GstVideoFormat
gst_video_format_from_masks (gint depth, gint bpp, gint endianness,
    guint red_mask, guint green_mask, guint blue_mask, guint alpha_mask)
{
  GstVideoFormat format;

  /* our caps system handles 24/32bpp RGB as big-endian. */
  if ((bpp == 24 || bpp == 32) && endianness == G_LITTLE_ENDIAN) {
    red_mask = GUINT32_TO_BE (red_mask);
    green_mask = GUINT32_TO_BE (green_mask);
    blue_mask = GUINT32_TO_BE (blue_mask);
    alpha_mask = GUINT32_TO_BE (alpha_mask);
    endianness = G_BIG_ENDIAN;
    if (bpp == 24) {
      red_mask >>= 8;
      green_mask >>= 8;
      blue_mask >>= 8;
    }
  }

  if (depth == 30 && bpp == 32) {
    format = GST_VIDEO_FORMAT_r210;
  } else if (depth == 24 && bpp == 32) {
    format = gst_video_format_from_rgb32_masks (red_mask, green_mask,
        blue_mask);
  } else if (depth == 32 && bpp == 32 && alpha_mask) {
    format = gst_video_format_from_rgba32_masks (red_mask, green_mask,
        blue_mask, alpha_mask);
  } else if (depth == 24 && bpp == 24) {
    format = gst_video_format_from_rgb24_masks (red_mask, green_mask,
        blue_mask);
  } else if ((depth == 15 || depth == 16) && bpp == 16 &&
      endianness == G_BYTE_ORDER) {
    format = gst_video_format_from_rgb16_masks (red_mask, green_mask,
        blue_mask);
  } else if (depth == 8 && bpp == 8) {
    format = GST_VIDEO_FORMAT_RGB8P;
  } else if (depth == 64 && bpp == 64) {
    format = gst_video_format_from_rgba32_masks (red_mask, green_mask,
        blue_mask, alpha_mask);
    if (format == GST_VIDEO_FORMAT_ARGB) {
      format = GST_VIDEO_FORMAT_ARGB64;
    } else {
      format = GST_VIDEO_FORMAT_UNKNOWN;
    }
  } else {
    format = GST_VIDEO_FORMAT_UNKNOWN;
  }
  return format;
}

/**
 * gst_video_format_from_fourcc:
 * @fourcc: a FOURCC value representing raw YUV video
 *
 * Converts a FOURCC value into the corresponding #GstVideoFormat.
 * If the FOURCC cannot be represented by #GstVideoFormat,
 * #GST_VIDEO_FORMAT_UNKNOWN is returned.
 *
 * Returns: the #GstVideoFormat describing the FOURCC value
 */
GstVideoFormat
gst_video_format_from_fourcc (guint32 fourcc)
{
  switch (fourcc) {
    case GST_MAKE_FOURCC ('I', '4', '2', '0'):
      return GST_VIDEO_FORMAT_I420;
    case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):
      return GST_VIDEO_FORMAT_YV12;
    case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
      return GST_VIDEO_FORMAT_YUY2;
    case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'):
      return GST_VIDEO_FORMAT_YVYU;
    case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
      return GST_VIDEO_FORMAT_UYVY;
    case GST_MAKE_FOURCC ('V', 'Y', 'U', 'Y'):
      return GST_VIDEO_FORMAT_VYUY;
    case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'):
      return GST_VIDEO_FORMAT_AYUV;
    case GST_MAKE_FOURCC ('Y', '4', '1', 'B'):
      return GST_VIDEO_FORMAT_Y41B;
    case GST_MAKE_FOURCC ('Y', '4', '2', 'B'):
      return GST_VIDEO_FORMAT_Y42B;
    case GST_MAKE_FOURCC ('Y', '4', '4', '4'):
      return GST_VIDEO_FORMAT_Y444;
    case GST_MAKE_FOURCC ('v', '2', '1', '0'):
      return GST_VIDEO_FORMAT_v210;
    case GST_MAKE_FOURCC ('v', '2', '1', '6'):
      return GST_VIDEO_FORMAT_v216;
    case GST_MAKE_FOURCC ('N', 'V', '1', '2'):
      return GST_VIDEO_FORMAT_NV12;
    case GST_MAKE_FOURCC ('N', 'V', '2', '1'):
      return GST_VIDEO_FORMAT_NV21;
    case GST_MAKE_FOURCC ('N', 'V', '1', '6'):
      return GST_VIDEO_FORMAT_NV16;
    case GST_MAKE_FOURCC ('N', 'V', '6', '1'):
      return GST_VIDEO_FORMAT_NV61;
    case GST_MAKE_FOURCC ('N', 'V', '2', '4'):
      return GST_VIDEO_FORMAT_NV24;
    case GST_MAKE_FOURCC ('v', '3', '0', '8'):
      return GST_VIDEO_FORMAT_v308;
    case GST_MAKE_FOURCC ('I', 'Y', 'U', '2'):
      return GST_VIDEO_FORMAT_IYU2;
    case GST_MAKE_FOURCC ('Y', '8', '0', '0'):
    case GST_MAKE_FOURCC ('Y', '8', ' ', ' '):
    case GST_MAKE_FOURCC ('G', 'R', 'E', 'Y'):
      return GST_VIDEO_FORMAT_GRAY8;
    case GST_MAKE_FOURCC ('Y', '1', '6', ' '):
      return GST_VIDEO_FORMAT_GRAY16_LE;
    case GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'):
      return GST_VIDEO_FORMAT_UYVP;
    case GST_MAKE_FOURCC ('A', '4', '2', '0'):
      return GST_VIDEO_FORMAT_A420;
    case GST_MAKE_FOURCC ('Y', 'U', 'V', '9'):
      return GST_VIDEO_FORMAT_YUV9;
    case GST_MAKE_FOURCC ('Y', 'V', 'U', '9'):
      return GST_VIDEO_FORMAT_YVU9;
    case GST_MAKE_FOURCC ('I', 'Y', 'U', '1'):
      return GST_VIDEO_FORMAT_IYU1;
    case GST_MAKE_FOURCC ('A', 'Y', '6', '4'):
      return GST_VIDEO_FORMAT_AYUV64;
    default:
      return GST_VIDEO_FORMAT_UNKNOWN;
  }
}

/**
 * gst_video_format_from_string:
 * @format: a format string
 *
 * Convert the @format string to its #GstVideoFormat.
 *
 * Returns: the #GstVideoFormat for @format or GST_VIDEO_FORMAT_UNKNOWN when the
 * string is not a known format.
 */
GstVideoFormat
gst_video_format_from_string (const gchar * format)
{
  guint i;

  g_return_val_if_fail (format != NULL, GST_VIDEO_FORMAT_UNKNOWN);

  for (i = 0; i < G_N_ELEMENTS (formats); i++) {
    if (strcmp (GST_VIDEO_FORMAT_INFO_NAME (&formats[i].info), format) == 0)
      return GST_VIDEO_FORMAT_INFO_FORMAT (&formats[i].info);
  }
  return GST_VIDEO_FORMAT_UNKNOWN;
}


/**
 * gst_video_format_to_fourcc:
 * @format: a #GstVideoFormat video format
 *
 * Converts a #GstVideoFormat value into the corresponding FOURCC.  Only
 * a few YUV formats have corresponding FOURCC values.  If @format has
 * no corresponding FOURCC value, 0 is returned.
 *
 * Returns: the FOURCC corresponding to @format
 */
guint32
gst_video_format_to_fourcc (GstVideoFormat format)
{
  g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0);

  if ((gint) format >= G_N_ELEMENTS (formats))
    return 0;

  return formats[format].fourcc;
}

/**
 * gst_video_format_to_string:
 * @format: a #GstVideoFormat video format
 *
 * Returns a string containing a descriptive name for
 * the #GstVideoFormat if there is one, or NULL otherwise.
 *
 * Returns: the name corresponding to @format
 */
const gchar *
gst_video_format_to_string (GstVideoFormat format)
{
  g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, NULL);

  if ((gint) format >= G_N_ELEMENTS (formats))
    return NULL;

  return GST_VIDEO_FORMAT_INFO_NAME (&formats[format].info);
}

/**
 * gst_video_format_get_info:
 * @format: a #GstVideoFormat
 *
 * Get the #GstVideoFormatInfo for @format
 *
 * Returns: The #GstVideoFormatInfo for @format.
 */
const GstVideoFormatInfo *
gst_video_format_get_info (GstVideoFormat format)
{
  g_return_val_if_fail ((gint) format < G_N_ELEMENTS (formats), NULL);

  return &formats[format].info;
}

/**
 * gst_video_format_get_palette:
 * @format: a #GstVideoFormat
 * @size: (out): size of the palette in bytes
 *
 * Get the default palette of @format. This the palette used in the pack
 * function for paletted formats.
 *
 * Returns: (transfer none): the default palette of @format or %NULL when
 * @format does not have a palette.
 *
 * Since: 1.2
 */
gconstpointer
gst_video_format_get_palette (GstVideoFormat format, gsize * size)
{
  g_return_val_if_fail ((gint) format < G_N_ELEMENTS (formats), NULL);
  g_return_val_if_fail (size != NULL, NULL);

  switch (format) {
    case GST_VIDEO_FORMAT_RGB8P:
      *size = sizeof (std_palette_RGB8P);
      return std_palette_RGB8P;
    default:
      return NULL;
  }
}
