#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/times.h>

#include <gst/gst.h>
#include <gst/base/gstadapter.h>

struct TestParams
{
  gint tot_size;
  gint read_size;
  gint write_size;
};

/* This test pushes 'n' buffers of 'write size' into an adapter, then reads
 * them out in 'read size' sized pieces, using take and then take_buffer, 
 * and prints the timings */

static struct TestParams param_sets[] = {
/* These values put ~256MB in 1MB chunks in an adapter, then reads them out
 * in 250kb blocks */
  {256000000, 250000, 1000000},
/* These values put ~256MB in 1000 byte chunks in an adapter, then reads them 
 * out in 200 byte blocks */
  {25600000, 200, 1000},
/* These values put ~256MB in 200 chunks in an adapter, then reads them out
 * in 1000 byte blocks */
  {25600000, 1000, 200}
};

static const gint n_tests = sizeof (param_sets) / sizeof (struct TestParams);

static gint ticks_per_sec;

static void
run_test_take (struct TestParams *params)
{
  /* Create an adapter and feed it data of fixed size, then retrieve it in 
   * a different size */
  GstAdapter *adapter = gst_adapter_new ();
  guint8 *data;
  GstBuffer *buf;
  int i;
  gint ntimes = params->tot_size / params->write_size;

  for (i = 0; i < ntimes; i++) {
    buf = gst_buffer_new_and_alloc (params->write_size);

    data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
    memset (data, 0, params->write_size);
    gst_buffer_unmap (buf, data, params->write_size);

    gst_adapter_push (adapter, buf);
  }

  do {
    data = gst_adapter_take (adapter, params->read_size);
    if (data == NULL)
      break;
    g_free (data);
  } while (TRUE);

  g_object_unref (adapter);
}

static void
run_test_take_buffer (struct TestParams *params)
{
  /* Create an adapter and feed it data of fixed size, then retrieve it in 
   * a different size
   */
  GstAdapter *adapter = gst_adapter_new ();
  GstBuffer *buf;
  int i;
  gint ntimes = params->tot_size / params->write_size;
  guint8 *data;

  for (i = 0; i < ntimes; i++) {
    buf = gst_buffer_new_and_alloc (params->write_size);

    data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
    memset (data, 0, params->write_size);
    gst_buffer_unmap (buf, data, params->write_size);

    gst_adapter_push (adapter, buf);
  }

  do {
    buf = gst_adapter_take_buffer (adapter, params->read_size);
    if (buf == NULL)
      break;
    gst_buffer_unref (buf);
  } while (TRUE);

  g_object_unref (adapter);
}

static void
run_tests (struct TestParams *params)
{
  struct tms time_data;
  gdouble start;
  gdouble dur;

  g_print ("Running on %d bytes, writing %d bytes/buf, reading %d bytes/buf\n",
      params->tot_size, params->write_size, params->read_size);

  start = 0.0;
  run_test_take (params);

  times (&time_data);
  dur = (gdouble) (time_data.tms_utime + time_data.tms_stime) / ticks_per_sec;
  g_print ("Time for take test: %g secs\n", dur - start);

  start = dur;
  run_test_take_buffer (params);

  times (&time_data);
  dur = (gdouble) (time_data.tms_utime + time_data.tms_stime) / ticks_per_sec;
  g_print ("Time for TakeBuffer test: %g secs\n", dur - start);

  g_print ("\n");
}

int
main (int argc, char **argv)
{
  gint i;

  ticks_per_sec = sysconf (_SC_CLK_TCK);

  gst_init (&argc, &argv);

  for (i = 0; i < n_tests; i++)
    run_tests (param_sets + i);

  return 0;
}
