Blame tests/check/elements/opus.c

Packit 971217
/* GStreamer
Packit 971217
 *
Packit 971217
 * unit test for opus
Packit 971217
 *
Packit 971217
 * Copyright (C) <2011> Vincent Penquerc'h <vincent.penquerch@collbaora.co.uk>
Packit 971217
 *
Packit 971217
 * This library is free software; you can redistribute it and/or
Packit 971217
 * modify it under the terms of the GNU Library General Public
Packit 971217
 * License as published by the Free Software Foundation; either
Packit 971217
 * version 2 of the License, or (at your option) any later version.
Packit 971217
 *
Packit 971217
 * This library is distributed in the hope that it will be useful,
Packit 971217
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 971217
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 971217
 * Library General Public License for more details.
Packit 971217
 *
Packit 971217
 * You should have received a copy of the GNU Library General Public
Packit 971217
 * License along with this library; if not, write to the
Packit 971217
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 971217
 * Boston, MA 02110-1301, USA.
Packit 971217
 */
Packit 971217
Packit 971217
#ifdef HAVE_CONFIG_H
Packit 971217
#include "config.h"
Packit 971217
#endif
Packit 971217
Packit 971217
#include <gst/check/gstcheck.h>
Packit 971217
#include <gst/check/gstharness.h>
Packit 971217
Packit 971217
#if G_BYTE_ORDER == G_BIG_ENDIAN
Packit 971217
#define AFORMAT "S16BE"
Packit 971217
#else
Packit 971217
#define AFORMAT "S16LE"
Packit 971217
#endif
Packit 971217
Packit 971217
#define AUDIO_CAPS_STRING "audio/x-raw, " \
Packit 971217
                           "format = (string) " AFORMAT ", "\
Packit 971217
                           "layout = (string) interleaved, " \
Packit 971217
                           "rate = (int) 48000, " \
Packit 971217
                           "channels = (int) 1 "
Packit 971217
Packit 971217
/* A lot of these taken from the vorbisdec test */
Packit 971217
Packit 971217
/* For ease of programming we use globals to keep refs for our floating
Packit 971217
 * src and sink pads we create; otherwise we always have to do get_pad,
Packit 971217
 * get_peer, and then remove references in every test function */
Packit 971217
static GstPad *mydecsrcpad, *mydecsinkpad;
Packit 971217
static GstPad *myencsrcpad, *myencsinkpad;
Packit 971217
Packit 971217
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
Packit 971217
    GST_PAD_SINK,
Packit 971217
    GST_PAD_ALWAYS,
Packit 971217
    GST_STATIC_CAPS_ANY);
Packit 971217
static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
Packit 971217
    GST_PAD_SRC,
Packit 971217
    GST_PAD_ALWAYS,
Packit 971217
    GST_STATIC_CAPS_ANY);
Packit 971217
Packit 971217
static GstElement *
Packit 971217
setup_opusdec (void)
Packit 971217
{
Packit 971217
  GstElement *opusdec;
Packit 971217
Packit 971217
  GST_DEBUG ("setup_opusdec");
Packit 971217
  opusdec = gst_check_setup_element ("opusdec");
Packit 971217
  mydecsrcpad = gst_check_setup_src_pad (opusdec, &srctemplate);
Packit 971217
  mydecsinkpad = gst_check_setup_sink_pad (opusdec, &sinktemplate);
Packit 971217
  gst_pad_set_active (mydecsrcpad, TRUE);
Packit 971217
  gst_pad_set_active (mydecsinkpad, TRUE);
Packit 971217
Packit 971217
  return opusdec;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
cleanup_opusdec (GstElement * opusdec)
Packit 971217
{
Packit 971217
  GST_DEBUG ("cleanup_opusdec");
Packit 971217
  gst_element_set_state (opusdec, GST_STATE_NULL);
Packit 971217
Packit 971217
  gst_pad_set_active (mydecsrcpad, FALSE);
Packit 971217
  gst_pad_set_active (mydecsinkpad, FALSE);
Packit 971217
  gst_check_teardown_src_pad (opusdec);
Packit 971217
  gst_check_teardown_sink_pad (opusdec);
Packit 971217
  gst_check_teardown_element (opusdec);
Packit 971217
}
Packit 971217
Packit 971217
static GstElement *
Packit 971217
setup_opusenc (void)
Packit 971217
{
Packit 971217
  GstElement *opusenc;
Packit 971217
Packit 971217
  GST_DEBUG ("setup_opusenc");
Packit 971217
  opusenc = gst_check_setup_element ("opusenc");
Packit 971217
  myencsrcpad = gst_check_setup_src_pad (opusenc, &srctemplate);
Packit 971217
  myencsinkpad = gst_check_setup_sink_pad (opusenc, &sinktemplate);
Packit 971217
  gst_pad_set_active (myencsrcpad, TRUE);
Packit 971217
  gst_pad_set_active (myencsinkpad, TRUE);
Packit 971217
Packit 971217
  return opusenc;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
cleanup_opusenc (GstElement * opusenc)
Packit 971217
{
Packit 971217
  GST_DEBUG ("cleanup_opusenc");
Packit 971217
  gst_element_set_state (opusenc, GST_STATE_NULL);
Packit 971217
Packit 971217
  gst_pad_set_active (myencsrcpad, FALSE);
Packit 971217
  gst_pad_set_active (myencsinkpad, FALSE);
Packit 971217
  gst_check_teardown_src_pad (opusenc);
Packit 971217
  gst_check_teardown_sink_pad (opusenc);
Packit 971217
  gst_check_teardown_element (opusenc);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
check_buffers (guint expected)
Packit 971217
{
Packit 971217
  GstBuffer *outbuffer;
Packit 971217
  guint i, num_buffers;
Packit 971217
Packit 971217
  /* check buffers are the type we expect */
Packit 971217
  num_buffers = g_list_length (buffers);
Packit 971217
  fail_unless (num_buffers >= expected);
Packit 971217
  for (i = 0; i < num_buffers; ++i) {
Packit 971217
    outbuffer = GST_BUFFER (buffers->data);
Packit 971217
    fail_if (outbuffer == NULL);
Packit 971217
    fail_if (gst_buffer_get_size (outbuffer) == 0);
Packit 971217
Packit 971217
    buffers = g_list_remove (buffers, outbuffer);
Packit 971217
Packit 971217
    ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1);
Packit 971217
    gst_buffer_unref (outbuffer);
Packit 971217
    outbuffer = NULL;
Packit 971217
  }
Packit 971217
}
Packit 971217
Packit 971217
GST_START_TEST (test_opus_encode_nothing)
Packit 971217
{
Packit 971217
  GstElement *opusenc;
Packit 971217
Packit 971217
  opusenc = setup_opusenc ();
Packit 971217
  fail_unless (gst_element_set_state (opusenc,
Packit 971217
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
Packit 971217
      "could not set to playing");
Packit 971217
Packit 971217
  fail_unless (gst_pad_push_event (myencsrcpad, gst_event_new_eos ()) == TRUE);
Packit 971217
Packit 971217
  fail_unless (gst_element_set_state (opusenc,
Packit 971217
          GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
Packit 971217
      "could not set to ready");
Packit 971217
Packit 971217
  /* cleanup */
Packit 971217
  cleanup_opusenc (opusenc);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_opus_decode_nothing)
Packit 971217
{
Packit 971217
  GstElement *opusdec;
Packit 971217
Packit 971217
  opusdec = setup_opusdec ();
Packit 971217
  fail_unless (gst_element_set_state (opusdec,
Packit 971217
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
Packit 971217
      "could not set to playing");
Packit 971217
Packit 971217
  fail_unless (gst_pad_push_event (mydecsrcpad, gst_event_new_eos ()) == TRUE);
Packit 971217
Packit 971217
  fail_unless (gst_element_set_state (opusdec,
Packit 971217
          GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
Packit 971217
      "could not set to ready");
Packit 971217
Packit 971217
  /* cleanup */
Packit 971217
  cleanup_opusdec (opusdec);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_opus_encode_samples)
Packit 971217
{
Packit 971217
  const unsigned int nsamples = 4096;
Packit 971217
  GstElement *opusenc;
Packit 971217
  GstBuffer *inbuffer;
Packit 971217
  GstCaps *caps;
Packit 971217
Packit 971217
  opusenc = setup_opusenc ();
Packit 971217
Packit 971217
  fail_unless (gst_element_set_state (opusenc,
Packit 971217
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
Packit 971217
      "could not set to playing");
Packit 971217
Packit 971217
  inbuffer = gst_buffer_new_and_alloc (nsamples * 2);
Packit 971217
  gst_buffer_memset (inbuffer, 0, 0, nsamples * 2);
Packit 971217
Packit 971217
  GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_OFFSET (inbuffer) = 0;
Packit 971217
  GST_BUFFER_DURATION (inbuffer) = GST_CLOCK_TIME_NONE;
Packit 971217
  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
Packit 971217
Packit 971217
  caps = gst_caps_from_string (AUDIO_CAPS_STRING);
Packit 971217
  fail_unless (caps != NULL);
Packit 971217
  gst_check_setup_events (myencsrcpad, opusenc, caps, GST_FORMAT_TIME);
Packit 971217
  gst_caps_unref (caps);
Packit 971217
  gst_buffer_ref (inbuffer);
Packit 971217
Packit 971217
  /* pushing gives away my reference ... */
Packit 971217
  fail_unless (gst_pad_push (myencsrcpad, inbuffer) == GST_FLOW_OK);
Packit 971217
  /* ... and nothing ends up on the global buffer list */
Packit 971217
  fail_unless (gst_pad_push_event (myencsrcpad, gst_event_new_eos ()) == TRUE);
Packit 971217
Packit 971217
  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
Packit 971217
  gst_buffer_unref (inbuffer);
Packit 971217
Packit 971217
  fail_unless (gst_element_set_state (opusenc,
Packit 971217
          GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
Packit 971217
      "could not set to ready");
Packit 971217
Packit 971217
  /* default frame size is 20 ms, at 48000 Hz that's 960 samples */
Packit 971217
  check_buffers ((nsamples + 959) / 960);
Packit 971217
Packit 971217
  /* cleanup */
Packit 971217
  cleanup_opusenc (opusenc);
Packit 971217
  g_list_free (buffers);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_opus_encode_properties)
Packit 971217
{
Packit 971217
  const unsigned int nsamples = 4096;
Packit 971217
  enum
Packit 971217
  { steps = 20 };
Packit 971217
  GstElement *opusenc;
Packit 971217
  GstBuffer *inbuffer;
Packit 971217
  GstCaps *caps;
Packit 971217
  unsigned int step;
Packit 971217
  static const struct
Packit 971217
  {
Packit 971217
    const char *param;
Packit 971217
    int value;
Packit 971217
  } param_changes[steps] = {
Packit 971217
    {
Packit 971217
    "frame-size", 40}, {
Packit 971217
    "inband-fec", 1}, {
Packit 971217
    "complexity", 5}, {
Packit 971217
    "bandwidth", 1104}, {
Packit 971217
    "frame-size", 2}, {
Packit 971217
    "max-payload-size", 80}, {
Packit 971217
    "frame-size", 60}, {
Packit 971217
    "max-payload-size", 900}, {
Packit 971217
    "complexity", 1}, {
Packit 971217
    "bitrate", 30000}, {
Packit 971217
    "frame-size", 10}, {
Packit 971217
    "bitrate", 300000}, {
Packit 971217
    "inband-fec", 0}, {
Packit 971217
    "frame-size", 5}, {
Packit 971217
    "bandwidth", 1101}, {
Packit 971217
    "frame-size", 10}, {
Packit 971217
    "bitrate", 500000}, {
Packit 971217
    "frame-size", 5}, {
Packit 971217
    "bitrate", 80000}, {
Packit 971217
  "complexity", 8},};
Packit 971217
Packit 971217
  opusenc = setup_opusenc ();
Packit 971217
Packit 971217
  fail_unless (gst_element_set_state (opusenc,
Packit 971217
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
Packit 971217
      "could not set to playing");
Packit 971217
Packit 971217
  caps = gst_caps_from_string (AUDIO_CAPS_STRING);
Packit 971217
  fail_unless (caps != NULL);
Packit 971217
Packit 971217
  gst_check_setup_events (myencsrcpad, opusenc, caps, GST_FORMAT_TIME);
Packit 971217
Packit 971217
  for (step = 0; step < steps; ++step) {
Packit 971217
    GstSegment segment;
Packit 971217
Packit 971217
    gst_segment_init (&segment, GST_FORMAT_TIME);
Packit 971217
    gst_pad_push_event (myencsrcpad, gst_event_new_segment (&segment));
Packit 971217
Packit 971217
    inbuffer = gst_buffer_new_and_alloc (nsamples * 2);
Packit 971217
    gst_buffer_memset (inbuffer, 0, 0, nsamples * 2);
Packit 971217
Packit 971217
    GST_BUFFER_TIMESTAMP (inbuffer) = GST_BUFFER_OFFSET (inbuffer) = 0;
Packit 971217
    GST_BUFFER_DURATION (inbuffer) = GST_CLOCK_TIME_NONE;
Packit 971217
    ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
Packit 971217
Packit 971217
    gst_buffer_ref (inbuffer);
Packit 971217
Packit 971217
    /* pushing gives away my reference ... */
Packit 971217
    fail_unless (gst_pad_push (myencsrcpad, inbuffer) == GST_FLOW_OK);
Packit 971217
    /* ... and nothing ends up on the global buffer list */
Packit 971217
    fail_unless (gst_pad_push_event (myencsrcpad,
Packit 971217
            gst_event_new_eos ()) == TRUE);
Packit 971217
Packit 971217
    ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
Packit 971217
    gst_buffer_unref (inbuffer);
Packit 971217
Packit 971217
    /* change random parameters */
Packit 971217
    g_object_set (opusenc, param_changes[step].param, param_changes[step].value,
Packit 971217
        NULL);
Packit 971217
Packit 971217
    check_buffers (1);
Packit 971217
Packit 971217
    fail_unless (gst_pad_push_event (myencsrcpad,
Packit 971217
            gst_event_new_flush_start ()) == TRUE);
Packit 971217
    fail_unless (gst_pad_push_event (myencsrcpad,
Packit 971217
            gst_event_new_flush_stop (TRUE)) == TRUE);
Packit 971217
  }
Packit 971217
Packit 971217
  gst_caps_unref (caps);
Packit 971217
Packit 971217
  fail_unless (gst_element_set_state (opusenc,
Packit 971217
          GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
Packit 971217
      "could not set to ready");
Packit 971217
Packit 971217
  /* cleanup */
Packit 971217
  cleanup_opusenc (opusenc);
Packit 971217
  g_list_free (buffers);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
/* removes fields that do not interest our tests to
Packit 971217
 * allow using gst_caps_is_equal for comparison */
Packit 971217
static GstCaps *
Packit 971217
remove_extra_caps_fields (GstCaps * caps)
Packit 971217
{
Packit 971217
  gint i;
Packit 971217
  for (i = 0; i < gst_caps_get_size (caps); i++) {
Packit 971217
    GstStructure *s = gst_caps_get_structure (caps, i);
Packit 971217
Packit 971217
    gst_structure_remove_field (s, "channel-mapping-family");
Packit 971217
    gst_structure_remove_field (s, "coupled-count");
Packit 971217
    gst_structure_remove_field (s, "stream-count");
Packit 971217
  }
Packit 971217
  return gst_caps_simplify (caps);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
run_getcaps_check (GstCaps * filter, GstCaps * downstream_caps,
Packit 971217
    GstCaps * expected_result)
Packit 971217
{
Packit 971217
  GstElement *opusdec;
Packit 971217
  GstElement *capsfilter;
Packit 971217
  GstPad *sinkpad;
Packit 971217
  GstCaps *result;
Packit 971217
  gchar *caps_str;
Packit 971217
Packit 971217
  opusdec = gst_element_factory_make ("opusdec", NULL);
Packit 971217
  capsfilter = gst_element_factory_make ("capsfilter", NULL);
Packit 971217
  sinkpad = gst_element_get_static_pad (opusdec, "sink");
Packit 971217
  fail_unless (gst_element_link (opusdec, capsfilter));
Packit 971217
Packit 971217
  if (downstream_caps)
Packit 971217
    g_object_set (capsfilter, "caps", downstream_caps, NULL);
Packit 971217
  result = gst_pad_query_caps (sinkpad, filter);
Packit 971217
  result = remove_extra_caps_fields (result);
Packit 971217
  caps_str = gst_caps_to_string (result);
Packit 971217
  fail_unless (gst_caps_is_equal (expected_result, result),
Packit 971217
      "Unexpected output caps: %s", caps_str);
Packit 971217
Packit 971217
  if (filter)
Packit 971217
    gst_caps_unref (filter);
Packit 971217
  gst_caps_unref (result);
Packit 971217
  gst_caps_unref (expected_result);
Packit 971217
  if (downstream_caps)
Packit 971217
    gst_caps_unref (downstream_caps);
Packit 971217
  gst_object_unref (sinkpad);
Packit 971217
  gst_object_unref (opusdec);
Packit 971217
  gst_object_unref (capsfilter);
Packit 971217
  g_free (caps_str);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
run_getcaps_check_from_strings (const gchar * filter,
Packit 971217
    const gchar * downstream_caps, const gchar * expected_result)
Packit 971217
{
Packit 971217
  run_getcaps_check (filter ? gst_caps_from_string (filter) : NULL,
Packit 971217
      downstream_caps ? gst_caps_from_string (downstream_caps) : NULL,
Packit 971217
      gst_caps_from_string (expected_result));
Packit 971217
}
Packit 971217
Packit 971217
GST_START_TEST (test_opusdec_getcaps)
Packit 971217
{
Packit 971217
  /* default result */
Packit 971217
  run_getcaps_check_from_strings (NULL, NULL,
Packit 971217
      "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)[1,8]");
Packit 971217
Packit 971217
  /* A single supported rate downstream - should accept any upstream anyway */
Packit 971217
  run_getcaps_check_from_strings (NULL, "audio/x-raw, rate=(int)8000",
Packit 971217
      "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)[1,8]");
Packit 971217
Packit 971217
  /* Two supported rates (fields as a array, not as a single int) */
Packit 971217
  run_getcaps_check_from_strings (NULL, "audio/x-raw, rate=(int){24000, 8000}",
Packit 971217
      "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)[1,8]");
Packit 971217
Packit 971217
  /* One supported and one unsupported rate */
Packit 971217
  run_getcaps_check_from_strings (NULL, "audio/x-raw, rate=(int){24000, 1000}",
Packit 971217
      "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)[1,8]");
Packit 971217
Packit 971217
  /* Unsupported rate */
Packit 971217
  run_getcaps_check_from_strings (NULL, "audio/x-raw, rate=(int)1000", "EMPTY");
Packit 971217
Packit 971217
  /* same tests for channels */
Packit 971217
  run_getcaps_check_from_strings (NULL, "audio/x-raw, channels=(int)2",
Packit 971217
      "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)[1,2]");
Packit 971217
  run_getcaps_check_from_strings (NULL, "audio/x-raw, channels=(int)[1, 2]",
Packit 971217
      "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)[1,2]");
Packit 971217
  run_getcaps_check_from_strings (NULL, "audio/x-raw, channels=(int)5000",
Packit 971217
      "EMPTY");
Packit 971217
Packit 971217
  /* Now add filters */
Packit 971217
Packit 971217
  /* Formats not acceptable */
Packit 971217
  run_getcaps_check_from_strings ("audio/x-opus, rate=(int)1000", NULL,
Packit 971217
      "EMPTY");
Packit 971217
  run_getcaps_check_from_strings ("audio/x-opus, channels=(int)200", NULL,
Packit 971217
      "EMPTY");
Packit 971217
Packit 971217
  /* Should restrict the result of the caps query to the selected rate/channels */
Packit 971217
  run_getcaps_check_from_strings ("audio/x-opus, rate=(int)8000", NULL,
Packit 971217
      "audio/x-opus, rate=(int)8000, channels=(int)[1,8]");
Packit 971217
  run_getcaps_check_from_strings ("audio/x-opus, channels=(int)2", NULL,
Packit 971217
      "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)2");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_opus_decode_plc_timestamps_with_fec)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  GstHarness *h =
Packit 971217
      gst_harness_new_parse ("opusdec use-inband-fec=TRUE plc=TRUE");
Packit 971217
  GstClockTime dur0 = GST_MSECOND * 35 / 10;    /* because of lookahead */
Packit 971217
  GstClockTime dur = GST_MSECOND * 10;
Packit 971217
Packit 971217
  gst_harness_add_src_parse (h,
Packit 971217
      "audiotestsrc samplesperbuffer=480 is-live=TRUE ! "
Packit 971217
      "opusenc frame-size=10 inband-fec=TRUE", TRUE);
Packit 971217
Packit 971217
  /* Push first buffer from encoder to decoder. It will not be decoded yet
Packit 971217
   * because of the delay introduced by FEC */
Packit 971217
  gst_harness_src_crank_and_push_many (h, 1, 1);
Packit 971217
  fail_unless_equals_int (0, gst_harness_buffers_received (h));
Packit 971217
Packit 971217
  /* Drop second buffer from encoder and send a GAP event to decoder
Packit 971217
   * instead with 2x duration */
Packit 971217
  gst_harness_src_crank_and_push_many (h, 1, 0);
Packit 971217
  fail_unless (buf = gst_harness_pull (h->src_harness));
Packit 971217
  fail_unless (gst_harness_push_event (h,
Packit 971217
          gst_event_new_gap (GST_BUFFER_PTS (buf),
Packit 971217
              GST_BUFFER_DURATION (buf) * 2)));
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  /* Extract first buffer from decoder and verify timstamps */
Packit 971217
  fail_unless (buf = gst_harness_pull (h));
Packit 971217
  fail_unless_equals_int64 (0, GST_BUFFER_PTS (buf));
Packit 971217
  fail_unless_equals_int64 (dur0, GST_BUFFER_DURATION (buf));
Packit 971217
  fail_unless (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT));
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  /* Third buffer is pushed from encoder to decoder with DISCONT set */
Packit 971217
  gst_harness_src_crank_and_push_many (h, 1, 0);
Packit 971217
  fail_unless (buf = gst_harness_pull (h->src_harness));
Packit 971217
  GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
Packit 971217
  gst_harness_push (h, buf);
Packit 971217
Packit 971217
  /* Extract second (concealed) buffer from decoder and verify timestamp
Packit 971217
     and the 2x duration */
Packit 971217
  fail_unless (buf = gst_harness_pull (h));
Packit 971217
  fail_unless_equals_int64 (dur0, GST_BUFFER_PTS (buf));
Packit 971217
  fail_unless_equals_int64 (dur * 2, GST_BUFFER_DURATION (buf));
Packit 971217
  fail_if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT));
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  /* Push fourth buffer from encoder to decoder as normal */
Packit 971217
  gst_harness_src_crank_and_push_many (h, 1, 1);
Packit 971217
Packit 971217
  /* Extract third buffer from decoder and verify timestamps */
Packit 971217
  fail_unless (buf = gst_harness_pull (h));
Packit 971217
  fail_unless_equals_int64 (dur0 + 1 * dur, GST_BUFFER_PTS (buf));
Packit 971217
  fail_unless_equals_int64 (dur, GST_BUFFER_DURATION (buf));
Packit 971217
  fail_if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT));
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  gst_harness_teardown (h);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
static Suite *
Packit 971217
opus_suite (void)
Packit 971217
{
Packit 971217
  Suite *s = suite_create ("opus");
Packit 971217
  TCase *tc_chain = tcase_create ("general");
Packit 971217
Packit 971217
  suite_add_tcase (s, tc_chain);
Packit 971217
Packit 971217
  tcase_add_test (tc_chain, test_opus_encode_nothing);
Packit 971217
  tcase_add_test (tc_chain, test_opus_decode_nothing);
Packit 971217
  tcase_add_test (tc_chain, test_opus_encode_samples);
Packit 971217
  tcase_add_test (tc_chain, test_opus_encode_properties);
Packit 971217
  tcase_add_test (tc_chain, test_opusdec_getcaps);
Packit 971217
  tcase_add_test (tc_chain, test_opus_decode_plc_timestamps_with_fec);
Packit 971217
Packit 971217
  return s;
Packit 971217
}
Packit 971217
Packit 971217
GST_CHECK_MAIN (opus);