/*
 * GStreamer
 *
 * unit test for (audio) parser
 *
 * Copyright (C) 2008 Nokia Corporation. All rights reserved.
 *
 * Contact: Stefan Kost <stefan.kost@nokia.com>
 *
 * 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.
 */

#include <gst/check/gstcheck.h>

#define MAX_HEADERS 10

typedef struct
{
  guint discard;
  guint buffers_before_offset_skip;
  guint offset_skip_amount;
  const guint8 *data_to_verify;
  guint data_to_verify_size;
  GstCaps *caps;
  gboolean no_metadata;

  GstClockTime ts_counter;
  gint64 offset_counter;
  guint buffer_counter;
} buffer_verify_data_s;

typedef struct {
    guint8     *data;
    guint       size;
} datablob;

typedef gboolean (*VerifyBuffer) (buffer_verify_data_s * vdata, GstBuffer * buf);
typedef GstElement* (*ElementSetup) (const gchar * desc);

/* context state variables; to be set by test using this helper */
/* mandatory */
extern const gchar *ctx_factory;
extern GstStaticPadTemplate *ctx_sink_template;
extern GstStaticPadTemplate *ctx_src_template;
/* optional */
extern GstCaps *ctx_input_caps;
extern GstCaps *ctx_output_caps;
extern guint ctx_discard;
extern datablob ctx_headers[MAX_HEADERS];
extern gboolean ctx_no_metadata;

extern VerifyBuffer ctx_verify_buffer;
extern ElementSetup ctx_setup;

/* no refs taken/kept, all up to caller */
typedef struct
{
  const gchar          *factory;
  ElementSetup         factory_setup;
  GstStaticPadTemplate *sink_template;
  GstStaticPadTemplate *src_template;
  /* caps that go into element */
  GstCaps              *src_caps;
  /* optional: output caps to verify */
  GstCaps              *sink_caps;
  /* initial headers */
  datablob              headers[MAX_HEADERS];
  /* initial (header) output to forego checking */
  guint                 discard;
  /* series of buffers; middle series considered garbage */
  struct {
    /* data and size */
    guint8     *data;
    guint      size;
    /* num of frames with above data per buffer */
    guint      fpb;
    /* num of buffers */
    guint      num;
  } series[3];
  /* sigh, weird cases */
  gboolean              framed;
  guint                 dropped;
  gboolean              no_metadata;
} GstParserTest;

void gst_parser_test_init (GstParserTest * ptest, guint8 * data, guint size, guint num);

void gst_parser_test_run (GstParserTest * test, GstCaps ** out_caps);

void gst_parser_test_normal (guint8 *data, guint size);

void gst_parser_test_drain_single (guint8 *data, guint size);

void gst_parser_test_drain_garbage (guint8 *data, guint size, guint8 *garbage, guint gsize);

void gst_parser_test_split (guint8 *data, guint size);

void gst_parser_test_skip_garbage (guint8 *data, guint size, guint8 *garbage, guint gsize);

void gst_parser_test_output_caps (guint8 *data, guint size, const gchar * input_caps,
                                  const gchar * output_caps);

GstCaps *gst_parser_test_get_output_caps (guint8 *data, guint size, const gchar * input_caps);

