/* GStreamer unit test for video
 *
 * Copyright (C) <2003> David A. Schleef <ds@schleef.org>
 * Copyright (C) <2006> Jan Schmidt <thaytan@mad.scientist.com>
 * Copyright (C) <2008,2011> Tim-Philipp Müller <tim centricular net>
 * Copyright (C) <2012> Collabora Ltd. <tim.muller@collabora.co.uk>
 *
 * 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

#ifdef HAVE_VALGRIND
# include <valgrind/valgrind.h>
#endif

#include <unistd.h>

#include <gst/check/gstcheck.h>

#include <gst/video/video.h>
#include <gst/video/gstvideometa.h>
#include <gst/video/video-overlay-composition.h>
#include <string.h>

/* These are from the current/old videotestsrc; we check our new public API
 * in libgstvideo against the old one to make sure the sizes and offsets
 * end up the same */

typedef struct paintinfo_struct paintinfo;
struct paintinfo_struct
{
  unsigned char *dest;          /* pointer to first byte of video data */
  unsigned char *yp, *up, *vp;  /* pointers to first byte of each component
                                 * for both packed/planar YUV and RGB */
  unsigned char *ap;            /* pointer to first byte of alpha component */
  unsigned char *endptr;        /* pointer to byte beyond last video data */
  int ystride;
  int ustride;
  int vstride;
  int width;
  int height;
};

struct fourcc_list_struct
{
  const char *fourcc;
  const char *name;
  int bitspp;
  void (*paint_setup) (paintinfo * p, unsigned char *dest);
};

static void paint_setup_I420 (paintinfo * p, unsigned char *dest);
static void paint_setup_YV12 (paintinfo * p, unsigned char *dest);
static void paint_setup_YUY2 (paintinfo * p, unsigned char *dest);
static void paint_setup_UYVY (paintinfo * p, unsigned char *dest);
static void paint_setup_YVYU (paintinfo * p, unsigned char *dest);
static void paint_setup_IYU2 (paintinfo * p, unsigned char *dest);
static void paint_setup_Y41B (paintinfo * p, unsigned char *dest);
static void paint_setup_Y42B (paintinfo * p, unsigned char *dest);
static void paint_setup_GRAY8 (paintinfo * p, unsigned char *dest);
static void paint_setup_AYUV (paintinfo * p, unsigned char *dest);

#if 0
static void paint_setup_IMC1 (paintinfo * p, unsigned char *dest);
static void paint_setup_IMC2 (paintinfo * p, unsigned char *dest);
static void paint_setup_IMC3 (paintinfo * p, unsigned char *dest);
static void paint_setup_IMC4 (paintinfo * p, unsigned char *dest);
#endif
static void paint_setup_YUV9 (paintinfo * p, unsigned char *dest);
static void paint_setup_YVU9 (paintinfo * p, unsigned char *dest);

int fourcc_get_size (struct fourcc_list_struct *fourcc, int w, int h);

struct fourcc_list_struct fourcc_list[] = {
/* packed */
  {"YUY2", "YUY2", 16, paint_setup_YUY2},
  {"UYVY", "UYVY", 16, paint_setup_UYVY},
  {"Y422", "Y422", 16, paint_setup_UYVY},
  {"UYNV", "UYNV", 16, paint_setup_UYVY},       /* FIXME: UYNV? */
  {"YVYU", "YVYU", 16, paint_setup_YVYU},
  {"AYUV", "AYUV", 32, paint_setup_AYUV},

  /* interlaced */
  /*{   "IUYV", "IUY2", 16, paint_setup_YVYU }, */

  /* inverted */
  /*{   "cyuv", "cyuv", 16, paint_setup_YVYU }, */

  /*{   "Y41P", "Y41P", 12, paint_setup_YVYU }, */

  /* interlaced */
  /*{   "IY41", "IY41", 12, paint_setup_YVYU }, */

  /*{   "Y211", "Y211", 8, paint_setup_YVYU }, */

  /*{   "Y41T", "Y41T", 12, paint_setup_YVYU }, */
  /*{   "Y42P", "Y42P", 16, paint_setup_YVYU }, */
  /*{   "CLJR", "CLJR", 8, paint_setup_YVYU }, */
  /*{   "IYU1", "IYU1", 12, paint_setup_YVYU }, */
  {"IYU2", "IYU2", 24, paint_setup_IYU2},

/* planar */
  /* YVU9 */
  {"YVU9", "YVU9", 9, paint_setup_YVU9},
  /* YUV9 */
  {"YUV9", "YUV9", 9, paint_setup_YUV9},
  /* IF09 */
  /* YV12 */
  {"YV12", "YV12", 12, paint_setup_YV12},
  /* I420 */
  {"I420", "I420", 12, paint_setup_I420},
  /* NV12 */
  /* NV21 */
#if 0
  /* IMC1 */
  {"IMC1", "IMC1", 16, paint_setup_IMC1},
  /* IMC2 */
  {"IMC2", "IMC2", 12, paint_setup_IMC2},
  /* IMC3 */
  {"IMC3", "IMC3", 16, paint_setup_IMC3},
  /* IMC4 */
  {"IMC4", "IMC4", 12, paint_setup_IMC4},
#endif
  /* CLPL */
  /* Y41B */
  {"Y41B", "Y41B", 12, paint_setup_Y41B},
  /* Y42B */
  {"Y42B", "Y42B", 16, paint_setup_Y42B},
  /* GRAY8 grayscale */
  {"GRAY8", "GRAY8", 8, paint_setup_GRAY8}
};

/* returns the size in bytes for one video frame of the given dimensions
 * given the fourcc */
int
fourcc_get_size (struct fourcc_list_struct *fourcc, int w, int h)
{
  paintinfo pi = { NULL, };
  paintinfo *p = &pi;

  p->width = w;
  p->height = h;

  fourcc->paint_setup (p, NULL);

  return (unsigned long) p->endptr;
}

static void
paint_setup_I420 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->ystride = GST_ROUND_UP_4 (p->width);
  p->up = p->yp + p->ystride * GST_ROUND_UP_2 (p->height);
  p->ustride = GST_ROUND_UP_8 (p->width) / 2;
  p->vp = p->up + p->ustride * GST_ROUND_UP_2 (p->height) / 2;
  p->vstride = GST_ROUND_UP_8 (p->ystride) / 2;
  p->endptr = p->vp + p->vstride * GST_ROUND_UP_2 (p->height) / 2;
}

static void
paint_setup_YV12 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->ystride = GST_ROUND_UP_4 (p->width);
  p->vp = p->yp + p->ystride * GST_ROUND_UP_2 (p->height);
  p->vstride = GST_ROUND_UP_8 (p->ystride) / 2;
  p->up = p->vp + p->vstride * GST_ROUND_UP_2 (p->height) / 2;
  p->ustride = GST_ROUND_UP_8 (p->ystride) / 2;
  p->endptr = p->up + p->ustride * GST_ROUND_UP_2 (p->height) / 2;
}

static void
paint_setup_AYUV (paintinfo * p, unsigned char *dest)
{
  p->ap = dest;
  p->yp = dest + 1;
  p->up = dest + 2;
  p->vp = dest + 3;
  p->ystride = p->width * 4;
  p->endptr = dest + p->ystride * p->height;
}

static void
paint_setup_YUY2 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->up = dest + 1;
  p->vp = dest + 3;
  p->ystride = GST_ROUND_UP_2 (p->width) * 2;
  p->endptr = dest + p->ystride * p->height;
}

static void
paint_setup_UYVY (paintinfo * p, unsigned char *dest)
{
  p->yp = dest + 1;
  p->up = dest;
  p->vp = dest + 2;
  p->ystride = GST_ROUND_UP_2 (p->width) * 2;
  p->endptr = dest + p->ystride * p->height;
}

static void
paint_setup_YVYU (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->up = dest + 3;
  p->vp = dest + 1;
  p->ystride = GST_ROUND_UP_2 (p->width) * 2;
  p->endptr = dest + p->ystride * p->height;
}

static void
paint_setup_IYU2 (paintinfo * p, unsigned char *dest)
{
  /* untested */
  p->yp = dest + 1;
  p->up = dest + 0;
  p->vp = dest + 2;
  p->ystride = GST_ROUND_UP_4 (p->width * 3);
  p->endptr = dest + p->ystride * p->height;
}

static void
paint_setup_Y41B (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->ystride = GST_ROUND_UP_4 (p->width);
  p->up = p->yp + p->ystride * p->height;
  p->ustride = GST_ROUND_UP_16 (p->width) / 4;
  p->vp = p->up + p->ustride * p->height;
  p->vstride = GST_ROUND_UP_16 (p->width) / 4;
  p->endptr = p->vp + p->vstride * p->height;
}

static void
paint_setup_Y42B (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->ystride = GST_ROUND_UP_4 (p->width);
  p->up = p->yp + p->ystride * p->height;
  p->ustride = GST_ROUND_UP_8 (p->width) / 2;
  p->vp = p->up + p->ustride * p->height;
  p->vstride = GST_ROUND_UP_8 (p->width) / 2;
  p->endptr = p->vp + p->vstride * p->height;
}

static void
paint_setup_GRAY8 (paintinfo * p, unsigned char *dest)
{
  /* untested */
  p->yp = dest;
  p->ystride = GST_ROUND_UP_4 (p->width);
  p->endptr = dest + p->ystride * p->height;
}

#if 0
static void
paint_setup_IMC1 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->up = dest + p->width * p->height;
  p->vp = dest + p->width * p->height + p->width * p->height / 2;
}

static void
paint_setup_IMC2 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->vp = dest + p->width * p->height;
  p->up = dest + p->width * p->height + p->width / 2;
}

static void
paint_setup_IMC3 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->up = dest + p->width * p->height + p->width * p->height / 2;
  p->vp = dest + p->width * p->height;
}

static void
paint_setup_IMC4 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->vp = dest + p->width * p->height + p->width / 2;
  p->up = dest + p->width * p->height;
}
#endif

static void
paint_setup_YVU9 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->ystride = GST_ROUND_UP_4 (p->width);
  p->vp = p->yp + p->ystride * p->height;
  p->vstride = GST_ROUND_UP_4 (p->ystride / 4);
  p->up = p->vp + p->vstride * (GST_ROUND_UP_4 (p->height) / 4);
  p->ustride = GST_ROUND_UP_4 (p->ystride / 4);
  p->endptr = p->up + p->ustride * (GST_ROUND_UP_4 (p->height) / 4);
}

static void
paint_setup_YUV9 (paintinfo * p, unsigned char *dest)
{
  p->yp = dest;
  p->ystride = GST_ROUND_UP_4 (p->width);
  p->up = p->yp + p->ystride * p->height;
  p->ustride = GST_ROUND_UP_4 (p->ystride / 4);
  p->vp = p->up + p->ustride * (GST_ROUND_UP_4 (p->height) / 4);
  p->vstride = GST_ROUND_UP_4 (p->ystride / 4);
  p->endptr = p->vp + p->vstride * (GST_ROUND_UP_4 (p->height) / 4);
}

#define gst_video_format_is_packed video_format_is_packed
static gboolean
video_format_is_packed (GstVideoFormat fmt)
{
  switch (fmt) {
    case GST_VIDEO_FORMAT_I420:
    case GST_VIDEO_FORMAT_YV12:
    case GST_VIDEO_FORMAT_Y41B:
    case GST_VIDEO_FORMAT_Y42B:
    case GST_VIDEO_FORMAT_GRAY8:
    case GST_VIDEO_FORMAT_YUV9:
    case GST_VIDEO_FORMAT_YVU9:
      return FALSE;
    case GST_VIDEO_FORMAT_IYU1:
    case GST_VIDEO_FORMAT_IYU2:
    case GST_VIDEO_FORMAT_YUY2:
    case GST_VIDEO_FORMAT_YVYU:
    case GST_VIDEO_FORMAT_UYVY:
    case GST_VIDEO_FORMAT_AYUV:
    case GST_VIDEO_FORMAT_RGBx:
    case GST_VIDEO_FORMAT_BGRx:
    case GST_VIDEO_FORMAT_xRGB:
    case GST_VIDEO_FORMAT_xBGR:
    case GST_VIDEO_FORMAT_RGBA:
    case GST_VIDEO_FORMAT_BGRA:
    case GST_VIDEO_FORMAT_ARGB:
    case GST_VIDEO_FORMAT_ABGR:
    case GST_VIDEO_FORMAT_RGB:
    case GST_VIDEO_FORMAT_BGR:
    case GST_VIDEO_FORMAT_RGB8P:
      return TRUE;
    default:
      g_return_val_if_reached (FALSE);
  }
  return FALSE;
}

static gint
get_num_formats (void)
{
  gint num_formats = 100;
  fail_unless (gst_video_format_to_string (num_formats) == NULL);
  while (gst_video_format_to_string (num_formats) == NULL)
    --num_formats;
  GST_INFO ("number of known video formats: %d", num_formats);
  return num_formats + 1;
}

GST_START_TEST (test_video_formats_all)
{
  GstStructure *s;
  const GValue *val, *list_val;
  GstCaps *caps;
  guint num, n, num_formats;

  num_formats = get_num_formats ();

  caps = gst_caps_from_string ("video/x-raw, format=" GST_VIDEO_FORMATS_ALL);
  s = gst_caps_get_structure (caps, 0);
  val = gst_structure_get_value (s, "format");
  fail_unless (val != NULL);
  fail_unless (GST_VALUE_HOLDS_LIST (val));
  num = gst_value_list_get_size (val);
  fail_unless (num > 0);
  for (n = 0; n < num; ++n) {
    const gchar *fmt_str;

    list_val = gst_value_list_get_value (val, n);
    fail_unless (G_VALUE_HOLDS_STRING (list_val));
    fmt_str = g_value_get_string (list_val);
    GST_INFO ("format: %s", fmt_str);
    fail_if (gst_video_format_from_string (fmt_str) ==
        GST_VIDEO_FORMAT_UNKNOWN);
  }
  /* Take into account GST_VIDEO_FORMAT_ENCODED and UNKNOWN */
  fail_unless_equals_int (num, num_formats - 2);

  gst_caps_unref (caps);
}

GST_END_TEST;

#define WIDTH 77
#define HEIGHT 20
GST_START_TEST (test_video_formats_pack_unpack)
{
  guint n, num_formats;

  num_formats = get_num_formats ();

  for (n = GST_VIDEO_FORMAT_ENCODED + 1; n < num_formats; ++n) {
    const GstVideoFormatInfo *vfinfo, *unpackinfo;
    GstVideoFormat fmt = n;
    GstVideoInfo vinfo;
    gpointer data[GST_VIDEO_MAX_PLANES];
    gint stride[GST_VIDEO_MAX_PLANES];
    guint8 *vdata, *unpack_data;
    gsize vsize, unpack_size;
    guint p;

    GST_INFO ("testing %s", gst_video_format_to_string (fmt));

    vfinfo = gst_video_format_get_info (fmt);
    fail_unless (vfinfo != NULL);

    unpackinfo = gst_video_format_get_info (vfinfo->unpack_format);
    fail_unless (unpackinfo != NULL);

    gst_video_info_init (&vinfo);
    gst_video_info_set_format (&vinfo, fmt, WIDTH, HEIGHT);
    vsize = GST_VIDEO_INFO_SIZE (&vinfo);
    vdata = g_malloc (vsize);
    memset (vdata, 0x99, vsize);

    g_assert (vfinfo->pack_lines == 1);

    unpack_size =
        GST_VIDEO_FORMAT_INFO_BITS (unpackinfo) *
        GST_VIDEO_FORMAT_INFO_N_COMPONENTS (unpackinfo) *
        GST_ROUND_UP_16 (WIDTH);
    unpack_data = g_malloc (unpack_size);

    for (p = 0; p < GST_VIDEO_INFO_N_PLANES (&vinfo); ++p) {
      data[p] = vdata + GST_VIDEO_INFO_PLANE_OFFSET (&vinfo, p);
      stride[p] = GST_VIDEO_INFO_PLANE_STRIDE (&vinfo, p);
    }

    /* now unpack */
    vfinfo->unpack_func (vfinfo, GST_VIDEO_PACK_FLAG_NONE, unpack_data, data,
        stride, 0, 0, WIDTH);

    /* and pack */
    vfinfo->pack_func (vfinfo, GST_VIDEO_PACK_FLAG_NONE, unpack_data,
        unpack_size, data, stride, GST_VIDEO_CHROMA_SITE_UNKNOWN, 0, WIDTH);

    /* now unpack */
    vfinfo->unpack_func (vfinfo, GST_VIDEO_PACK_FLAG_NONE, unpack_data, data,
        stride, 0, HEIGHT - 1, WIDTH);

    /* and pack */
    vfinfo->pack_func (vfinfo, GST_VIDEO_PACK_FLAG_NONE, unpack_data,
        unpack_size, data, stride, GST_VIDEO_CHROMA_SITE_UNKNOWN, HEIGHT - 1,
        WIDTH);

    g_free (unpack_data);
    g_free (vdata);
  }
}

GST_END_TEST;
#undef WIDTH
#undef HEIGHT

GST_START_TEST (test_video_formats)
{
  guint i;

  for (i = 0; i < G_N_ELEMENTS (fourcc_list); ++i) {
    const GstVideoFormatInfo *vf_info;
    GstVideoFormat fmt;
    const gchar *s;
    guint32 fourcc;
    guint w, h;

    s = fourcc_list[i].fourcc;
    fourcc = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]);
    fmt = gst_video_format_from_fourcc (fourcc);

    if (fmt == GST_VIDEO_FORMAT_UNKNOWN) {
      GST_DEBUG ("Unknown format %s, skipping tests", fourcc_list[i].fourcc);
      continue;
    }

    vf_info = gst_video_format_get_info (fmt);
    fail_unless (vf_info != NULL);

    fail_unless_equals_int (GST_VIDEO_FORMAT_INFO_FORMAT (vf_info), fmt);

    GST_INFO ("Fourcc %s, packed=%d", fourcc_list[i].fourcc,
        gst_video_format_is_packed (fmt));

    fail_unless (GST_VIDEO_FORMAT_INFO_IS_YUV (vf_info));

    /* use any non-NULL pointer so we can compare against NULL */
    {
      paintinfo paintinfo = { 0, };
      fourcc_list[i].paint_setup (&paintinfo, (unsigned char *) s);
      if (paintinfo.ap != NULL) {
        fail_unless (GST_VIDEO_FORMAT_INFO_HAS_ALPHA (vf_info));
      } else {
        fail_if (GST_VIDEO_FORMAT_INFO_HAS_ALPHA (vf_info));
      }
    }

    for (w = 1; w <= 65; ++w) {
      for (h = 1; h <= 65; ++h) {
        GstVideoInfo vinfo;
        paintinfo paintinfo = { 0, };
        guint off0, off1, off2, off3;
        guint cs0, cs1, cs2, cs3;
        guint size;

        GST_LOG ("%s, %dx%d", fourcc_list[i].fourcc, w, h);

        gst_video_info_init (&vinfo);
        gst_video_info_set_format (&vinfo, fmt, w, h);

        paintinfo.width = w;
        paintinfo.height = h;
        fourcc_list[i].paint_setup (&paintinfo, NULL);
        fail_unless_equals_int (GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 0),
            paintinfo.ystride);
        if (!gst_video_format_is_packed (fmt)
            && GST_VIDEO_INFO_N_PLANES (&vinfo) <= 2) {
          /* planar */
          fail_unless_equals_int (GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 1),
              paintinfo.ustride);
          fail_unless_equals_int (GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 2),
              paintinfo.vstride);
          /* check component_width * height against offsets/size somehow? */
        }

        size = GST_VIDEO_INFO_SIZE (&vinfo);
        off0 = GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 0);
        off1 = GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 1);
        off2 = GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 2);

        GST_INFO ("size %d <> %d", size, (int) ((guintptr) paintinfo.endptr));
        GST_INFO ("off0 %d <> %d", off0, (int) ((guintptr) paintinfo.yp));
        GST_INFO ("off1 %d <> %d", off1, (int) ((guintptr) paintinfo.up));
        GST_INFO ("off2 %d <> %d", off2, (int) ((guintptr) paintinfo.vp));

        fail_unless_equals_int (size, (unsigned long) paintinfo.endptr);
        fail_unless_equals_int (off0, (unsigned long) paintinfo.yp);
        fail_unless_equals_int (off1, (unsigned long) paintinfo.up);
        fail_unless_equals_int (off2, (unsigned long) paintinfo.vp);

        /* should be 0 if there's no alpha component */
        off3 = GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 3);
        fail_unless_equals_int (off3, (unsigned long) paintinfo.ap);

        cs0 = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 0) *
            GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 0);
        cs1 = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 1) *
            GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 1);
        cs2 = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 2) *
            GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 2);

        /* GST_LOG ("cs0=%d,cs1=%d,cs2=%d,off0=%d,off1=%d,off2=%d,size=%d",
           cs0, cs1, cs2, off0, off1, off2, size); */

        if (!gst_video_format_is_packed (fmt))
          fail_unless (cs0 <= off1);

        if (GST_VIDEO_FORMAT_INFO_HAS_ALPHA (vinfo.finfo)) {
          cs3 = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 3) *
              GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 2);
          fail_unless (cs3 < size);
          /* U/V/alpha shouldn't take up more space than the Y component */
          fail_if (cs1 > cs0, "cs1 (%d) should be <= cs0 (%d)", cs1, cs0);
          fail_if (cs2 > cs0, "cs2 (%d) should be <= cs0 (%d)", cs2, cs0);
          fail_if (cs3 > cs0, "cs3 (%d) should be <= cs0 (%d)", cs3, cs0);

          /* all components together shouldn't take up more space than size */
          fail_unless (cs0 + cs1 + cs2 + cs3 <= size);
        } else {
          /* U/V shouldn't take up more space than the Y component */
          fail_if (cs1 > cs0, "cs1 (%d) should be <= cs0 (%d)", cs1, cs0);
          fail_if (cs2 > cs0, "cs2 (%d) should be <= cs0 (%d)", cs2, cs0);

          /* all components together shouldn't take up more space than size */
          fail_unless (cs0 + cs1 + cs2 <= size,
              "cs0 (%d) + cs1 (%d) + cs2 (%d) should be <= size (%d)",
              cs0, cs1, cs2, size);
        }
      }
    }
  }
}

GST_END_TEST;

GST_START_TEST (test_video_formats_rgb)
{
  GstVideoInfo vinfo;
  gint width, height, framerate_n, framerate_d, par_n, par_d;
  GstCaps *caps;
  GstStructure *structure;

  gst_video_info_init (&vinfo);
  gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_RGB, 800, 600);
  vinfo.par_n = 1;
  vinfo.par_d = 1;
  vinfo.fps_n = 0;
  vinfo.fps_d = 1;
  caps = gst_video_info_to_caps (&vinfo);
  structure = gst_caps_get_structure (caps, 0);

  fail_unless (gst_structure_get_int (structure, "width", &width));
  fail_unless (gst_structure_get_int (structure, "height", &height));
  fail_unless (gst_structure_get_fraction (structure, "framerate", &framerate_n,
          &framerate_d));
  fail_unless (gst_structure_get_fraction (structure, "pixel-aspect-ratio",
          &par_n, &par_d));

  fail_unless (width == 800);
  fail_unless (height == 600);
  fail_unless (framerate_n == 0);
  fail_unless (framerate_d == 1);
  fail_unless (par_n == 1);
  fail_unless (par_d == 1);

  gst_caps_unref (caps);
}

GST_END_TEST;


GST_START_TEST (test_video_formats_rgba_large_dimension)
{
  GstVideoInfo vinfo;
  gint width, height, framerate_n, framerate_d, par_n, par_d;
  GstCaps *caps;
  GstStructure *structure;

  gst_video_info_init (&vinfo);
  gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_RGBA, 29700, 21000);
  vinfo.par_n = 1;
  vinfo.par_d = 1;
  vinfo.fps_n = 0;
  vinfo.fps_d = 1;
  caps = gst_video_info_to_caps (&vinfo);
  structure = gst_caps_get_structure (caps, 0);

  fail_unless (gst_structure_get_int (structure, "width", &width));
  fail_unless (gst_structure_get_int (structure, "height", &height));
  fail_unless (gst_structure_get_fraction (structure, "framerate", &framerate_n,
          &framerate_d));
  fail_unless (gst_structure_get_fraction (structure, "pixel-aspect-ratio",
          &par_n, &par_d));

  fail_unless (width == 29700);
  fail_unless (height == 21000);
  fail_unless (framerate_n == 0);
  fail_unless (framerate_d == 1);
  fail_unless (par_n == 1);
  fail_unless (par_d == 1);
  fail_unless (vinfo.size == (gsize) 29700 * 21000 * 4);

  gst_caps_unref (caps);
}

GST_END_TEST;

GST_START_TEST (test_dar_calc)
{
  guint display_ratio_n, display_ratio_d;

  /* Ensure that various Display Ratio calculations are correctly done */
  /* video 768x576, par 16/15, display par 16/15 = 4/3 */
  fail_unless (gst_video_calculate_display_ratio (&display_ratio_n,
          &display_ratio_d, 768, 576, 16, 15, 16, 15));
  fail_unless (display_ratio_n == 4 && display_ratio_d == 3);

  /* video 720x480, par 32/27, display par 1/1 = 16/9 */
  fail_unless (gst_video_calculate_display_ratio (&display_ratio_n,
          &display_ratio_d, 720, 480, 32, 27, 1, 1));
  fail_unless (display_ratio_n == 16 && display_ratio_d == 9);

  /* video 360x288, par 533333/500000, display par 16/15 = 
   * dar 1599999/1600000 */
  fail_unless (gst_video_calculate_display_ratio (&display_ratio_n,
          &display_ratio_d, 360, 288, 533333, 500000, 16, 15));
  fail_unless (display_ratio_n == 1599999 && display_ratio_d == 1280000);
}

GST_END_TEST;

GST_START_TEST (test_parse_caps_rgb)
{
  struct
  {
    const gchar *tmpl_caps_string;
    GstVideoFormat fmt;
  } formats[] = {
    /* 24 bit */
    {
    GST_VIDEO_CAPS_MAKE ("RGB"), GST_VIDEO_FORMAT_RGB}, {
    GST_VIDEO_CAPS_MAKE ("BGR"), GST_VIDEO_FORMAT_BGR},
        /* 32 bit (no alpha) */
    {
    GST_VIDEO_CAPS_MAKE ("RGBx"), GST_VIDEO_FORMAT_RGBx}, {
    GST_VIDEO_CAPS_MAKE ("xRGB"), GST_VIDEO_FORMAT_xRGB}, {
    GST_VIDEO_CAPS_MAKE ("BGRx"), GST_VIDEO_FORMAT_BGRx}, {
    GST_VIDEO_CAPS_MAKE ("xBGR"), GST_VIDEO_FORMAT_xBGR},
        /* 32 bit (with alpha) */
    {
    GST_VIDEO_CAPS_MAKE ("RGBA"), GST_VIDEO_FORMAT_RGBA}, {
    GST_VIDEO_CAPS_MAKE ("ARGB"), GST_VIDEO_FORMAT_ARGB}, {
    GST_VIDEO_CAPS_MAKE ("BGRA"), GST_VIDEO_FORMAT_BGRA}, {
    GST_VIDEO_CAPS_MAKE ("ABGR"), GST_VIDEO_FORMAT_ABGR},
        /* 16 bit */
    {
    GST_VIDEO_CAPS_MAKE ("RGB16"), GST_VIDEO_FORMAT_RGB16}, {
    GST_VIDEO_CAPS_MAKE ("BGR16"), GST_VIDEO_FORMAT_BGR16}, {
    GST_VIDEO_CAPS_MAKE ("RGB15"), GST_VIDEO_FORMAT_RGB15}, {
    GST_VIDEO_CAPS_MAKE ("BGR15"), GST_VIDEO_FORMAT_BGR15}
  };
  gint i;

  for (i = 0; i < G_N_ELEMENTS (formats); ++i) {
    GstVideoInfo vinfo;
    GstCaps *caps, *caps2;

    caps = gst_caps_from_string (formats[i].tmpl_caps_string);
    fail_unless (caps != NULL);
    gst_caps_set_simple (caps, "width", G_TYPE_INT, 2 * (i + 1), "height",
        G_TYPE_INT, i + 1, "framerate", GST_TYPE_FRACTION, 15, 1,
        "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
        "interlace-mode", G_TYPE_STRING, "progressive",
        "colorimetry", G_TYPE_STRING, "1:1:0:0",
        "multiview-mode", G_TYPE_STRING, "mono",
        "multiview-flags", GST_TYPE_VIDEO_MULTIVIEW_FLAGSET, 0,
        GST_FLAG_SET_MASK_EXACT, NULL);
    g_assert (gst_caps_is_fixed (caps));

    GST_DEBUG ("testing caps: %" GST_PTR_FORMAT, caps);

    gst_video_info_init (&vinfo);
    fail_unless (gst_video_info_from_caps (&vinfo, caps));
    fail_unless_equals_int (GST_VIDEO_INFO_FORMAT (&vinfo), formats[i].fmt);
    fail_unless_equals_int (GST_VIDEO_INFO_WIDTH (&vinfo), 2 * (i + 1));
    fail_unless_equals_int (GST_VIDEO_INFO_HEIGHT (&vinfo), i + 1);

    /* make sure they're serialised back correctly */
    caps2 = gst_video_info_to_caps (&vinfo);
    fail_unless (caps2 != NULL);
    if (!gst_caps_is_equal (caps, caps2)) {
      gchar *caps1s = gst_caps_to_string (caps);
      gchar *caps2s = gst_caps_to_string (caps2);
      fail ("caps [%s] not equal to caps2 [%s]", caps1s, caps2s);
      g_free (caps1s);
      g_free (caps2s);
    }

    gst_caps_unref (caps);
    gst_caps_unref (caps2);
  }
}

GST_END_TEST;

GST_START_TEST (test_parse_caps_multiview)
{
  gint i, j;
  GstVideoMultiviewMode modes[] = {
    GST_VIDEO_MULTIVIEW_MODE_MONO,
    GST_VIDEO_MULTIVIEW_MODE_LEFT,
    GST_VIDEO_MULTIVIEW_MODE_RIGHT,
    GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE,
    GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE_QUINCUNX,
    GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED,
    GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED,
    GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM,
    GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD,
    GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME,
    GST_VIDEO_MULTIVIEW_MODE_MULTIVIEW_FRAME_BY_FRAME,
    GST_VIDEO_MULTIVIEW_MODE_SEPARATED,
  };
  GstVideoMultiviewFlags flags[] = {
    GST_VIDEO_MULTIVIEW_FLAGS_NONE,
    GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST,
    GST_VIDEO_MULTIVIEW_FLAGS_LEFT_FLIPPED,
    GST_VIDEO_MULTIVIEW_FLAGS_LEFT_FLOPPED,
    GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_FLIPPED,
    GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_FLOPPED,
    GST_VIDEO_MULTIVIEW_FLAGS_MIXED_MONO,
    GST_VIDEO_MULTIVIEW_FLAGS_MIXED_MONO |
        GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST,
    GST_VIDEO_MULTIVIEW_FLAGS_MIXED_MONO |
        GST_VIDEO_MULTIVIEW_FLAGS_LEFT_FLIPPED
  };

  for (i = 0; i < G_N_ELEMENTS (modes); i++) {
    for (j = 0; j < G_N_ELEMENTS (flags); j++) {
      GstVideoInfo vinfo;
      GstCaps *caps;

      gst_video_info_init (&vinfo);
      gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_I420, 320, 240);

      GST_VIDEO_INFO_MULTIVIEW_MODE (&vinfo) = modes[i];
      GST_VIDEO_INFO_MULTIVIEW_FLAGS (&vinfo) = flags[j];

      caps = gst_video_info_to_caps (&vinfo);
      fail_if (caps == NULL);
      GST_LOG ("mview mode %d flags %x -> caps %" GST_PTR_FORMAT,
          modes[i], flags[j], caps);

      fail_unless (gst_video_info_from_caps (&vinfo, caps));

      GST_LOG ("mview mode %d flags %x -> info mode %d flags %x",
          modes[i], flags[j], GST_VIDEO_INFO_MULTIVIEW_MODE (&vinfo),
          GST_VIDEO_INFO_MULTIVIEW_FLAGS (&vinfo));

      fail_unless (GST_VIDEO_INFO_MULTIVIEW_MODE (&vinfo) == modes[i],
          "Expected multiview mode %d got mode %d", modes[i],
          GST_VIDEO_INFO_MULTIVIEW_MODE (&vinfo));
      fail_unless (GST_VIDEO_INFO_MULTIVIEW_FLAGS (&vinfo) == flags[j],
          "Expected multiview flags 0x%x got 0x%x", flags[j],
          GST_VIDEO_INFO_MULTIVIEW_FLAGS (&vinfo));

      gst_caps_unref (caps);
    }
  }
}

GST_END_TEST;

typedef struct
{
  const gchar *string_from;
  const gchar *string_to;
  const gchar *name;
  GstVideoColorimetry color;
} ColorimetryTest;

#define MAKE_COLORIMETRY_TEST(s1,s2,n,r,m,t,p) { s1, s2, n,         \
    { GST_VIDEO_COLOR_RANGE ##r, GST_VIDEO_COLOR_MATRIX_ ##m,       \
    GST_VIDEO_TRANSFER_ ##t, GST_VIDEO_COLOR_PRIMARIES_ ##p } }

GST_START_TEST (test_parse_colorimetry)
{
  ColorimetryTest tests[] = {
    MAKE_COLORIMETRY_TEST ("bt601", "bt601", "bt601",
        _16_235, BT601, BT709, SMPTE170M),
    MAKE_COLORIMETRY_TEST ("2:4:5:4", "bt601", "bt601",
        _16_235, BT601, BT709, SMPTE170M),
    MAKE_COLORIMETRY_TEST ("bt709", "bt709", "bt709",
        _16_235, BT709, BT709, BT709),
    MAKE_COLORIMETRY_TEST ("smpte240m", "smpte240m", "smpte240m",
        _16_235, SMPTE240M, SMPTE240M, SMPTE240M),
    MAKE_COLORIMETRY_TEST ("sRGB", "sRGB", "sRGB",
        _0_255, RGB, SRGB, BT709),
    MAKE_COLORIMETRY_TEST ("bt2020" , "bt2020", "bt2020",
        _16_235, BT2020, BT2020_12, BT2020),
    MAKE_COLORIMETRY_TEST ("1:4:0:0", "1:4:0:0", NULL,
        _0_255, BT601, UNKNOWN, UNKNOWN),
  };
  gint i;

  for (i = 0; i < G_N_ELEMENTS (tests); i++) {
    const ColorimetryTest *test = &tests[i];
    GstVideoColorimetry color;
    gchar *string;

    fail_unless (gst_video_colorimetry_from_string (&color, test->string_from));
    fail_unless_equals_int (color.range, test->color.range);
    fail_unless_equals_int (color.matrix, test->color.matrix);
    fail_unless_equals_int (color.transfer, test->color.transfer);
    fail_unless_equals_int (color.primaries, test->color.primaries);

    string = gst_video_colorimetry_to_string (&color);
    fail_unless_equals_string (string, test->string_to);
    g_free (string);

    fail_unless (gst_video_colorimetry_is_equal (&color, &test->color));

    if (test->name)
      fail_unless (gst_video_colorimetry_matches (&color, test->name));
  }
}

GST_END_TEST;

GST_START_TEST (test_events)
{
  GstEvent *e;
  gboolean in_still;

  e = gst_video_event_new_still_frame (TRUE);
  fail_if (e == NULL, "Failed to create still frame event");
  fail_unless (gst_video_event_parse_still_frame (e, &in_still),
      "Failed to parse still frame event");
  fail_unless (gst_video_event_parse_still_frame (e, NULL),
      "Failed to parse still frame event w/ in_still == NULL");
  fail_unless (in_still == TRUE);
  gst_event_unref (e);

  e = gst_video_event_new_still_frame (FALSE);
  fail_if (e == NULL, "Failed to create still frame event");
  fail_unless (gst_video_event_parse_still_frame (e, &in_still),
      "Failed to parse still frame event");
  fail_unless (gst_video_event_parse_still_frame (e, NULL),
      "Failed to parse still frame event w/ in_still == NULL");
  fail_unless (in_still == FALSE);
  gst_event_unref (e);
}

GST_END_TEST;

GST_START_TEST (test_convert_frame)
{
  GstVideoInfo vinfo;
  GstCaps *from_caps, *to_caps;
  GstBuffer *from_buffer;
  GstSample *from_sample, *to_sample;
  GError *error = NULL;
  gint i;
  GstMapInfo map;

  gst_debug_set_threshold_for_name ("default", GST_LEVEL_NONE);

  from_buffer = gst_buffer_new_and_alloc (640 * 480 * 4);

  gst_buffer_map (from_buffer, &map, GST_MAP_WRITE);
  for (i = 0; i < 640 * 480; i++) {
    map.data[4 * i + 0] = 0;    /* x */
    map.data[4 * i + 1] = 255;  /* R */
    map.data[4 * i + 2] = 0;    /* G */
    map.data[4 * i + 3] = 0;    /* B */
  }
  gst_buffer_unmap (from_buffer, &map);

  gst_video_info_init (&vinfo);
  gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_xRGB, 640, 480);
  vinfo.fps_n = 25;
  vinfo.fps_d = 1;
  vinfo.par_n = 1;
  vinfo.par_d = 1;
  from_caps = gst_video_info_to_caps (&vinfo);

  from_sample = gst_sample_new (from_buffer, from_caps, NULL, NULL);

  to_caps =
      gst_caps_from_string
      ("something/that, does=(string)not, exist=(boolean)FALSE");

  to_sample =
      gst_video_convert_sample (from_sample, to_caps,
      GST_CLOCK_TIME_NONE, &error);
  fail_if (to_sample != NULL);
  fail_unless (error != NULL);
  g_error_free (error);
  error = NULL;

  gst_caps_unref (to_caps);
  gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_I420, 240, 320);
  vinfo.fps_n = 25;
  vinfo.fps_d = 1;
  vinfo.par_n = 1;
  vinfo.par_d = 2;
  to_caps = gst_video_info_to_caps (&vinfo);

  to_sample =
      gst_video_convert_sample (from_sample, to_caps,
      GST_CLOCK_TIME_NONE, &error);
  fail_unless (to_sample != NULL);
  fail_unless (error == NULL);

  gst_buffer_unref (from_buffer);
  gst_caps_unref (from_caps);
  gst_sample_unref (from_sample);
  gst_sample_unref (to_sample);
  gst_caps_unref (to_caps);
}

GST_END_TEST;

typedef struct
{
  GMainLoop *loop;
  GstSample *sample;
  GError *error;
} ConvertFrameContext;

static void
convert_sample_async_callback (GstSample * sample, GError * err,
    ConvertFrameContext * cf_data)
{
  cf_data->sample = sample;
  cf_data->error = err;

  g_main_loop_quit (cf_data->loop);
}

GST_START_TEST (test_convert_frame_async)
{
  GstVideoInfo vinfo;
  GstCaps *from_caps, *to_caps;
  GstBuffer *from_buffer;
  GstSample *from_sample;
  gint i;
  GstMapInfo map;
  GMainLoop *loop;
  ConvertFrameContext cf_data = { NULL, NULL, NULL };

  gst_debug_set_threshold_for_name ("default", GST_LEVEL_NONE);

  from_buffer = gst_buffer_new_and_alloc (640 * 480 * 4);

  gst_buffer_map (from_buffer, &map, GST_MAP_WRITE);
  for (i = 0; i < 640 * 480; i++) {
    map.data[4 * i + 0] = 0;    /* x */
    map.data[4 * i + 1] = 255;  /* R */
    map.data[4 * i + 2] = 0;    /* G */
    map.data[4 * i + 3] = 0;    /* B */
  }
  gst_buffer_unmap (from_buffer, &map);

  gst_video_info_init (&vinfo);
  gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_xRGB, 640, 470);
  vinfo.par_n = 1;
  vinfo.par_d = 1;
  vinfo.fps_n = 25;
  vinfo.fps_d = 1;
  from_caps = gst_video_info_to_caps (&vinfo);

  to_caps =
      gst_caps_from_string
      ("something/that, does=(string)not, exist=(boolean)FALSE");

  loop = cf_data.loop = g_main_loop_new (NULL, FALSE);

  from_sample = gst_sample_new (from_buffer, from_caps, NULL, NULL);
  gst_buffer_unref (from_buffer);
  gst_caps_unref (from_caps);

  gst_video_convert_sample_async (from_sample, to_caps,
      GST_CLOCK_TIME_NONE,
      (GstVideoConvertSampleCallback) convert_sample_async_callback, &cf_data,
      NULL);

  g_main_loop_run (loop);

  fail_if (cf_data.sample != NULL);
  fail_unless (cf_data.error != NULL);
  g_error_free (cf_data.error);
  cf_data.error = NULL;

  gst_caps_unref (to_caps);
  gst_video_info_init (&vinfo);
  gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_I420, 240, 320);
  vinfo.par_n = 1;
  vinfo.par_d = 2;
  vinfo.fps_n = 25;
  vinfo.fps_d = 1;
  to_caps = gst_video_info_to_caps (&vinfo);
  gst_video_convert_sample_async (from_sample, to_caps,
      GST_CLOCK_TIME_NONE,
      (GstVideoConvertSampleCallback) convert_sample_async_callback, &cf_data,
      NULL);
  g_main_loop_run (loop);
  fail_unless (cf_data.sample != NULL);
  fail_unless (cf_data.error == NULL);

  gst_sample_unref (cf_data.sample);
  gst_caps_unref (to_caps);
  gst_sample_unref (from_sample);

  g_main_loop_unref (loop);
}

GST_END_TEST;

GST_START_TEST (test_video_size_from_caps)
{
  GstVideoInfo vinfo;
  GstCaps *caps;

  caps = gst_caps_new_simple ("video/x-raw",
      "format", G_TYPE_STRING, "YV12",
      "width", G_TYPE_INT, 640,
      "height", G_TYPE_INT, 480, "framerate", GST_TYPE_FRACTION, 25, 1, NULL);

  gst_video_info_init (&vinfo);
  fail_unless (gst_video_info_from_caps (&vinfo, caps));
  fail_unless (GST_VIDEO_INFO_SIZE (&vinfo) == (640 * 480 * 12 / 8));

  gst_caps_unref (caps);
}

GST_END_TEST;

GST_START_TEST (test_overlay_composition)
{
  GstVideoOverlayComposition *comp1, *comp2;
  GstVideoOverlayRectangle *rect1, *rect2;
  GstVideoOverlayCompositionMeta *ometa;
  GstBuffer *pix1, *pix2, *buf;
  GstVideoMeta *vmeta;
  guint seq1, seq2;
  guint w, h, stride;
  gint x, y;
  guint8 val;

  pix1 = gst_buffer_new_and_alloc (200 * sizeof (guint32) * 50);
  gst_buffer_memset (pix1, 0, 0, gst_buffer_get_size (pix1));

  gst_buffer_add_video_meta (pix1, GST_VIDEO_FRAME_FLAG_NONE,
      GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB, 200, 50);
  rect1 = gst_video_overlay_rectangle_new_raw (pix1,
      600, 50, 300, 50, GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);

  gst_buffer_unref (pix1);
  pix1 = NULL;

  comp1 = gst_video_overlay_composition_new (rect1);
  fail_unless (gst_video_overlay_composition_n_rectangles (comp1) == 1);
  fail_unless (gst_video_overlay_composition_get_rectangle (comp1, 0) == rect1);
  fail_unless (gst_video_overlay_composition_get_rectangle (comp1, 1) == NULL);

  /* rectangle was created first, sequence number should be smaller */
  seq1 = gst_video_overlay_rectangle_get_seqnum (rect1);
  seq2 = gst_video_overlay_composition_get_seqnum (comp1);
  fail_unless (seq1 < seq2);

  /* composition took own ref, so refcount is 2 now, so this should fail */
  ASSERT_CRITICAL (gst_video_overlay_rectangle_set_render_rectangle (rect1, 50,
          600, 300, 50));

  /* drop our ref, so refcount is 1 (we know it will continue to be valid) */
  gst_video_overlay_rectangle_unref (rect1);
  gst_video_overlay_rectangle_set_render_rectangle (rect1, 50, 600, 300, 50);

  comp2 = gst_video_overlay_composition_new (rect1);
  fail_unless (gst_video_overlay_composition_n_rectangles (comp2) == 1);
  fail_unless (gst_video_overlay_composition_get_rectangle (comp2, 0) == rect1);
  fail_unless (gst_video_overlay_composition_get_rectangle (comp2, 1) == NULL);

  fail_unless (seq1 < gst_video_overlay_composition_get_seqnum (comp2));
  fail_unless (seq2 < gst_video_overlay_composition_get_seqnum (comp2));

  /* now refcount is 2 again because comp2 has also taken a ref, so must fail */
  ASSERT_CRITICAL (gst_video_overlay_rectangle_set_render_rectangle (rect1, 0,
          0, 1, 1));

  /* this should make a copy of the rectangles so drop the original
   * second ref on rect1 */
  comp2 = gst_video_overlay_composition_make_writable (comp2);
  gst_video_overlay_rectangle_set_render_rectangle (rect1, 51, 601, 301, 51);

  rect2 = gst_video_overlay_composition_get_rectangle (comp2, 0);
  fail_unless (gst_video_overlay_composition_n_rectangles (comp2) == 1);
  fail_unless (gst_video_overlay_composition_get_rectangle (comp2, 0) == rect2);
  fail_unless (gst_video_overlay_composition_get_rectangle (comp2, 1) == NULL);
  fail_unless (rect1 != rect2);

  gst_video_overlay_composition_add_rectangle (comp1, rect2);
  gst_video_overlay_composition_ref (comp1);
  ASSERT_CRITICAL (gst_video_overlay_composition_add_rectangle (comp1, rect2));
  gst_video_overlay_composition_unref (comp1);

  /* make sure the copy really worked */
  gst_video_overlay_rectangle_get_render_rectangle (rect1, &x, &y, &w, &h);
  fail_unless_equals_int (x, 51);
  fail_unless_equals_int (y, 601);
  fail_unless_equals_int (w, 301);
  fail_unless_equals_int (h, 51);

  /* get scaled pixbuf and touch last byte */
  pix1 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  stride = 4 * w;
  fail_unless (gst_buffer_get_size (pix1) > ((h - 1) * stride + (w * 4) - 1),
      "size %u vs. last pixel offset %u", gst_buffer_get_size (pix1),
      ((h - 1) * stride + (w * 4) - 1));
  gst_buffer_extract (pix1, ((h - 1) * stride + (w * 4) - 1), &val, 1);
  fail_unless_equals_int (val, 0);

  gst_video_overlay_rectangle_get_render_rectangle (rect2, &x, &y, &w, &h);
  fail_unless_equals_int (x, 50);
  fail_unless_equals_int (y, 600);
  fail_unless_equals_int (w, 300);
  fail_unless_equals_int (h, 50);

  /* get scaled pixbuf and touch last byte */
  pix2 = gst_video_overlay_rectangle_get_pixels_raw (rect2,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  stride = 4 * w;
  fail_unless (gst_buffer_get_size (pix2) > ((h - 1) * stride + (w * 4) - 1),
      "size %u vs. last pixel offset %u", gst_buffer_get_size (pix1),
      ((h - 1) * stride + (w * 4) - 1));
  gst_buffer_extract (pix2, ((h - 1) * stride + (w * 4) - 1), &val, 1);
  fail_unless_equals_int (val, 0);

  /* get scaled pixbuf again, should be the same buffer as before (caching) */
  pix1 = gst_video_overlay_rectangle_get_pixels_raw (rect2,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix1 == pix2);

  /* get in different format */
  pix1 = gst_video_overlay_rectangle_get_pixels_ayuv (rect2,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix1 != pix2);
  /* get it again, should be same (caching) */
  pix2 = gst_video_overlay_rectangle_get_pixels_ayuv (rect2,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix1 == pix2);
  /* get unscaled, should be different */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_ayuv (rect2,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix1 != pix2);
  /* but should be cached */
  pix1 = gst_video_overlay_rectangle_get_pixels_unscaled_ayuv (rect2,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix1 == pix2);

  vmeta = gst_buffer_get_video_meta (pix1);
  fail_unless (vmeta != NULL);
  w = vmeta->width;
  h = vmeta->height;
  fail_unless_equals_int (w, 200);
  fail_unless_equals_int (h, 50);
  fail_unless_equals_int (vmeta->format,
      GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_YUV);
  fail_unless (gst_buffer_get_size (pix1) == w * h * 4);
  gst_buffer_extract (pix1, 0, &seq1, 4);
  fail_unless (seq1 != 0);

  /* now compare the original unscaled ones */
  pix1 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect2,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);

  vmeta = gst_buffer_get_video_meta (pix2);
  fail_unless (vmeta != NULL);
  w = vmeta->width;
  h = vmeta->height;

  /* the original pixel buffers should be identical */
  fail_unless (pix1 == pix2);
  fail_unless_equals_int (w, 200);
  fail_unless_equals_int (h, 50);
  stride = 4 * w;

  /* touch last byte */
  fail_unless (gst_buffer_get_size (pix1) > ((h - 1) * stride + (w * 4) - 1),
      "size %u vs. last pixel offset %u", gst_buffer_get_size (pix1),
      ((h - 1) * stride + (w * 4) - 1));
  gst_buffer_extract (pix1, ((h - 1) * stride + (w * 4) - 1), &val, 1);
  fail_unless_equals_int (val, 0);

  /* test attaching and retrieving of compositions to/from buffers */
  buf = gst_buffer_new ();
  fail_unless (gst_buffer_get_video_overlay_composition_meta (buf) == NULL);

  gst_buffer_ref (buf);
  /* buffer now has refcount of 2, so its metadata is not writable.
   * only check this if we are not running in valgrind, as it leaks */
#ifdef HAVE_VALGRIND
  if (!RUNNING_ON_VALGRIND) {
    ASSERT_CRITICAL (gst_buffer_add_video_overlay_composition_meta (buf,
            comp1));
  }
#endif
  gst_buffer_unref (buf);
  gst_buffer_add_video_overlay_composition_meta (buf, comp1);
  ometa = gst_buffer_get_video_overlay_composition_meta (buf);
  fail_unless (ometa != NULL);
  fail_unless (ometa->overlay == comp1);
  fail_unless (gst_buffer_remove_video_overlay_composition_meta (buf, ometa));
  gst_buffer_add_video_overlay_composition_meta (buf, comp2);
  ometa = gst_buffer_get_video_overlay_composition_meta (buf);
  fail_unless (ometa->overlay == comp2);
  fail_unless (gst_buffer_remove_video_overlay_composition_meta (buf, ometa));
  fail_unless (gst_buffer_get_video_overlay_composition_meta (buf) == NULL);

  /* make sure the buffer cleans up its composition ref when unreffed */
  gst_buffer_add_video_overlay_composition_meta (buf, comp2);
  gst_buffer_unref (buf);

  gst_video_overlay_composition_unref (comp2);
  gst_video_overlay_composition_unref (comp1);
}

GST_END_TEST;

GST_START_TEST (test_overlay_composition_premultiplied_alpha)
{
  GstVideoOverlayRectangle *rect1;
  GstVideoMeta *vmeta;
  GstBuffer *pix1, *pix2, *pix3, *pix4, *pix5;
  GstBuffer *pix6, *pix7, *pix8, *pix9, *pix10;
  guint8 *data5, *data7;
  guint w, h, w2, h2;
  GstMapInfo map;

  pix1 = gst_buffer_new_and_alloc (200 * sizeof (guint32) * 50);
  gst_buffer_memset (pix1, 0, 0x80, gst_buffer_get_size (pix1));

  gst_buffer_add_video_meta (pix1, GST_VIDEO_FRAME_FLAG_NONE,
      GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB, 200, 50);
  rect1 = gst_video_overlay_rectangle_new_raw (pix1,
      600, 50, 300, 50, GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  gst_buffer_unref (pix1);

  /* same flags, unscaled, should be the same buffer */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix1 == pix2);

  /* same flags, but scaled */
  pix3 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_if (pix3 == pix1 || pix3 == pix2);

  /* same again, should hopefully get the same (cached) buffer as before */
  pix4 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix4 == pix3);

  /* just to update the vars */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);

  vmeta = gst_buffer_get_video_meta (pix2);
  fail_unless (vmeta != NULL);
  w = vmeta->width;
  h = vmeta->height;

  /* now, let's try to get premultiplied alpha from the unpremultiplied input */
  pix5 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  fail_if (pix5 == pix1 || pix5 == pix2 || pix5 == pix3);
  vmeta = gst_buffer_get_video_meta (pix5);
  fail_unless (vmeta != NULL);
  w2 = vmeta->width;
  h2 = vmeta->height;
  fail_unless_equals_int (w, w2);
  fail_unless_equals_int (h, h2);
  fail_unless_equals_int (gst_buffer_get_size (pix2),
      gst_buffer_get_size (pix5));
  gst_buffer_map (pix5, &map, GST_MAP_READ);
  fail_if (gst_buffer_memcmp (pix2, 0, map.data, map.size) == 0);
  /* make sure it actually did what we expected it to do (input=0x80808080) */
  data5 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data5[0], 0x40);
  fail_unless_equals_int (data5[1], 0x40);
  fail_unless_equals_int (data5[2], 0x40);
  fail_unless_equals_int (data5[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data5[0], 0x80);
  fail_unless_equals_int (data5[1], 0x40);
  fail_unless_equals_int (data5[2], 0x40);
  fail_unless_equals_int (data5[3], 0x40);
#endif
  gst_buffer_unmap (pix5, &map);

  /* same again, now we should be getting back the same buffer as before,
   * as it should have been cached */
  pix6 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  fail_unless (pix6 == pix5);

  /* just to update the stride var */
  pix3 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix3 == pix4);

  /* now try to get scaled premultiplied alpha from unpremultiplied input */
  pix7 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  fail_if (pix7 == pix1 || pix7 == pix2 || pix7 == pix3 || pix7 == pix5);

  gst_buffer_map (pix7, &map, GST_MAP_READ);
  data7 = map.data;
  /* make sure it actually did what we expected it to do (input=0x80808080)
   * hoping that the scaling didn't mess up our values */
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data7[0], 0x40);
  fail_unless_equals_int (data7[1], 0x40);
  fail_unless_equals_int (data7[2], 0x40);
  fail_unless_equals_int (data7[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data7[0], 0x80);
  fail_unless_equals_int (data7[1], 0x40);
  fail_unless_equals_int (data7[2], 0x40);
  fail_unless_equals_int (data7[3], 0x40);
#endif
  gst_buffer_unmap (pix7, &map);

  /* and the same again, it should be cached now */
  pix8 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  fail_unless (pix8 == pix7);

  /* make sure other cached stuff is still there */
  pix9 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix9 == pix3);
  pix10 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  fail_unless (pix10 == pix5);

  gst_video_overlay_rectangle_unref (rect1);
}

GST_END_TEST;

GST_START_TEST (test_overlay_composition_global_alpha)
{
  GstVideoOverlayRectangle *rect1;
  GstBuffer *pix1, *pix2, *pix3, *pix4, *pix5;
  GstVideoMeta *vmeta;
  guint8 *data2, *data4, *data5;
  guint w, h, w4, h4;
  guint seq1, seq2;
  gfloat ga1, ga2;
  GstVideoOverlayFormatFlags flags1;
  GstMapInfo map;

  pix1 = gst_buffer_new_and_alloc (200 * sizeof (guint32) * 50);
  gst_buffer_memset (pix1, 0, 0x80, gst_buffer_get_size (pix1));

  gst_buffer_add_video_meta (pix1, GST_VIDEO_FRAME_FLAG_NONE,
      GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB, 200, 50);
  rect1 = gst_video_overlay_rectangle_new_raw (pix1,
      600, 50, 300, 50, GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  gst_buffer_unref (pix1);

  /* same flags, unscaled, should be the same buffer */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix1 == pix2);

  vmeta = gst_buffer_get_video_meta (pix2);
  fail_unless (vmeta != NULL);
  w = vmeta->width;
  h = vmeta->height;

  /* same flags, but scaled */
  pix3 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_if (pix3 == pix1 || pix3 == pix2);

  /* get unscaled premultiplied data, new cached rectangle should be created */
  pix4 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  fail_if (pix4 == pix2 || pix4 == pix3);
  vmeta = gst_buffer_get_video_meta (pix4);
  fail_unless (vmeta != NULL);
  w4 = vmeta->width;
  h4 = vmeta->height;
  fail_unless_equals_int (w, w4);
  fail_unless_equals_int (h, h4);
  fail_unless_equals_int (gst_buffer_get_size (pix2),
      gst_buffer_get_size (pix4));
  gst_buffer_map (pix4, &map, GST_MAP_READ);
  fail_if (gst_buffer_memcmp (pix1, 0, map.data, map.size) == 0);
  /* make sure it actually did what we expected it to do (input=0x80808080) */
  data4 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data4[0], 0x40);
  fail_unless_equals_int (data4[1], 0x40);
  fail_unless_equals_int (data4[2], 0x40);
  fail_unless_equals_int (data4[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data4[0], 0x80);
  fail_unless_equals_int (data4[1], 0x40);
  fail_unless_equals_int (data4[2], 0x40);
  fail_unless_equals_int (data4[3], 0x40);
#endif
  gst_buffer_unmap (pix4, &map);

  /* now premultiplied and scaled, again a new cached rectangle should be cached */
  pix5 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  fail_if (pix5 == pix2 || pix5 == pix3 || pix5 == pix4);
  /* stride and size should be equal to the first scaled rect */
  fail_unless_equals_int (gst_buffer_get_size (pix5),
      gst_buffer_get_size (pix3));
  /* data should be different (premutliplied) though */
  gst_buffer_map (pix5, &map, GST_MAP_READ);
  fail_if (gst_buffer_memcmp (pix3, 0, map.data, map.size) == 0);
  /* make sure it actually did what we expected it to do (input=0x80808080) */
  data5 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data5[0], 0x40);
  fail_unless_equals_int (data5[1], 0x40);
  fail_unless_equals_int (data5[2], 0x40);
  fail_unless_equals_int (data5[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data5[0], 0x80);
  fail_unless_equals_int (data5[1], 0x40);
  fail_unless_equals_int (data5[2], 0x40);
  fail_unless_equals_int (data5[3], 0x40);
#endif
  gst_buffer_unmap (pix5, &map);

  /* global_alpha should initially be 1.0 */
  ga1 = gst_video_overlay_rectangle_get_global_alpha (rect1);
  fail_unless_equals_float (ga1, 1.0);

  /* now set global_alpha */
  seq1 = gst_video_overlay_rectangle_get_seqnum (rect1);
  gst_video_overlay_rectangle_set_global_alpha (rect1, 0.5);
  ga2 = gst_video_overlay_rectangle_get_global_alpha (rect1);
  fail_unless_equals_float (ga2, 0.5);

  /* seqnum should have changed */
  seq2 = gst_video_overlay_rectangle_get_seqnum (rect1);
  fail_unless (seq1 < seq2);

  /* internal flags should have been set */
  flags1 = gst_video_overlay_rectangle_get_flags (rect1);
  fail_unless_equals_int (flags1, GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA);

  /* request unscaled pixel-data, global-alpha not applied */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA);
  /* this should just return the same buffer */
  fail_unless (pix2 == pix1);
  /* make sure we got the initial data (input=0x80808080) */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#endif
  gst_buffer_unmap (pix2, &map);

  /* unscaled pixel-data, global-alpha applied */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  /* this should be the same buffer with on-the-fly modified alpha-channel */
  fail_unless (pix2 == pix1);
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
  /* make sure we got the initial data with adjusted alpha-channel */
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x40);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x40);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#endif
  gst_buffer_unmap (pix2, &map);

  /* adjust global_alpha once more */
  gst_video_overlay_rectangle_set_global_alpha (rect1, 0.25);
  ga2 = gst_video_overlay_rectangle_get_global_alpha (rect1);
  fail_unless_equals_float (ga2, 0.25);
  /* and again request unscaled pixel-data, global-alpha applied */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  fail_unless (pix2 == pix1);
  /* make sure we got the initial data with adjusted alpha-channel */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x20);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x20);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#endif
  gst_buffer_unmap (pix2, &map);

  /* again: unscaled pixel-data, global-alpha not applied,
   * this should revert alpha-channel to initial values */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA);
  fail_unless (pix2 == pix1);
  /* make sure we got the initial data (input=0x80808080) */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#endif
  gst_buffer_unmap (pix2, &map);

  /* now scaled, global-alpha not applied */
  pix2 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA);
  /* this should just return the rect/buffer, that was cached for these
   * scaling dimensions */
  fail_unless (pix2 == pix3);
  /* make sure we got the initial data (input=0x80808080) */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#endif
  gst_buffer_unmap (pix2, &map);

  /* scaled, global-alpha (0.25) applied */
  pix2 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  /* this should just return the rect/buffer, that was cached for these
   * scaling dimensions with modified alpha channel */
  fail_unless (pix2 == pix3);
  /* make sure we got the data we expect for global-alpha=0.25 */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x20);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x20);
  fail_unless_equals_int (data2[1], 0x80);
  fail_unless_equals_int (data2[2], 0x80);
  fail_unless_equals_int (data2[3], 0x80);
#endif
  gst_buffer_unmap (pix2, &map);

  /* now unscaled premultiplied data, global-alpha not applied,
   * is this really a valid use case?*/
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA |
      GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA);
  /* this should just return the rect/buffer, that was cached for the
   * premultiplied data */
  fail_unless (pix2 == pix4);
  /* make sure we got what we expected */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x40);
  fail_unless_equals_int (data2[1], 0x40);
  fail_unless_equals_int (data2[2], 0x40);
  fail_unless_equals_int (data2[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x40);
  fail_unless_equals_int (data2[2], 0x40);
  fail_unless_equals_int (data2[3], 0x40);
#endif
  gst_buffer_unmap (pix2, &map);

  /* unscaled premultiplied data, global-alpha (0.25) applied */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  /* this should just return the rect/buffer, that was cached for the
   * premultiplied data */
  fail_unless (pix2 == pix4);
  /* make sure we got what we expected:
   * (0x40 / (0x80/0xFF) * (0x20/0xFF) = 0x10
   * NOTE: unless we are using round() for the premultiplied case
   * in gst_video_overlay_rectangle_apply_global_alpha() we get rounding
   * error, i.e. 0x0F here */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x0F);
  fail_unless_equals_int (data2[1], 0x0F);
  fail_unless_equals_int (data2[2], 0x0F);
  fail_unless_equals_int (data2[3], 0x20);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x20);
  fail_unless_equals_int (data2[1], 0x0F);
  fail_unless_equals_int (data2[2], 0x0F);
  fail_unless_equals_int (data2[3], 0x0F);
#endif
  gst_buffer_unmap (pix2, &map);

  /* set global_alpha once more */
  gst_video_overlay_rectangle_set_global_alpha (rect1, 0.75);
  /* and verify that also premultiplied data is adjusted
   * correspondingly (though with increasing rounding errors) */
  pix2 = gst_video_overlay_rectangle_get_pixels_unscaled_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  /* this should just return the rect/buffer, that was cached for the
   * premultiplied data */
  fail_unless (pix2 == pix4);
  /* make sure we got what we expected:
   * (0x0F / (0x20/0xFF) * (0x60/0xFF) = 0x2D
   * NOTE: using floats everywhere we would get 0x30
   * here we will actually end up with 0x2C */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x2C);
  fail_unless_equals_int (data2[1], 0x2C);
  fail_unless_equals_int (data2[2], 0x2C);
  fail_unless_equals_int (data2[3], 0x60);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x60);
  fail_unless_equals_int (data2[1], 0x2C);
  fail_unless_equals_int (data2[2], 0x2C);
  fail_unless_equals_int (data2[3], 0x2C);
#endif
  gst_buffer_unmap (pix2, &map);

  /* now scaled and premultiplied data, global-alpha not applied,
   * is this really a valid use case?*/
  pix2 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA |
      GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA);
  /* this should just return the rect/buffer, that was cached for the
   * first premultiplied+scaled rect*/
  fail_unless (pix2 == pix5);
  /* make sure we got what we expected */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x40);
  fail_unless_equals_int (data2[1], 0x40);
  fail_unless_equals_int (data2[2], 0x40);
  fail_unless_equals_int (data2[3], 0x80);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x80);
  fail_unless_equals_int (data2[1], 0x40);
  fail_unless_equals_int (data2[2], 0x40);
  fail_unless_equals_int (data2[3], 0x40);
#endif
  gst_buffer_unmap (pix2, &map);

  /* scaled and premultiplied data, global-alpha applied */
  pix2 = gst_video_overlay_rectangle_get_pixels_raw (rect1,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
  /* this should just return the rect/buffer, that was cached for the
   * first premultiplied+scaled rect*/
  fail_unless (pix2 == pix5);
  /* make sure we got what we expected; see above note about rounding errors! */
  gst_buffer_map (pix2, &map, GST_MAP_READ);
  data2 = map.data;
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  /* B - G - R - A */
  fail_unless_equals_int (data2[0], 0x2F);
  fail_unless_equals_int (data2[1], 0x2F);
  fail_unless_equals_int (data2[2], 0x2F);
  fail_unless_equals_int (data2[3], 0x60);
#else
  /* A - R - G - B */
  fail_unless_equals_int (data2[0], 0x60);
  fail_unless_equals_int (data2[1], 0x2F);
  fail_unless_equals_int (data2[2], 0x2F);
  fail_unless_equals_int (data2[3], 0x2F);
#endif
  gst_buffer_unmap (pix2, &map);

  gst_video_overlay_rectangle_unref (rect1);
}

GST_END_TEST;

static guint8 *
make_pixels (gint depth, gint width, gint height)
{
  guint32 color = 0xff000000;
  gint i, j;

  if (depth == 8) {
    guint8 *pixels = g_malloc (width * height * 4);
    for (i = 0; i < height; i++) {
      for (j = 0; j < width; j++) {
        pixels[(i * width + j) * 4 + 0] = ((color >> 24) & 0xff);
        pixels[(i * width + j) * 4 + 1] = ((color >> 16) & 0xff);
        pixels[(i * width + j) * 4 + 2] = ((color >> 8) & 0xff);
        pixels[(i * width + j) * 4 + 3] = (color & 0xff);
        color++;
      }
    }
    return pixels;
  } else {
#define TO16(a) (((a)<<8)|(a))
    guint16 *pixels = g_malloc (width * height * 8);
    for (i = 0; i < height; i++) {
      for (j = 0; j < width; j++) {
        pixels[(i * width + j) * 4 + 0] = TO16 ((color >> 24) & 0xff);
        pixels[(i * width + j) * 4 + 1] = TO16 ((color >> 16) & 0xff);
        pixels[(i * width + j) * 4 + 2] = TO16 ((color >> 8) & 0xff);
        pixels[(i * width + j) * 4 + 3] = TO16 (color & 0xff);
        color++;
      }
    }
#undef TO16
    return (guint8 *) pixels;
  }
}

#define HS(x,o) ((x)&hs[o])
#define WS(x,o) ((x)&ws[o])
#define IN(i,j,o) (in[(HS(i, o)*width + WS(j,o))*4+(o)] & mask[o])
#define OUT(i,j,o) (out[((i)*width + (j))*4+o] & mask[o])
static gint
compare_frame (const GstVideoFormatInfo * finfo, gint depth, guint8 * outpixels,
    guint8 * pixels, gint width, gint height)
{
  gint diff, i, j, k;
  guint ws[4], hs[4], mask[4];

  for (k = 0; k < 4; k++) {
    hs[k] = G_MAXUINT << finfo->h_sub[(3 + k) % 4];
    ws[k] = G_MAXUINT << finfo->w_sub[(3 + k) % 4];
    mask[k] = G_MAXUINT << (depth - finfo->depth[(3 + k) % 4]);
  }
  diff = 0;
  if (depth == 8) {
    guint8 *in = pixels;
    guint8 *out = outpixels;

    for (i = 0; i < height; i++) {
      for (j = 0; j < width; j++) {
        for (k = 0; k < 4; k++) {
          diff += IN (i, j, k) != OUT (i, j, k);
        }
      }
    }
  } else {
    guint16 *in = (guint16 *) pixels;
    guint16 *out = (guint16 *) outpixels;

    for (i = 0; i < height; i++) {
      for (j = 0; j < width; j++) {
        for (k = 0; k < 4; k++) {
          diff += IN (i, j, k) != OUT (i, j, k);
        }
      }
    }
  }
  return diff;
}

#undef WS
#undef HS
#undef IN
#undef OUT

typedef struct
{
  GstVideoFormat infmt;
  GstVideoFormat outfmt;
  gint method;
  gdouble convert_sec;
} ConvertResult;

#define SIGN(a,b) ((a) < (b) ? -1 : (a) > (b) ? 1 : 0)

static gint
compare_result (gconstpointer a, gconstpointer b)
{
  const ConvertResult *ap = a;
  const ConvertResult *bp = b;

  return SIGN (ap->convert_sec, bp->convert_sec);
}

#define UNPACK_FRAME(frame,dest,line,x,width)            \
  (frame)->info.finfo->unpack_func ((frame)->info.finfo, \
      (GST_VIDEO_FRAME_IS_INTERLACED (frame) ?           \
        GST_VIDEO_PACK_FLAG_INTERLACED :                 \
        GST_VIDEO_PACK_FLAG_NONE),                       \
      dest, (frame)->data, (frame)->info.stride, x,      \
      line, width)
#define PACK_FRAME(frame,src,line,width)               \
  (frame)->info.finfo->pack_func ((frame)->info.finfo, \
      (GST_VIDEO_FRAME_IS_INTERLACED (frame) ?         \
        GST_VIDEO_PACK_FLAG_INTERLACED :               \
        GST_VIDEO_PACK_FLAG_NONE),                     \
      src, 0, (frame)->data, (frame)->info.stride,     \
      (frame)->info.chroma_site, line, width);

GST_START_TEST (test_video_pack_unpack2)
{
  GstVideoFormat format;
  GTimer *timer;
  gint num_formats, i;
  GArray *packarray, *unpackarray;

#define WIDTH 320
#define HEIGHT 240
/* set to something larger to do benchmarks */
#define TIME 0.01

  timer = g_timer_new ();
  packarray = g_array_new (FALSE, FALSE, sizeof (ConvertResult));
  unpackarray = g_array_new (FALSE, FALSE, sizeof (ConvertResult));

  num_formats = get_num_formats ();

  GST_DEBUG ("pack/sec\t unpack/sec \tpack GB/sec\tunpack GB/sec\tformat");

  for (format = GST_VIDEO_FORMAT_I420; format < num_formats; format++) {
    GstVideoInfo info;
    const GstVideoFormatInfo *finfo, *fuinfo;
    GstBuffer *buffer;
    GstVideoFrame frame;
    gint k, stride, count, diff, depth;
    guint8 *pixels, *outpixels;
    gdouble elapsed;
    gdouble unpack_sec, pack_sec;
    ConvertResult res;

    finfo = gst_video_format_get_info (format);
    fail_unless (finfo != NULL);

    if (GST_VIDEO_FORMAT_INFO_HAS_PALETTE (finfo))
      continue;

    fuinfo = gst_video_format_get_info (finfo->unpack_format);
    fail_unless (fuinfo != NULL);

    depth = GST_VIDEO_FORMAT_INFO_BITS (fuinfo);
    fail_unless (depth == 8 || depth == 16);

    pixels = make_pixels (depth, WIDTH, HEIGHT);
    stride = WIDTH * (depth >> 1);

    gst_video_info_set_format (&info, format, WIDTH, HEIGHT);
    buffer = gst_buffer_new_and_alloc (info.size);
    gst_video_frame_map (&frame, &info, buffer, GST_MAP_READWRITE);

    /* pack the frame into the target format */
    /* warmup */
    PACK_FRAME (&frame, pixels, 0, WIDTH);

    count = 0;
    g_timer_start (timer);
    while (TRUE) {
      for (k = 0; k < HEIGHT; k += finfo->pack_lines) {
        PACK_FRAME (&frame, pixels + k * stride, k, WIDTH);
      }
      count++;
      elapsed = g_timer_elapsed (timer, NULL);
      if (elapsed >= TIME)
        break;
    }
    unpack_sec = count / elapsed;

    res.infmt = format;
    res.outfmt = finfo->unpack_format;
    res.convert_sec = unpack_sec;
    g_array_append_val (unpackarray, res);

    outpixels = g_malloc0 (HEIGHT * stride);

    /* unpack the frame */
    /* warmup */
    UNPACK_FRAME (&frame, outpixels, 0, 0, WIDTH);

    count = 0;
    g_timer_start (timer);
    while (TRUE) {
      for (k = 0; k < HEIGHT; k += finfo->pack_lines) {
        UNPACK_FRAME (&frame, outpixels + k * stride, k, 0, WIDTH);
      }
      count++;
      elapsed = g_timer_elapsed (timer, NULL);
      if (elapsed >= TIME)
        break;
    }
    pack_sec = count / elapsed;

    res.outfmt = format;
    res.infmt = finfo->unpack_format;
    res.convert_sec = pack_sec;
    g_array_append_val (packarray, res);

    /* compare the frame */
    diff = compare_frame (finfo, depth, outpixels, pixels, WIDTH, HEIGHT);

    GST_DEBUG ("%f \t %f \t %f \t %f \t %s %d/%f", pack_sec, unpack_sec,
        info.size * pack_sec, info.size * unpack_sec, finfo->name, count,
        elapsed);

    if (diff != 0) {
      gst_util_dump_mem (outpixels, 128);
      gst_util_dump_mem (pixels, 128);
      fail_if (diff != 0);
    }
    gst_video_frame_unmap (&frame);
    gst_buffer_unref (buffer);
    g_free (pixels);
    g_free (outpixels);
  }

  g_array_sort (packarray, compare_result);
  for (i = 0; i < packarray->len; i++) {
    ConvertResult *res = &g_array_index (packarray, ConvertResult, i);

    GST_DEBUG ("%f pack/sec %s->%s", res->convert_sec,
        gst_video_format_to_string (res->infmt),
        gst_video_format_to_string (res->outfmt));
  }

  g_array_sort (unpackarray, compare_result);
  for (i = 0; i < unpackarray->len; i++) {
    ConvertResult *res = &g_array_index (unpackarray, ConvertResult, i);

    GST_DEBUG ("%f unpack/sec %s->%s", res->convert_sec,
        gst_video_format_to_string (res->infmt),
        gst_video_format_to_string (res->outfmt));
  }

  g_timer_destroy (timer);
  g_array_free (packarray, TRUE);
  g_array_free (unpackarray, TRUE);
}

GST_END_TEST;
#undef WIDTH
#undef HEIGHT
#undef TIME

#define WIDTH 320
#define HEIGHT 240
#define TIME 0.1
#define GET_LINE(l) (pixels + CLAMP (l, 0, HEIGHT-1) * WIDTH * 4)
GST_START_TEST (test_video_chroma)
{
  guint8 *pixels;
  guint n_lines;
  gint i, j, k, offset, count;
  gpointer lines[10];
  GTimer *timer;
  gdouble elapsed, subsample_sec;
  GstVideoChromaSite sites[] = {
    GST_VIDEO_CHROMA_SITE_NONE,
    GST_VIDEO_CHROMA_SITE_H_COSITED,
  };

  timer = g_timer_new ();
  pixels = make_pixels (8, WIDTH, HEIGHT);

  for (k = 0; k < G_N_ELEMENTS (sites); k++) {
    GstVideoChromaResample *resample;

    resample = gst_video_chroma_resample_new (GST_VIDEO_CHROMA_METHOD_LINEAR,
        sites[k], GST_VIDEO_CHROMA_FLAG_NONE, GST_VIDEO_FORMAT_AYUV, -1, -1);

    gst_video_chroma_resample_get_info (resample, &n_lines, &offset);
    fail_unless (n_lines < 10);

    /* warmup */
    for (j = 0; j < n_lines; j++)
      lines[j] = GET_LINE (offset + j);
    gst_video_chroma_resample (resample, lines, WIDTH);

    count = 0;
    g_timer_start (timer);
    while (TRUE) {
      for (i = 0; i < HEIGHT; i += n_lines) {
        for (j = 0; j < n_lines; j++)
          lines[j] = GET_LINE (i + offset + j);

        gst_video_chroma_resample (resample, lines, WIDTH);
      }
      count++;
      elapsed = g_timer_elapsed (timer, NULL);
      if (elapsed >= TIME)
        break;
    }
    subsample_sec = count / elapsed;
    GST_DEBUG ("%f downsamples/sec  %d/%f", subsample_sec, count, elapsed);
    gst_video_chroma_resample_free (resample);

    resample = gst_video_chroma_resample_new (GST_VIDEO_CHROMA_METHOD_LINEAR,
        sites[k], GST_VIDEO_CHROMA_FLAG_NONE, GST_VIDEO_FORMAT_AYUV, 1, 1);

    gst_video_chroma_resample_get_info (resample, &n_lines, &offset);
    fail_unless (n_lines < 10);

    /* warmup */
    for (j = 0; j < n_lines; j++)
      lines[j] = GET_LINE (offset + j);
    gst_video_chroma_resample (resample, lines, WIDTH);

    count = 0;
    g_timer_start (timer);
    while (TRUE) {
      for (i = 0; i < HEIGHT; i += n_lines) {
        for (j = 0; j < n_lines; j++)
          lines[j] = GET_LINE (i + offset + j);

        gst_video_chroma_resample (resample, lines, WIDTH);
      }
      count++;
      elapsed = g_timer_elapsed (timer, NULL);
      if (elapsed >= TIME)
        break;
    }
    subsample_sec = count / elapsed;
    GST_DEBUG ("%f upsamples/sec  %d/%f", subsample_sec, count, elapsed);
    gst_video_chroma_resample_free (resample);
  }

  g_free (pixels);
  g_timer_destroy (timer);
}

GST_END_TEST;
#undef WIDTH
#undef HEIGHT
#undef TIME

GST_START_TEST (test_video_scaler)
{
  GstVideoScaler *scale;

  scale = gst_video_scaler_new (GST_VIDEO_RESAMPLER_METHOD_LINEAR,
      GST_VIDEO_SCALER_FLAG_NONE, 2, 10, 5, NULL);
  gst_video_scaler_free (scale);

  scale = gst_video_scaler_new (GST_VIDEO_RESAMPLER_METHOD_LINEAR,
      GST_VIDEO_SCALER_FLAG_NONE, 2, 15, 5, NULL);
  gst_video_scaler_free (scale);
}

GST_END_TEST;

#define WIDTH 320
#define HEIGHT 240
#define TIME 0.01

GST_START_TEST (test_video_color_convert)
{
  GstVideoFormat infmt, outfmt;
  GTimer *timer;
  gint num_formats, i;
  GArray *array;

  array = g_array_new (FALSE, FALSE, sizeof (ConvertResult));

  timer = g_timer_new ();

  num_formats = get_num_formats ();

  for (infmt = GST_VIDEO_FORMAT_I420; infmt < num_formats; infmt++) {
    GstVideoInfo ininfo;
    GstVideoFrame inframe;
    GstBuffer *inbuffer;

    gst_video_info_set_format (&ininfo, infmt, WIDTH, HEIGHT);
    inbuffer = gst_buffer_new_and_alloc (ininfo.size);
    gst_buffer_memset (inbuffer, 0, 0, -1);
    gst_video_frame_map (&inframe, &ininfo, inbuffer, GST_MAP_READ);

    for (outfmt = GST_VIDEO_FORMAT_I420; outfmt < num_formats; outfmt++) {
      GstVideoInfo outinfo;
      GstVideoFrame outframe;
      GstBuffer *outbuffer;
      GstVideoConverter *convert;
      gdouble elapsed;
      gint count;
      ConvertResult res;

      gst_video_info_set_format (&outinfo, outfmt, WIDTH, HEIGHT);
      outbuffer = gst_buffer_new_and_alloc (outinfo.size);
      gst_video_frame_map (&outframe, &outinfo, outbuffer, GST_MAP_WRITE);

      convert = gst_video_converter_new (&ininfo, &outinfo, NULL);
      /* warmup */
      gst_video_converter_frame (convert, &inframe, &outframe);

      count = 0;
      g_timer_start (timer);
      while (TRUE) {
        gst_video_converter_frame (convert, &inframe, &outframe);

        count++;
        elapsed = g_timer_elapsed (timer, NULL);
        if (elapsed >= TIME)
          break;
      }

      res.infmt = infmt;
      res.outfmt = outfmt;
      res.convert_sec = count / elapsed;

      GST_DEBUG ("%f conversions/sec %s->%s, %d/%f", res.convert_sec,
          gst_video_format_to_string (infmt),
          gst_video_format_to_string (outfmt), count, elapsed);

      g_array_append_val (array, res);

      gst_video_converter_free (convert);

      gst_video_frame_unmap (&outframe);
      gst_buffer_unref (outbuffer);
    }
    gst_video_frame_unmap (&inframe);
    gst_buffer_unref (inbuffer);
  }

  g_array_sort (array, compare_result);

  for (i = 0; i < array->len; i++) {
    ConvertResult *res = &g_array_index (array, ConvertResult, i);

    GST_DEBUG ("%f conversions/sec %s->%s", res->convert_sec,
        gst_video_format_to_string (res->infmt),
        gst_video_format_to_string (res->outfmt));
  }

  g_array_free (array, TRUE);

  g_timer_destroy (timer);
}

GST_END_TEST;
#undef WIDTH
#undef HEIGHT

#define WIDTH_IN 320
#define HEIGHT_IN 240
#define WIDTH_OUT 400
#define HEIGHT_OUT 300
#define TIME 0.01

GST_START_TEST (test_video_size_convert)
{
  GstVideoFormat infmt, outfmt;
  GTimer *timer;
  gint num_formats, i;
  GArray *array;

  array = g_array_new (FALSE, FALSE, sizeof (ConvertResult));

  timer = g_timer_new ();

  num_formats = get_num_formats ();

  for (infmt = GST_VIDEO_FORMAT_I420; infmt < num_formats; infmt++) {
    GstVideoInfo ininfo, outinfo;
    GstVideoFrame inframe, outframe;
    GstBuffer *inbuffer, *outbuffer;
    GstVideoConverter *convert;
    gdouble elapsed;
    gint count, method;
    ConvertResult res;

    gst_video_info_set_format (&ininfo, infmt, WIDTH_IN, HEIGHT_IN);
    inbuffer = gst_buffer_new_and_alloc (ininfo.size);
    gst_buffer_memset (inbuffer, 0, 0, -1);
    gst_video_frame_map (&inframe, &ininfo, inbuffer, GST_MAP_READ);

    outfmt = infmt;
    gst_video_info_set_format (&outinfo, outfmt, WIDTH_OUT, HEIGHT_OUT);
    outbuffer = gst_buffer_new_and_alloc (outinfo.size);
    gst_video_frame_map (&outframe, &outinfo, outbuffer, GST_MAP_WRITE);

    for (method = 0; method < 4; method++) {
      convert = gst_video_converter_new (&ininfo, &outinfo,
          gst_structure_new ("options",
              GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
              GST_TYPE_VIDEO_RESAMPLER_METHOD, method, NULL));

      /* warmup */
      gst_video_converter_frame (convert, &inframe, &outframe);

      count = 0;
      g_timer_start (timer);
      while (TRUE) {
        gst_video_converter_frame (convert, &inframe, &outframe);

        count++;
        elapsed = g_timer_elapsed (timer, NULL);
        if (elapsed >= TIME)
          break;
      }

      res.infmt = infmt;
      res.outfmt = outfmt;
      res.method = method;
      res.convert_sec = count / elapsed;

      GST_DEBUG ("%f resize/sec %s->%s, %d, %d/%f", res.convert_sec,
          gst_video_format_to_string (infmt),
          gst_video_format_to_string (outfmt), method, count, elapsed);

      g_array_append_val (array, res);

      gst_video_converter_free (convert);
    }
    gst_video_frame_unmap (&outframe);
    gst_buffer_unref (outbuffer);
    gst_video_frame_unmap (&inframe);
    gst_buffer_unref (inbuffer);
  }

  g_array_sort (array, compare_result);

  for (i = 0; i < array->len; i++) {
    ConvertResult *res = &g_array_index (array, ConvertResult, i);

    GST_DEBUG ("%f method %d, resize/sec %s->%s", res->convert_sec, res->method,
        gst_video_format_to_string (res->infmt),
        gst_video_format_to_string (res->outfmt));
  }

  g_array_free (array, TRUE);

  g_timer_destroy (timer);
}

GST_END_TEST;
#undef WIDTH
#undef HEIGHT

GST_START_TEST (test_video_convert)
{
  GstVideoInfo ininfo, outinfo;
  GstVideoFrame inframe, outframe;
  GstBuffer *inbuffer, *outbuffer;
  GstVideoConverter *convert;

  gst_video_info_set_format (&ininfo, GST_VIDEO_FORMAT_ARGB, 320, 240);
  inbuffer = gst_buffer_new_and_alloc (ininfo.size);
  gst_buffer_memset (inbuffer, 0, 0, -1);
  gst_video_frame_map (&inframe, &ininfo, inbuffer, GST_MAP_READ);

  gst_video_info_set_format (&outinfo, GST_VIDEO_FORMAT_BGRx, 400, 300);
  outbuffer = gst_buffer_new_and_alloc (outinfo.size);
  gst_video_frame_map (&outframe, &outinfo, outbuffer, GST_MAP_WRITE);

  /* see that we don't reuse the source line directly because we need
   * to add borders to it */
  convert = gst_video_converter_new (&ininfo, &outinfo,
      gst_structure_new ("options",
          GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
          GST_TYPE_VIDEO_RESAMPLER_METHOD, 3,
          GST_VIDEO_CONVERTER_OPT_SRC_X, G_TYPE_INT, 10,
          GST_VIDEO_CONVERTER_OPT_SRC_Y, G_TYPE_INT, 0,
          GST_VIDEO_CONVERTER_OPT_SRC_WIDTH, G_TYPE_INT, 300,
          GST_VIDEO_CONVERTER_OPT_SRC_HEIGHT, G_TYPE_INT, 220,
          GST_VIDEO_CONVERTER_OPT_DEST_X, G_TYPE_INT, 80,
          GST_VIDEO_CONVERTER_OPT_DEST_Y, G_TYPE_INT, 60,
          GST_VIDEO_CONVERTER_OPT_DEST_WIDTH, G_TYPE_INT, 300,
          GST_VIDEO_CONVERTER_OPT_DEST_HEIGHT, G_TYPE_INT, 220, NULL));

  gst_video_converter_frame (convert, &inframe, &outframe);
  gst_video_converter_free (convert);

  /* see that we reuse the source line directly because we need to scale
   * it first */
  convert = gst_video_converter_new (&ininfo, &outinfo,
      gst_structure_new ("options",
          GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
          GST_TYPE_VIDEO_RESAMPLER_METHOD, 3,
          GST_VIDEO_CONVERTER_OPT_SRC_X, G_TYPE_INT, 10,
          GST_VIDEO_CONVERTER_OPT_SRC_Y, G_TYPE_INT, 0,
          GST_VIDEO_CONVERTER_OPT_SRC_WIDTH, G_TYPE_INT, 300,
          GST_VIDEO_CONVERTER_OPT_SRC_HEIGHT, G_TYPE_INT, 220,
          GST_VIDEO_CONVERTER_OPT_DEST_X, G_TYPE_INT, 80,
          GST_VIDEO_CONVERTER_OPT_DEST_Y, G_TYPE_INT, 60,
          GST_VIDEO_CONVERTER_OPT_DEST_WIDTH, G_TYPE_INT, 310,
          GST_VIDEO_CONVERTER_OPT_DEST_HEIGHT, G_TYPE_INT, 230, NULL));

  gst_video_converter_frame (convert, &inframe, &outframe);
  gst_video_converter_free (convert);

  gst_video_frame_unmap (&outframe);
  gst_buffer_unref (outbuffer);
  gst_video_frame_unmap (&inframe);
  gst_buffer_unref (inbuffer);

}

GST_END_TEST;

GST_START_TEST (test_video_transfer)
{
  gint i, j;

  for (j = GST_VIDEO_TRANSFER_GAMMA10; j <= GST_VIDEO_TRANSFER_LOG316; j++) {
    for (i = 0; i < 256; i++) {
      gdouble val1, val2;

      val1 = gst_video_color_transfer_encode (j, i / 255.0);
      fail_if (val1 < 0.0 || val1 > 1.0);

      val2 = gst_video_color_transfer_decode (j, val1);
      fail_if (val2 < 0.0 || val2 > 1.0);

      GST_DEBUG ("%d: %d %f->%f->%f %d", j, i, i / 255.0, val1, val2,
          (int) lrint (val2 * 255.0));
      if (val1 == 0.0)
        fail_if (val2 != 0.0);
      else
        fail_if (lrint (val2 * 255.0) != i);
    }
  }
}

GST_END_TEST;

GST_START_TEST (test_video_center_rect)
{
  GstVideoRectangle src, dest, result, expected;

#define NEW_RECT(x,y,w,h) ((GstVideoRectangle) {x,y,w,h})
#define CHECK_RECT(res, exp)			\
  fail_unless_equals_int(exp.x, res.x);\
  fail_unless_equals_int(exp.y, res.y);\
  fail_unless_equals_int(exp.w, res.w);\
  fail_unless_equals_int(exp.h, res.h);

  /* 1:1 Aspect Ratio */
  src = NEW_RECT (0, 0, 100, 100);
  dest = NEW_RECT (0, 0, 100, 100);
  expected = NEW_RECT (0, 0, 100, 100);
  gst_video_sink_center_rect (src, dest, &result, TRUE);
  CHECK_RECT (result, expected);

  src = NEW_RECT (0, 0, 100, 100);
  dest = NEW_RECT (0, 0, 50, 50);
  expected = NEW_RECT (0, 0, 50, 50);
  gst_video_sink_center_rect (src, dest, &result, TRUE);
  CHECK_RECT (result, expected);

  src = NEW_RECT (0, 0, 100, 100);
  dest = NEW_RECT (50, 50, 100, 100);
  expected = NEW_RECT (50, 50, 100, 100);
  gst_video_sink_center_rect (src, dest, &result, TRUE);
  CHECK_RECT (result, expected);

  /* Aspect ratio scaling (tall) */
  src = NEW_RECT (0, 0, 50, 100);
  dest = NEW_RECT (0, 0, 50, 50);
  expected = NEW_RECT (12, 0, 25, 50);
  gst_video_sink_center_rect (src, dest, &result, TRUE);
  CHECK_RECT (result, expected);

  src = NEW_RECT (0, 0, 50, 100);
  dest = NEW_RECT (50, 50, 50, 50);
  expected = NEW_RECT (62, 50, 25, 50);
  gst_video_sink_center_rect (src, dest, &result, TRUE);
  CHECK_RECT (result, expected);

  /* Aspect ratio scaling (wide) */
  src = NEW_RECT (0, 0, 100, 50);
  dest = NEW_RECT (0, 0, 50, 50);
  expected = NEW_RECT (0, 12, 50, 25);
  gst_video_sink_center_rect (src, dest, &result, TRUE);
  CHECK_RECT (result, expected);

  src = NEW_RECT (0, 0, 100, 50);
  dest = NEW_RECT (50, 50, 50, 50);
  expected = NEW_RECT (50, 62, 50, 25);
  gst_video_sink_center_rect (src, dest, &result, TRUE);
  CHECK_RECT (result, expected);
}

GST_END_TEST;

void test_overlay_blend_rect (gint x, gint y, gint width, gint height,
    GstVideoFrame * video_frame);
void test_overlay_blend_rect_verify (gint x, gint y, gint width,
    gint height, GstVideoFrame * video_frame);
#define VIDEO_WIDTH 320
#define VIDEO_HEIGHT 240

void
test_overlay_blend_rect_verify (gint x, gint y, gint width, gint height,
    GstVideoFrame * video_frame)
{
  guint8 *data;
  gint i = 0, prev_i = 0;
  gint size = 0;
  gint temp_width = 0, temp_height = 0;

  data = GST_VIDEO_FRAME_PLANE_DATA (video_frame, 0);
  size = GST_VIDEO_FRAME_SIZE (video_frame);

  if (x + width < 0 || y + height < 0 || x >= VIDEO_WIDTH || y >= VIDEO_HEIGHT)
    return;
  if (x <= 0)
    temp_width = width + x;
  else if (x > 0 && (x + width) <= VIDEO_WIDTH)
    temp_width = width;
  else
    temp_width = VIDEO_WIDTH - x;
  if (y <= 0)
    temp_height = height + y;
  else if (y > 0 && (y + height) <= VIDEO_HEIGHT)
    temp_height = height;
  else
    temp_height = VIDEO_HEIGHT - y;

  if (x <= 0 && y <= 0)
    i = 0;
  else
    i = (((x <= 0) ? 0 : x) + (((y <= 0) ? 0 : y) * VIDEO_WIDTH)) * 4;
  prev_i = i;

  for (; i < size - 4; i += 4) {
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
    /* B - G - R - A */
    fail_unless_equals_int (data[i], 0x80);
    fail_unless_equals_int (data[i + 1], 0x80);
    fail_unless_equals_int (data[i + 2], 0x80);
    fail_unless_equals_int (data[i + 3], 0x80);
#else
    /* A - R - G - B */
    fail_unless_equals_int (data[i], 0x00);
    fail_unless_equals_int (data[i + 1], 0x80);
    fail_unless_equals_int (data[i + 2], 0x80);
    fail_unless_equals_int (data[i + 3], 0x80);
#endif
    if ((i + 4) == (4 * (((((y > 0) ? (y + temp_height) : temp_height) -
                        1) * VIDEO_WIDTH) + ((x >
                        0) ? (x + temp_width) : temp_width))))
      break;
    if ((i + 4 - prev_i) == ((temp_width) * 4)) {
      i += ((VIDEO_WIDTH - (temp_width)) * 4);
      prev_i = i + 4;
    }

  }
}

void
test_overlay_blend_rect (gint x, gint y, gint width, gint height,
    GstVideoFrame * video_frame)
{
  GstVideoOverlayComposition *comp1;
  GstVideoOverlayRectangle *rect1;
  GstBuffer *pix, *pix1;
  GstVideoInfo vinfo;

  memset (video_frame, 0, sizeof (GstVideoFrame));
  pix =
      gst_buffer_new_and_alloc (VIDEO_WIDTH * VIDEO_HEIGHT * sizeof (guint32));
  gst_buffer_memset (pix, 0, 0, gst_buffer_get_size (pix));
  gst_video_info_init (&vinfo);
  gst_video_info_set_format (&vinfo, GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB,
      VIDEO_WIDTH, VIDEO_HEIGHT);
  gst_video_frame_map (video_frame, &vinfo, pix, GST_MAP_READWRITE);
  gst_buffer_unref (pix);
  pix = NULL;

  pix1 = gst_buffer_new_and_alloc (width * height * sizeof (guint32));
  gst_buffer_memset (pix1, 0, 0x80, gst_buffer_get_size (pix1));
  gst_buffer_add_video_meta (pix1, GST_VIDEO_FRAME_FLAG_NONE,
      GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB, width, height);
  rect1 = gst_video_overlay_rectangle_new_raw (pix1,
      x, y, width, height, GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  gst_buffer_unref (pix1);
  pix1 = NULL;

  comp1 = gst_video_overlay_composition_new (rect1);
  fail_unless (gst_video_overlay_composition_blend (comp1, video_frame));
  gst_video_overlay_composition_unref (comp1);
  gst_video_overlay_rectangle_unref (rect1);

  test_overlay_blend_rect_verify (x, y, width, height, video_frame);
  gst_video_frame_unmap (video_frame);
}

GST_START_TEST (test_overlay_blend)
{
  GstVideoFrame video_frame;

  /* Overlay width & height smaller than video width & height */
  /* Overlay rendered completely left of video surface
   * x + overlay_width <= 0 */
  test_overlay_blend_rect (-60, 50, 50, 50, &video_frame);
  /* Overlay rendered completely right of video surface
   * x >= video_width */
  test_overlay_blend_rect (330, 50, 50, 50, &video_frame);
  /* Overlay rendered completely top of video surface
   * y + overlay_height <= 0 */
  test_overlay_blend_rect (50, -60, 50, 50, &video_frame);
  /* Overlay rendered completely bottom of video surface
   * y >= video_height */
  test_overlay_blend_rect (50, 250, 50, 50, &video_frame);
  /* Overlay rendered partially left of video surface
   * x < 0 && -x < overlay_width */
  test_overlay_blend_rect (-40, 50, 50, 50, &video_frame);
  /* Overlay rendered partially right of video surface
   * x < video_width && (overlay_width + x) > video_width */
  test_overlay_blend_rect (300, 50, 50, 50, &video_frame);
  /* Overlay rendered partially top of video surface
   * y < 0 && -y < overlay_height */
  test_overlay_blend_rect (50, -40, 50, 50, &video_frame);
  /* Overlay rendered partially bottom of video surface
   * y < video_height && (overlay_height + y) > video_height */
  test_overlay_blend_rect (50, 220, 50, 50, &video_frame);

  /* Overlay width & height bigger than video width & height */
  /* Overlay rendered completely left of video surface
   * x + overlay_width <= 0 */
  test_overlay_blend_rect (-360, 50, 350, 250, &video_frame);
  /* Overlay rendered completely right of video surface
   * x >= video_width */
  test_overlay_blend_rect (330, 50, 350, 250, &video_frame);
  /* Overlay rendered completely top of video surface
   * y + overlay_height <= 0 */
  test_overlay_blend_rect (50, -260, 350, 250, &video_frame);
  /* Overlay rendered completely bottom of video surface
   * y >= video_height */
  test_overlay_blend_rect (50, 250, 350, 250, &video_frame);
  /* Overlay rendered partially left of video surface
   * x < 0 && -x < overlay_width */
  test_overlay_blend_rect (-40, 50, 350, 250, &video_frame);
  /* Overlay rendered partially right of video surface
   * x < video_width && (overlay_width + x) > video_width */
  test_overlay_blend_rect (300, 50, 350, 250, &video_frame);
  /* Overlay rendered partially top of video surface
   * y < 0 && -y < overlay_height */
  test_overlay_blend_rect (50, -40, 350, 250, &video_frame);
  /* Overlay rendered partially bottom of video surface
   * y < video_height && (overlay_height + y) > video_height */
  test_overlay_blend_rect (50, 220, 350, 250, &video_frame);
}

GST_END_TEST;

GST_START_TEST (test_overlay_composition_over_transparency)
{
  GstVideoOverlayComposition *comp1;
  GstVideoOverlayRectangle *rect1;
  GstBuffer *pix1, *pix2;
  GstVideoInfo vinfo;
  guint8 *data;

  GstVideoFrame video_frame;
  guint fwidth = 200, height = 50, swidth = 100;

  memset (&video_frame, 0, sizeof (GstVideoFrame));

  pix1 = gst_buffer_new_and_alloc (fwidth * sizeof (guint32) * height);
  gst_buffer_memset (pix1, 0, 0x00, gst_buffer_get_size (pix1));
  gst_video_info_init (&vinfo);
  gst_video_info_set_format (&vinfo, GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB,
      fwidth, height);
  gst_video_frame_map (&video_frame, &vinfo, pix1, GST_MAP_READWRITE);
  gst_buffer_unref (pix1);

  pix2 = gst_buffer_new_and_alloc (swidth * sizeof (guint32) * height);
  gst_buffer_memset (pix2, 0, 0xFF, gst_buffer_get_size (pix2));
  gst_buffer_add_video_meta (pix2, GST_VIDEO_FRAME_FLAG_NONE,
      GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB, swidth, height);
  rect1 = gst_video_overlay_rectangle_new_raw (pix2, swidth, 0,
      swidth, height, GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);

  comp1 = gst_video_overlay_composition_new (rect1);
  fail_unless (gst_video_overlay_composition_blend (comp1, &video_frame));
  gst_video_overlay_composition_unref (comp1);
  gst_video_overlay_rectangle_unref (rect1);
  gst_buffer_unref (pix2);

  data = GST_VIDEO_FRAME_PLANE_DATA (&video_frame, 0);

  fail_unless_equals_int (data[0], 0x00);
  fail_unless_equals_int (data[1], 0x00);
  fail_unless_equals_int (data[2], 0x00);
  fail_unless_equals_int (data[3], 0x00);

  data += swidth * sizeof (guint32);

  fail_unless_equals_int (data[0], 0xFF);
  fail_unless_equals_int (data[1], 0xFF);
  fail_unless_equals_int (data[2], 0xFF);
  fail_unless_equals_int (data[3], 0xFF);

  gst_video_frame_unmap (&video_frame);
}

GST_END_TEST;


static Suite *
video_suite (void)
{
  Suite *s = suite_create ("video support library");
  TCase *tc_chain = tcase_create ("general");

  tcase_set_timeout (tc_chain, 60 * 60);

  suite_add_tcase (s, tc_chain);
  tcase_add_test (tc_chain, test_video_formats);
  tcase_add_test (tc_chain, test_video_formats_rgb);
  tcase_add_test (tc_chain, test_video_formats_rgba_large_dimension);
  tcase_add_test (tc_chain, test_video_formats_all);
  tcase_add_test (tc_chain, test_video_formats_pack_unpack);
  tcase_add_test (tc_chain, test_dar_calc);
  tcase_add_test (tc_chain, test_parse_caps_rgb);
  tcase_add_test (tc_chain, test_parse_caps_multiview);
  tcase_add_test (tc_chain, test_parse_colorimetry);
  tcase_add_test (tc_chain, test_events);
  tcase_add_test (tc_chain, test_convert_frame);
  tcase_add_test (tc_chain, test_convert_frame_async);
  tcase_add_test (tc_chain, test_video_size_from_caps);
  tcase_add_test (tc_chain, test_overlay_composition);
  tcase_add_test (tc_chain, test_overlay_composition_premultiplied_alpha);
  tcase_add_test (tc_chain, test_overlay_composition_global_alpha);
  tcase_add_test (tc_chain, test_video_pack_unpack2);
  tcase_add_test (tc_chain, test_video_chroma);
  tcase_add_test (tc_chain, test_video_scaler);
  tcase_add_test (tc_chain, test_video_color_convert);
  tcase_add_test (tc_chain, test_video_size_convert);
  tcase_add_test (tc_chain, test_video_convert);
  tcase_add_test (tc_chain, test_video_transfer);
  tcase_add_test (tc_chain, test_overlay_blend);
  tcase_add_test (tc_chain, test_video_center_rect);
  tcase_add_test (tc_chain, test_overlay_composition_over_transparency);

  return s;
}

GST_CHECK_MAIN (video);
